diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..291b9a5b --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2c0d09b1d0bd1ea2094e2ebca6e3a9a5 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/404.html b/404.html new file mode 100644 index 00000000..caa90759 --- /dev/null +++ b/404.html @@ -0,0 +1,479 @@ + + + + + + +
+ + +Short
+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 00000000..2ea7ff3e --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = `` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = `` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 00000000..dbe1aaad --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/css/ansys_sphinx_theme.css b/_static/css/ansys_sphinx_theme.css new file mode 100644 index 00000000..ec40368d --- /dev/null +++ b/_static/css/ansys_sphinx_theme.css @@ -0,0 +1,1039 @@ +/* Provided by the Sphinx base theme template at build time */ + +@import "../basic.css"; +@import url("https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Open+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap"); +@import "../sg_gallery.css"; +@import "../design-style.4045f2051d55cab465a707391d5b2007.min.css"; +@import "../styles/pydata-sphinx-theme.css"; + +@font-face { + font-family: "Source Sans Pro Light"; + src: url(../fonts/SourceSansPro-Light.ttf); +} + +@font-face { + font-family: "Source Sans Pro"; + src: url(../fonts/SourceSansPro-Regular.ttf); +} + +:root { + /* Ansys specific changes to the theme */ + + /***************************************************************************** + * Ansys Font family + **/ + /* These are adapted from https://systemfontstack.com/ */ + --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, + "Helvetica Neue", Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, + Segoe UI Symbol; + --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, + Liberation Mono, Lucida Console, monospace; + + --pst-font-family-base: "Source Sans Pro", sans-serif, + var(--pst-font-family-base-system); + --pst-font-family-heading: "Source Sans Pro", sans-serif, + var(--pst-font-family-base-system); + --pst-font-family-monospace: monospace, Courier, + var(--pst-font-family-monospace-system); + + /***************************************************************************** + * Ansys compatible colors + * + * Colors are defined in rgb string way, "red, green, blue" + **/ + --ansysGold: rgb(255, 183, 27); /* #FFB71B */ + --ansysBronze: rgb(200, 146, 17); /* #C89211 */ + --pythonBlue: rgb(57, 114, 161); /* #3972a1 */ + + --pst-color-active-navigation: var(--ansysBronze); /* --ansysBronze */ + --pst-color-navbar-link: rgb(255, 255, 255); + --pst-color-navbar-link-hover: var(--ansysBronze); /* --ansysBronze */ + --pst-color-navbar-link-active: var(--ansysGold); /* --ansysBronze */ + --pst-font-size-h1: 48px; + --pst-font-size-h2: 36px; + --pst-font-size-h3: 28px; + --pst-font-size-h4: 20px; + --pst-font-size-h5: 14px; + --pst-font-size-h6: 11px; +} + +html[data-theme="light"] { + /***************************************************************************** + * main colors + */ + --pst-color-primary: #fff; + --pst-color-secondary: rgb(200, 146, 17); + --pst-color-success: rgb(40, 167, 69); + --pst-color-text-base: rgb(0, 0, 0); + --pst-color-text-muted: rgb(26, 24, 24); + --pst-color-border: #c9c9c9; + --pst-color-shadow: rgb(216, 216, 216); + --pst-color-info: var(--pst-color-link); + + /***************************************************************************** + * depth colors + */ + --pst-color-on-background: rgb(0, 0, 0); + --pst-color-on-surface: #f2f2f2; + + /***************************************************************************** + * extensions + */ + + --pst-color-panel-background: var(--pst-color-on-background); + + /***************************************************************************** + * layout + */ + + --pst-color-link: #1e6ddc; + --pst-color-link-hover: #32cfea; + --pst-color-inline-code: #000; + --pst-color-target: rgb(255, 255, 255); + + /***************************************************************************** + * color for sphinx-gallery-code output + */ + --pst-color-codecell: #fafae2; + --pst-color-codeout: var(--pst-color-inline-code); + --pst-color-sig: #0965c8; + --pst-color-code-s1: #b35000; + --pst-color-code-c1: #095d0a; + /***************************************************************************** + * sphinx design primary color + */ + --sd-color-primary: var(--pst-color-text-base); + + /***************************************************************************** + * table hovering + */ + --pst-color-table-hover: var(--pst-color-border); + + /***************************************************************************** + * search hide match + */ + --pst-color-search-match: #91969b; +} + +html[data-theme="dark"] { + /***************************************************************************** + * main colors + */ + --pst-color-primary: #d09735; + --pst-color-secondary: #c58e30; + --pst-color-success: rgb(72, 135, 87); + --pst-color-text-base: rgb(201, 209, 217); + --pst-color-text-muted: rgb(192, 192, 192); + --pst-color-border: rgb(192, 192, 192); + --pst-color-shadow: rgb(104, 102, 102); + --pst-color-background: rgb(18, 18, 18); + --pst-color-on-background: rgb(0, 0, 0); + --pst-color-surface: rgb(41, 41, 41); + --pst-color-on-surface: rgb(55, 55, 55); + --pst-color-info: var(--pst-color-secondary); + + /***************************************************************************** + * extensions + */ + + --pst-color-panel-background: var(--pst-color-on-background); + + /***************************************************************************** + * layout + */ + + --pst-color-link: #579ce5; + --pst-color-link-hover: #12b2e2; + --pst-color-inline-code: #fff; + --pst-color-target: rgb(71, 39, 0); + + /***************************************************************************** + * color for sphinx-gallery-code output + */ + --pst-color-codecell: #495057; + --pst-color-codeout: #f2f4f6; + --pst-color-sig: #d6ab1e; + --pst-color-code-s1: #d79a60; + --pst-color-code-c1: #8fb842; + + /***************************************************************************** + * table hovering + */ + --pst-color-table-hover: var(--pst-color-target); + + /***************************************************************************** + * search hide match + */ + --pst-color-search-match: var(--pst-color-primary); +} + +/* +################# +body and content +################# +*/ + +body { + font-family: "Open Sans", sans-serif; +} + +h1, +h2 { + color: var(--pst-color-text-base); +} + +/* +########## +Codecell +########## +*/ + +dt:target, +span.highlighted { + background-color: var(--pst-color-codecell) !important; +} + +.docutils { + color: var(--pst-color-inline-code); + font-family: var(--pst-font-family-monospace); + font-weight: 500; + font-size: 87.5%; +} + +code.literal { + padding: 0.1rem 0.25rem; + padding-top: 0.1rem; + padding-right: 0.25rem; + padding-bottom: 0.1rem; + padding-left: 0.25rem; + background-color: var(--pst-color-on-surface); + border: 1px solid var(--pst-color-border); + border-radius: 0.25rem; +} + +.xref.std.std-ref { + color: var(--pst-color-inline-code); + font-family: "Inconsolata"; + font-weight: normal; + font-style: italic; + padding: 0.1rem 0.25rem; + padding-top: 0.1rem; + padding-right: 0.25rem; + padding-bottom: 0.1rem; + padding-left: 0.25rem; + font-size: 90%; + background-color: var(--pst-color-on-surface); + border: 1px solid var(--pst-color-border); + border-radius: 0.25rem; +} + +.sig { + font-family: "Consolas", "Menlo", "DejaVu Sans Mono", + "Bitstream Vera Sans Mono", monospace; +} + +.sig-name.descname { + color: var(--pst-color-inline-code); +} + +.sig-name { + color: var(--pst-color-sig); +} + +/* Increase empty-space around classes, methods, properties, etc. that are descendants + of other items */ +dl.class dl.py { + margin-top: 2.5em; + margin-bottom: 2.5em; +} + +/* Reduce empty-space around Notes and Examples headings */ +p.rubric { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +/* +######## +Table +######## +*/ + +table { + width: 100%; + max-width: 100%; + border-spacing: 0; + border-collapse: collapse; + overflow: hidden; + vertical-align: middle; + + /* Disabling scroll bars */ + overflow-y: scroll; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* Internet Explorer 10+ */ +} + +tr { + background-color: var(--pst-color-background); +} + +th { + background-color: rgb(255, 183, 27, 0.55); +} + +tr:nth-child(odd), +tr:nth-child(even) { + background-color: var(--pst-color-background); +} + +.table tr:hover td { + background-color: var(--pst-color-table-hover); +} + +/* +############### +Table-centered +################ +Same as table but with horizontally centered text. + +see examples. +*/ +table.table-centered { + width: 100%; + max-width: 100%; + border-spacing: 0; + border-collapse: collapse; + overflow: hidden; + vertical-align: middle; + text-align: center; + + /* Disabling scroll bars */ + overflow-y: scroll; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* Internet Explorer 10+ */ +} + +.table-centered tr { + background-color: var(--pst-color-background); + text-align: center; +} + +.table-centered th { + background-color: rgb(255, 183, 27, 0.55); + text-align: center; +} + +.table-centered tr:nth-child(odd), +.table-centered tr:nth-child(even) { + text-align: center; + background-color: var(--pst-color-background); +} + +.table-centered tr:hover td { + background-color: var(--pst-color-table-hover); + text-align: center; +} + +table.dataframe { + table-layout: auto !important; +} + +/* +################### +longtable-centered +#################### +*/ + +table.longtable-centered { + text-align: center; +} + +.longtable-centered tr { + text-align: center; +} + +.longtable-centered th { + text-align: center; +} + +.longtable-centered tr:nth-child(odd) { + text-align: center; +} + +.longtable-centered tr:nth-child(even) { + text-align: center; +} + +table.longtable-centered tr:hover td { + background-color: var(--pst-color-table-hover); + text-align: center; +} + +/* +######### +DataFrame +######### +*/ + +.dataframe tr { + background-color: var(--pst-color-background); +} + +.dataframe tr:nth-child(odd), +.dataframe tr:nth-child(even) { + background-color: var(--pst-color-background) !important; +} + +.dataframe tr:hover td { + background-color: var(--pst-color-table-hover); +} + +/* +################### +DataFrame-centered +################### +*/ + +.dataframe-centered tr { + background-color: var(--pst-color-background); + text-align: center; +} + +.dataframe-centered tr:nth-child(odd) { + background-color: var(--pst-color-background) !important; + text-align: center; +} + +.dataframe-centered tr:nth-child(even) { + background-color: var(--pst-color-border); + text-align: center; +} + +.dataframe-centered tr:hover td { + background-color: var(--pst-color-border); + text-align: center; +} + +.dataframe thead th { + text-align: center; +} + +/* +############ +data table +############ +*/ + +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + color: var(--pst-color-text-base) !important; +} + +.dataTables_wrapper, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: var(--pst-color-text-base) !important; +} + +table.dataTable tbody th, +table.dataTable tbody td { + background: var(--pst-color-background); +} + +label { + color: var(--pst-color-text-base); +} + +/* +########## +Scroll-bar +########## +*/ + +body::-webkit-scrollbar { + width: 1rem; + height: 1rem; +} + +body::-webkit-scrollbar-thumb { + background: var(--pst-color-border); + border-radius: inherit; +} + +body::-webkit-scrollbar-track { + background: var(--pst-color-background); +} + +.bd-sidebar::-webkit-scrollbar { + width: 0.5rem; + height: 0.5rem; +} + +.bd-sidebar::-webkit-scrollbar-thumb { + background: var(--pst-color-border); + border-radius: inherit; + visibility: hidden !important; +} + +.bd-sidebar::-webkit-scrollbar-track { + background: var(--pst-color-border); + visibility: hidden !important; +} + +.bd-toc::-webkit-scrollbar { + width: 0.5rem; + height: 0.5rem; +} + +.bd-toc::-webkit-scrollbar-thumb { + background: var(--pst-color-border); + border-radius: inherit; +} + +.bd-toc::-webkit-scrollbar-track { + background: var(--pst-color-border); +} + +/* +############ +Autosummary +############ +*/ + +.autosummary tr:nth-child(odd), +.autosummary tr:nth-child(even) { + background-color: var(--pst-color-background); +} + +/* +##################### +ReST :download: links +##################### +*/ +a > code.download { + font-family: var(--pst-font-family-base); + color: var(--pst-color-link); + text-decoration: none; + font-weight: normal; +} + +/* +##################### +Sphinx gallery output +##################### +*/ +.sphx-glr-script-out .highlight pre { + background-color: var(--pst-color-codecell) !important; + color: var(--pst-color-codeout); +} + +.prev-next-area a p.prev-next-title { + color: var(--pst-color-link); + font-weight: 600; + font-size: 1.1em; +} + +.highlight .s1, +.s2, +.kc { + color: var(--pst-color-code-s1) !important; +} + +html[data-theme="dark"] .highlight .kn { + color: #e18fff; + font-weight: normal; +} + +.highlight .c1 { + color: var(--pst-color-code-c1); +} + +html[data-theme="dark"] .highlight .n { + color: #b3d7ff; +} + +html[data-theme="dark"] .highlight .nn { + color: #43d69d; + text-decoration: none; +} +/* +############### +Dropdown button +############### +*/ + +.navbar button.navbar-toggler { + margin-right: 1em; + border-color: rgb(255, 255, 255); + color: rgb(255, 255, 255); +} + +/* +#################################################### +Side column size (first and second column from left) +#################################################### +*/ + +.col-md-3 { + flex: 0 0 20%; + max-width: 20%; +} + +a.headerlink { + color: #222; +} + +@media (min-width: 1200px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl { + max-width: 1200px; + } +} + +@media (min-width: 1600px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl { + max-width: 1600px; + } +} + +/* +############################################ +Navigation column (according to side column) +############################################ +*/ +.col-lg-9 { + flex: 0 0 80%; + max-width: 80%; + padding-right: 5px; + padding-left: 20px; +} +.bd-main .bd-content { + display: flex; + height: 100%; + justify-content: end; +} + +.bd-main .bd-content .bd-article-container .bd-article { + padding-left: 1rem; + padding-top: 1rem; +} +.bd-header .navbar-nav li a.nav-link { + color: #ddd; +} +.bd-header .navbar-nav .dropdown button { + color: #ddd; + display: unset; +} + +/* +################################# +Syntax highlighting in code block +################################# +*/ + +html[data-theme="light"] .highlight .o { + color: #b35000; + font-weight: bold; +} + +/* +############################# +Bold font weight for **code** +############################# +*/ + +b, +strong { + font-weight: 900; +} + +.bd-header .navbar-nav > .active > .nav-link { + border-bottom: 2px solid #fff; +} + +.navbar-nav li a:focus, +.navbar-nav li a:hover, +.navbar-nav li.current > a { + color: white !important; +} + +.navbar-nav .dropdown .dropdown-menu { + min-width: 250px; +} + +/* +########################### +Left side toc-tree hovering +########################### +*/ + +nav.bd-links .active:hover > a { + font-weight: bold; + color: var(--pst-color-text-base); + border-left: 2px solid var(--pst-color-text-base); +} + +nav.bd-links .active > a { + font-weight: bold; + color: var(--pst-color-text-muted) !important; + border-left: 2px solid var(--pst-color-text-base); + border-bottom: none !important; + padding-left: 0.5rem; +} + +nav.bd-links li > a:hover { + font-weight: 900; + color: var(--pst-color-link) !important; +} + +/* +################## +icon, button, logo +################## +*/ + +button, +input, +optgroup, +select, +textarea, +button:hover { + color: #ddd; +} + +.theme-switch-button { + border-color: #f8f9fa; +} + +button.btn.version-switcher__button { + border-color: var(--pst-color-border); + color: #ddd; +} + +button.version-switcher__button:hover { + color: #f8f8f2; +} + +button.version-switcher__button { + color: #f8f9fa; +} + +.search-button { + color: #ddd; +} + +kbd { + background-color: #f8f9fa; +} + +.theme-switch-button span { + color: #f8f9fa; +} + +html[data-theme="light"] .theme-switch-button span:hover { + color: #0d0d0d; +} + +/* make the github logo white */ + +i.fa-github-square:before, +i.fa-square-github:before { + color: white; + font-size: 2rem; +} + +.version-switcher__menu a.list-group-item:hover { + background-color: #d09735 !important; + border-color: var(--pst-color-text-base) !important; + color: #000 !important; +} + +.version-switcher__menu a.list-group-item { + background-color: #f8f9fa; + border-color: var(--pst-color-border); + color: #000; +} + +.fa-wrench:before { + content: "\f0ad"; + color: white; +} + +.navbar-icon-links { + font-size: 1.5rem; + color: white; +} + +/* +############################## +image padding before and after +############################## +*/ + +img { + padding-top: 1em; + padding-bottom: 1em; +} + +html[data-theme="dark"] .bd-content img:not(.only-dark):not(.dark-light) { + background: transparent; +} + +img.logo__image { + padding-top: 0rem; + padding-bottom: 0rem; +} + +/* +########################## +Nav-bar entity right side. +########################## +*/ + +nav.bd-links li > a { + color: var(--pst-color-link); + font-size: 0.98rem; +} + +html[data-theme="light"] .highlight pre { + line-height: 125%; + font-size: 0.9em; +} + +html[data-theme="dark"] .highlight pre { + line-height: 125%; + font-size: 0.9em; +} + +.bd-toc { + padding-top: 5em; +} + +#version_switcher_button { + background-color: var(--pst-color-background); +} + +.editthispage a { + color: var(--pst-color-text-base); +} + +.list-group-item.active { + z-index: 2; + color: var(--pst-color-text-base) !important; +} + +/* +############## +Sphinx design +############## +*/ +.sd-sphinx-override, +.sd-sphinx-override * { + background-color: transparent !important; + font-size: medium; + flex: auto; +} +/* Sphinx-design tab */ + +/* Common styles for all screen sizes */ +.sd-tab-set > input:not(.focus-visible) + label { + outline: none; + font-size: large; + -webkit-tap-highlight-color: transparent; + color: var(--pst-color-text-base); +} + +.sd-tab-set > input:checked + label + .sd-tab-content { + display: block; + font-size: medium; +} + +.sd-tab-set > input:checked + label + .sd-tab-content { + display: block; + font-size: 0.9rem; +} + +.sd-tab-content { + font-family: var(--pst-font-family-base); +} + +.bd-content .sd-tab-set > input:checked + label, +.bd-content .sd-tab-set > input:not(:checked) + label:hover { + color: var(--pst-color-text-base); + border-color: var(--pst-color-text-base); +} + +/* Media query for medium-sized screens */ +@media screen and (max-width: 768px) { + .sd-tab-set > input:not(.focus-visible) + label { + font-size: medium; + } +} + +/* Media query for small-sized screens */ +@media screen and (max-width: 576px) { + .sd-tab-set > input:not(.focus-visible) + label { + font-size: small; + } +} + +/* Sphinx-design card */ + +/* Common styles for all screen sizes */ +.sd-card .sd-card-text { + font-family: var(--pst-font-family-base) !important; +} + +.sd-card .sd-card-header { + border: none; + background-color: white; + color: #150458 !important; + font-size: var(--pst-font-size-h5); + font-weight: bold; + font-family: var(--pst-font-family-base); + padding: 0.5rem 0rem 0.5rem 0rem; +} + +.sd-card .sd-card-footer .sd-card-text { + max-width: 220px; + margin-left: auto; + margin-right: auto; + font-family: var(--pst-font-family-base); +} + +html[data-theme="dark"] .sd-shadow-sm { + box-shadow: 0 0.1rem 1rem rgba(250, 250, 250, 0.6) !important; +} + +html[data-theme="dark"] .sd-card-img-top[src*=".png"] { + filter: invert(0.82) brightness(0.8) contrast(1.2); +} + +/* Common styles for all screen sizes */ +.sd-card { + border-radius: 0; + padding: 10px 10px 10px 10px; + font-family: var(--pst-font-family-base) !important; +} + +/* Media query for medium-sized screens */ +@media screen and (max-width: 768px) { + .sd-card .sd-card-header { + font-size: var(--pst-font-size-h6); + } +} + +/* Media query for small-sized screens */ +@media screen and (max-width: 576px) { + .sd-card .sd-card-header { + font-size: var(--pst-font-size-h5); + } + .sd-card { + padding: 5px 5px 5px 5px; + } + .sd-sphinx-override, + .sd-sphinx-override * { + box-sizing: content-box !important; + } +} + +/* +Sphinx-design dropdown +*/ + +details.sd-dropdown .sd-summary-title { + border: 1px solid var(--pst-color-text-base) !important; + color: var(--sd-color-card-text) !important; + font-family: var(monospace) !important; + font-size: medium; + text-align: left; + padding-left: 1rem; +} + +/* +################################# +Right side toctree color and font +################################# +*/ +.toc-entry a.nav-link { + padding: 0.125rem 1.5rem; + color: var(--pst-color-link); +} + +.toc-entry a.nav-link.active { + font-weight: bold; + color: var(--pst-color-text-base); + background-color: transparent; + border-left: 2px solid var(--pst-color-text-muted); +} + +.toc-h2 { + font-size: 0.98rem; + padding: 0.05em; +} + +.toc-h3 { + font-size: 0.96rem; +} + +.toc-h4 { + font-size: 0.9rem; +} + +.toc-entry a.nav-link:hover { + color: var(--pst-color-link); + text-decoration: none; + font-weight: 600; +} + +/* +########### +Directives +########### +*/ + +div.deprecated { + border-color: var(--pst-color-danger); + background-color: #dc354514; +} + +div.deprecated, +div.versionadded, +div.versionchanged { + background-color: transparent; +} + +.admonition, +div.admonition { + background-color: var(--pst-color-on-surface); +} + +/* +############ +Border lines +############ +*/ +.bd-sidebar-primary, +.bd-sidebar-secondary { + max-height: calc(100vh - var(--pst-header-height) - 1vh); +} + +/* +################# +search hide match +################# +*/ + +div#searchbox p.highlight-link a { + background-color: var(--pst-color-search-match); +} diff --git a/_static/css/breadcrumbs.css b/_static/css/breadcrumbs.css new file mode 100644 index 00000000..60fe0155 --- /dev/null +++ b/_static/css/breadcrumbs.css @@ -0,0 +1,70 @@ +/* Provided by the Sphinx base theme template at build time, +styles exclusively for the ansys-sphinx-theme classes. */ + +@import "ansys-sphinx-theme.css"; + +/* +############ +breadcrumbs +############ +*/ + +#breadcrumbs-spacer { + border-right: 10rem solid var(--pst-color-background); +} + +div.related > ul { + padding: 10px 0 20px 0; +} + +*, +:after, +:before { + box-sizing: border-box; +} + +/* +########################### +vesrion warning announcement +############################ +*/ + +#announcement_msg { + display: flex; + justify-content: center; + position: relative; + width: 100%; + padding: 0.5rem 12.5%; + text-align: center; +} + +#announcement_msg :after { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + background-color: rgb(223, 95, 114); + opacity: 0.2; + content: ""; + z-index: -1; +} + +#announcement_msg :empty { + display: none; +} + +#announcement_msg p { + font-weight: bold; + margin: auto; + color: black; +} + +html[data-theme="dark"] #announcement_msg :after { + background-color: lightpink; + opacity: 0.5; +} + +#announcement_msg a { + color: #1e6ddc; +} diff --git a/_static/css/meilisearch.css b/_static/css/meilisearch.css new file mode 100644 index 00000000..4782f112 --- /dev/null +++ b/_static/css/meilisearch.css @@ -0,0 +1,217 @@ +@import "https://cdn.jsdelivr.net/npm/docs-searchbar.js@latest/dist/cdn/docs-searchbar.min.css"; +@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"; + +div[data-ds-theme] .searchbox { + overflow-y: scroll; + margin: auto; +} + +.docs-searchbar-suggestion--category-header { + background-color: var(--pst-color-border); + border-radius: 7px; + text-align: left; +} + +/* Styles for screens with a width of 576px or less */ +@media screen and (max-width: 576px) { + div[data-ds-theme] .searchbox { + width: 100%; + max-width: 100%; + } + + .dsb-suggestions { + width: 100%; + max-width: 480px; + } + + .meilisearch-autocomplete .dsb-dropdown-menu [class^="dsb-dataset-"] { + max-width: 580px; + min-width: 430px; + width: 450px; + } + + .bd-search input { + width: 270px !important; + } + + .index-select { + width: 180px; + } + + .meilisearch-autocomplete .docs-searchbar-suggestion { + width: 450px; + } +} + +/* Styles for screens with a width of 1200px or less */ +@media screen and (min-width: 1200px) { + div[data-ds-theme] .searchbox { + max-width: 800px; + } + + .dsb-suggestions { + width: 100%; + max-width: 580px; + } + + div[data-ds-theme] .meilisearch-autocomplete .dsb-dropdown-menu { + max-width: 870px; + min-width: 580px; + width: 850px; + } + + .bd-search input { + width: 600px !important; + } + .index-select { + width: 250px; + } + + div[data-ds-theme] .meilisearch-autocomplete .docs-searchbar-suggestion { + width: 735px; + } +} + +div[data-ds-theme] .searchbox input { + height: 32px; + border-radius: 8px; + font-size: 18px; + font-family: "Open Sans", sans-serif; + box-shadow: 0px 0px 8px darkgrey; +} + +.docs-searchbar-footer { + display: none; +} + +.docs-searchbar-footer { + display: none; +} + +[class*="docs-searchbar-suggestion"] { + text-decoration: none; +} + +.docs-searchbar-suggestion--highlight { + box-shadow: none !important; +} + +.container { + display: flex; + justify-content: center; + align-items: center; +} + +div[data-ds-theme] .meilisearch-autocomplete { + text-align: center; + color: var(--pst-color-text-base); +} + +#search-bar-input { + background-color: var(--pst-color-background); + border: 1px solid var(--pst-color-border); + border-radius: 0.25rem; + color: var(--pst-color-text-base); + font-size: var(--pst-font-size-icon); + position: relative; + padding-left: 3rem; +} + +.meilisearch-autocomplete::before { + content: "\f002"; + font-family: "Font Awesome 6 Free"; + position: absolute; + left: 8px; + top: 50%; + transform: translateY(-50%); + font-size: 1rem; + color: var(--pst-color-border); +} + +.index-select { + color: var(--pst-color-text-base); + background: var(--pst-color-background); + height: 47px; + border: 1px solid var(--pst-color-border); + border-radius: 0.25rem; + font-size: 20px; + font-family: "Open Sans", sans-serif; + box-shadow: 0px 0px 20px var(--pst-color-border); + padding: 0 10px 0px 10px; + margin-left: 5px; +} + +div[data-ds-theme] + .meilisearch-autocomplete + .dsb-dropdown-menu + [class^="dsb-dataset-"] { + position: relative; + border: 1px solid #d9d9d9; + background: var(--pst-color-background); + border-radius: 4px; + padding: 0 8px 8px; +} +div[data-ds-theme] .meilisearch-autocomplete .dsb-dropdown-menu { + max-height: 600px !important; + overflow-y: auto !important; + border: 1px solid #ccc; +} + +div[data-ds-theme] .meilisearch-autocomplete .docs-searchbar-suggestion { + background: var(--pst-color-background); +} + +div[data-ds-theme] + .meilisearch-autocomplete + .docs-searchbar-suggestion--highlight { + color: var(--pst-color-info) !important; + font-weight: 900; + background: transparent; + padding: 0 0.05em; +} + +div[data-ds-theme] + .meilisearch-autocomplete + .docs-searchbar-suggestion--subcategory-column { + width: None; + text-align: left; +} + +div[data-ds-theme] + .meilisearch-autocomplete + .docs-searchbar-suggestion--content { + display: block; +} + +div[data-ds-theme] .meilisearch-autocomplete .docs-searchbar-suggestion--title { + margin-bottom: 4px; + color: var(--pst-color-text-base); + font-size: 0.9em; + font-weight: 700; + width: 100%; +} + +/* Styling the scrollbar */ +div[data-ds-theme] + .meilisearch-autocomplete + .dsb-dropdown-menu::-webkit-scrollbar { + width: 0.5rem; + height: 0.5rem; +} + +div[data-ds-theme] + .meilisearch-autocomplete + .dsb-dropdown-menu::-webkit-scrollbar-thumb { + background: var(--pst-color-text-base); + border-radius: inherit; +} + +div[data-ds-theme] + .meilisearch-autocomplete + .dsb-dropdown-menu::-webkit-scrollbar-track { + background: var(--pst-color-background); +} + +.bd-search { + margin-bottom: 200px; +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..1378c7c1 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.dev0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/fonts/SourceSansPro-Light.ttf b/_static/fonts/SourceSansPro-Light.ttf new file mode 100644 index 00000000..348871ac Binary files /dev/null and b/_static/fonts/SourceSansPro-Light.ttf differ diff --git a/_static/fonts/SourceSansPro-Regular.ttf b/_static/fonts/SourceSansPro-Regular.ttf new file mode 100644 index 00000000..b422bf43 Binary files /dev/null and b/_static/fonts/SourceSansPro-Regular.ttf differ diff --git a/_static/fonts/SourceSansPro-SemiBold.ttf b/_static/fonts/SourceSansPro-SemiBold.ttf new file mode 100644 index 00000000..2908e0d7 Binary files /dev/null and b/_static/fonts/SourceSansPro-SemiBold.ttf differ diff --git a/_static/js/download_target_blank.js b/_static/js/download_target_blank.js new file mode 100644 index 00000000..9f84c70f --- /dev/null +++ b/_static/js/download_target_blank.js @@ -0,0 +1,6 @@ +/* Add target="_blank" attribute to all hyperlinks generated by the ReST :download: directive. + * This will ensure the links open in a new tab. */ + +$(document).ready(function () { + $("a.download").attr("target", "_blank"); +}); diff --git a/_static/js/table.js b/_static/js/table.js new file mode 100644 index 00000000..a080ead1 --- /dev/null +++ b/_static/js/table.js @@ -0,0 +1,3 @@ +$(document).ready(function () { + $("table.datatable").DataTable(); +}); diff --git a/_static/jupyter-sphinx.css b/_static/jupyter-sphinx.css new file mode 100644 index 00000000..87724dfc --- /dev/null +++ b/_static/jupyter-sphinx.css @@ -0,0 +1,123 @@ +/* Stylesheet for jupyter-sphinx + +These styles mimic the Jupyter HTML styles. + +The default CSS (Cascading Style Sheet) class structure of jupyter-sphinx +is the following: + +jupyter_container + code_cell (optional) + stderr (optional) + output (optional) + +If the code_cell is not displayed, then there is not a jupyter_container, and +the output is provided without CSS. + +This stylesheet attempts to override the defaults of all packaged Sphinx themes +to display jupter-sphinx cells in a Jupyter-like style. + +If you want to adjust the styles, add additional custom CSS to override these +styles. + +After a build, this stylesheet is loaded from ./_static/jupyter-sphinx.css . + +*/ + + +div.jupyter_container { + padding: .4em; + margin: 0 0 .4em 0; + background-color: #FFFF; + border: 1px solid #CCC; + -moz-box-shadow: 2px 2px 4px rgba(87, 87, 87, 0.2); + -webkit-box-shadow: 2px 2px 4px rgba(87, 87, 87, 0.2); + box-shadow: 2px 2px 4px rgba(87, 87, 87, 0.2); +} +.jupyter_container div.code_cell { + border: 1px solid #cfcfcf; + border-radius: 2px; + background-color: #f7f7f7; + margin: 0 0; + overflow: auto; +} + +.jupyter_container div.code_cell pre { + padding: 4px; + margin: 0 0; + background-color: #f7f7f7; + border: none; + background: none; + box-shadow: none; + -webkit-box-shadow: none; /* for nature */ + -moz-box-shadow: none; /* for nature */ +} + +.jupyter_container div.code_cell * { + margin: 0 0; +} +div.jupyter_container div.highlight { + background-color: #f7f7f7; /* for haiku */ +} +div.jupyter_container { + padding: 0; + margin: 0; +} + +/* Prevent alabaster breaking highlight alignment */ +div.jupyter_container .hll { + padding: 0; + margin: 0; +} + +/* overrides for sphinx_rtd_theme */ +.rst-content .jupyter_container div[class^='highlight'], +.document .jupyter_container div[class^='highlight'], +.rst-content .jupyter_container pre.literal-block { + border:none; + margin: 0; + padding: 0; + background: none; + padding: 3px; + background-color: transparent; +} +/* restore Mathjax CSS, as it assumes a vertical margin. */ +.jupyter_container .MathJax_Display { + margin: 1em 0em; + text-align: center; +} +.jupyter_container .stderr { + background-color: #FCC; + border: none; + padding: 3px; +} +.jupyter_container .output { + border: none; +} +.jupyter_container div.output pre { + background-color: white; + background: none; + padding: 4px; + border: none; + box-shadow: none; + -webkit-box-shadow: none; /* for nature */ + -moz-box-shadow: none; /* for nature */ +} +.jupyter_container .code_cell td.linenos { + text-align: right; + padding: 4px 4px 4px 8px; + border-right: 1px solid #cfcfcf; + color: #999; +} +.jupyter_container .output .highlight { + background-color: #ffffff; +} +/* combine sequential jupyter cells, + by moving sequential ones up higher on y-axis */ +div.jupyter_container + div.jupyter_container { + margin: -.5em 0 .4em 0; +} + +/* Fix for sphinx_rtd_theme spacing after jupyter_container #91 */ +.rst-content .jupyter_container { + margin: 0 0 24px 0; +} diff --git a/_static/jupyterlite_badge_logo.svg b/_static/jupyterlite_badge_logo.svg new file mode 100644 index 00000000..5de36d7f --- /dev/null +++ b/_static/jupyterlite_badge_logo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/no_image.png b/_static/no_image.png new file mode 100644 index 00000000..8c2d48d5 Binary files /dev/null and b/_static/no_image.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pyansys-logo-black-cropped.png b/_static/pyansys-logo-black-cropped.png new file mode 100644 index 00000000..e28bc3de Binary files /dev/null and b/_static/pyansys-logo-black-cropped.png differ diff --git a/_static/pyansys-logo-white-cropped.png b/_static/pyansys-logo-white-cropped.png new file mode 100644 index 00000000..91b50f98 Binary files /dev/null and b/_static/pyansys-logo-white-cropped.png differ diff --git a/_static/pyansys_dark.png b/_static/pyansys_dark.png new file mode 100644 index 00000000..b0ff9e19 Binary files /dev/null and b/_static/pyansys_dark.png differ diff --git a/_static/pyansys_dark_square.png b/_static/pyansys_dark_square.png new file mode 100644 index 00000000..2b271562 Binary files /dev/null and b/_static/pyansys_dark_square.png differ diff --git a/_static/pyansys_light.png b/_static/pyansys_light.png new file mode 100644 index 00000000..9f31babd Binary files /dev/null and b/_static/pyansys_light.png differ diff --git a/_static/pyansys_light_square.png b/_static/pyansys_light_square.png new file mode 100644 index 00000000..3e0706a5 Binary files /dev/null and b/_static/pyansys_light_square.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..997797f2 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #7971292e } +html[data-theme="light"] .highlight { background: #fefefe; color: #545454 } +html[data-theme="light"] .highlight .c { color: #797129 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #d91e18 } /* Error */ +html[data-theme="light"] .highlight .k { color: #7928a1 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #797129 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #545454 } /* Name */ +html[data-theme="light"] .highlight .o { color: #008000 } /* Operator */ +html[data-theme="light"] .highlight .p { color: #545454 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #797129 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #797129 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #797129 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #797129 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #797129 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #797129 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #007faa } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #007faa } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #007faa } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #7928a1 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #7928a1 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #7928a1 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #7928a1 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #7928a1 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #797129 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #797129 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #797129 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #008000 } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #797129 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #797129 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #007faa } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #007faa } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #797129 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #008000 } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #7928a1 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #007faa } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #797129 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #545454 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #545454 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #007faa } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #007faa } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #d91e18 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #7928a1 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #545454 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #545454 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #797129 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #797129 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #797129 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #797129 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #797129 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #008000 } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #008000 } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #008000 } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #008000 } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #008000 } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #008000 } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #008000 } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #008000 } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #008000 } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #008000 } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #d91e18 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #008000 } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #007faa } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #797129 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #007faa } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #d91e18 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #d91e18 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #d91e18 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #797129 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #797129 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/scripts/bootstrap.js b/_static/scripts/bootstrap.js new file mode 100644 index 00000000..766173ab --- /dev/null +++ b/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>m,beforeWrite:()=>A,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>Dt,createPopperBase:()=>Lt,createPopperLite:()=>$t,detectOverflow:()=>mt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>T,offset:()=>wt,placements:()=>g,popper:()=>d,popperGenerator:()=>kt,popperOffsets:()=>At,preventOverflow:()=>Et,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>u,write:()=>E});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",u="viewport",d="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),g=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),m="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",A="beforeWrite",E="write",C="afterWrite",T=[m,_,b,v,y,w,A,E,C];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function S(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function M(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!M()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,u=n.height/o;return{width:h,height:u,top:c,right:l+h,bottom:c+u,left:l,x:l,y:c}}function W(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function F(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function B(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function q(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function R(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function V(t){return L(t)&&"fixed"!==B(t).position?t.offsetParent:null}function K(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===B(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===B(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&L(t)&&"fixed"===B(t).position)return null;var i=R(t);for(D(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=B(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return I(t,N(e,i))}function Y(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,u=r.modifiersData.popperOffsets,d=S(r.placement),f=Q(d),p=[o,s].indexOf(d)>=0?"height":"width";if(h&&u){var g=function(t,e){return Y("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),m=W(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-u[f]-r.rects.popper[p],y=u[f]-r.rects.reference[f],w=K(h),A=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,E=v/2-y/2,C=g[_],T=A-m[p]-g[b],O=A/2-m[p]/2+E,x=X(C,O,T),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&F(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,u=t.offsets,d=t.position,f=t.gpuAcceleration,p=t.adaptive,g=t.roundOffsets,m=t.isFixed,_=u.x,b=void 0===_?0:_,v=u.y,y=void 0===v?0:v,w="function"==typeof g?g({x:b,y}):{x:b,y};b=w.x,y=w.y;var A=u.hasOwnProperty("x"),E=u.hasOwnProperty("y"),C=o,T=i,O=window;if(p){var k=K(r),L="clientHeight",D="clientWidth";k===x(r)&&"static"!==B(k=q(r)).position&&"absolute"===d&&(L="scrollHeight",D="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(T=n,y-=(m&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(C=s,b-=(m&&k===O&&O.visualViewport?O.visualViewport.width:k[D])-a.width,b*=f?1:-1)}var $,S=Object.assign({position:d},p&&Z),I=!0===g?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},S,(($={})[T]=E?"0":"",$[C]=A?"0":"",$.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",$)):Object.assign({},S,((e={})[T]=E?y+"px":"",e[C]=A?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:S(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return H(q(t)).left+lt(t).scrollLeft}function ht(t){var e=B(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:ut(R(t))}function dt(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(dt(R(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===u?ft(function(t,e){var i=x(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=M();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=q(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===B(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,r=t.reference,a=t.element,h=t.placement,u=h?S(h):null,d=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(u){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var g=u?Q(u):null;if(null!=g){var m="y"===g?"height":"width";switch(d){case l:e[g]=e[g]-(r[m]/2-a[m]/2);break;case c:e[g]=e[g]+(r[m]/2-a[m]/2)}}return e}function mt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,g=o.boundary,m=void 0===g?h:g,_=o.rootBoundary,b=void 0===_?u:_,v=o.elementContext,y=void 0===v?d:v,w=o.altBoundary,A=void 0!==w&&w,E=o.padding,C=void 0===E?0:E,T=Y("number"!=typeof C?C:U(C,a)),x=y===d?f:d,D=t.rects.popper,$=t.elements[A?x:y],S=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=dt(R(t)),i=["absolute","fixed"].indexOf(B(t).position)>=0&&L(t)?K(t):t;return k(i)?e.filter((function(t){return k(t)&&F(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k($)?$:$.contextElement||q(t.elements.popper),m,b,p),P=H(t.elements.reference),j=gt({reference:P,element:D,strategy:"absolute",placement:l}),M=ft(Object.assign({},D,j)),W=y===d?M:P,z={top:S.top-W.top+T.top,bottom:W.bottom-S.bottom+T.bottom,left:S.left-W.left+T.left,right:W.right-S.right+T.right},V=t.modifiersData.offset;if(y===d&&V){var Q=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=Q[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var u=c.mainAxis,d=void 0===u||u,f=c.altAxis,m=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,A=c.flipVariations,E=void 0===A||A,C=c.allowedAutoPlacements,T=e.options.placement,O=S(T),x=_||(O!==T&&E?function(t){if(S(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(T):[ot(T)]),k=[T].concat(x).reduce((function(t,i){return t.concat(S(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,u=J(n),d=u?l?p:p.filter((function(t){return J(t)===u})):a,f=d.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=d);var m=f.reduce((function(e,i){return e[i]=mt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[S(i)],e}),{});return Object.keys(m).sort((function(t,e){return m[t]-m[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:E,allowedAutoPlacements:C}):i)}),[]),L=e.rects.reference,D=e.rects.popper,$=new Map,I=!0,N=k[0],P=0;P' + + '' + + _("Hide Search Matches") + + "
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/styles/bootstrap.css b/_static/styles/bootstrap.css new file mode 100644 index 00000000..0aa5f54f --- /dev/null +++ b/_static/styles/bootstrap.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,:after,:before{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:var(--bs-body-bg);color:var(--bs-body-color);font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}hr{border:0;border-top:1px solid;color:inherit;margin:1rem 0;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem;margin-top:0}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-bottom:1rem;margin-top:0}abbr[title]{cursor:help;text-decoration:underline dotted;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-bottom:1rem;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;font-size:.875em;margin-bottom:1rem;margin-top:0;overflow:auto}pre code{color:inherit;font-size:inherit;word-break:normal}code{word-wrap:break-word;color:var(--bs-code-color);font-size:.875em}a>code{color:inherit}kbd{background-color:var(--bs-body-color);border-radius:.25rem;color:var(--bs-body-bg);font-size:.875em;padding:.1875rem .375rem}kbd kbd{font-size:1em;padding:0}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{border-collapse:collapse;caption-side:bottom}caption{color:#6c757d;padding-bottom:.5rem;padding-top:.5rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border:0 solid;border-color:inherit}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{-webkit-appearance:button;font:inherit}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-6{font-size:2.5rem}}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;font-size:.875em;margin-bottom:1rem;margin-top:-1rem}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#6c757d;font-size:.875em}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-left:auto;margin-right:auto;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media(min-width:540px){.container,.container-sm{max-width:540px}}@media(min-width:720px){.container,.container-md,.container-sm{max-width:720px}}@media(min-width:960px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1400px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:540px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:720px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:960px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0,0,0,.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0,0,0,.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0,0,0,.075);border-color:var(--bs-table-border-color);color:var(--bs-table-color);margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped-columns>:not(caption)>tr>:nth-child(2n),.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000}.table-primary,.table-secondary{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000}.table-info,.table-success{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000}.table-danger,.table-warning{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000}.table-dark,.table-light{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media(max-width:539.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:719.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:959.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.25rem;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.875rem;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-text{color:#6c757d;font-size:.875em;margin-top:.25rem}.form-control{appearance:none;background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.375rem;color:#212529;display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{background-color:#fff;border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);color:#212529;outline:0}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{background-color:#e9ecef;border:0 solid;border-color:inherit;border-inline-end-width:1px;border-radius:0;color:#212529;margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;pointer-events:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#212529;display:block;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.25rem;font-size:.875rem;min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem}.form-control-sm::file-selector-button{margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{border-radius:.5rem;font-size:1.25rem;min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem}.form-control-lg::file-selector-button{margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{height:calc(1.5em + .75rem + 2px);padding:.375rem;width:3rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{-moz-padding-start:calc(.75rem - 3px);appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;color:#212529;display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem 2.25rem .375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{border-radius:.25rem;font-size:.875rem;padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.form-select-lg{border-radius:.5rem;font-size:1.25rem;padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.form-check{display:block;margin-bottom:.125rem;min-height:1.5rem;padding-left:1.5em}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-left:0;padding-right:1.5em;text-align:right}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{appearance:none;background-color:#fff;background-position:50%;background-repeat:no-repeat;background-size:contain;border:1px solid rgba(0,0,0,.25);height:1em;margin-top:.25em;print-color-adjust:exact;vertical-align:top;width:1em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E");border-color:#0d6efd}.form-check-input:disabled{filter:none;opacity:.5;pointer-events:none}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E");background-position:0;border-radius:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out;width:2em}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%2386b7fe'/%3E%3C/svg%3E")}.form-switch .form-check-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{filter:none;opacity:.65;pointer-events:none}.form-range{appearance:none;background-color:transparent;height:1.5rem;padding:0;width:100%}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;height:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{border:1px solid transparent;height:100%;left:0;overflow:hidden;padding:1rem .75rem;pointer-events:none;position:absolute;text-align:start;text-overflow:ellipsis;top:0;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out;white-space:nowrap;width:100%}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-select{padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{flex:1 1 auto;min-width:0;position:relative;width:1%}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem;color:#212529;display:flex;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{border-radius:.5rem;font-size:1.25rem;padding:.5rem 1rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{border-radius:.25rem;font-size:.875rem;padding:.25rem .5rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-bottom-right-radius:0;border-top-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-bottom-left-radius:0;border-top-left-radius:0}.valid-feedback{color:#198754;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(25,135,84,.9);border-radius:.375rem;color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#198754;padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3.75rem + 1.5em)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{color:#dc3545;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(220,53,69,.9);border-radius:.375rem;color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"),url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3.75rem + 1.5em)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 hsla(0,0%,100%,.15),0 1px 1px rgba(0,0,0,.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);background-color:var(--bs-btn-bg);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);color:var(--bs-btn-color);cursor:pointer;display:inline-block;font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;user-select:none;vertical-align:middle}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);color:var(--bs-btn-hover-color)}.btn-check+.btn:hover{background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color);color:var(--bs-btn-color)}.btn:focus-visible{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);color:var(--bs-btn-hover-color);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color);color:var(--bs-btn-active-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);color:var(--bs-btn-disabled-color);opacity:var(--bs-btn-disabled-opacity);pointer-events:none}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{height:auto;transition:width .35s ease;width:0}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0,0,0,.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;background-clip:padding-box;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);color:var(--bs-dropdown-color);display:none;font-size:var(--bs-dropdown-font-size);list-style:none;margin:0;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);position:absolute;text-align:left;z-index:var(--bs-dropdown-zindex)}.dropdown-menu[data-bs-popper]{left:0;margin-top:var(--bs-dropdown-spacer);top:100%}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media(min-width:540px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media(min-width:720px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media(min-width:960px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{bottom:100%;margin-bottom:var(--bs-dropdown-spacer);margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{left:100%;margin-left:var(--bs-dropdown-spacer);margin-top:0;right:auto;top:0}.dropend .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{left:auto;margin-right:var(--bs-dropdown-spacer);margin-top:0;right:100%;top:0}.dropstart .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{border-top:1px solid var(--bs-dropdown-divider-bg);height:0;margin:var(--bs-dropdown-divider-margin-y) 0;opacity:1;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:var(--bs-dropdown-link-color);display:block;font-weight:400;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);text-align:inherit;text-decoration:none;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:var(--bs-dropdown-link-hover-bg);color:var(--bs-dropdown-link-hover-color)}.dropdown-item.active,.dropdown-item:active{background-color:var(--bs-dropdown-link-active-bg);color:var(--bs-dropdown-link-active-color);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:var(--bs-dropdown-link-disabled-color);pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:var(--bs-dropdown-header-color);display:block;font-size:.875rem;margin-bottom:0;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);white-space:nowrap}.dropdown-item-text{color:var(--bs-dropdown-link-color);display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:hsla(0,0%,100%,.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{color:var(--bs-nav-link-color);display:block;font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);cursor:default;pointer-events:none}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{background:none;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius);margin-bottom:calc(var(--bs-nav-tabs-border-width)*-1)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:var(--bs-nav-tabs-link-hover-border-color);isolation:isolate}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{background-color:transparent;border-color:transparent;color:var(--bs-nav-link-disabled-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color);color:var(--bs-nav-tabs-link-active-color)}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:calc(var(--bs-nav-tabs-border-width)*-1)}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:none;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{background-color:transparent;border-color:transparent;color:var(--bs-nav-link-disabled-color)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:var(--bs-nav-pills-link-active-bg);color:var(--bs-nav-pills-link-active-color)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0,0,0,.55);--bs-navbar-hover-color:rgba(0,0,0,.7);--bs-navbar-disabled-color:rgba(0,0,0,.3);--bs-navbar-active-color:rgba(0,0,0,.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0,0,0,.9);--bs-navbar-brand-hover-color:rgba(0,0,0,.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.55)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");--bs-navbar-toggler-border-color:rgba(0,0,0,.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl{align-items:center;display:flex;flex-wrap:inherit;justify-content:space-between}.navbar-brand{color:var(--bs-navbar-brand-color);font-size:var(--bs-navbar-brand-font-size);margin-right:var(--bs-navbar-brand-margin-end);padding-bottom:var(--bs-navbar-brand-padding-y);padding-top:var(--bs-navbar-brand-padding-y);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-bottom:.5rem;padding-top:.5rem}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);color:var(--bs-navbar-color);font-size:var(--bs-navbar-toggler-font-size);line-height:1;padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:540px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{background-color:transparent!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:720px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{background-color:transparent!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:960px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{background-color:transparent!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{background-color:transparent!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{background-color:transparent!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}.navbar-dark{--bs-navbar-color:hsla(0,0%,100%,.55);--bs-navbar-hover-color:hsla(0,0%,100%,.75);--bs-navbar-disabled-color:hsla(0,0%,100%,.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:hsla(0,0%,100%,.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.55)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0,0,0,.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;word-wrap:break-word;background-clip:border-box;background-color:var(--bs-card-bg);border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);display:flex;flex-direction:column;height:var(--bs-card-height);min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{color:var(--bs-card-color);flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(var(--bs-card-title-spacer-y)*-.5)}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);margin-bottom:0;padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{border-bottom:0;margin-bottom:calc(var(--bs-card-cap-padding-y)*-1);margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.card-img-overlay{border-radius:var(--bs-card-inner-border-radius);bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width:540px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:#212529;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:#212529;--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13,110,253,.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{align-items:center;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;color:var(--bs-accordion-btn-color);display:flex;font-size:1rem;overflow-anchor:none;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);position:relative;text-align:left;transition:var(--bs-accordion-transition);width:100%}@media(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width)*-1) 0 var(--bs-accordion-border-color);color:var(--bs-accordion-active-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);content:"";flex-shrink:0;height:var(--bs-accordion-btn-icon-width);margin-left:auto;transition:var(--bs-accordion-btn-icon-transition);width:var(--bs-accordion-btn-icon-width)}@media(prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{border-color:var(--bs-accordion-btn-focus-border-color);box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0;z-index:3}.accordion-header{margin-bottom:0}.accordion-item{background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);color:var(--bs-accordion-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:var(--bs-accordion-inner-border-radius);border-bottom-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-left:0;border-radius:0;border-right:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);display:flex;flex-wrap:wrap;font-size:var(--bs-breadcrumb-font-size);list-style:none;margin-bottom:var(--bs-breadcrumb-margin-bottom);padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/");float:left;padding-right:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13,110,253,.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;list-style:none;padding-left:0}.page-link{background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);color:var(--bs-pagination-color);display:block;font-size:var(--bs-pagination-font-size);padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);position:relative;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color);color:var(--bs-pagination-hover-color);z-index:2}.page-link:focus{background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);color:var(--bs-pagination-focus-color);outline:0;z-index:3}.active>.page-link,.page-link.active{background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color);color:var(--bs-pagination-active-color);z-index:3}.disabled>.page-link,.page-link.disabled{background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color);color:var(--bs-pagination-disabled-color);pointer-events:none}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-bottom-left-radius:var(--bs-pagination-border-radius);border-top-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-bottom-right-radius:var(--bs-pagination-border-radius);border-top-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;border-radius:var(--bs-badge-border-radius);color:var(--bs-badge-color);display:inline-block;font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);text-align:center;vertical-align:baseline;white-space:nowrap}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);color:var(--bs-alert-color);margin-bottom:var(--bs-alert-margin-bottom);padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);position:relative}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{padding:1.25rem 1rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0,0,0,.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);font-size:var(--bs-progress-font-size);height:var(--bs-progress-height)}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:var(--bs-progress-bar-bg);color:var(--bs-progress-bar-color);flex-direction:column;justify-content:center;text-align:center;transition:var(--bs-progress-bar-transition);white-space:nowrap}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0,0,0,.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{color:var(--bs-list-group-action-color);text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:var(--bs-list-group-action-hover-bg);color:var(--bs-list-group-action-hover-color);text-decoration:none;z-index:1}.list-group-item-action:active{background-color:var(--bs-list-group-action-active-bg);color:var(--bs-list-group-action-active-color)}.list-group-item{background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);color:var(--bs-list-group-color);display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);position:relative;text-decoration:none}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:var(--bs-list-group-disabled-bg);color:var(--bs-list-group-disabled-color);pointer-events:none}.list-group-item.active{background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color);color:var(--bs-list-group-active-color);z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:var(--bs-list-group-border-width);margin-top:calc(var(--bs-list-group-border-width)*-1)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}@media(min-width:540px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:720px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:960px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cfe2ff;color:#084298}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#bacbe6;color:#084298}.list-group-item-primary.list-group-item-action.active{background-color:#084298;border-color:#084298;color:#fff}.list-group-item-secondary{background-color:#e2e3e5;color:#41464b}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#cbccce;color:#41464b}.list-group-item-secondary.list-group-item-action.active{background-color:#41464b;border-color:#41464b;color:#fff}.list-group-item-success{background-color:#d1e7dd;color:#0f5132}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#bcd0c7;color:#0f5132}.list-group-item-success.list-group-item-action.active{background-color:#0f5132;border-color:#0f5132;color:#fff}.list-group-item-info{background-color:#cff4fc;color:#055160}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#badce3;color:#055160}.list-group-item-info.list-group-item-action.active{background-color:#055160;border-color:#055160;color:#fff}.list-group-item-warning{background-color:#fff3cd;color:#664d03}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#e6dbb9;color:#664d03}.list-group-item-warning.list-group-item-action.active{background-color:#664d03;border-color:#664d03;color:#fff}.list-group-item-danger{background-color:#f8d7da;color:#842029}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#dfc2c4;color:#842029}.list-group-item-danger.list-group-item-action.active{background-color:#842029;border-color:#842029;color:#fff}.list-group-item-light{background-color:#fefefe;color:#636464}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#e5e5e5;color:#636464}.list-group-item-light.list-group-item-action.active{background-color:#636464;border-color:#636464;color:#fff}.list-group-item-dark{background-color:#d3d3d4;color:#141619}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#bebebf;color:#141619}.list-group-item-dark.list-group-item-action.active{background-color:#141619;border-color:#141619;color:#fff}.btn-close{background:transparent url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3E%3C/svg%3E") 50%/1em auto no-repeat;border:0;border-radius:.375rem;box-sizing:content-box;color:#000;height:1em;opacity:.5;padding:.25em;width:1em}.btn-close:hover{color:#000;opacity:.75;text-decoration:none}.btn-close:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1;outline:0}.btn-close.disabled,.btn-close:disabled{opacity:.25;pointer-events:none;user-select:none}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:hsla(0,0%,100%,.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0,0,0,.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:hsla(0,0%,100%,.85);--bs-toast-header-border-color:rgba(0,0,0,.05);background-clip:padding-box;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);border-radius:var(--bs-toast-border-radius);box-shadow:var(--bs-toast-box-shadow);color:var(--bs-toast-color);font-size:var(--bs-toast-font-size);max-width:100%;pointer-events:auto;width:var(--bs-toast-max-width)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;max-width:100%;pointer-events:none;position:absolute;width:max-content;z-index:var(--bs-toast-zindex)}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{align-items:center;background-clip:padding-box;background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));color:var(--bs-toast-header-color);display:flex;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x)}.toast-header .btn-close{margin-left:var(--bs-toast-padding-x);margin-right:calc(var(--bs-toast-padding-x)*-.5)}.toast-body{word-wrap:break-word;padding:var(--bs-toast-padding-x)}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;display:none;height:100%;left:0;outline:0;overflow-x:hidden;overflow-y:auto;position:fixed;top:0;width:100%;z-index:var(--bs-modal-zindex)}.modal-dialog{margin:var(--bs-modal-margin);pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{background-clip:padding-box;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);color:var(--bs-modal-color);display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;background-color:var(--bs-backdrop-bg);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:var(--bs-backdrop-zindex)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{align-items:center;border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--bs-modal-header-padding)}.modal-header .btn-close{margin:calc(var(--bs-modal-header-padding-y)*-.5) calc(var(--bs-modal-header-padding-x)*-.5) calc(var(--bs-modal-header-padding-y)*-.5) auto;padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5)}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{flex:1 1 auto;padding:var(--bs-modal-padding);position:relative}.modal-footer{align-items:center;background-color:var(--bs-modal-footer-bg);border-bottom-left-radius:var(--bs-modal-inner-border-radius);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width:540px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0,0,0,.15)}.modal-dialog{margin-left:auto;margin-right:auto;max-width:var(--bs-modal-width)}.modal-sm{--bs-modal-width:300px}}@media(min-width:960px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:539.98px){.modal-fullscreen-sm-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:719.98px){.modal-fullscreen-md-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:959.98px){.modal-fullscreen-lg-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;word-wrap:break-word;display:block;font-family:var(--bs-font-sans-serif);font-size:var(--bs-tooltip-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:var(--bs-tooltip-margin);opacity:0;padding:var(--bs-tooltip-arrow-height);text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:var(--bs-tooltip-zindex)}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;height:var(--bs-tooltip-arrow-height);width:var(--bs-tooltip-arrow-width)}.tooltip .tooltip-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{border-top-color:var(--bs-tooltip-bg);border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;top:-1px}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{height:var(--bs-tooltip-arrow-width);left:0;width:var(--bs-tooltip-arrow-height)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{border-right-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;right:-1px}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{border-bottom-color:var(--bs-tooltip-bg);border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);bottom:-1px}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{height:var(--bs-tooltip-arrow-width);right:0;width:var(--bs-tooltip-arrow-height)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{border-left-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);left:-1px}.tooltip-inner{background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius);color:var(--bs-tooltip-color);max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);text-align:center}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0,0,0,.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);word-wrap:break-word;background-clip:padding-box;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);display:block;font-family:var(--bs-font-sans-serif);font-size:var(--bs-popover-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:var(--bs-popover-max-width);text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:var(--bs-popover-zindex)}.popover .popover-arrow{display:block;height:var(--bs-popover-arrow-height);width:var(--bs-popover-arrow-width)}.popover .popover-arrow:after,.popover .popover-arrow:before{border:0 solid transparent;content:"";display:block;position:absolute}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{border-top-color:var(--bs-popover-bg);bottom:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{height:var(--bs-popover-arrow-width);left:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{border-right-color:var(--bs-popover-bg);left:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{border-bottom-color:var(--bs-popover-bg);top:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg);content:"";display:block;left:50%;margin-left:calc(var(--bs-popover-arrow-width)*-.5);position:absolute;top:0;width:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{height:var(--bs-popover-arrow-width);right:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{border-left-color:var(--bs-popover-bg);right:var(--bs-popover-border-width)}.popover-header{background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);color:var(--bs-popover-header-color);font-size:var(--bs-popover-header-font-size);margin-bottom:0;padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x)}.popover-header:empty{display:none}.popover-body{color:var(--bs-popover-body-color);padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{opacity:0;transition:opacity 0s .6s;z-index:0}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;display:inline-block;height:2rem;width:2rem}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;position:absolute;right:0;z-index:2}.carousel-indicators [data-bs-target]{background-clip:padding-box;background-color:#fff;border:0;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;padding:0;text-indent:-999px;transition:opacity .6s ease;width:30px}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:1.25rem;color:#fff;left:15%;padding-bottom:1.25rem;padding-top:1.25rem;position:absolute;right:15%;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);border-radius:50%;display:inline-block;height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);width:var(--bs-spinner-width)}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border-right-color:currentcolor;border:var(--bs-spinner-border-width) solid;border-right:var(--bs-spinner-border-width) solid transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,.075)}@media(max-width:539.98px){.offcanvas-sm{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:539.98px)and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:539.98px){.offcanvas-sm.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-sm.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-sm.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom,.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-sm.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media(min-width:540px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{background-color:transparent!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:719.98px){.offcanvas-md{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:719.98px)and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:719.98px){.offcanvas-md.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-md.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-md.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom,.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-md.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media(min-width:720px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{background-color:transparent!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:959.98px){.offcanvas-lg{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:959.98px)and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:959.98px){.offcanvas-lg.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-lg.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-lg.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom,.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-lg.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media(min-width:960px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{background-color:transparent!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:1199.98px){.offcanvas-xl{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:1199.98px)and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-xl.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-xl.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom,.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-xl.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{background-color:transparent!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}.offcanvas{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:transform .3s ease-in-out;visibility:hidden;z-index:var(--bs-offcanvas-zindex)}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;transform:translateY(-100%)}.offcanvas.offcanvas-bottom,.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{align-items:center;display:flex;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{margin-bottom:calc(var(--bs-offcanvas-padding-y)*-.5);margin-right:calc(var(--bs-offcanvas-padding-x)*-.5);margin-top:calc(var(--bs-offcanvas-padding-y)*-.5);padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5)}.offcanvas-title{line-height:1.5;margin-bottom:0}.offcanvas-body{flex-grow:1;overflow-y:auto;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.placeholder{background-color:currentcolor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{animation:placeholder-wave 2s linear infinite;mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-size:200% 100%}@keyframes placeholder-wave{to{mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-secondary{background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-success{background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-info{background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-warning{background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-danger{background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-light{background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-dark{background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important;color:#fff!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio:before{content:"";display:block;padding-top:var(--bs-aspect-ratio)}.ratio>*{height:100%;left:0;position:absolute;top:0;width:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}.sticky-top{top:0}.sticky-bottom,.sticky-top{position:sticky;z-index:1020}.sticky-bottom{bottom:0}@media(min-width:540px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{bottom:0;position:sticky;z-index:1020}}@media(min-width:720px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{bottom:0;position:sticky;z-index:1020}}@media(min-width:960px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{bottom:0;position:sticky;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{bottom:0;position:sticky;z-index:1020}}.hstack{align-items:center;flex-direction:row}.hstack,.vstack{align-self:stretch;display:flex}.vstack{flex:1 1 auto;flex-direction:column}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.stretched-link:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{align-self:stretch;background-color:currentcolor;display:inline-block;min-height:1em;opacity:.25;width:1px}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:hsla(0,0%,100%,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important}.rounded-end,.rounded-top{border-top-right-radius:var(--bs-border-radius)!important}.rounded-bottom,.rounded-end{border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom,.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media(min-width:540px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-bottom:0!important;margin-top:0!important}.my-sm-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-sm-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-sm-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-sm-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-sm-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-sm-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-bottom:0!important;padding-top:0!important}.py-sm-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-sm-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-sm-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-sm-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-sm-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:720px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-bottom:0!important;margin-top:0!important}.my-md-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-md-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-md-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-md-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-md-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-md-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-bottom:0!important;padding-top:0!important}.py-md-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-md-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-md-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-md-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-md-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:960px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-bottom:0!important;margin-top:0!important}.my-lg-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-lg-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-lg-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-lg-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-lg-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-lg-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-bottom:0!important;padding-top:0!important}.py-lg-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-lg-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-lg-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-lg-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-lg-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-bottom:0!important;margin-top:0!important}.my-xl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-xl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-xl-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-xl-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-xl-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-xl-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-bottom:0!important;padding-top:0!important}.py-xl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-xl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-xl-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-xl-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-xl-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} \ No newline at end of file diff --git a/_static/styles/pydata-sphinx-theme.css b/_static/styles/pydata-sphinx-theme.css new file mode 100644 index 00000000..ca295d8a --- /dev/null +++ b/_static/styles/pydata-sphinx-theme.css @@ -0,0 +1 @@ +html{--pst-header-height:4rem;--pst-header-article-height:calc(var(--pst-header-height)*2/3);--pst-sidebar-secondary:17rem;--pst-font-size-base:1rem;--pst-font-size-h1:2.5rem;--pst-font-size-h2:2rem;--pst-font-size-h3:1.75rem;--pst-font-size-h4:1.5rem;--pst-font-size-h5:1.25rem;--pst-font-size-h6:1.1rem;--pst-font-size-milli:0.9rem;--pst-sidebar-font-size:0.9rem;--pst-sidebar-font-size-mobile:1.1rem;--pst-sidebar-header-font-size:1.2rem;--pst-sidebar-header-font-weight:600;--pst-admonition-font-weight-heading:600;--pst-font-weight-caption:300;--pst-font-weight-heading:400;--pst-font-family-base-system:-apple-system,BlinkMacSystemFont,Segoe UI,"Helvetica Neue",Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;--pst-font-family-monospace-system:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--pst-font-family-base:var(--pst-font-family-base-system);--pst-font-family-heading:var(--pst-font-family-base-system);--pst-font-family-monospace:var(--pst-font-family-monospace-system);--pst-font-size-icon:1.5rem;--pst-icon-check-circle:"";--pst-icon-info-circle:"";--pst-icon-exclamation-triangle:"";--pst-icon-exclamation-circle:"";--pst-icon-times-circle:"";--pst-icon-lightbulb:"";--pst-icon-download:"";--pst-icon-angle-left:"";--pst-icon-angle-right:"";--pst-icon-external-link:"";--pst-icon-search-minus:"";--pst-icon-github:"";--pst-icon-gitlab:"";--pst-icon-share:"";--pst-icon-bell:"";--pst-icon-pencil:"";--pst-breadcrumb-divider:"";--pst-icon-admonition-default:var(--pst-icon-bell);--pst-icon-admonition-note:var(--pst-icon-info-circle);--pst-icon-admonition-attention:var(--pst-icon-exclamation-circle);--pst-icon-admonition-caution:var(--pst-icon-exclamation-triangle);--pst-icon-admonition-warning:var(--pst-icon-exclamation-triangle);--pst-icon-admonition-danger:var(--pst-icon-exclamation-triangle);--pst-icon-admonition-error:var(--pst-icon-times-circle);--pst-icon-admonition-hint:var(--pst-icon-lightbulb);--pst-icon-admonition-tip:var(--pst-icon-lightbulb);--pst-icon-admonition-important:var(--pst-icon-exclamation-circle);--pst-icon-admonition-seealso:var(--pst-icon-share);--pst-icon-admonition-todo:var(--pst-icon-pencil);--pst-icon-versionmodified-default:var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-added:var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-changed:var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-deprecated:var(--pst-icon-exclamation-circle);font-size:var(--pst-font-size-base);scroll-padding-top:calc(var(--pst-header-height) + 1rem)}body{background-color:var(--pst-color-background);color:var(--pst-color-text-base);display:flex;flex-direction:column;font-family:var(--pst-font-family-base);font-weight:400;line-height:1.65;min-height:100vh}body::-webkit-scrollbar{height:.5rem;width:.5rem}body::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}body::-webkit-scrollbar-track{background:transparent}body::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}body::-webkit-scrollbar-thumb:hover,body:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}body::-webkit-scrollbar-track{background:var(--pst-color-background)}p{color:var(--pst-color-text-base);font-size:1em;margin-bottom:1.15rem}p.rubric{border-bottom:1px solid var(--pst-color-border)}p.centered{text-align:center}a{word-wrap:break-word;color:var(--pst-color-link);text-decoration:none}a:hover{color:var(--pst-color-link-hover);text-decoration:underline}a.headerlink{color:var(--pst-color-warning);font-size:.8em;margin-left:.2em;opacity:.4;padding:0 4px;text-decoration:none;transition:all .2s ease-out;user-select:none}a.headerlink:hover{opacity:1}a.github:before,a.gitlab:before{color:var(--pst-color-text-muted);font:var(--fa-font-brands);margin-right:.25rem}a.github:before{content:var(--pst-icon-github)}a.gitlab:before{content:var(--pst-icon-gitlab)}.heading-style,h1,h2,h3,h4,h5,h6{font-family:var(--pst-font-family-heading);font-weight:var(--pst-font-weight-heading);line-height:1.15;margin:2.75rem 0 1.05rem}h1{font-size:var(--pst-font-size-h1);margin-top:0}h1,h2{color:var(--pst-color-primary)}h2{font-size:var(--pst-font-size-h2)}h3{font-size:var(--pst-font-size-h3)}h3,h4{color:var(--pst-color-text-base)}h4{font-size:var(--pst-font-size-h4)}h5{font-size:var(--pst-font-size-h5)}h5,h6{color:var(--pst-color-text-base)}h6{font-size:var(--pst-font-size-h6)}.text_small,small{font-size:var(--pst-font-size-milli)}hr{border:0;border-top:1px solid var(--pst-color-border)}code,kbd,pre,samp{font-family:var(--pst-font-family-monospace)}kbd{background-color:var(--pst-color-on-background);color:var(--pst-color-text-muted)}kbd:not(.compound){border:1px solid var(--pst-color-border);box-shadow:1px 1px 1px var(--pst-color-shadow);margin:0 .1rem;padding:.1rem .4rem}code{color:var(--pst-color-inline-code)}pre{background-color:var(--pst-color-surface);border:1px solid var(--pst-color-border);border-radius:.25rem;color:var(--pst-color-text-base);line-height:1.2em;margin:1.5em 0;padding:1rem}pre::-webkit-scrollbar{height:.5rem;width:.5rem}pre::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}pre::-webkit-scrollbar-track{background:transparent}pre::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}pre::-webkit-scrollbar-thumb:hover,pre:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}pre .linenos{opacity:.5;padding-right:10px}.skip-link{background-color:var(--pst-color-background);border-bottom:1px solid var(--pst-color-border);color:var(--pst-color-link);left:0;padding:.5rem;position:fixed;right:0;text-align:center;top:0;transform:translateY(-100%);transition:transform .15s ease-in-out;z-index:1055}.skip-link:focus{transform:translateY(0)}.bd-container{display:flex;flex-grow:1;justify-content:center}.bd-container .bd-container__inner{display:flex}.bd-page-width{width:100%}@media(min-width:960px){.bd-page-width{max-width:88rem}}.bd-header-announcement{align-items:center;display:flex;justify-content:center;min-height:3rem;padding:.5rem 12.5%;position:relative;text-align:center;width:100%}@media(max-width:959.98px){.bd-header-announcement{padding:.5rem 2%}}.bd-header-announcement p{font-weight:700;margin:0}.bd-header-announcement:after{background-color:var(--pst-color-info);content:"";height:100%;left:0;opacity:.2;position:absolute;top:0;width:100%;z-index:-1}.bd-header-announcement:empty{display:none}.bd-main{display:flex;flex-direction:column;flex-grow:1;min-width:0}.bd-main .bd-content{display:flex;height:100%;justify-content:center}.bd-main .bd-content .bd-article-container{display:flex;flex-direction:column;justify-content:start;max-width:60em;overflow-x:auto;padding:1rem;width:100%}@media(min-width:1200px){.bd-main .bd-content .bd-article-container .bd-article{padding-left:2rem;padding-top:1.5rem}}.bd-footer{border-top:1px solid var(--pst-color-border);width:100%}.bd-footer .bd-footer__inner{display:flex;flex-grow:1;margin:auto;padding:1rem}.bd-footer .footer-items__end,.bd-footer .footer-items__start{display:flex;flex-direction:column;gap:.5rem;justify-content:center}.bd-footer .footer-items__end{margin-left:auto;text-align:end}.bd-footer .footer-item p{margin-bottom:0}.bd-footer-article .footer-article-items,.bd-footer-content .footer-content-items{display:flex;flex-direction:column;margin-top:auto}.bd-header{background:var(--pst-color-on-background)!important;box-shadow:0 .125rem .25rem 0 var(--pst-color-shadow);justify-content:center;max-width:100vw;padding:0;position:sticky;top:0;width:100%;z-index:1030}.bd-header .bd-header__inner{align-items:center;display:flex;height:fit-content;padding-left:1rem;padding-right:1rem}.bd-header .navbar-item{align-items:center;display:flex;height:var(--pst-header-height);max-height:var(--pst-header-height)}.bd-header .navbar-header-items{flex-shrink:1}@media(min-width:960px){.bd-header .navbar-header-items{display:flex;flex-grow:1;padding:0 0 0 .5rem}}.bd-header .navbar-header-items__center,.bd-header .navbar-header-items__end,.bd-header .navbar-header-items__start{align-items:center;display:flex;flex-flow:wrap;row-gap:0}.bd-header .navbar-header-items__center,.bd-header .navbar-header-items__end{column-gap:1rem}.bd-header .navbar-header-items__start{flex-shrink:0;gap:.5rem;margin-right:auto}.bd-header .navbar-header-items__end{justify-content:end}.bd-header .navbar-nav{display:flex}@media(min-width:960px){.bd-header .navbar-nav{align-items:center}}.bd-header .navbar-nav li a.nav-link{color:var(--pst-color-text-muted)}.bd-header .navbar-nav li a.nav-link:focus,.bd-header .navbar-nav li a.nav-link:hover{color:var(--pst-color-primary)}.bd-header .navbar-nav>.active>.nav-link{color:var(--pst-color-primary);font-weight:600}.bd-header .navbar-nav .dropdown button{border:none;color:var(--pst-color-text-muted);display:unset}.bd-header .navbar-nav .dropdown .dropdown-menu{background-color:var(--pst-color-on-background);border:1px solid var(--pst-color-border);box-shadow:0 0 .3rem .1rem var(--pst-color-shadow);margin:.5rem 0;min-width:20rem;padding:.5rem 1rem;z-index:1070}.bd-header .navbar-nav .dropdown .dropdown-menu:not(.show){display:none}@media(min-width:960px){.navbar-center-items .navbar-item{display:inline-block}}.toc-entry>.nav-link.active{background-color:transparent;border-left:2px solid var(--pst-color-primary);color:var(--pst-color-primary);font-weight:600}.nav-link:hover{border-style:none}.nav-link.nav-external:after{content:var(--pst-icon-external-link);font:var(--fa-font-solid);font-size:.75em;margin-left:.3em}.bd-navbar-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.bd-header label.sidebar-toggle{align-items:center;color:var(--pst-color-muted);cursor:pointer;display:flex;font-size:var(--pst-font-size-icon);margin-bottom:0}.bd-header label.primary-toggle{padding-right:1rem}@media(min-width:960px){.bd-header label.primary-toggle{display:none}}.bd-header label.secondary-toggle{padding-left:1rem}@media(min-width:1200px){.bd-header label.secondary-toggle{display:none}}.bd-header .navbar-header-items{display:none}@media(min-width:960px){.bd-header .navbar-header-items{display:inherit}}.navbar-persistent--mobile{margin-left:auto}@media(min-width:960px){.navbar-persistent--mobile{display:none}}.navbar-persistent--container{display:none}@media(min-width:960px){.navbar-persistent--container{display:flex}}.header-article__inner{display:flex;padding:0 .5rem}.header-article__inner .header-article-item{height:var(--pst-header-article-height);min-height:var(--pst-header-article-height)}.header-article__inner .header-article-items__end,.header-article__inner .header-article-items__start{align-items:start;display:flex;gap:.5rem}.header-article__inner .header-article-items__end{margin-left:auto}.bd-sidebar-primary{background-color:var(--pst-color-background);border-right:1px solid var(--pst-color-border);display:flex;flex:0 0 auto;flex-direction:column;font-size:var(--pst-sidebar-font-size-mobile);gap:1rem;max-height:calc(100vh - var(--pst-header-height));overflow-y:auto;padding:2rem 1rem 1rem;position:sticky;top:var(--pst-header-height);width:25%}.bd-sidebar-primary::-webkit-scrollbar{height:.5rem;width:.5rem}.bd-sidebar-primary::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}.bd-sidebar-primary::-webkit-scrollbar-track{background:transparent}.bd-sidebar-primary::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}.bd-sidebar-primary::-webkit-scrollbar-thumb:hover,.bd-sidebar-primary:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}@media(min-width:960px){.bd-sidebar-primary{font-size:var(--pst-sidebar-font-size)}}.bd-sidebar-primary .nav-link{font-size:var(--pst-sidebar-font-size-mobile)}.bd-sidebar-primary.no-sidebar{border-right:0}@media(min-width:960px){.bd-sidebar-primary.hide-on-wide{display:none}}.bd-sidebar-primary h1,.bd-sidebar-primary h2,.bd-sidebar-primary h3,.bd-sidebar-primary h4{color:var(--pst-color-text-base)}.bd-sidebar-primary .sidebar-primary-items__end .sidebar-primary-item,.bd-sidebar-primary .sidebar-primary-items__start .sidebar-primary-item{padding:.5rem 0}.bd-sidebar-primary .sidebar-header-items{display:flex;flex-direction:column}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__title{color:var(--pst-color-text-base);font-size:var(--pst-sidebar-header-font-size);font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown button{display:none}.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown .dropdown-menu{background-color:inherit;border:none;display:flex;flex-direction:column;font-size:inherit;margin:0;padding:0}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__center{display:flex;flex-direction:column}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__end{align-items:center;display:flex;gap:.5rem}@media(min-width:960px){.bd-sidebar-primary .sidebar-header-items{display:none}}.bd-sidebar-primary .sidebar-primary-items__start{border-top:1px solid var(--pst-color-border)}@media(min-width:960px){.bd-sidebar-primary .sidebar-primary-items__start{border-top:none}}.bd-sidebar-primary .sidebar-primary-items__end{margin-bottom:1em;margin-top:auto}.bd-sidebar-primary .list-caption{list-style:none;padding-left:0}.bd-sidebar-primary li{position:relative}.bd-sidebar-primary li.has-children>.reference{padding-right:30px}.bd-sidebar-primary label.toctree-toggle{align-items:center;cursor:pointer;display:flex;height:30px;justify-content:center;position:absolute;right:0;top:0;width:30px}.bd-sidebar-primary label.toctree-toggle:hover{background:var(--pst-color-surface)}.bd-sidebar-primary label.toctree-toggle i{display:inline-block;font-size:.75rem;text-align:center}.bd-sidebar-primary label.toctree-toggle i:hover{color:var(--pst-color-primary)}.bd-sidebar-primary .label-parts{height:100%;width:100%}.bd-sidebar-primary .label-parts:hover{background:none}.bd-sidebar-primary .label-parts i{position:absolute;right:0;top:.3em;width:30px}nav.bd-links{margin-right:-1rem}@media(min-width:960px){nav.bd-links{display:block}}nav.bd-links ul{list-style:none}nav.bd-links ul ul{padding:0 0 0 1rem}nav.bd-links li>a{color:var(--pst-color-text-muted);display:block;padding:.25rem 0}nav.bd-links li>a:hover{background-color:transparent;color:var(--pst-color-primary);text-decoration:none}nav.bd-links li>a.reference.external:after{content:var(--pst-icon-external-link);font:var(--fa-font-solid);font-size:.75em;margin-left:.3em}nav.bd-links .active:hover>a,nav.bd-links .active>a{color:var(--pst-color-primary);font-weight:600}nav.bd-links p.bd-links__title{font-size:var(--pst-sidebar-header-font-size)}nav.bd-links p.bd-links__title,nav.bd-links p.caption{font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}nav.bd-links p.caption{color:var(--pst-color-text-base);font-size:var(--pst-sidebar-font-size-mobile);margin-top:1.25rem;position:relative}nav.bd-links p.caption:first-child{margin-top:0}@media(min-width:960px){nav.bd-links p.caption{font-size:var(--pst-sidebar-font-size)}}.bd-sidebar-secondary{background-color:var(--pst-color-background);display:flex;flex-direction:column;flex-shrink:0;font-size:var(--pst-sidebar-font-size-mobile);max-height:calc(100vh - var(--pst-header-height));order:2;overflow-y:auto;padding:2rem 1rem 1rem;position:sticky;top:var(--pst-header-height);width:var(--pst-sidebar-secondary)}@media(min-width:1200px){.bd-sidebar-secondary{font-size:var(--pst-sidebar-font-size)}}.bd-sidebar-secondary::-webkit-scrollbar{height:.5rem;width:.5rem}.bd-sidebar-secondary::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}.bd-sidebar-secondary::-webkit-scrollbar-track{background:transparent}.bd-sidebar-secondary::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}.bd-sidebar-secondary::-webkit-scrollbar-thumb:hover,.bd-sidebar-secondary:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}.sidebar-secondary-item{padding:.5rem}@media(min-width:1200px){.sidebar-secondary-item{border-left:1px solid var(--pst-color-border);padding-left:1rem}}.sidebar-secondary-item i{padding-right:.5rem}input.sidebar-toggle{display:none}label.overlay{background-color:#000;height:0;left:0;opacity:.5;position:fixed;top:0;transition:opacity .2s ease-out;width:0;z-index:1050}input#__primary:checked+label.overlay.overlay-primary,input#__secondary:checked+label.overlay.overlay-secondary{height:100vh;width:100vw}input#__primary:checked~.bd-container .bd-sidebar-primary{margin-left:0;visibility:visible}input#__secondary:checked~.bd-container .bd-sidebar-secondary{margin-right:0;visibility:visible}@media(min-width:960px){label.sidebar-toggle.primary-toggle{display:none}input#__primary:checked+label.overlay.overlay-primary{height:0;width:0}.bd-sidebar-primary{margin-left:0;visibility:visible}}@media(max-width:959.98px){.bd-sidebar-primary{flex-grow:.75;height:100vh;left:0;margin-left:-75%;max-height:100vh;max-width:350px;position:fixed;top:0;transition:visibility .2s ease-out,margin .2s ease-out;visibility:hidden;width:75%;z-index:1055}}@media(max-width:1199.98px){.bd-sidebar-secondary{flex-grow:.75;height:100vh;margin-right:-75%;max-height:100vh;max-width:350px;position:fixed;right:0;top:0;transition:visibility .2s ease-out,margin .2s ease-out;visibility:hidden;width:75%;z-index:1055}}ul.bd-breadcrumbs{display:flex;flex-wrap:wrap;font-size:.8rem;list-style:none;padding-left:0}ul.bd-breadcrumbs li.breadcrumb-item{align-items:center;display:flex;font-weight:700}ul.bd-breadcrumbs li.breadcrumb-item a{color:var(--pst-color-link)}ul.bd-breadcrumbs li.breadcrumb-item:not(.breadcrumb-home):before{color:var(--pst-color-text-muted);content:var(--pst-breadcrumb-divider);font:var(--fa-font-solid);font-size:.8rem;padding:0 .5rem}.navbar-icon-links{column-gap:1rem;display:flex;flex-direction:row;flex-wrap:wrap}.navbar-icon-links li.nav-item a.nav-link{padding-left:0;padding-right:0}.navbar-icon-links a span{align-items:center;display:flex}.navbar-icon-links i.fa-brands,.navbar-icon-links i.fa-regular,.navbar-icon-links i.fa-solid{font-size:var(--pst-font-size-icon);font-style:normal;vertical-align:middle}.navbar-icon-links i.fa-square-twitter:before{color:#55acee}.navbar-icon-links i.fa-square-gitlab:before{color:#548}.navbar-icon-links i.fa-bitbucket:before{color:#0052cc}.navbar-icon-links img.icon-link-image{border-radius:.2rem;height:1.5em}.navbar-brand{align-items:center;display:flex;flex-shrink:0;gap:.5rem;height:var(--pst-header-height);margin:0;max-height:var(--pst-header-height);padding:.5rem 0;position:relative;width:auto}.navbar-brand p{margin-bottom:0}.navbar-brand img{height:100%;max-width:100%;width:auto}.navbar-nav ul{display:block;list-style:none}.navbar-nav ul ul{padding:0 0 0 1rem}.navbar-nav li{display:flex;flex-direction:column}.navbar-nav li a{align-items:center;color:var(--pst-color-text-muted);display:flex;height:100%;padding-bottom:.25rem;padding-top:.25rem}.navbar-nav li a:hover{border-style:none;text-decoration-line:none}.navbar-nav li a:focus,.navbar-nav li a:hover,.navbar-nav li.current>a{color:var(--pst-color-primary)}.navbar-nav li.current>a{font-weight:600}.navbar-nav .toctree-checkbox{display:none;position:absolute}.navbar-nav .toctree-checkbox~ul{display:none}.navbar-nav .toctree-checkbox~label i{transform:rotate(0deg)}.navbar-nav .toctree-checkbox:checked~ul{display:block}.navbar-nav .toctree-checkbox:checked~label i{transform:rotate(180deg)}.bd-header .navbar-nav>p.sidebar-header-items__title{display:none}.page-toc .section-nav{border-bottom:none;padding-left:0}.page-toc .section-nav ul{padding-left:1rem}.page-toc .nav-link{font-size:var(--pst-sidebar-font-size-mobile)}@media(min-width:1200px){.page-toc .nav-link{font-size:var(--pst-sidebar-font-size)}}.page-toc .onthispage{color:var(--pst-color-text-base);font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}.prev-next-area{width:100%}.prev-next-area p{line-height:1.3em;margin:0 .3em}.prev-next-area i{font-size:1.2em}.prev-next-area a{align-items:center;border:none;color:var(--pst-color-text-muted);display:flex;max-width:45%;overflow-x:hidden;padding:10px;text-decoration:none}.prev-next-area a p.prev-next-title{color:var(--pst-color-primary);font-size:1.1em;font-weight:var(--pst-admonition-font-weight-heading)}.prev-next-area a:hover p.prev-next-title{text-decoration:underline}.prev-next-area a .prev-next-info{flex-direction:column;margin:0 .5em}.prev-next-area a .prev-next-info .prev-next-subtitle{text-transform:capitalize}.prev-next-area a.left-prev{float:left}.prev-next-area a.right-next{float:right}.prev-next-area a.right-next div.prev-next-info{text-align:right}.bd-search{margin-left:-15px;margin-right:-15px;padding:1rem 15px;position:relative}.bd-search .icon{color:var(--pst-color-border);left:25px;position:absolute}.bd-search i.fa-solid.fa-magnifying-glass{color:var(--pst-color-text-muted);left:1.6rem;position:absolute}.bd-search input{background-color:var(--pst-color-background);border:1px solid var(--pst-color-border);border-radius:.25rem;color:var(--pst-color-text-base);padding-left:2.5rem}.bd-search input::placeholder{color:var(--pst-color-border)}.bd-search input:active,.bd-search input:focus{background-color:var(--pst-color-background);color:var(--pst-color-text-base)}.bd-search input::-webkit-search-cancel-button,.bd-search input::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.bd-search .search-button__kbd-shortcut{color:var(--pst-color-border);display:flex;position:absolute;right:2em}.search-button{align-content:center;align-items:center;color:var(--pst-color-text-muted);display:flex;padding:0}.search-button:hover{color:var(--pst-color-primary)}.search-button i{font-size:1.3rem}.search-button__overlay,.search-button__search-container{display:none}.search-button__wrapper.show .search-button__search-container{display:flex;left:50%;margin-top:.5rem;max-width:800px;position:fixed;right:1rem;top:30%;transform:translate(-50%,-50%);width:90%;z-index:1055}.search-button__wrapper.show .search-button__overlay{background-color:#000;display:flex;height:100%;left:0;opacity:.5;position:fixed;top:0;width:100%;z-index:1050}.search-button__wrapper.show form.bd-search{flex-grow:1;padding-bottom:0;padding-top:0}.search-button__wrapper.show i,.search-button__wrapper.show input{font-size:var(--pst-font-size-icon)}div#searchbox p.highlight-link{box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important;margin:1rem 0;width:fit-content}@media(min-width:1200px){div#searchbox p.highlight-link{margin-left:2rem}}div#searchbox p.highlight-link a{background-color:var(--pst-color-primary);border-radius:.25rem;color:#fff;font-size:1.25rem;padding:.75rem;transition:box-shadow .25s ease-out}div#searchbox p.highlight-link a:hover{box-shadow:inset 0 0 50px 50px rgba(0,0,0,.25);text-decoration:none}div#searchbox p.highlight-link a:before{color:unset;content:var(--pst-icon-search-minus);font:var(--fa-font-solid);margin-right:.5rem}.theme-switch-button{border-color:var(--pst-color-on-background);font-size:calc(var(--pst-font-size-icon) - .1rem);margin:0 -.5rem;padding:0}.theme-switch-button span{color:var(--pst-color-text-muted);display:none;padding:.5rem}.theme-switch-button span:active,.theme-switch-button span:focus,.theme-switch-button span:hover{text-decoration:none}.theme-switch-button:active,.theme-switch-button:hover{background-color:var(--pst-color-on-surface)!important;border-color:var(--pst-color-on-background)!important}.theme-switch-button:active a,.theme-switch-button:hover a{color:var(--pst-color-text-muted)}.bd-sidebar-primary .theme-switch-button{border-color:var(--pst-color-background)}.bd-sidebar-primary .theme-switch-button:active,.bd-sidebar-primary .theme-switch-button:hover{border-color:var(--pst-color-background)!important}html[data-mode=auto] .theme-switch-button span[data-mode=auto],html[data-mode=dark] .theme-switch-button span[data-mode=dark],html[data-mode=light] .theme-switch-button span[data-mode=light]{display:flex}button.btn.version-switcher__button{border-color:var(--pst-color-border);color:var(--pst-color-text-base);margin-bottom:1em}@media(min-width:960px){button.btn.version-switcher__button{margin-bottom:unset}}button.btn.version-switcher__button:active{border-color:var(--pst-color-border);color:var(--pst-color-text-base)}.version-switcher__menu{border-color:var(--pst-color-border);border-radius:var(--bs-dropdown-border-radius)}.version-switcher__menu a.list-group-item{background-color:var(--pst-color-on-background);color:var(--pst-color-text-base);padding:.75rem 1.25rem}.version-switcher__menu a.list-group-item:not(:last-child){border-bottom:1px solid var(--pst-color-border)}.version-switcher__menu a.list-group-item:hover{background-color:var(--pst-color-surface)}.version-switcher__menu a.list-group-item.active{color:var(--pst-color-primary)}.version-switcher__menu a.list-group-item.active span:before{background-color:var(--pst-color-primary);content:"";height:100%;left:0;opacity:.1;position:absolute;top:0;width:100%}.version-switcher__menu,button.version-switcher__button{font-size:1.1em}@media(min-width:960px){.version-switcher__menu,button.version-switcher__button{font-size:unset}}nav.page-toc{margin-bottom:1rem}.bd-toc .nav .nav,.list-caption .nav{display:none}.bd-toc .nav .nav.visible,.bd-toc .nav>.active>ul,.list-caption .nav.visible,.list-caption>.active>ul,.toc-entry{display:block}.toc-entry a.nav-link{color:var(--pst-color-text-muted);display:block;margin-left:-1rem;padding:.125rem 0 .125rem 1rem}.toc-entry a.nav-link:hover{color:var(--pst-color-primary);text-decoration:none}.toc-entry a.nav-link.active{background-color:transparent;border-left:2px solid var(--pst-color-primary);color:var(--pst-color-primary);font-weight:600}div.deprecated,div.versionadded,div.versionchanged{background-color:var(--pst-color-on-background);border-left:.2rem solid;border-color:var(--pst-color-info);border-radius:.25rem;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important;margin:1.5625em auto;overflow:hidden;padding:0 .6rem;page-break-inside:avoid;position:relative;transition:color .25s,background-color .25s,border-color .25s;vertical-align:middle}div.deprecated>p,div.versionadded>p,div.versionchanged>p{margin-bottom:.6rem;margin-top:.6rem}div.deprecated>p:before,div.versionadded>p:before,div.versionchanged>p:before{background-color:var(--pst-color-info);content:"";height:100%;left:0;opacity:.1;pointer-events:none;position:absolute;top:0;width:100%}div.versionadded{border-color:var(--pst-color-success)}div.versionadded p:before{background-color:var(--pst-color-success)}div.versionchanged{border-color:var(--pst-color-warning)}div.versionchanged p:before{background-color:var(--pst-color-warning)}div.deprecated{border-color:var(--pst-color-danger)}div.deprecated p:before{background-color:var(--pst-color-danger)}span.versionmodified{font-weight:600}span.versionmodified:before{color:var(--pst-color-info);content:var(--pst-icon-versionmodified-default);font:var(--fa-font-solid);margin-right:.6rem}span.versionmodified.added:before{color:var(--pst-color-success);content:var(--pst-icon-versionmodified-added)}span.versionmodified.changed:before{color:var(--pst-color-warning);content:var(--pst-icon-versionmodified-changed)}span.versionmodified.deprecated:before{color:var(--pst-color-danger);content:var(--pst-icon-versionmodified-deprecated)}.sidebar-indices-items{border-top:1px solid var(--pst-color-border);display:flex;flex-direction:column}@media(min-width:960px){.sidebar-indices-items{border-top:none}}.sidebar-indices-items .sidebar-indices-items__title{color:var(--pst-color-text-base);font-size:var(--pst-sidebar-header-font-size);font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}.sidebar-indices-items ul.indices-link{list-style:none;margin-right:-1rem;padding:0}.sidebar-indices-items ul.indices-link li>a{color:var(--pst-color-text-muted);display:block;padding:.25rem 0}.sidebar-indices-items ul.indices-link li>a:hover{background-color:transparent;color:var(--pst-color-primary);text-decoration:none}.bd-sidebar-primary div#rtd-footer-container{bottom:-1rem;margin:-1rem;position:sticky}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge{font-family:var(--pst-font-family-base);font-size:.9em;max-width:unset;position:unset}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .rst-current-version{align-items:center;background-color:var(--pst-color-background);border-top:1px solid var(--pst-color-border);color:var(--pst-color-success);display:flex;gap:.2rem;height:2.5rem;transition:background-color .2s ease-out}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-book{color:var(--pst-color-text-muted);margin-right:auto}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-book:after{color:var(--pst-color-text-base);content:"Read The Docs";font-family:var(--pst-font-family-base);font-weight:var(--pst-admonition-font-weight-heading)}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-caret-down{color:var(--pst-color-text-muted)}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge.shift-up .rst-current-version{border-bottom:1px solid var(--pst-color-border)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions{background-color:var(--pst-color-surface);color:var(--pst-color-text-base)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions dl dd a{color:var(--pst-color-text-muted)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions hr{background-color:var(--pst-color-border)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions small a{color:var(--pst-color-link)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions input{background-color:var(--pst-color-surface);border:1px solid var(--pst-color-border);padding-left:.5rem}.admonition,div.admonition{background-color:var(--pst-color-on-background);border-left:.2rem solid;border-color:var(--pst-color-info);border-radius:.25rem;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important;margin:1.5625em auto;overflow:hidden;padding:0 .6rem .8rem;page-break-inside:avoid}.admonition :last-child,div.admonition :last-child{margin-bottom:0}.admonition p.admonition-title~*,div.admonition p.admonition-title~*{margin-left:1.4rem;margin-right:1.4rem}.admonition>ol,.admonition>ul,div.admonition>ol,div.admonition>ul{margin-left:1em}.admonition>.admonition-title,div.admonition>.admonition-title{font-weight:var(--pst-admonition-font-weight-heading);margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;position:relative}.admonition>.admonition-title:after,div.admonition>.admonition-title:after{color:var(--pst-color-info);content:var(--pst-icon-admonition-default);font:var(--fa-font-solid);height:1rem;left:.5rem;line-height:inherit;opacity:1;position:absolute;width:1rem}.admonition>.admonition-title:before,div.admonition>.admonition-title:before{background-color:var(--pst-color-info);content:"";height:100%;left:0;opacity:.1;pointer-events:none;position:absolute;top:0;width:100%}.admonition>.admonition-title+*,div.admonition>.admonition-title+*{margin-top:.4em}.admonition.attention,div.admonition.attention{border-color:var(--pst-color-attention)}.admonition.attention>.admonition-title:before,div.admonition.attention>.admonition-title:before{background-color:var(--pst-color-attention)}.admonition.attention>.admonition-title:after,div.admonition.attention>.admonition-title:after{color:var(--pst-color-attention);content:var(--pst-icon-admonition-attention)}.admonition.caution,div.admonition.caution{border-color:var(--pst-color-warning)}.admonition.caution>.admonition-title:before,div.admonition.caution>.admonition-title:before{background-color:var(--pst-color-warning)}.admonition.caution>.admonition-title:after,div.admonition.caution>.admonition-title:after{color:var(--pst-color-warning);content:var(--pst-icon-admonition-caution)}.admonition.warning,div.admonition.warning{border-color:var(--pst-color-warning)}.admonition.warning>.admonition-title:before,div.admonition.warning>.admonition-title:before{background-color:var(--pst-color-warning)}.admonition.warning>.admonition-title:after,div.admonition.warning>.admonition-title:after{color:var(--pst-color-warning);content:var(--pst-icon-admonition-warning)}.admonition.danger,div.admonition.danger{border-color:var(--pst-color-danger)}.admonition.danger>.admonition-title:before,div.admonition.danger>.admonition-title:before{background-color:var(--pst-color-danger)}.admonition.danger>.admonition-title:after,div.admonition.danger>.admonition-title:after{color:var(--pst-color-danger);content:var(--pst-icon-admonition-danger)}.admonition.error,div.admonition.error{border-color:var(--pst-color-danger)}.admonition.error>.admonition-title:before,div.admonition.error>.admonition-title:before{background-color:var(--pst-color-danger)}.admonition.error>.admonition-title:after,div.admonition.error>.admonition-title:after{color:var(--pst-color-danger);content:var(--pst-icon-admonition-error)}.admonition.hint,div.admonition.hint{border-color:var(--pst-color-success)}.admonition.hint>.admonition-title:before,div.admonition.hint>.admonition-title:before{background-color:var(--pst-color-success)}.admonition.hint>.admonition-title:after,div.admonition.hint>.admonition-title:after{color:var(--pst-color-success);content:var(--pst-icon-admonition-hint)}.admonition.tip,div.admonition.tip{border-color:var(--pst-color-success)}.admonition.tip>.admonition-title:before,div.admonition.tip>.admonition-title:before{background-color:var(--pst-color-success)}.admonition.tip>.admonition-title:after,div.admonition.tip>.admonition-title:after{color:var(--pst-color-success);content:var(--pst-icon-admonition-tip)}.admonition.important,div.admonition.important{border-color:var(--pst-color-attention)}.admonition.important>.admonition-title:before,div.admonition.important>.admonition-title:before{background-color:var(--pst-color-attention)}.admonition.important>.admonition-title:after,div.admonition.important>.admonition-title:after{color:var(--pst-color-attention);content:var(--pst-icon-admonition-important)}.admonition.note,div.admonition.note{border-color:var(--pst-color-info)}.admonition.note>.admonition-title:before,div.admonition.note>.admonition-title:before{background-color:var(--pst-color-info)}.admonition.note>.admonition-title:after,div.admonition.note>.admonition-title:after{color:var(--pst-color-info);content:var(--pst-icon-admonition-note)}.admonition.seealso,div.admonition.seealso{border-color:var(--pst-color-success)}.admonition.seealso>.admonition-title:before,div.admonition.seealso>.admonition-title:before{background-color:var(--pst-color-success)}.admonition.seealso>.admonition-title:after,div.admonition.seealso>.admonition-title:after{color:var(--pst-color-success);content:var(--pst-icon-admonition-seealso)}.admonition.admonition-todo,div.admonition.admonition-todo{border-color:var(--pst-color-border)}.admonition.admonition-todo>.admonition-title:before,div.admonition.admonition-todo>.admonition-title:before{background-color:var(--pst-color-border)}.admonition.admonition-todo>.admonition-title:after,div.admonition.admonition-todo>.admonition-title:after{color:var(--pst-color-border);content:var(--pst-icon-admonition-todo)}.admonition.sidebar,div.admonition.sidebar{border-width:0 0 0 .2rem;clear:both;float:right;margin-left:.5rem;margin-top:0;max-width:40%}.admonition.sidebar.attention,.admonition.sidebar.important,div.admonition.sidebar.attention,div.admonition.sidebar.important{border-color:var(--pst-color-attention)}.admonition.sidebar.caution,.admonition.sidebar.warning,div.admonition.sidebar.caution,div.admonition.sidebar.warning{border-color:var(--pst-color-warning)}.admonition.sidebar.danger,.admonition.sidebar.error,div.admonition.sidebar.danger,div.admonition.sidebar.error{border-color:var(--pst-color-danger)}.admonition.sidebar.hint,.admonition.sidebar.seealso,.admonition.sidebar.tip,div.admonition.sidebar.hint,div.admonition.sidebar.seealso,div.admonition.sidebar.tip{border-color:var(--pst-color-success)}.admonition.sidebar.note,.admonition.sidebar.todo,div.admonition.sidebar.note,div.admonition.sidebar.todo{border-color:var(--pst-color-info)}.admonition.sidebar p.admonition-title~*,div.admonition.sidebar p.admonition-title~*{margin-left:0;margin-right:0}aside.topic,div.topic,div.topic.contents,nav.contents{background-color:var(--pst-color-surface);border-color:var(--pst-color-border);border-radius:.25rem;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important;display:flex;flex-direction:column;padding:1rem 1.25rem}aside.topic .topic-title,div.topic .topic-title,div.topic.contents .topic-title,nav.contents .topic-title{margin:0 0 .5rem}aside.topic ul.simple,div.topic ul.simple,div.topic.contents ul.simple,nav.contents ul.simple{padding-left:1rem}aside.topic ul.simple ul,div.topic ul.simple ul,div.topic.contents ul.simple ul,nav.contents ul.simple ul{padding-left:2em}aside.sidebar{background-color:var(--pst-color-surface);border:1px solid var(--pst-color-border);border-radius:.25rem;margin-left:.5rem;padding:0}aside.sidebar>:last-child{padding-bottom:1rem}aside.sidebar p.sidebar-title{border-bottom:1px solid var(--pst-color-border);font-family:var(--pst-font-family-heading);font-weight:var(--pst-admonition-font-weight-heading);margin-bottom:0;padding-bottom:.5rem;padding-top:.5rem;position:relative}aside.sidebar>:not(.sidebar-title):first-child,aside.sidebar>p.sidebar-title+*{margin-top:1rem}aside.sidebar>*{padding-left:1rem;padding-right:1rem}p.rubric{display:flex;flex-direction:column}.seealso dd{margin-bottom:0;margin-top:0}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{background-color:var(--pst-color-surface);padding:1px 8px 1px 5px;white-space:nowrap}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.sig{font-family:var(--pst-font-family-monospace)}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.c .m,.sig.c .s,.sig.c .sc,.sig.cpp .k,.sig.cpp .kt,.sig.cpp .m,.sig.cpp .s,.sig.cpp .sc{color:var(--pst-color-text-base)}.sig-name{color:var(--pst-color-inline-code)}dt:target,span.highlighted{background-color:var(--pst-color-target)}.viewcode-back{font-family:var(--pst-font-family-base)}.viewcode-block:target{background-color:var(--pst-color-target);border-bottom:1px solid var(--pst-color-border);border-top:1px solid var(--pst-color-border);position:relative}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>dl.simple>dt{display:flex}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl.field-list{display:grid;grid-template-columns:unset}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dt.field-even,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dt.field-odd{background-color:var(--pst-color-surface);margin-bottom:.1rem;margin-top:.2rem}div.highlight,div.literal-block-wrapper,div[class*=highlight-]{border-radius:.25rem;display:flex;flex-direction:column;width:unset}div.literal-block-wrapper{border:1px solid var(--pst-color-border);border-radius:.25rem}div.literal-block-wrapper div.code-block-caption{border-bottom:1px solid var(--pst-color-border);font-size:1rem;font-weight:var(--pst-font-weight-caption);margin:0;padding:.5rem}div.literal-block-wrapper div.code-block-caption a.headerlink{font-size:inherit}div.literal-block-wrapper div[class*=highlight-]{border-radius:0;margin:0}div.literal-block-wrapper div[class*=highlight-] pre{border:none;box-shadow:none}code.literal{background-color:var(--pst-color-surface);border:1px solid var(--pst-color-on-surface);border-radius:.25rem;padding:.1rem .25rem}figure a.headerlink{font-size:inherit;position:absolute}figure:hover a.headerlink{visibility:visible}figure figcaption{color:var(--pst-color-text-muted);font-family:var(--pst-font-family-heading);font-weight:var(--pst-font-weight-caption);margin-left:auto;margin-right:auto}figure figcaption table.table{margin-left:auto;margin-right:auto;width:fit-content}dt.label>span.brackets:not(:only-child):before{content:"["}dt.label>span.brackets:not(:only-child):after{content:"]"}a.footnote-reference{font-size:small;vertical-align:super}aside.footnote{margin-bottom:.5rem}aside.footnote:last-child{margin-bottom:1rem}aside.footnote span.backrefs,aside.footnote span.label{font-weight:700}aside.footnote:target{background-color:var(--pst-color-target)}div.doctest>div.highlight span.gp,span.linenos,table.highlighttable td.linenos{user-select:none;-webkit-user-select:text;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}dd{margin-bottom:10px;margin-left:30px;margin-top:3px}ol,ul{padding-inline-start:2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}blockquote{border-left:.25em solid var(--pst-color-border);border-radius:.25rem;padding:1em;position:relative}blockquote,blockquote p{color:var(--pst-color-text-muted)}blockquote .line-block{margin:0}blockquote p:last-child{margin-bottom:0}blockquote:before{background-color:var(--pst-color-border);content:"";height:100%;left:0;opacity:.1;pointer-events:none;position:absolute;top:0;width:100%;z-index:-1}span.guilabel{border:1px solid var(--pst-color-info);border-radius:4px;color:var(--pst-color-info);font-size:80%;font-weight:700;margin:auto 2px;padding:2.4px 6px;position:relative}span.guilabel:before{background-color:var(--pst-color-info);content:"";height:100%;left:0;opacity:.1;pointer-events:none;position:absolute;top:0;width:100%}a.reference.download:before{color:var(--pst-color-text-muted);content:var(--pst-icon-download);font:var(--fa-font-solid);font-size:.8em;padding:0 .25em}table{display:table;margin-left:auto;margin-right:auto;max-width:100%;overflow:auto;width:fit-content}table::-webkit-scrollbar{height:.5rem;width:.5rem}table::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}table::-webkit-scrollbar-track{background:transparent}table::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}table::-webkit-scrollbar-thumb:hover,table:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}table.table-right{margin-right:0}table.table-left{margin-left:0}table caption{caption-side:top;color:var(--pst-color-text-muted);text-align:center}td.text-align\:left,th.text-align\:left{text-align:left}td.text-align\:right,th.text-align\:right{text-align:right}td.text-align\:center,th.text-align\:center{text-align:center}.toctree-wrapper p.caption{font-size:1.5em;margin-bottom:0}.toctree-wrapper>ul{padding-left:0}.toctree-wrapper li[class^=toctree-l]{list-style:none;margin-bottom:.2em}.toctree-wrapper li[class^=toctree-l]>a{font-size:1.1em;list-style:none}.toctree-wrapper li[class^=toctree-l]>ul{list-style:none;padding-inline-start:1.5em}.toctree-wrapper .toctree-l1>a{font-size:1.3em}div.topic.contents ul.simple,nav.contents ul.simple{list-style:none;padding-left:0}div.math,span.math{align-items:center;display:flex;max-width:100%;overflow:hidden}span.math{display:inline-flex}div.math{flex-direction:row-reverse;gap:.5em}div.math span.eqno a.headerlink{font-size:1em;position:relative}div.math mjx-container{flex-grow:1;overflow:auto;padding-bottom:.2rem}div.math mjx-container::-webkit-scrollbar{height:.5rem;width:.5rem}div.math mjx-container::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}div.math mjx-container::-webkit-scrollbar-track{background:transparent}div.math mjx-container::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}div.math mjx-container::-webkit-scrollbar-thumb:hover,div.math mjx-container:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}div.math mjx-container mjx-assistive-mml{height:0}.ablog-sidebar-item h2,.ablog-sidebar-item h3{font-size:var(--pst-sidebar-header-font-size);margin-top:.5rem}.ablog-sidebar-item h2 a,.ablog-sidebar-item h3 a{color:var(--pst-color-text-base)}.ablog-sidebar-item ul{display:flex;flex-direction:column;gap:.5em;list-style:none;margin-bottom:0;overflow-y:hidden;padding-left:0}.ablog-sidebar-item ul.ablog-cloud{flex-direction:row;flex-flow:wrap;gap:.5rem}.ablog-sidebar-item ul.ablog-cloud li{align-items:center;display:flex}.ablog__prev-next{display:flex;font-size:1.2em;padding:1rem 0}.ablog__prev-next>span{display:flex;max-width:45%}.ablog__prev-next>span a{align-items:center;display:flex;gap:1rem;line-height:1.5rem;margin-left:auto}.ablog__prev-next>span a i:before{color:var(--pst-color-text-base)}.ablog__prev-next span.ablog__prev i.fa-arrow-circle-left:before{content:var(--pst-icon-angle-left)}.ablog__prev-next span.ablog__spacer{display:none}.ablog__prev-next span.ablog__next{margin-left:auto;text-align:right}.ablog__prev-next span.ablog__next i.fa-arrow-circle-right:before{content:var(--pst-icon-angle-right)}.ablog__collection,.postlist{padding-left:0}.ablog__collection .ablog-post,.postlist .ablog-post{list-style:none}.ablog__collection .ablog-post .ablog-archive,.postlist .ablog-post .ablog-archive{display:flex;flex-direction:row;flex-wrap:wrap;font-size:.75rem;gap:1rem;list-style:none;padding-left:0}.ablog__collection .ablog-post .ablog-post-title,.postlist .ablog-post .ablog-post-title{font-size:1.25rem;margin-top:0}.ablog__collection .ablog-post .ablog-post-title a,.postlist .ablog-post .ablog-post-title a{font-weight:700}.ablog__collection .ablog-post .ablog-post-expand,.postlist .ablog-post .ablog-post-expand{margin-bottom:.5rem}.docutils.container{margin-left:unset;margin-right:unset;max-width:unset;padding-left:unset;padding-right:unset;width:unset}div.highlight button.copybtn{align-items:center;background-color:unset;background-color:var(--pst-color-surface);border:none;display:flex;justify-content:center}div.highlight button.copybtn:not(.success){color:var(--pst-color-muted)}div.highlight button.copybtn:hover:not(.success){color:var(--pst-color-text)}div.highlight button.copybtn.o-tooltip--left:after{background-color:var(--pst-color-surface);color:var(--pst-color-text)}#ethical-ad-placement .ethical-footer a,#ethical-ad-placement .ethical-footer a:active,#ethical-ad-placement .ethical-footer a:hover,#ethical-ad-placement .ethical-footer a:visited,#ethical-ad-placement .ethical-sidebar a,#ethical-ad-placement .ethical-sidebar a:active,#ethical-ad-placement .ethical-sidebar a:hover,#ethical-ad-placement .ethical-sidebar a:visited{color:var(--pst-color-text-base)}#ethical-ad-placement .ethical-footer,#ethical-ad-placement .ethical-sidebar{background-color:var(--pst-color-background);border:1px solid var(--pst-color-border);border-radius:5px;color:var(--pst-color-text-base);font-size:14px;line-height:20px}.bd-content div.jupyter_container{background-color:unset;border:none;box-shadow:none}.bd-content div.jupyter_container div.highlight,.bd-content div.jupyter_container div.output{border-radius:.25rem}.bd-content div.jupyter_container div.highlight{background-color:var(--pst-color-surface)}.bd-content div.jupyter_container .cell_input,.bd-content div.jupyter_container .cell_output{border-radius:.25rem}.bd-content div.jupyter_container .cell_input pre,.bd-content div.jupyter_container .cell_output pre{padding:1rem}.xr-wrap[hidden]{display:block!important}html:not([data-theme]){--pst-color-primary:#459db9;--pst-color-secondary:#ee9040;--pst-color-info:#459db9;--pst-color-warning:#ee9040;--pst-color-success:#28a745;--pst-color-attention:#ffc107;--pst-color-danger:#dc3545;--pst-color-text-base:#323232;--pst-color-text-muted:#646464;--pst-color-shadow:#d8d8d8;--pst-color-border:#c9c9c9;--pst-color-inline-code:#e83e8c;--pst-color-target:#fbe54e;--pst-color-background:#fff;--pst-color-on-background:#fff;--pst-color-surface:#f5f5f5;--pst-color-on-surface:#e1e1e1;--pst-color-link:var(--pst-color-primary);--pst-color-link-hover:var(--pst-color-warning)}html:not([data-theme]) .only-dark,html:not([data-theme]) .only-dark~figcaption{display:none!important}html[data-theme=light]{--pst-color-attention:#ffc107;--pst-color-text-base:#323232;--pst-color-text-muted:#646464;--pst-color-shadow:#d8d8d8;--pst-color-border:#c9c9c9;--pst-color-inline-code:#e83e8c;--pst-color-target:#fbe54e;--pst-color-background:#fff;--pst-color-on-background:#fff;--pst-color-surface:#f5f5f5;--pst-color-on-surface:#e1e1e1;--pst-color-link:var(--pst-color-primary);--pst-color-link-hover:var(--pst-color-warning)}html[data-theme=light] .only-dark,html[data-theme=light] .only-dark~figcaption{display:none!important}html[data-theme=dark]{--pst-color-attention:#dca90f;--pst-color-text-base:#cecece;--pst-color-text-muted:#a6a6a6;--pst-color-shadow:#212121;--pst-color-border:silver;--pst-color-inline-code:#dd9ec2;--pst-color-target:#472700;--pst-color-background:#121212;--pst-color-on-background:#1e1e1e;--pst-color-surface:#212121;--pst-color-on-surface:#373737;--pst-color-link:var(--pst-color-primary);--pst-color-link-hover:var(--pst-color-warning)}html[data-theme=dark] .only-light,html[data-theme=dark] .only-light~figcaption{display:none!important}html[data-theme=dark] img:not(.only-dark):not(.dark-light){filter:brightness(.8) contrast(1.2)}html[data-theme=dark] .bd-content img:not(.only-dark):not(.dark-light){background:#fff;border-radius:.25rem}html[data-theme=dark] .MathJax_SVG *{fill:var(--pst-color-text-base)}.pst-color-primary{color:var(--pst-color-primary)}.pst-color-secondary{color:var(--pst-color-secondary)}.pst-color-info{color:var(--pst-color-info)}.pst-color-warning{color:var(--pst-color-warning)}.pst-color-success{color:var(--pst-color-success)}.pst-color-attention{color:var(--pst-color-attention)}.pst-color-danger{color:var(--pst-color-danger)}.pst-color-text-base{color:var(--pst-color-text-base)}.pst-color-text-muted{color:var(--pst-color-text-muted)}.pst-color-shadow{color:var(--pst-color-shadow)}.pst-color-border{color:var(--pst-color-border)}.pst-color-inline-code{color:var(--pst-color-inline-code)}.pst-color-target{color:var(--pst-color-target)}.pst-color-background{color:var(--pst-color-background)}.pst-color-on-background{color:var(--pst-color-on-background)}.pst-color-surface{color:var(--pst-color-surface)}.pst-color-on-surface{color:var(--pst-color-on-surface)}html[data-theme=light]{--pst-color-primary:#459db9;--pst-color-primary-text:#fff;--pst-color-primary-highlight:#306e81;--sd-color-primary:var(--pst-color-primary);--sd-color-primary-text:var(--pst-color-primary-text);--sd-color-primary-highlight:var(--pst-color-primary-highlight);--pst-color-secondary:#ee9040;--pst-color-secondary-text:#fff;--pst-color-secondary-highlight:#cf6912;--sd-color-secondary:var(--pst-color-secondary);--sd-color-secondary-text:var(--pst-color-secondary-text);--sd-color-secondary-highlight:var(--pst-color-secondary-highlight);--pst-color-success:#28a745;--pst-color-success-text:#fff;--pst-color-success-highlight:#19692c;--sd-color-success:var(--pst-color-success);--sd-color-success-text:var(--pst-color-success-text);--sd-color-success-highlight:var(--pst-color-success-highlight);--pst-color-info:#459db9;--pst-color-info-text:#fff;--pst-color-info-highlight:#306e81;--sd-color-info:var(--pst-color-info);--sd-color-info-text:var(--pst-color-info-text);--sd-color-info-highlight:var(--pst-color-info-highlight);--pst-color-warning:#ee9040;--pst-color-warning-text:#fff;--pst-color-warning-highlight:#cf6912;--sd-color-warning:var(--pst-color-warning);--sd-color-warning-text:var(--pst-color-warning-text);--sd-color-warning-highlight:var(--pst-color-warning-highlight);--pst-color-danger:#dc3545;--pst-color-danger-text:#fff;--pst-color-danger-highlight:#a71d2a;--sd-color-danger:var(--pst-color-danger);--sd-color-danger-text:var(--pst-color-danger-text);--sd-color-danger-highlight:var(--pst-color-danger-highlight);--pst-color-light:#c9c9c9;--pst-color-light-text:#000;--pst-color-light-highlight:#a3a3a3;--sd-color-light:var(--pst-color-light);--sd-color-light-text:var(--pst-color-light-text);--sd-color-light-highlight:var(--pst-color-light-highlight);--pst-color-muted:#646464;--pst-color-muted-text:#fff;--pst-color-muted-highlight:#3e3e3e;--sd-color-muted:var(--pst-color-muted);--sd-color-muted-text:var(--pst-color-muted-text);--sd-color-muted-highlight:var(--pst-color-muted-highlight);--pst-color-dark:#323232;--pst-color-dark-text:#fff;--pst-color-dark-highlight:#0c0c0c;--sd-color-dark:var(--pst-color-dark);--sd-color-dark-text:var(--pst-color-dark-text);--sd-color-dark-highlight:var(--pst-color-dark-highlight);--pst-color-black:#000;--pst-color-black-text:#fff;--pst-color-black-highlight:#000;--sd-color-black:var(--pst-color-black);--sd-color-black-text:var(--pst-color-black-text);--sd-color-black-highlight:var(--pst-color-black-highlight);--pst-color-white:#fff;--pst-color-white-text:#000;--pst-color-white-highlight:#d9d9d9;--sd-color-white:var(--pst-color-white);--sd-color-white-text:var(--pst-color-white-text);--sd-color-white-highlight:var(--pst-color-white-highlight)}html[data-theme=dark]{--pst-color-primary:#459db9;--pst-color-primary-text:#fff;--pst-color-primary-highlight:#306e81;--sd-color-primary:var(--pst-color-primary);--sd-color-primary-text:var(--pst-color-primary-text);--sd-color-primary-highlight:var(--pst-color-primary-highlight);--pst-color-secondary:#ee9040;--pst-color-secondary-text:#fff;--pst-color-secondary-highlight:#cf6912;--sd-color-secondary:var(--pst-color-secondary);--sd-color-secondary-text:var(--pst-color-secondary-text);--sd-color-secondary-highlight:var(--pst-color-secondary-highlight);--pst-color-success:#488757;--pst-color-success-text:#fff;--pst-color-success-highlight:#2d5537;--sd-color-success:var(--pst-color-success);--sd-color-success-text:var(--pst-color-success-text);--sd-color-success-highlight:var(--pst-color-success-highlight);--pst-color-info:#459db9;--pst-color-info-text:#fff;--pst-color-info-highlight:#306e81;--sd-color-info:var(--pst-color-info);--sd-color-info-text:var(--pst-color-info-text);--sd-color-info-highlight:var(--pst-color-info-highlight);--pst-color-warning:#ee9040;--pst-color-warning-text:#fff;--pst-color-warning-highlight:#cf6912;--sd-color-warning:var(--pst-color-warning);--sd-color-warning-text:var(--pst-color-warning-text);--sd-color-warning-highlight:var(--pst-color-warning-highlight);--pst-color-danger:#cb4653;--pst-color-danger-text:#fff;--pst-color-danger-highlight:#992b36;--sd-color-danger:var(--pst-color-danger);--sd-color-danger-text:var(--pst-color-danger-text);--sd-color-danger-highlight:var(--pst-color-danger-highlight);--pst-color-light:#c9c9c9;--pst-color-light-text:#000;--pst-color-light-highlight:#a3a3a3;--sd-color-light:var(--pst-color-light);--sd-color-light-text:var(--pst-color-light-text);--sd-color-light-highlight:var(--pst-color-light-highlight);--pst-color-muted:#a6a6a6;--pst-color-muted-text:#fff;--pst-color-muted-highlight:gray;--sd-color-muted:var(--pst-color-muted);--sd-color-muted-text:var(--pst-color-muted-text);--sd-color-muted-highlight:var(--pst-color-muted-highlight);--pst-color-dark:#cecece;--pst-color-dark-text:#000;--pst-color-dark-highlight:#a8a8a8;--sd-color-dark:var(--pst-color-dark);--sd-color-dark-text:var(--pst-color-dark-text);--sd-color-dark-highlight:var(--pst-color-dark-highlight);--pst-color-black:#000;--pst-color-black-text:#fff;--pst-color-black-highlight:#000;--sd-color-black:var(--pst-color-black);--sd-color-black-text:var(--pst-color-black-text);--sd-color-black-highlight:var(--pst-color-black-highlight);--pst-color-white:#fff;--pst-color-white-text:#000;--pst-color-white-highlight:#d9d9d9;--sd-color-white:var(--pst-color-white);--sd-color-white-text:var(--pst-color-white-text);--sd-color-white-highlight:var(--pst-color-white-highlight)}html[data-theme=dark],html[data-theme=light]{--sd-color-card-border:var(--pst-color-border)}html[data-theme=light] .sd-shadow-lg,html[data-theme=light] .sd-shadow-md,html[data-theme=light] .sd-shadow-sm,html[data-theme=light] .sd-shadow-xs{box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important}.bd-content .sd-card{border:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-header{background-color:var(--pst-color-panel-background);border-bottom:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-footer{border-top:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-body,.bd-content .sd-card .sd-card-footer{background-color:var(--pst-color-panel-background)}.bd-content .sd-tab-set>input:checked+label,.bd-content .sd-tab-set>input:not(:checked)+label:hover{border-color:var(--pst-color-primary);color:var(--pst-color-primary)}.bd-content .sd-tab-set>input:not(:checked)+label:hover{opacity:.5}.bd-content .sd-tab-set>label{color:var(--pst-color-text-muted)}html .bd-content .sd-tab-set>label:hover{border-color:var(--pst-color-primary);color:var(--pst-color-primary);opacity:.5}details.sd-dropdown{border:0!important;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow)!important}details.sd-dropdown summary.sd-card-header{border:0!important}details.sd-dropdown summary.sd-card-header+div.sd-summary-content{border:0}details.sd-dropdown summary.sd-card-header{align-items:center;background-color:unset!important;border-left:.2rem solid var(--pst-sd-dropdown-color)!important;color:var(--pst-color-text)!important;display:flex;font-weight:600;padding-bottom:.5rem;padding-top:.5rem;position:relative}details.sd-dropdown summary.sd-card-header,details.sd-dropdown summary.sd-card-header+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-card-border)}details.sd-dropdown summary.sd-card-header.sd-bg-primary,details.sd-dropdown summary.sd-card-header.sd-bg-primary+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-primary)}details.sd-dropdown summary.sd-card-header.sd-bg-secondary,details.sd-dropdown summary.sd-card-header.sd-bg-secondary+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-secondary)}details.sd-dropdown summary.sd-card-header.sd-bg-success,details.sd-dropdown summary.sd-card-header.sd-bg-success+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-success)}details.sd-dropdown summary.sd-card-header.sd-bg-info,details.sd-dropdown summary.sd-card-header.sd-bg-info+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-info)}details.sd-dropdown summary.sd-card-header.sd-bg-warning,details.sd-dropdown summary.sd-card-header.sd-bg-warning+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-warning)}details.sd-dropdown summary.sd-card-header.sd-bg-danger,details.sd-dropdown summary.sd-card-header.sd-bg-danger+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-danger)}details.sd-dropdown summary.sd-card-header.sd-bg-light,details.sd-dropdown summary.sd-card-header.sd-bg-light+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-light)}details.sd-dropdown summary.sd-card-header.sd-bg-muted,details.sd-dropdown summary.sd-card-header.sd-bg-muted+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-muted)}details.sd-dropdown summary.sd-card-header.sd-bg-dark,details.sd-dropdown summary.sd-card-header.sd-bg-dark+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-dark)}details.sd-dropdown summary.sd-card-header.sd-bg-black,details.sd-dropdown summary.sd-card-header.sd-bg-black+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-black)}details.sd-dropdown summary.sd-card-header.sd-bg-white,details.sd-dropdown summary.sd-card-header.sd-bg-white+div.sd-summary-content{--pst-sd-dropdown-color:var(--sd-color-white)}details.sd-dropdown summary.sd-card-header:before{background-color:var(--pst-sd-dropdown-color);content:"";height:100%;left:0;opacity:.1;pointer-events:none;position:absolute;top:0;width:100%}details.sd-dropdown summary.sd-card-header+div.sd-summary-content{border-bottom-left-radius:calc(.25rem - 1px);border-left:.2rem solid var(--pst-sd-dropdown-color)!important}details.sd-dropdown summary.sd-card-header span.sd-summary-icon{align-items:center;color:var(--pst-sd-dropdown-color)!important;display:inline-flex}details.sd-dropdown summary.sd-card-header .sd-summary-down,details.sd-dropdown summary.sd-card-header .sd-summary-up{top:.7rem}.bd-content .admonition button.toggle-button{color:inherit}.bd-content details.toggle-details summary{border-left:3px solid var(--pst-color-primary)}html div.rendered_html html .jp-RenderedHTMLCommon table{table-layout:auto}html[data-theme=dark] .bd-content .nboutput .output_area.rendered_html{background-color:var(--pst-color-text-base);border-radius:.25rem;color:var(--pst-color-on-background);padding:.5rem}html[data-theme=dark] .bd-content .nboutput .output_area.stderr{background:var(--pst-color-danger)}div.nblast.container{margin-bottom:1rem}div.cell_output .output{max-width:100%;overflow-x:auto}div.cell_output .output::-webkit-scrollbar{height:.5rem;width:.5rem}div.cell_output .output::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted);border-radius:.25rem}div.cell_output .output::-webkit-scrollbar-track{background:transparent}div.cell_output .output::-webkit-scrollbar-thumb{background:var(--pst-color-on-surface)}div.cell_output .output::-webkit-scrollbar-thumb:hover,div.cell_output .output:hover::-webkit-scrollbar-thumb{background:var(--pst-color-text-muted)}html[data-theme=dark] .bd-content div.cell_output .text_html,html[data-theme=dark] .bd-content div.cell_output img{background-color:var(--pst-color-text-base);border-radius:.25rem;color:var(--pst-color-on-background);padding:.5rem}.bd-content div.cell_input{display:flex;flex-direction:column;justify-content:stretch}.bd-content div.cell_input,.bd-content div.output{border-radius:.25rem}.bd-content div.output table{table-layout:auto}html[data-theme=dark] .bd-content img.leaflet-tile.leaflet-tile-loaded{border-radius:0;padding:0}.bd-search-container div#search-results>h2{font-size:var(--pst-font-size-icon);margin-top:0}.bd-search-container div#search-results p.search-summary{color:var(--pst-color-text-muted)}.bd-search-container ul.search{list-style:none;margin:0}.bd-search-container ul.search li{background-image:none;border-top:1px solid var(--pst-color-text-muted);margin:1rem 0;padding:1rem 0}.bd-search-container ul.search li>a{font-size:1.2em}.bd-search-container ul.search li div.context,.bd-search-container ul.search li p.context{color:var(--pst-color-text-base);margin:.5em 0 0}.bd-search-container ul.search li div.context a:before,.bd-search-container ul.search li p.context a:before{color:var(--pst-color-text-muted);content:"#";padding-right:.2em} \ No newline at end of file diff --git a/_static/styles/theme.css b/_static/styles/theme.css new file mode 100644 index 00000000..4519dd91 --- /dev/null +++ b/_static/styles/theme.css @@ -0,0 +1,2 @@ +/* Provided by Sphinx's 'basic' theme, and included in the final set of assets */ +@import "../basic.css"; diff --git a/_static/twemoji.css b/_static/twemoji.css new file mode 100644 index 00000000..878d070d --- /dev/null +++ b/_static/twemoji.css @@ -0,0 +1,6 @@ +img.emoji { + height: 1em; + width: 1em; + margin: 0 .05em 0 .1em; + vertical-align: -0.1em; +} diff --git a/_static/twemoji.js b/_static/twemoji.js new file mode 100644 index 00000000..91bc868f --- /dev/null +++ b/_static/twemoji.js @@ -0,0 +1,10 @@ +function addEvent(element, eventName, fn) { + if (element.addEventListener) + element.addEventListener(eventName, fn, false); + else if (element.attachEvent) + element.attachEvent('on' + eventName, fn); +} + +addEvent(window, 'load', function() { + twemoji.parse(document.body, {'folder': 'svg', 'ext': '.svg'}); +}); diff --git a/_static/vendor/fontawesome/6.1.2/LICENSE.txt b/_static/vendor/fontawesome/6.1.2/LICENSE.txt new file mode 100644 index 00000000..cc557ece --- /dev/null +++ b/_static/vendor/fontawesome/6.1.2/LICENSE.txt @@ -0,0 +1,165 @@ +Fonticons, Inc. (https://fontawesome.com) + +-------------------------------------------------------------------------------- + +Font Awesome Free License + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +-------------------------------------------------------------------------------- + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) + +The Font Awesome Free download is licensed under a Creative Commons +Attribution 4.0 International License and applies to all icons packaged +as SVG and JS file types. + +-------------------------------------------------------------------------------- + +# Fonts: SIL OFL 1.1 License + +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +Copyright (c) 2022 Fonticons, Inc. (https://fontawesome.com) +with Reserved Font Name: "Font Awesome". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +-------------------------------------------------------------------------------- + +# Code: MIT License (https://opensource.org/licenses/MIT) + +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +Copyright 2022 Fonticons, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +# Attribution + +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +-------------------------------------------------------------------------------- + +# Brand Icons + +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/_static/vendor/fontawesome/6.1.2/css/all.min.css b/_static/vendor/fontawesome/6.1.2/css/all.min.css new file mode 100644 index 00000000..aad4b1d9 --- /dev/null +++ b/_static/vendor/fontawesome/6.1.2/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2022 Fonticons, Inc. + */.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-duotone,.fa-light,.fa-regular,.fa-solid,.fa-thin,.fab,.fad,.fal,.far,.fas,.fat{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);line-height:inherit;position:absolute;text-align:center;width:var(--fa-li-width,2em)}.fa-border{border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-a:before{content:"\41"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-anchor:before{content:"\f13d"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-anchor-lock:before{content:"\e4ad"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-ankh:before{content:"\f644"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-archway:before{content:"\f557"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-arrow-trend-down:before{content:"\e097"}.fa-arrow-trend-up:before{content:"\e098"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-arrows-spin:before{content:"\e4bb"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-asterisk:before{content:"\2a"}.fa-at:before{content:"\40"}.fa-atom:before{content:"\f5d2"}.fa-audio-description:before{content:"\f29e"}.fa-austral-sign:before{content:"\e0a9"}.fa-award:before{content:"\f559"}.fa-b:before{content:"\42"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-backward:before{content:"\f04a"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-baht-sign:before{content:"\e0ac"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-barcode:before{content:"\f02a"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-bell:before{content:"\f0f3"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blog:before{content:"\f781"}.fa-bold:before{content:"\f032"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-book-bookmark:before{content:"\e0bb"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-bookmark:before{content:"\f02e"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-bore-hole:before{content:"\e4c3"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-bottle-water:before{content:"\e4c5"}.fa-bowl-food:before{content:"\e4c6"}.fa-bowl-rice:before{content:"\e2eb"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes-packing:before{content:"\e4c7"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-bread-slice:before{content:"\f7ec"}.fa-bridge:before{content:"\e4c8"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-bridge-water:before{content:"\e4ce"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broom:before{content:"\f51a"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-brush:before{content:"\f55d"}.fa-bucket:before{content:"\e4cf"}.fa-bug:before{content:"\f188"}.fa-bug-slash:before{content:"\e490"}.fa-bugs:before{content:"\e4d0"}.fa-building:before{content:"\f1ad"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-building-circle-check:before{content:"\e4d2"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-building-flag:before{content:"\e4d5"}.fa-building-lock:before{content:"\e4d6"}.fa-building-ngo:before{content:"\e4d7"}.fa-building-shield:before{content:"\e4d8"}.fa-building-un:before{content:"\e4d9"}.fa-building-user:before{content:"\e4da"}.fa-building-wheat:before{content:"\e4db"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-burst:before{content:"\e4dc"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-c:before{content:"\43"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-week:before{content:"\f784"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-camera-rotate:before{content:"\e0d8"}.fa-campground:before{content:"\f6bb"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-car-on:before{content:"\e4dd"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-car-side:before{content:"\f5e4"}.fa-car-tunnel:before{content:"\e4de"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-cart-plus:before{content:"\f217"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cedi-sign:before{content:"\e0df"}.fa-cent-sign:before{content:"\e3f5"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-charging-station:before{content:"\f5e7"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-chart-column:before{content:"\e0e3"}.fa-chart-gantt:before{content:"\e0e4"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-chart-simple:before{content:"\e473"}.fa-check:before{content:"\f00c"}.fa-check-double:before{content:"\f560"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-child-dress:before{content:"\e59c"}.fa-child-reaching:before{content:"\e59d"}.fa-child-rifle:before{content:"\e4e0"}.fa-children:before{content:"\e4e1"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-circle-nodes:before{content:"\e4e2"}.fa-circle-notch:before{content:"\f1ce"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-city:before{content:"\f64f"}.fa-clapperboard:before{content:"\e131"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-question:before{content:"\e4e3"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-clover:before{content:"\e139"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-compare:before{content:"\e13a"}.fa-code-fork:before{content:"\e13b"}.fa-code-merge:before{content:"\f387"}.fa-code-pull-request:before{content:"\e13c"}.fa-coins:before{content:"\f51e"}.fa-colon-sign:before{content:"\e140"}.fa-comment:before{content:"\f075"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-compress:before{content:"\f066"}.fa-computer:before{content:"\e4e5"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-d:before{content:"\44"}.fa-database:before{content:"\f1c0"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-democrat:before{content:"\f747"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-dharmachakra:before{content:"\f655"}.fa-diagram-next:before{content:"\e476"}.fa-diagram-predecessor:before{content:"\e477"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-diagram-successor:before{content:"\e47a"}.fa-diamond:before{content:"\f219"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-disease:before{content:"\f7fa"}.fa-display:before{content:"\e163"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-dong-sign:before{content:"\e169"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dove:before{content:"\f4ba"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-download:before{content:"\f019"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-e:before{content:"\45"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elevator:before{content:"\e16d"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-equals:before{content:"\3d"}.fa-eraser:before{content:"\f12d"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-exclamation:before{content:"\21"}.fa-expand:before{content:"\f065"}.fa-explosion:before{content:"\e4e9"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-eye-slash:before{content:"\f070"}.fa-f:before{content:"\46"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-fan:before{content:"\f863"}.fa-faucet:before{content:"\e005"}.fa-faucet-drip:before{content:"\e006"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-ferry:before{content:"\e4ea"}.fa-file:before{content:"\f15b"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-file-audio:before{content:"\f1c7"}.fa-file-circle-check:before{content:"\e5a0"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-file-circle-plus:before{content:"\e494"}.fa-file-circle-question:before{content:"\e4ef"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-excel:before{content:"\f1c3"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-file-medical:before{content:"\f477"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-shield:before{content:"\e4f0"}.fa-file-signature:before{content:"\f573"}.fa-file-video:before{content:"\f1c8"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-file-word:before{content:"\f1c2"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-burner:before{content:"\e4f1"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-fish:before{content:"\f578"}.fa-fish-fins:before{content:"\e4f2"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flask-vial:before{content:"\e4f3"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-florin-sign:before{content:"\e184"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-folder-closed:before{content:"\e185"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-tree:before{content:"\f802"}.fa-font:before{content:"\f031"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-franc-sign:before{content:"\e18f"}.fa-frog:before{content:"\f52e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-g:before{content:"\47"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-glass-water:before{content:"\e4f4"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-glasses:before{content:"\f530"}.fa-globe:before{content:"\f0ac"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-greater-than:before{content:"\3e"}.fa-greater-than-equal:before{content:"\f532"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-guarani-sign:before{content:"\e19a"}.fa-guitar:before{content:"\f7a6"}.fa-gun:before{content:"\e19b"}.fa-h:before{content:"\48"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-handcuffs:before{content:"\e4f8"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-hands-bound:before{content:"\e4f9"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-hands-clapping:before{content:"\e1a8"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-handshake:before{content:"\f2b5"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-hashtag:before{content:"\23"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-heart-circle-plus:before{content:"\e500"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helicopter-symbol:before{content:"\e502"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-helmet-un:before{content:"\e503"}.fa-highlighter:before{content:"\f591"}.fa-hill-avalanche:before{content:"\e507"}.fa-hill-rockslide:before{content:"\e508"}.fa-hippo:before{content:"\f6ed"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-house-chimney-user:before{content:"\e065"}.fa-house-chimney-window:before{content:"\e00d"}.fa-house-circle-check:before{content:"\e509"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-house-crack:before{content:"\e3b1"}.fa-house-fire:before{content:"\e50c"}.fa-house-flag:before{content:"\e50d"}.fa-house-flood-water:before{content:"\e50e"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-house-lock:before{content:"\e510"}.fa-house-medical:before{content:"\e3b2"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-house-medical-flag:before{content:"\e514"}.fa-house-signal:before{content:"\e012"}.fa-house-tsunami:before{content:"\e515"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-hurricane:before{content:"\f751"}.fa-i:before{content:"\49"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-images:before{content:"\f302"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-italic:before{content:"\f033"}.fa-j:before{content:"\4a"}.fa-jar:before{content:"\e516"}.fa-jar-wheat:before{content:"\e517"}.fa-jedi:before{content:"\f669"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-jet-fighter-up:before{content:"\e518"}.fa-joint:before{content:"\f595"}.fa-jug-detergent:before{content:"\e519"}.fa-k:before{content:"\4b"}.fa-kaaba:before{content:"\f66b"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-khanda:before{content:"\f66d"}.fa-kip-sign:before{content:"\e1c4"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-kitchen-set:before{content:"\e51a"}.fa-kiwi-bird:before{content:"\f535"}.fa-l:before{content:"\4c"}.fa-land-mine-on:before{content:"\e51b"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-landmark-flag:before{content:"\e51c"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-file:before{content:"\e51d"}.fa-laptop-medical:before{content:"\f812"}.fa-lari-sign:before{content:"\e1c8"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-lemon:before{content:"\f094"}.fa-less-than:before{content:"\3c"}.fa-less-than-equal:before{content:"\f537"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lines-leaning:before{content:"\e51e"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-lira-sign:before{content:"\f195"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-location-arrow:before{content:"\f124"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-location-pin-lock:before{content:"\e51f"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-locust:before{content:"\e520"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-m:before{content:"\4d"}.fa-magnet:before{content:"\f076"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-manat-sign:before{content:"\e1d5"}.fa-map:before{content:"\f279"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-pin:before{content:"\f276"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-and-venus:before{content:"\f224"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-mask:before{content:"\f6fa"}.fa-mask-face:before{content:"\e1d7"}.fa-mask-ventilator:before{content:"\e524"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-mattress-pillow:before{content:"\e525"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-medal:before{content:"\f5a2"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-mill-sign:before{content:"\e1ed"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-mitten:before{content:"\f7b5"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-mobile-button:before{content:"\f10b"}.fa-mobile-retro:before{content:"\e527"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-money-bills:before{content:"\e1f3"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-mosquito-net:before{content:"\e52c"}.fa-motorcycle:before{content:"\f21c"}.fa-mound:before{content:"\e52d"}.fa-mountain:before{content:"\f6fc"}.fa-mountain-city:before{content:"\e52e"}.fa-mountain-sun:before{content:"\e52f"}.fa-mug-hot:before{content:"\f7b6"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-music:before{content:"\f001"}.fa-n:before{content:"\4e"}.fa-naira-sign:before{content:"\e1f6"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-not-equal:before{content:"\f53e"}.fa-notdef:before{content:"\e1fe"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-notes-medical:before{content:"\f481"}.fa-o:before{content:"\4f"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-oil-can:before{content:"\f613"}.fa-oil-well:before{content:"\e532"}.fa-om:before{content:"\f679"}.fa-otter:before{content:"\f700"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-p:before{content:"\50"}.fa-pager:before{content:"\f815"}.fa-paint-roller:before{content:"\f5aa"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-pallet:before{content:"\f482"}.fa-panorama:before{content:"\e209"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-passport:before{content:"\f5ab"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-pause:before{content:"\f04c"}.fa-paw:before{content:"\f1b0"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-people-group:before{content:"\e533"}.fa-people-line:before{content:"\e534"}.fa-people-pulling:before{content:"\e535"}.fa-people-robbery:before{content:"\e536"}.fa-people-roof:before{content:"\e537"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-person-booth:before{content:"\f756"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-person-burst:before{content:"\e53b"}.fa-person-cane:before{content:"\e53c"}.fa-person-chalkboard:before{content:"\e53d"}.fa-person-circle-check:before{content:"\e53e"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-person-circle-minus:before{content:"\e540"}.fa-person-circle-plus:before{content:"\e541"}.fa-person-circle-question:before{content:"\e542"}.fa-person-circle-xmark:before{content:"\e543"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-person-dress-burst:before{content:"\e544"}.fa-person-drowning:before{content:"\e545"}.fa-person-falling:before{content:"\e546"}.fa-person-falling-burst:before{content:"\e547"}.fa-person-half-dress:before{content:"\e548"}.fa-person-harassing:before{content:"\e549"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-person-military-pointing:before{content:"\e54a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-person-military-to-person:before{content:"\e54c"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-person-pregnant:before{content:"\e31e"}.fa-person-rays:before{content:"\e54d"}.fa-person-rifle:before{content:"\e54e"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-person-shelter:before{content:"\e54f"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-person-through-window:before{content:"\e5a9"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-person-walking-luggage:before{content:"\e554"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-peseta-sign:before{content:"\e221"}.fa-peso-sign:before{content:"\e222"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-circle-check:before{content:"\e555"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-lock:before{content:"\e558"}.fa-plane-slash:before{content:"\e069"}.fa-plane-up:before{content:"\e22d"}.fa-plant-wilt:before{content:"\e5aa"}.fa-plate-wheat:before{content:"\e55a"}.fa-play:before{content:"\f04b"}.fa-plug:before{content:"\f1e6"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-plug-circle-check:before{content:"\e55c"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-plus-minus:before{content:"\e43c"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-puzzle-piece:before{content:"\f12e"}.fa-q:before{content:"\51"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\3f"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-r:before{content:"\52"}.fa-radiation:before{content:"\f7b9"}.fa-radio:before{content:"\f8d7"}.fa-rainbow:before{content:"\f75b"}.fa-ranking-star:before{content:"\e561"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-recycle:before{content:"\f1b8"}.fa-registered:before{content:"\f25d"}.fa-repeat:before{content:"\f363"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-republican:before{content:"\f75e"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-road-barrier:before{content:"\e562"}.fa-road-bridge:before{content:"\e563"}.fa-road-circle-check:before{content:"\e564"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-road-circle-xmark:before{content:"\e566"}.fa-road-lock:before{content:"\e567"}.fa-road-spikes:before{content:"\e568"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-route:before{content:"\f4d7"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-rug:before{content:"\e569"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-rupiah-sign:before{content:"\e23d"}.fa-s:before{content:"\53"}.fa-sack-dollar:before{content:"\f81d"}.fa-sack-xmark:before{content:"\e56a"}.fa-sailboat:before{content:"\e445"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-school:before{content:"\f549"}.fa-school-circle-check:before{content:"\e56b"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-school-flag:before{content:"\e56e"}.fa-school-lock:before{content:"\e56f"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-screwdriver:before{content:"\f54a"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-scroll:before{content:"\f70e"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-sd-card:before{content:"\f7c2"}.fa-section:before{content:"\e447"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-server:before{content:"\f233"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-sheet-plastic:before{content:"\e571"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-shield-cat:before{content:"\e572"}.fa-shield-dog:before{content:"\e573"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-shield-heart:before{content:"\e574"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-shoe-prints:before{content:"\f54b"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-shop-lock:before{content:"\e4a5"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-shower:before{content:"\f2cc"}.fa-shrimp:before{content:"\e448"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-sim-card:before{content:"\f7c4"}.fa-sink:before{content:"\e06d"}.fa-sitemap:before{content:"\f0e8"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-spa:before{content:"\f5bb"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-spray-can:before{content:"\f5bd"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-square:before{content:"\f0c8"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-square-full:before{content:"\f45c"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-square-nfi:before{content:"\e576"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-square-person-confined:before{content:"\e577"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-square-virus:before{content:"\e578"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-stairs:before{content:"\e289"}.fa-stamp:before{content:"\f5bf"}.fa-stapler:before{content:"\e5af"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-stethoscope:before{content:"\f0f1"}.fa-stop:before{content:"\f04d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-slash:before{content:"\e071"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stroopwafel:before{content:"\f551"}.fa-subscript:before{content:"\f12c"}.fa-suitcase:before{content:"\f0f2"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-superscript:before{content:"\f12b"}.fa-swatchbook:before{content:"\f5c3"}.fa-synagogue:before{content:"\f69b"}.fa-syringe:before{content:"\f48e"}.fa-t:before{content:"\54"}.fa-table:before{content:"\f0ce"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-tablet-button:before{content:"\f10a"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tarp:before{content:"\e57b"}.fa-tarp-droplet:before{content:"\e57c"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-tent:before{content:"\e57d"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tent-arrows-down:before{content:"\e581"}.fa-tents:before{content:"\e582"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-text-width:before{content:"\f035"}.fa-thermometer:before{content:"\f491"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-timeline:before{content:"\e29c"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toilet-portable:before{content:"\e583"}.fa-toilets-portable:before{content:"\e584"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-tower-cell:before{content:"\e585"}.fa-tower-observation:before{content:"\e586"}.fa-tractor:before{content:"\f722"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-train-tram:before{content:"\e5b4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-tree-city:before{content:"\e587"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-trophy:before{content:"\f091"}.fa-trowel:before{content:"\e589"}.fa-trowel-bricks:before{content:"\e58a"}.fa-truck:before{content:"\f0d1"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-truck-droplet:before{content:"\e58c"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-truck-field:before{content:"\e58d"}.fa-truck-field-un:before{content:"\e58e"}.fa-truck-front:before{content:"\e2b7"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plane:before{content:"\e58f"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-u:before{content:"\55"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-universal-access:before{content:"\f29a"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-upload:before{content:"\f093"}.fa-user:before{content:"\f007"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-clock:before{content:"\f4fd"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-user-graduate:before{content:"\f501"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-user-injured:before{content:"\f728"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-user-lock:before{content:"\f502"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-between-lines:before{content:"\e591"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-users-line:before{content:"\e592"}.fa-users-rays:before{content:"\e593"}.fa-users-rectangle:before{content:"\e594"}.fa-users-slash:before{content:"\e073"}.fa-users-viewfinder:before{content:"\e595"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-v:before{content:"\56"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-vault:before{content:"\e2c5"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-vial:before{content:"\f492"}.fa-vial-circle-check:before{content:"\e596"}.fa-vial-virus:before{content:"\e597"}.fa-vials:before{content:"\f493"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-virus:before{content:"\e074"}.fa-virus-covid:before{content:"\e4a8"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-vr-cardboard:before{content:"\f729"}.fa-w:before{content:"\57"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-wallet:before{content:"\f555"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-wand-sparkles:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-wave-square:before{content:"\f83e"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-wheelchair:before{content:"\f193"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-wind:before{content:"\f72e"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-worm:before{content:"\e599"}.fa-wrench:before{content:"\f0ad"}.fa-x:before{content:"\58"}.fa-x-ray:before{content:"\f497"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-xmarks-lines:before{content:"\e59a"}.fa-y:before{content:"\59"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-z:before{content:"\5a"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}:host,:root{--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-display:block;font-family:Font Awesome\ 6 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-family:Font Awesome\ 6 Brands;font-weight:400}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-alipay:before{content:"\f642"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-amilia:before{content:"\f36d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-artstation:before{content:"\f77a"}.fa-asymmetrik:before{content:"\f372"}.fa-atlassian:before{content:"\f77b"}.fa-audible:before{content:"\f373"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-bandcamp:before{content:"\f2d5"}.fa-battle-net:before{content:"\f835"}.fa-behance:before{content:"\f1b4"}.fa-bilibili:before{content:"\e3d9"}.fa-bimobject:before{content:"\f378"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bootstrap:before{content:"\f836"}.fa-bots:before{content:"\e340"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-buromobelexperte:before{content:"\f37f"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cmplid:before{content:"\e360"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-critical-role:before{content:"\f6c9"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dhl:before{content:"\f790"}.fa-diaspora:before{content:"\f791"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-elementor:before{content:"\f430"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-evernote:before{content:"\f839"}.fa-expeditedssl:before{content:"\f23e"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-figma:before{content:"\f799"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-fulcrum:before{content:"\f50b"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-gofore:before{content:"\f3a7"}.fa-golang:before{content:"\e40f"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-wallet:before{content:"\f1ee"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-gulp:before{content:"\f3ae"}.fa-hacker-news:before{content:"\f1d4"}.fa-hackerrank:before{content:"\f5f7"}.fa-hashnode:before{content:"\e499"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-hive:before{content:"\e07f"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hotjar:before{content:"\f3b1"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-ideal:before{content:"\e013"}.fa-imdb:before{content:"\f2d8"}.fa-instagram:before{content:"\f16d"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-keybase:before{content:"\f4f5"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-leanpub:before{content:"\f212"}.fa-less:before{content:"\f41d"}.fa-line:before{content:"\f3c0"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-mailchimp:before{content:"\f59e"}.fa-mandalorian:before{content:"\f50f"}.fa-markdown:before{content:"\f60f"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medapps:before{content:"\f3c6"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-mendeley:before{content:"\f7b3"}.fa-meta:before{content:"\e49b"}.fa-microblog:before{content:"\e01a"}.fa-microsoft:before{content:"\f3ca"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-nfc-directional:before{content:"\e530"}.fa-nfc-symbol:before{content:"\e531"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-padlet:before{content:"\e4a0"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-palfed:before{content:"\f3d8"}.fa-patreon:before{content:"\f3d9"}.fa-paypal:before{content:"\f1ed"}.fa-perbyte:before{content:"\e083"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pix:before{content:"\e43a"}.fa-playstation:before{content:"\f3df"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-r-project:before{content:"\f4f7"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-redhat:before{content:"\f7bc"}.fa-renren:before{content:"\f18b"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-rev:before{content:"\f5b2"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rust:before{content:"\e07a"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-schlix:before{content:"\f3ea"}.fa-screenpal:before{content:"\e570"}.fa-scribd:before{content:"\f28a"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-servicestack:before{content:"\f3ec"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopify:before{content:"\e057"}.fa-shopware:before{content:"\f5b5"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sith:before{content:"\f512"}.fa-sitrox:before{content:"\e44a"}.fa-sketch:before{content:"\f7c6"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-slideshare:before{content:"\f1e7"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-space-awesome:before{content:"\e5ac"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spotify:before{content:"\f1bc"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-symbol:before{content:"\f3f6"}.fa-sticker-mule:before{content:"\f3f7"}.fa-strava:before{content:"\f428"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-superpowers:before{content:"\f2dd"}.fa-supple:before{content:"\f3f9"}.fa-suse:before{content:"\f7d6"}.fa-swift:before{content:"\f8e1"}.fa-symfony:before{content:"\f83d"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-the-red-yeti:before{content:"\f69d"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-think-peaks:before{content:"\f731"}.fa-tiktok:before{content:"\e07b"}.fa-trade-federation:before{content:"\f513"}.fa-trello:before{content:"\f181"}.fa-tumblr:before{content:"\f173"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-uncharted:before{content:"\e084"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-vaadin:before{content:"\f408"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viber:before{content:"\f409"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-vuejs:before{content:"\f41f"}.fa-watchman-monitoring:before{content:"\e087"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whmcs:before{content:"\f40d"}.fa-wikipedia-w:before{content:"\f266"}.fa-windows:before{content:"\f17a"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-zhihu:before{content:"\f63f"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-display:block;font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-family:Font Awesome\ 6 Free;font-weight:400}:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-display:block;font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-family:Font Awesome\ 6 Free;font-weight:900}@font-face{font-display:block;font-family:Font Awesome\ 5 Brands;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-display:block;font-family:Font Awesome\ 5 Free;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-display:block;font-family:Font Awesome\ 5 Free;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-display:block;font-family:FontAwesome;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf b/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..24ca8b17 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 b/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..e67e5cd5 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf b/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..c5ac0095 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 b/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..7dca1d90 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf b/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..43ba1cc7 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 b/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..4a7f9665 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf b/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..243bc25b Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf differ diff --git a/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 b/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..e18a16d5 Binary files /dev/null and b/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 differ diff --git a/_static/vm10_setup.png b/_static/vm10_setup.png new file mode 100644 index 00000000..3bafea34 Binary files /dev/null and b/_static/vm10_setup.png differ diff --git a/_static/vm10_setup_1.png b/_static/vm10_setup_1.png new file mode 100644 index 00000000..0f5c0085 Binary files /dev/null and b/_static/vm10_setup_1.png differ diff --git a/_static/vm11_setup_1.png b/_static/vm11_setup_1.png new file mode 100644 index 00000000..8fd8470b Binary files /dev/null and b/_static/vm11_setup_1.png differ diff --git a/_static/vm11_setup_2.png b/_static/vm11_setup_2.png new file mode 100644 index 00000000..10eb178f Binary files /dev/null and b/_static/vm11_setup_2.png differ diff --git a/_static/vm12_setup.png b/_static/vm12_setup.png new file mode 100644 index 00000000..8126b319 Binary files /dev/null and b/_static/vm12_setup.png differ diff --git a/_static/vm13_setup.png b/_static/vm13_setup.png new file mode 100644 index 00000000..2764c9bc Binary files /dev/null and b/_static/vm13_setup.png differ diff --git a/_static/vm14_setup.png b/_static/vm14_setup.png new file mode 100644 index 00000000..b3a13bb9 Binary files /dev/null and b/_static/vm14_setup.png differ diff --git a/_static/vm15_setup.png b/_static/vm15_setup.png new file mode 100644 index 00000000..3ce88454 Binary files /dev/null and b/_static/vm15_setup.png differ diff --git a/_static/vm16_setup.png b/_static/vm16_setup.png new file mode 100644 index 00000000..473bf35d Binary files /dev/null and b/_static/vm16_setup.png differ diff --git a/_static/vm18_setup1.png b/_static/vm18_setup1.png new file mode 100644 index 00000000..d13639e1 Binary files /dev/null and b/_static/vm18_setup1.png differ diff --git a/_static/vm18_setup2.png b/_static/vm18_setup2.png new file mode 100644 index 00000000..43c166ff Binary files /dev/null and b/_static/vm18_setup2.png differ diff --git a/_static/vm1_setup.png b/_static/vm1_setup.png new file mode 100644 index 00000000..1bb514e3 Binary files /dev/null and b/_static/vm1_setup.png differ diff --git a/_static/vm20_setup.png b/_static/vm20_setup.png new file mode 100644 index 00000000..821811aa Binary files /dev/null and b/_static/vm20_setup.png differ diff --git a/_static/vm21_setup.png b/_static/vm21_setup.png new file mode 100644 index 00000000..40f7d23d Binary files /dev/null and b/_static/vm21_setup.png differ diff --git a/_static/vm25_setup.png b/_static/vm25_setup.png new file mode 100644 index 00000000..a8d465cb Binary files /dev/null and b/_static/vm25_setup.png differ diff --git a/_static/vm291_setup1.png b/_static/vm291_setup1.png new file mode 100644 index 00000000..b43534b9 Binary files /dev/null and b/_static/vm291_setup1.png differ diff --git a/_static/vm291_setup2.png b/_static/vm291_setup2.png new file mode 100644 index 00000000..93b7b69c Binary files /dev/null and b/_static/vm291_setup2.png differ diff --git a/_static/vm295_setup.png b/_static/vm295_setup.png new file mode 100644 index 00000000..ecfb757e Binary files /dev/null and b/_static/vm295_setup.png differ diff --git a/_static/vm299_setup.png b/_static/vm299_setup.png new file mode 100644 index 00000000..2ecd4b40 Binary files /dev/null and b/_static/vm299_setup.png differ diff --git a/_static/vm2_setup.png b/_static/vm2_setup.png new file mode 100644 index 00000000..482dc895 Binary files /dev/null and b/_static/vm2_setup.png differ diff --git a/_static/vm3_setup.png b/_static/vm3_setup.png new file mode 100644 index 00000000..669815ec Binary files /dev/null and b/_static/vm3_setup.png differ diff --git a/_static/vm4_setup.png b/_static/vm4_setup.png new file mode 100644 index 00000000..414fb96d Binary files /dev/null and b/_static/vm4_setup.png differ diff --git a/_static/vm5_setup.png b/_static/vm5_setup.png new file mode 100644 index 00000000..f2ddee28 Binary files /dev/null and b/_static/vm5_setup.png differ diff --git a/_static/vm6_setup.png b/_static/vm6_setup.png new file mode 100644 index 00000000..57bd466f Binary files /dev/null and b/_static/vm6_setup.png differ diff --git a/_static/vm7_setup.png b/_static/vm7_setup.png new file mode 100644 index 00000000..64e25c28 Binary files /dev/null and b/_static/vm7_setup.png differ diff --git a/_static/vm7_setup_1.png b/_static/vm7_setup_1.png new file mode 100644 index 00000000..e6d7cb51 Binary files /dev/null and b/_static/vm7_setup_1.png differ diff --git a/_static/vm7_setup_2.png b/_static/vm7_setup_2.png new file mode 100644 index 00000000..637fc216 Binary files /dev/null and b/_static/vm7_setup_2.png differ diff --git a/_static/vm8_setup.png b/_static/vm8_setup.png new file mode 100644 index 00000000..d3087b47 Binary files /dev/null and b/_static/vm8_setup.png differ diff --git a/_static/vm9_setup.png b/_static/vm9_setup.png new file mode 100644 index 00000000..62ad03c5 Binary files /dev/null and b/_static/vm9_setup.png differ diff --git a/_static/vm9_setup_2.png b/_static/vm9_setup_2.png new file mode 100644 index 00000000..d426a717 Binary files /dev/null and b/_static/vm9_setup_2.png differ diff --git a/_static/watermark.pdf b/_static/watermark.pdf new file mode 100644 index 00000000..202d1e69 Binary files /dev/null and b/_static/watermark.pdf differ diff --git a/_static/webpack-macros.html b/_static/webpack-macros.html new file mode 100644 index 00000000..58db7859 --- /dev/null +++ b/_static/webpack-macros.html @@ -0,0 +1,30 @@ + +{# Load FontAwesome icons #} +{% macro head_pre_icons() %} + + + + +{% endmacro %} + +{% macro head_pre_assets() %} + + + + +{% endmacro %} + +{% macro head_js_preload() %} + + + +{% endmacro %} + +{% macro body_post() %} + + + +{% endmacro %} \ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 00000000..93a9b5ba --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,605 @@ + + + + + + + + + + +Overall guidance on contributing to a PyAnsys library appears in the +Contributing topic +in the PyAnsys Developer’s Guide. Ensure that you are thoroughly familiar +with this guide before attempting to contribute to PyMAPDL Examples.
+The following contribution information is specific to PyMAPDL Examples.
+Run this code to clone and install the latest version of PyMAPDL Examples in development mode:
+git clone https://github.com/ansys/pymapdl-examples
+cd pymapdl-examples
+
Use the PyMAPDL Examples Issues page to submit questions, +report bugs, and request new features. When possible, use these issue +templates:
+Bug report template
Feature request template
If your issue does not fit into one of these template categories, create your own issue.
+To reach the project support team, email pyansys.core@ansys.com.
+The use of a Python virtual environment is recommended. +To create one, run the following commands:
+python -m venv .venv
+ .\.venv\Scripts\activate
+
To deactivate the virtual environment, run this command:
+deactivate
+
To build the documentation for PyMAPDL Examples locally, in the root directory of the repository, +run these commands:
+pip install -r .\requirements\requirements_doc.txt
+.\doc\make.bat html
+
PyMAPDL Examples follows the PEP8 standard as outlined in the PyAnsys Development Guide and implements style checking using +pre-commit.
+pre-commit
is a multi-language package manager for pre-commit hooks. To ensure
+that your code meets minimum code styling standards, install pre-commit
with
+this command:
pip install pre-commit
+
Once installed, you can run code style checks with this command:
+pre-commit run --all-files
+
You can also install this as a pre-commit hook by running this command:
+pre-commit install
+
This way, it is not possible for you to push code that fails the style checks:
+$ pre-commit install
+$ git commit -am "added my cool feature"
+black....................................................................Passed
+blacken-docs.............................................................Passed
+isort....................................................................Passed
+flake8...................................................................Passed
+codespell................................................................Passed
+check for merge conflicts................................................Passed
+debug statements (python)................................................Passed
+Validate GitHub Workflows................................................Passed
+
Here are some tips for writing a good example.
+mapdl.convert_script
#If you want to translate a MAPDL script into a PyMAPDL one, you can first +run these commands:
+from ansys.mapdl.core import convert_script
+convert_script(path_MAPDL_script)
+
Warning
+The mapdl.convert_script
method is still in the beta state. You should check its output.
+There may be easier ways to write some commands.
For example, use mapdl.eplot()
rather than mapdl.run("EPLOT")
.
The aim of PyMAPDL is to make it possible to create workflows that combine +MAPDL and the Python environment. +Some MAPDL workflows can be very efficient, but mixing them with Python packages +can simplify the code and allow you to generate more visually effective plots.
+Do not hesitate to explore the Python Package Index +to discover new Python packages.
+The more visual your example is, the better. +Python facilitates the creation of sophisticate graphics and plots: take advantage +of that.
+Packages like Matplotlib, Pandas +or PyVista can help you create nice graphics, tables, or plots .
+The Technology Showcases and the Verification Manual examples for +PyMAPDL are contained in this repository.
+These examples present how to use PyMAPDL in an academic modeling context. +They ensure the PyMAPDL accuracy.
+in straightforward problems which have “classical” or readily-obtainable +theoretical solutions using PyMAPDL.
+These problems may then serve as the basis for additional validation and +qualification of Mechanical APDL capabilities for specific applications that +may be of interest.
+Statically indeterminate reaction force analysis
+Thermally loaded support structure
+Deflection of a hinged support
+Laterally Loaded Tapered Support Structure
+Plastic compression of a pipe assembly
+Large lateral deflection of unequal stiffness springs
+Cylindrical Shell Under Pressure
+Large Deflection Eccentric Compression of Slender Column
+Bending of a Circular Plate Using Axisymmetric Shell Elements
+Bending of a Solid Beam (Plane Elements)
+Out-of-Plane Bending of a Curved Bar
+Cylindrical Membrane Under Pressure
+Force on the Boundary of a Semi-Infinite Body (Boussinesq Problem)
+One Dimensional Terzaghi’s Consolidation Problem with Permeability as Function of Depth
+Sound Diffusion in a Flat Room
+This documentation demonstrates the broad simulation capabilities of Ansys Mechanical +APDL. +The problems demonstrate how to use PyMAPDL to effectively and accurately +solve interdisciplinary problems from a variety of industries and engineering +fields.
+The exposed files are more complex examples than the ones presented in the APDL +Verification Manual. They are complete and concrete case studies +which necessitate more resources.
+Calibrating and validating a hyperelastic constitutive model
+Dynamic simulation of a printed circuit board assembly
+Buckling and post-buckling analysis of a ring-stiffened cylinder using nonlinear stabilization
+Cardiovascular Stent Simulation
+Friction stir welding (FSW) simulation
+The following examples initially come from the APDL Technology Showcase Manual.
+They initially were MAPDL files.
+They have been reproduced in Python files using PyMAPDL with the ansys-mapdl-core
library.
Calibrating and validating a hyperelastic constitutive model
+Dynamic simulation of a printed circuit board assembly
+Buckling and post-buckling analysis of a ring-stiffened cylinder using nonlinear stabilization
+Cardiovascular Stent Simulation
+Friction stir welding (FSW) simulation
+This example analysis shows how to solve a brake-squeal problem. +1.6. Analysis and Solution Controls are highlighted: linear non-prestressed +modal, partial nonlinear perturbed modal, and full nonlinear perturbed +modal. +The problem demonstrates sliding frictional contact and uses complex +eigensolvers to predict unstable modes.
+The following topics are available:
+You can also perform this example analysis entirely in the Ansys +Mechanical Application. For more information, see Brake-Squeal Analysis in the +Workbench Technology Showcase: Example Problems.
+Eliminating brake noise is a classic challenge in the automotive industry. Brake discs +develop large and sustained friction-induced oscillations, simple referred to as brake +squeal.
+Two common theories describe brake-squeal phenomena:
+Stick-Slip Theory – The self-excited +vibration of a brake system occurs when the static coefficient of friction is +greater than the sliding coefficient of friction. Variable friction forces +introduce energy into the system which is not properly dissipated during the +squealing event, resulting in large vibrations.
Mode-Coupling Theory – When two similar +characteristic modes couple with each other, instability is introduced to the +braking system. This instability is caused primarily by improperly selected +geometric parameters. +Both theories attribute brake squeal to variable friction forces at the disc-pad +interface.
Brake noise is generally categorized as follows:
+Low-frequency noise – An example of a low-frequency noise is the +“groaning” noise which occurs in the frequency range between 100 and +1000 Hz. Any noise having a frequency above 1000 Hz is considered a +squeal.
Low-frequency squeal – A result of mode coupling occurring between the +out-of-plane modes of the rotor and the bending modes of the brake pad.
High-frequency squeal – A result of mode coupling occurring between the +in-plane modes of the rotor. +Low- and high-frequency squealing can be determined via complex eigensolvers. The +presence of unstable modes suggests that the geometry parameters and material properties +of the braking system should be modified.
For more information, see Brake-Squeal (Prestressed Modal) Analysis in the Structural Analysis Guide.
+The following model is a simple brake disc-pad assembly. The disc has a thickness of +10 mm and the brake pads have a thickness of 15 mm. The inner diameter of the disc is +250 mm and outer diameter is of 350 mm. A pre-stressed modal analysis is performed on +this model using various methods to determine the unstable modes. A parametric study is +then performed to examine the effect of the friction coefficient on the dynamic +stability of the model.
+ +The following modeling topics are available:
+ +Brake-squeal problems typically require manual calculations of the unsymmetric
+terms arising from sources such as frictional sliding, and then inputting the
+unsymmetric terms using special elements (such as
+MATRIX27
). It is a tedious process requiring a matched mesh
+at the disc-pad interface along with assumptions related to the amount of area in
+contact and sliding.
3-D contact elements (CONTA17x
) offer a more efficient alternative by modeling
+surface-to-surface contact at the pad-disc interface. With contact
+surface-to-surface contact elements, a matched mesh is unnecessary at the
+contact-target surface, and there is no need to calculate the unsymmetric
+terms.
Contact surface-to-surface elements offer many controls for defining contact +pairs, such as the type of contact surface, algorithm, contact stiffness, and +gap/initial penetration effect.
+Frictional surface-to-surface contact pairs with a 0.3 coefficient of friction are +used to define contact between the brake pads and disc to simulate frictional +sliding contact occurring at the pad-disc interface. Bonded surface-to-surface +contact pairs are used to define the contact for other components which will be +always in contact throughout the braking operation.
+The augmented Lagrange algorithm is used for the frictional contact pairs, as the +pressure and frictional stresses are augmented during equilibrium iterations in such +a way that the penetration is reduced gradually. The augmented Lagrange algorithm +also requires fewer computational resources than the standard Lagrange multiplier +algorithm, which normally requires additional iterations to ensure that the contact +compatibility is satisfied exactly. The augmented Lagrange is well suited for +modeling general frictional contact, such as the contact between the brake pad and +disc defined in this example.
+An internal multipoint constraint (MPC) contact algorithm is used for bonded +contact because it ties contact and target surface together efficiently for +solid-solid assembly. The MPC algorithm builds equations internally based on the +contact kinematics and does not require the degrees of freedom of the contact +surface nodes, reducing the wave front size of the equation solver. A contact +detection point is made on the Gauss point for frictional contact pairs, and on the +nodal point (normal-to-target surface) for MPC bonded contact pairs.
+The Mapdl.cmrotate()
+command defines constant rotational velocities on
+the contact/target nodes to generate internal sliding motion. The specified
+rotational velocity is used only to determine the sliding direction and has no
+effect on the final solution. The element component used should include only the
+contact or the target elements that are on the brake disc/rotor. In this example,
+the target elements are defined on the disc surface and the contact elements are
+defined on the pad surface. The target elements attached to the disc surface are
+grouped to form a component named E_ROTOR which is then later specified on the
+Mapdl.cmrotate()
+command to generate a sliding frictional force.
The sweep method is used to generate a hexahedral dominant mesh of the brake
+system assembly. Brake discs, pads and all other associated components are meshed
+with 20-node structural solid SOLID186
elements with
+uniform reduced-integration element technology. The edge sizing tool is used to
+obtains a refined mesh at the pad-disc interface to improve the solution accuracy.
+For problems with a large unsymmetric coefficient, a finer mesh should be used at
+the pad-disc interface to accurately predict the unstable modes.
+CONTA174
(3-D 8 node surface to surface contact)
+elements are used to define the contact surface and
+TARGE170
(3-D target segment) elements are used to
+define the target surface. The brake disc-pad assembly is meshed with total of 60351
+nodes and 11473 elements.
Start this example by launching MAPDL and loading the model.
+# sphinx_gallery_thumbnail_path = '_static/tse1_setup.png'
+
+import pyvista
+pyvista.set_plot_theme('document')
+
+from ansys.mapdl.core import launch_mapdl, Mapdl
+from ansys.mapdl.core.examples.downloads import download_tech_demo_data
+from ansys.mapdl.core.examples.examples import ansys_colormap
+
+cdb_path = download_tech_demo_data("td-1", "disc_pad_model.cdb")
+
+def start(mapdl, case):
+ """Initialize MAPDL with a fresh disc pad model"""
+ mapdl.finish()
+ mapdl.verify(case)
+ mapdl.prep7()
+ mapdl.shpp("OFF", value2="NOWARN") # disable element shape checking
+ mapdl.cdread("COMB", cdb_path) # Read disc_pad_model.cdb file
+ mapdl.allsel()
+
+
+mapdl = launch_mapdl(nproc=8)
+mapdl.clear()
+
+start(mapdl, 'linear_non_prestressed')
+mapdl.title("linear_non_prestressed, Solving brake squeal problem using linear non pre-stressed modal solve")
+
+mapdl.eplot(
+ vtk=True, cpos="xy", show_edges=True, show_axes=False, line_width=2, background="w"
+)
+
Linear elastic isotropic materials are assigned to all the components of the braking +system.
+Table 1.1: Material Properties
++ | Material Properties |
+
---|---|
Young’s Modulus (Nm-2) |
+2.0 E+11 Pa |
+
Density |
+7800 Kg/m3 |
+
Poisson’s Ratio |
+0.3 |
+
The inner diameter of the cylinder hub and bolt holes is constrained in all +directions. +Small pressure loading is applied on both ends of the pad to establish +contact with the brake disc and to include prestress effects. The displacement on the +brake pad surfaces where the pressure loading is applied is constrained in all +directions except axial (along the Z-axis).
+ +The analysis settings and solution controls differ depending upon the method used +to solve a brake-squeal problem. This section describes three possible +methods:
+A linear +non-prestressed modal analysis is effective when the stress-stiffening +effects are not critical. +This method requires less run time than the other two methods, as +Newton-Raphson iterations are not required. The contact-stiffness matrix +is based on the initial contact status.
+Following is the process for solving a brake-squeal problem using this method:
+Perform a linear partial-element analysis with no prestress effects.
Generate the unsymmetric stiffness matrix
+(Mapdl.nropt("UNSYM")
).
Generate sliding frictional force (Mapdl.cmrotate()
).
Perform a complex modal analysis using the QRDAMP or UNSYM eigensolver.
+When using the QRDAMP solver, you can reuse the symmetric
+eigensolution from the previous load steps
+(Mapdl.qrdopt()
), effective when performing a friction-
+sensitive/parametric analysis, as it saves time by not recalculating the
+real symmetric modes after the first solve operation.
Expand the modes and postprocess the results from jobname.rST.
+For this analysis, the UNSYM solver is selected to solve the problem. +(Guidelines for selecting the eigensolver for brake-squeal problems appear +in 1.8. Recommendations.)
+The frequencies obtained from the modal solution have real and imaginary parts due +the presence of an unsymmetric stiffness matrix. The imaginary frequency reflects +the damped frequency, and the real frequency indicates whether the mode is stable or +not. A real eigenfrequency with a positive value indicates an unstable mode.
+The following input shows the solution steps involved in this method:
+Modal Solution
+mapdl.run("/SOLU")
+mapdl.nropt("UNSYM") # To generate non symmetric
+mapdl.cmsel("S", "C1_R") # Select the target elements of the disc
+mapdl.cmsel("A", "C2_R")
+mapdl.cm("E_ROTOR", "ELEM") # Form a component named E_ROTOR with the selected target elements
+mapdl.allsel("ALL")
+mapdl.cmrotate("E_ROTOR", "", "", 2) # Rotate the selected element along global Z using CMROTATE command
+
+# Perform modal solve, use UNSYM to extract 30 modes, and expand those
+# modes.
+mapdl.modal_analysis("UNSYM", 30, mxpand=True)
+mapdl.finish()
+
+mapdl.post1()
+modes = []
+modes.append(mapdl.set("list"))
+mapdl.set(1, 21)
+
+# Plot the mode shape for mode 21
+mapdl.post_processing.plot_nodal_displacement(
+ "NORM",
+ cmap=ansys_colormap(),
+ line_width=5,
+ cpos="xy",
+ scalar_bar_args={"title": "Displacement", "vertical": False},
+)
+
Figure 1.3: Mode Shape for Unstable Mode (Mode 21). +Obtained from the 1.6.1. Linear Non-prestressed Modal Analysis .
+Use a partial nonlinear perturbed modal analysis when stress-stiffening affects +the final modal solution. The initial contact conditions are established, and a +prestressed matrix is generated at the end of the first static solution.
+Following is the process for solving a brake-squeal problem using this method:
+Perform a nonlinear, large-deflection static analysis
+(Mapdl.nlgeom("ON")
).
Use the unsymmetric Newton-Raphson method
+(Mapdl.nropt("UNSYM")
). Specify the restart control points needed
+for the linear perturbation analysis (Mapdl.rescontrol()
)
Create components for use in the next step.
+The static solution with external loading establishes the initial contact +condition and generates a prestressed matrix.
+Restart the previous static solution from the desired load step and
+substep, and perform the first phase of the perturbation analysis while
+preserving the .ldhi, .rnnn and .rst files (Mapdl.antype("STATIC", "RESTART", "", "", "PERTURB")
).
Initiate a modal linear perturbation analysis
+(Mapdl.perturb("MODAL")
).
Generate forced frictional sliding contact (Mapdl.cmrotate()
),
+specifying the component names created in the previous step.
The contact stiffness matrix is based only on the contact status at the +restart point.
+Regenerate the element stiffness matrix at the end of the first phase of
+the linear perturbation solution (Mapdl.solve("ELFORM")
).
Obtain the linear perturbation modal solution using the QRDAMP or UNSYM
+eigensolver (Mapdl.modopt()
).
When using the QRDAMP solver, you can reuse the symmetric
+eigensolution from the previous load steps
+(Mapdl.qrdopt()
), effective when performing a
+friction-sensitive/parametric analysis, as it saves time by not
+recalculating the real symmetric modes after the first solve
+operation.
Expand the modes and postprocess the results (from the jobname.rstp file).
The following inputs show the solution steps involved with this method:
+Static Solution
+start(mapdl, "partial_prestressed")
+mapdl.title("partial_prestressed, Solving brake squeal problem using partial pre-stressed modal solve")
+
+mapdl.run("/SOLU")
+mapdl.antype("STATIC") # Perform static solve
+mapdl.outres("ALL", "ALL") # Write all element and nodal solution results for each sub steps
+mapdl.nropt("UNSYM") # Specify unsymmetric Newton-Raphson option to solve the problem
+mapdl.rescontrol("DEFINE", "ALL", 1) # Control restart files
+mapdl.nlgeom("ON") # Activate large deflection
+mapdl.autots("ON") # Auto time stepping turned on
+mapdl.time(1.0) # End time = 1.0 sec
+mapdl.esel("S", "TYPE", "", 124) # Select element type 124
+mapdl.nsle("S", "ALL") # Select nodes attached to the element
+mapdl.sf("ALL", "PRES", "%_LOADVARI4059%") # Apply surface pressure on the selected nodes
+mapdl.esel("S", "TYPE", "", 125) # Select element type 125
+mapdl.nsle("S", "ALL") # Select nodes attached to the element
+mapdl.sf("ALL", "PRES", "%_LOADVARI4061%") # Apply surface pressure on the selected nodes
+mapdl.nsel("ALL")
+mapdl.allsel("ALL")
+mapdl.cmsel("S", "C1_R") # Select target elements of the disc
+mapdl.cmsel("A", "C2_R")
+mapdl.cm("E_ROTOR", "ELEM") # Form a component named E_ROTOR
+mapdl.allsel("ALL")
+mapdl.solve() # Solve with prestress
+mapdl.finish()
+
Post processing to show partial results.
+# select contact elements attached to the brake pad
+mapdl.post1()
+mapdl.set("last")
+mapdl.esel("s", "type", "", 30, 32, 2)
+mapdl.post_processing.plot_element_values(
+ "CONT", "STAT", scalar_bar_args={"title": "Contact status"}
+)
+
+mapdl.post_processing.plot_element_values(
+ "CONT", "SLIDE", scalar_bar_args={"title": "Contact sliding distance"}
+)
+
+mapdl.allsel("all")
+mapdl.finish()
+
Perturbed Modal Solution
+# Restart from last load step and sub step of previous
+mapdl.run("/SOLU")
+mapdl.antype("static", "restart", "", "", "perturb")
+
+# static solution to perform perturbation analysis
+mapdl.perturb("modal", "", "", "") # Perform perturbation modal solve
+mapdl.cmrotate("E_ROTOR", rotatz=2)
+mapdl.solve("elform") # Regenerate the element matrices
+mapdl.outres("all", "all")
+mapdl.modopt("unsym", 30) # Use UNSYM eigen solver and extract 30 modes
+mapdl.mxpand(30, "", "", "") # Expand 30 modes
+mapdl.solve()
+mapdl.finish()
+
Post processing to show results.
+mapdl.post1()
+mapdl.file("", "rstp")
+print(mapdl.post_processing)
+
+mapdl.set(1, 21)
+mapdl.post_processing.plot_nodal_displacement(
+ scalar_bar_args={"title": "Total displacement\n Substep 21"}
+)
+
+mapdl.set(1, 22)
+mapdl.post_processing.plot_nodal_displacement(
+ scalar_bar_args={"title": "Total displacement\n Substep 22"}
+)
+
Figure 1.5: Mode Shape for Unstable Mode (Mode 21). +Obtained from the 1.6.1. Linear Non-prestressed Modal Analysis .
+Figure 1.6: Mode Shape for Unstable Mode (Mode 21). +Obtained from the 1.6.1. Linear Non-prestressed Modal Analysis .
+A full nonlinear perturbed modal analysis is the most accurate method for modeling +the brake-squeal problem. This method uses Newton-Raphson iterations for both of the static solutions.
+Following is the process for solving a brake-squeal problem using this method:
+Perform a nonlinear, large-deflection static analysis
+(Mapdl.nlgeom("ON")
).
+Use the unsymmetric Newton-Raphson method (Mapdl.nropt("UNSYM")
).
+Specify the restart control points needed for the linear perturbation analysis
+(Mapdl.rescontrol()
).
Perform a full second static analysis. Generate sliding contact
+(Mapdl.cmrotate()
) to form an unsymmetric stiffness matrix.
After obtaining the second static solution, postprocess the contact results. +Determine the status (that is, whether the elements are sliding, and the sliding distance, if any).
Restart the previous static solution from the desired load step and substep, and perform the first
+phase of the perturbation analysis while preserving the .ldhi, .rnnn and
+.rst files (Mapdl.antype("STATIC", "RESTART",,, "PERTURB")
).
Initiate a modal linear perturbation analysis
+(Mapdl.perturb("MODAL")
).
Regenerate the element stiffness matrix at the end of the first phase of
+the linear perturbation solution (Mapdl.solve("ELFORM")
).
Obtain the linear perturbation modal solution using the QRDAMP or UNSYM eigensolver
+(Mapdl.modopt()
).
Expand the modes and postprocess the results (from the jobname.rstp file). +The following inputs show the solution steps involved with this method:
First Static Solution
+start(mapdl, 'full_non_linear')
+
+mapdl.run("/SOLU")
+mapdl.antype("STATIC") # Perform static solve
+mapdl.outres("ALL", "ALL") # Write all element and nodal solution results for each substep
+mapdl.nropt("UNSYM") # Specify unsymmetric Newton-Raphson option to solve the problem
+mapdl.rescontrol("DEFINE", "ALL", 1) # Control restart files
+mapdl.nlgeom("ON") # Activate large deflection
+mapdl.autots("ON") # Auto time stepping turned on
+mapdl.time(1.0) # End time = 1.0 sec
+mapdl.esel("S", "TYPE", "", 124) # Select element type 124
+mapdl.nsle("S", "ALL") # Select nodes attached to the element
+mapdl.sf("ALL", "PRES", "%_LOADVARI4059%") # Apply surface pressure on the selected nodes
+mapdl.esel("S", "TYPE", "", 125) # Select element type 125
+mapdl.nsle("S", "ALL") # Select nodes attached to the element
+mapdl.sf("ALL", "PRES", "%_LOADVARI4061%") # Apply surface pressure on the selected nodes
+mapdl.nsel("ALL")
+mapdl.allsel("ALL")
+mapdl.cmsel("S", "C1_R") # Select the target elements of the disc
+mapdl.cmsel("A", "C2_R")
+mapdl.cm("E_ROTOR", "ELEM") # Form a component named E_ROTOR with the selected target ELEMENTS
+mapdl.allsel("ALL")
+mapdl.solve() # Solve with prestress loading
+
Second Static Solution
+mapdl.cmrotate("E_ROTOR", rotatz=2)
+mapdl.time(2.0) # End time = 2.0sec
+mapdl.solve() # Perform full solve
+mapdl.finish()
+
Plotting partial results
+mapdl.post1()
+mapdl.set("last")
+
+# select contact elements attached to the brake pad
+mapdl.esel("s", "type", "", 30, 32, 2)
+
+mapdl.post_processing.plot_element_values(
+ "CONT", "STAT", scalar_bar_args={"title": "Contact status"}
+)
+
+mapdl.post_processing.plot_element_values(
+ "CONT", "SLIDE", scalar_bar_args={"title": "Contact sliding distance"}
+)
+
+mapdl.allsel("all")
+mapdl.finish()
+
Perturbed Modal Solution
+mapdl.run("/SOLU")
+mapdl.antype("STATIC", "RESTART", action="PERTURB") # Restart from last load step and sub step
+mapdl.perturb("MODAL") # Perform linear perturbation modal solve
+mapdl.solve("ELFORM") # Regenerate the element stiffness matrix
+mapdl.outres("ALL", "ALL")
+mapdl.modopt("UNSYM", 30) # Use UNSYM eigensolver and extract 30 modes
+mapdl.mxpand(30) # Expand 30 modes
+mapdl.solve() # Solve linear perturbation modal solve
+
Plotting results
+mapdl.post1()
+mapdl.file("", "RSTP")
+print(mapdl.post_processing)
+
+
+mapdl.set(1, 21)
+mapdl.post_processing.plot_nodal_displacement(
+ scalar_bar_args={"title": "Total displacement\n Substep 21"}
+)
+
+mapdl.set(1, 22)
+mapdl.post_processing.plot_nodal_displacement(
+ scalar_bar_args={"title": "Total displacement\n Substep 22"}
+)
+
+mapdl.finish()
+mapdl.exit()
+
Figure 1.7: Mode Shape for Unstable Mode (Mode 21).
+Figure 1.8: Mode Shape for Unstable Mode (Mode 21).
+The unstable mode predictions for the brake disc-pad assembly using all three methods +were very close due to the relatively small prestress load. +The 1.6.1. Linear Non-prestressed Modal Analysis predicted +unstable modes at 6474 Hz, while the other two solution methods predicted unstable modes +at 6470 Hz.
+The mode shape plots for the unstable modes suggest that the bending mode of the pads +and disc have similar characteristics. These bending modes couple due to friction, and +produce a squealing noise.
+Figure 1.9: Mode Shape for Unstable Mode (Mode 21). +Obtained from the 1.6.1. Linear Non-prestressed Modal Analysis .
+Figure 1.10: Mode Shape for Unstable Mode (Mode 22). +Obtained from the 1.6.1. Linear Non-prestressed Modal Analysis .
+Table 1.2: Solution Output
++ | Linear non-prestressed modal |
+Partial nonlinear perturbed modal |
+Full nonlinear perturbed modal |
+|||
---|---|---|---|---|---|---|
Mode |
+Imaginary |
+Real |
+Imaginary |
+Real |
+Imaginary |
+Real |
+
1.00 |
+775.91 |
+0.00 |
+775.73 |
+0.00 |
+775.73 |
+0.00 |
+
2.00 |
+863.54 |
+0.00 |
+863.45 |
+0.00 |
+863.45 |
+0.00 |
+
3.00 |
+1097.18 |
+0.00 |
+1097.03 |
+0.00 |
+1097.03 |
+0.00 |
+
4.00 |
+1311.54 |
+0.00 |
+1311.06 |
+0.00 |
+1311.06 |
+0.00 |
+
5.00 |
+1328.73 |
+0.00 |
+1328.07 |
+0.00 |
+1328.07 |
+0.00 |
+
6.00 |
+1600.95 |
+0.00 |
+1600.66 |
+0.00 |
+1600.66 |
+0.00 |
+
7.00 |
+1616.15 |
+0.00 |
+1615.87 |
+0.00 |
+1615.87 |
+0.00 |
+
8.00 |
+1910.50 |
+0.00 |
+1910.50 |
+0.00 |
+1910.50 |
+0.00 |
+
9.00 |
+2070.73 |
+0.00 |
+2070.44 |
+0.00 |
+2070.44 |
+0.00 |
+
10.00 |
+2081.26 |
+0.00 |
+2080.98 |
+0.00 |
+2080.98 |
+0.00 |
+
11.00 |
+2676.71 |
+0.00 |
+2675.23 |
+0.00 |
+2675.23 |
+0.00 |
+
12.00 |
+2724.05 |
+0.00 |
+2722.61 |
+0.00 |
+2722.61 |
+0.00 |
+
13.00 |
+3373.96 |
+0.00 |
+3373.32 |
+0.00 |
+3373.32 |
+0.00 |
+
14.00 |
+4141.64 |
+0.00 |
+4141.45 |
+0.00 |
+4141.45 |
+0.00 |
+
15.00 |
+4145.16 |
+0.00 |
+4145.04 |
+0.00 |
+4145.04 |
+0.00 |
+
16.00 |
+4433.91 |
+0.00 |
+4431.08 |
+0.00 |
+4431.08 |
+0.00 |
+
17.00 |
+4486.50 |
+0.00 |
+4484.00 |
+0.00 |
+4484.00 |
+0.00 |
+
18.00 |
+4668.51 |
+0.00 |
+4667.62 |
+0.00 |
+4667.62 |
+0.00 |
+
19.00 |
+4767.54 |
+0.00 |
+4766.95 |
+0.00 |
+4766.95 |
+0.00 |
+
20.00 |
+5241.61 |
+0.00 |
+5241.38 |
+0.00 |
+5241.38 |
+0.00 |
+
21.00 |
+6474.25 |
+21.61 |
+6470.24 |
+21.90 |
+6470.24 |
+21.90 |
+
22.00 |
+6474.25 |
+-21.61 |
+6470.24 |
+-21.90 |
+6470.24 |
+-21.90 |
+
23.00 |
+6763.36 |
+0.00 |
+6763.19 |
+0.00 |
+6763.19 |
+0.00 |
+
24.00 |
+6765.62 |
+0.00 |
+6765.51 |
+0.00 |
+6765.51 |
+0.00 |
+
25.00 |
+6920.64 |
+0.00 |
+6919.64 |
+0.00 |
+6919.64 |
+0.00 |
+
26.00 |
+6929.25 |
+0.00 |
+6929.19 |
+0.00 |
+6929.19 |
+0.00 |
+
27.00 |
+7069.69 |
+0.00 |
+7066.72 |
+0.00 |
+7066.72 |
+0.00 |
+
28.00 |
+7243.80 |
+0.00 |
+7242.71 |
+0.00 |
+7242.71 |
+0.00 |
+
29.00 |
+8498.41 |
+0.00 |
+8493.08 |
+0.00 |
+8493.08 |
+0.00 |
+
30.00 |
+8623.76 |
+0.00 |
+8616.68 |
+0.00 |
+8616.68 |
+0.00 |
+
It is important to determine the modal behavior of individual components (disc and +pads) when predicting brake-squeal noise. A modal analysis performed on the free pad +and free disc model gives insight into potential coupling modes. The natural +frequency and mode shapes of brake pads and disc can also be used to define the type +of squeal noise that may occur in a braking system. Bending modes of pads and disc +are more significant than twisting modes because they eventually couple to produce +squeal noise.
+An examination of the results obtained from the modal analysis of a free disc and +pad shows that the second bending mode of the pad and ninth bending mode of the disc +can couple to create dynamic instability in the system. These pad and disc bending +modes can couple to produce an intermediate lock, resulting in a squeal noise at a +frequency close to 6470 Hz.
+A parametric study was performed on the brake disc model using a linear
+non-prestressed modal solution with an increasing coefficient of friction. QRDAMP
+eigensolver is used to perform the parametric studies by reusing the symmetric real
+modes (Mapdl.qrdopt("ON")
) obtained in the first load
+step.
The following plot suggests that modes with similar characteristics approach each +other and couple as the coefficient of friction increases:
+Figure 1.11: Effect of Friction Coefficient on Unstable Modes
+The following table provides guidelines for selecting the optimal analysis method to +use for a brake-squeal problem:
+Table 1.3: Analysis comparison
+Analysis Method |
+Benefits |
+Costs |
+
---|---|---|
Linear non-prestressed modal |
+
|
+
|
+
Partial nonlinear perturbed modal |
+
|
+
|
+
Full nonlinear perturbed modal |
+
|
+
|
+
The following table provides guidelines for selecting the optimal eigensolver
+(Mapdl.modopt()
) for obtaining the brake-squeal solution:
Table 1.4: Solver comparison
+Eigensolver |
+Benefits |
+Costs |
+
---|---|---|
QRDAMP |
+
|
+
|
+
UNSYM |
+
|
+
|
+
For further information, see Brake-Squeal (Prestressed Modal) Analysis in the Structural Analysis Guide.
+The following works were consulted when creating this example problem:
+Triches, M. Jr., Gerges, S. N. Y., & Jordon, R. (2004). Reduction of +squeal noise from disc brake systems using constrained layer damping. +Journal of the Brazilian Society of Mechanical Sciences and +Engineering. 26, 340-343.
Allgaier, R., Gaul, L., Keiper, W., & Willner, K. (1999). Mode lock-in and +friction modeling. Computational Methods in Contact +Mechanics. 4, 35-47.
Schroth, R., Hoffmann, N., Swift, R. (2004, January). Mechanism of brake +squeal from theory to experimentally measured mode coupling. In +Proceedings of the twenty second International Modal Analysis +Conference (IMAC XXII).
The following input files were used for this problem:
+linear_non_prestressed.html – Linear non-prestressed modal solve input file.
+Download source code: linear_non_prestressed.py
.
partial_prestressed.html – Partial prestressed modal solve input file.
+Download source code: partial_prestressed.py
.
full_non_linear.html – Full nonlinear prestressed modal solve input file.
+Download source code: full_non_linear.py
.
linear_non_prestressed_par.html – Parametric studies with increasing coefficient of friction.
+Download source code: linear_non_prestressed_par.py
.
disc_pad_model.cdb – Common database file used for the linear non-prestressed modal analysis, the partial prestressed modal analysis,
+and the full nonlinear prestressed modal analysis (called by the linear_non_prestressed.dat, partial_prestressed.dat,
+full_non_linear.html and linear_non_prestressed_par.html files, respectively).
+Download file: disc_pad_model.cdb
.
+ |
For more information, see Obtaining the input files.
+ +This example problem demonstrates the hyperelastic curve-fitting capabilities used +to select constitutive model parameters to fit experimental data. Several issues +that influence the accuracy of the curve fit are discussed. +Validation of the resulting constitutive model is demonstrated by comparison with a +tension-torsion experiment.
+The following topics are available:
+You can also perform this example analysis entirely in the Ansys +Mechanical Application. For more information, see +Calibrating and Validating a Hyperelastic Constitutive Model in the Workbench Technology Showcase: Example Problems.
+Several hyperelastic constitutive models can be used to model the large deformation +behavior of elastic materials; however, it is sometimes difficult to select parameters +to adequately match the behavior of the material. +The curve-fitting process fits the hyperelastic constitutive model parameters to a set +of experimental data using a least-squares minimization.
+Curve-fitting is relatively simple, but certain conditions can affect the accuracy of +the resulting constitutive model. +The constitutive model should therefore be compared with experimental data to ensure +that it adequately reproduces the material behavior over the actual range of deformation.
+A constitutive model is needed that matches the behavior of a vulcanized natural +rubber material up to 100 percent engineering strain in a variety of deformation modes.
+In this problem, the experimental data are obtained from a simulation of a +hyperelastic test suite (uniaxial, biaxial, and planar tension tests) using common +experimental test specimens. Using this data, parameters for a constitutive model are +determined using hyperelastic fitting capabilities that focus on use of the three-, +five-, and nine-parameter Mooney-Rivlin hyperelastic models.
+After demonstrating the fitting procedure and selecting a suitable constitutive model, +a tension-torsion experiment is simulated and compared to the experimental data to +validate the predictions for the model.
+Material properties for the calibration and validation experiments follow:
+ +Experimental data was obtained via a simulation of a hyperelastic test suite with +an Ogden hyperelastic material. +The test suite specimens are shown here, with the dark areas indicating locations +of the clamps:
+ +The engineering-stress vs. engineering-strain results are as follows:
+ +The uniaxial specimen is similar to ASTM D412-C (ASTM Standard D412, 2006).
+The crosshead is displaced by 396 mm, giving a measured engineering strain in the +gage section of 662 percent and a calculated engineering stress of 58.1 MPa.
+The equibiaxial specimen is disc-shaped, with 16 equally spaced tabs about the +circumference. The tabs are stretched 127.3 mm, resulting in a measured engineering +strain in the gage section of 336 percent and a calculated engineering stress of +22.1 MPa.
+For the planar specimen, the crosshead is displaced by 191.6 mm, giving a +calculated engineering strain of 639 percent and a calculated engineering stress of +54.7 MPa.
+A simulated tension-torsion experiment was performed on a thin strip. The specimen +is similar to that specified in ASTM D1043 (ASTM Standard D1043, 2006) and is shown +here:
+ +The experiment consists of clamping each end of the specimen into the test +apparatus, then stretching the specimen by 50 percent of its original gage length +and twisting one end of the specimen for four complete revolutions. Following is the +resulting moment-vs.-rotation data:
+ +Analysis and solution-control information for calibration and validation +follow:
+ +Material parameter calibration occurs using the curve-fitting +tool.
+Example 15.1: Fitting a hyperelastic constitutive model to a set of uniaxial stress-strain +Data
+The command input shown here is for illustration only. While curve-fitting is +possible via command input, Ansys, Inc. recommends using the graphical user +interface (GUI) to perform the curve-fitting, or at least visually validating +the results using the GUI to ensure a sound fit.
+from ansys.mapdl.core import launch_mapdl
+mapdl = launch_mapdl()
+
+mapdl.prep7()
+mapdl.tbft("fadd",1,"hyper","mooney",3)
+mapdl.tbft("eadd",1,"unia","uniax".l)OG
+mapdl.tbft("solve",1,"hyper","mooney",3)
+mapdl.tbft("fset",1,"hyper","mooney",3)
+
The TBFT,FADD
command initializes the curve-fitting procedure
+for a hyperelastic, three-parameter, Mooney-Rivlin model assigned to
+material identification number 1.
TBFT,EADD
reads the uniaxial experimental data in the
+uniax.log
file as the fitting data for material number 1.
+The experimental data in the file is a set of engineering-strain vs.
+engineering-stress input:
0.819139E-01 0.82788577E+00
+0.166709E+00 0.15437247E+01
+0.253960E+00 0.21686152E+01
+0.343267E+00 0.27201819E+01
+0.434257E+00 0.32129833E+01
+0.526586E+00 0.36589498E+01
+0.619941E+00 0.40677999E+01
+0.714042E+00 0.44474142E+01
+0.808640E+00 0.48041608E+01
+0.903519E+00 0.51431720E+01
+0.998495E+00 0.54685772E+01
+0.109341E+01 0.57836943E+01
+
TBFT,SOLVE
determines the three constitutive parameters for the
+Mooney-Rivlin model, minimizing the difference between the model and the
+experimental data.
TBFT,FSET
assigns the fitted constitutive parameters to
+material number 1.
For this problem, the fitted parameters for the three-parameter Mooney-Rivlin +model are:
+\(C_{10} = 1.338856\) |
+
\(C_{11} = - 1.648364 x10-2\) |
+
Following is a mesh developed to simulate the torsion experiment to validate the +fitted constitutive model parameters obtained in 15.4.1. Calibrating Parameters:
+ +The mesh consists of 1,332 SOLID186 elements using the +default formulation (a mixed-displacement pressure formulation with reduced +integration).
+The attachment of the test specimen +to the test apparatus is simulated by boundary conditions applied to the specimen in +the region of the clamps, as described here:
+The back-left clamp region is fully restrained.
The back-right clamp region is attached to a rigid-contact surface and +fixed in place.
The front-left clamp region is attached to a rigid-contact surface and +displaced in the z direction to simulate a clamping displacement equal +to 25 percent of the specimen thickness. The same is true for the +front-right clamp region. +The stretching to 50 percent engineering strain is simulated by displacing the +rigid-contact surfaces attached to the right clamp regions while holding left clamp +regions fixed.
The torsion of the specimen is simulated by holding the left clamp region in place +and twisting the keypoints attached to the right contact surfaces about the +longitudinal axis.
+Results for the calibration and validation operations are discussed below:
+ +Using all of experimental data shown in Fig. 10 +to fit the three-, five-, and nine-parameter Mooney-Rivlin models results in the +following parameters, fit to the entire range of experimental data:
++ | Three-Parameter |
+Five-Parameter |
+Nine-Parameter |
+
---|---|---|---|
\(C_{10}\) |
+1.8785 |
+1.4546 |
+1.7095 |
+
\(C_{01}\) |
+-5.7759 x 10-2 |
+7.6677 x 10-2 |
+5.6365 x 10-2 |
+
\(C_{20}\) |
+— |
+1.3484 x 10-2 |
+-1.2088 x 10-2 |
+
\(C_{11}\) |
+1.9589 x 10-3 |
+-4.4337 x 10-3 |
+3.7099 x 10-5 |
+
\(C_{02}\) |
+— |
+2.3997 x 10-4 |
+-4.6858 x 10-4 |
+
\(C_{30}\) |
+— |
+— |
+3.5202 x 10-4 |
+
\(C_{21}\) |
+— |
+— |
+6.0562 x 10-6 |
+
\(C_{12}\) |
+— |
+— |
+1.9666 x 10-5 |
+
\(C_{03}\) |
+— |
+— |
+-8.9997 x 10-7 |
+
\(\nu\) |
+3.6415 |
+3.0625 |
+3.5318 |
+
The following figure is a comparison of the models to the experimental data:
+ +Thus far, it is obvious that none of the models provide a suitable fit to the +entire range of experimental data. The reason is that the least-squares fitting +procedure is minimizing the error over the entire range of data; therefore, it can +be detrimental to include data that is not representative of the actual range of use.
+If the experimental data range is limited to about 100 percent strain, however, +the fitted parameters shown in the following table are obtained:
++ | Three-Parameter |
+Five-Parameter |
+Nine-Parameter |
+
---|---|---|---|
\(C_{10}\) |
+1.6540 |
+1.7874 |
+1.8904 |
+
\(C_{01}\) |
+1.2929 x 10-1 |
+5.7229 x 10-2 |
+-3.6352 x 10-2 |
+
\(C_{20}\) |
+— |
+-5.8765 x 10-2 |
+-2.3484 x 10-1 |
+
\(C_{11}\) |
+-1.2726 x 10-2 |
+2.6843 x 10-2 |
+2.6511 x 10-1 |
+
\(C_{02}\) |
+— |
+-5.1127 x 10-3 |
+-6.8670 x 10-2 |
+
\(C_{30}\) |
+— |
+— |
+5.1742 x 10-2 |
+
\(C_{21}\) |
+— |
+— |
+-8.3262 x 10-2 |
+
\(C_{12}\) |
+— |
+— |
+3.6204 x 10-2 |
+
\(C_{03}\) |
+— |
+— |
+-4.3754 x 10-3 |
+
\(\nu\) |
+3.5665 |
+3.6892 |
+3.7081 |
+
The following figure is a comparison of the models with the parameters fit to the +modified experimental data:
+ +For the equibiaxial and planar experiments, any of the three models might be +acceptable; however, the comparison with the uniaxial data might indicate that +none of the three models are acceptable.
+The behavior of the model outside the fitted range can significantly differ from +the actual response of the material. For example, the model parameters fit to the +experimental data to 100 percent strain have been used to simulate the hyperelastic +test suite to strains of about 200 percent, as shown in the following comparisons:
+ +Beyond 100 percent strain, it becomes apparent that some of the predictions +quickly deteriorate. In all three comparisons, the nine-parameter model quickly +loses accuracy, and it appears that the three- and nine-parameter Mooney-Rivlin +models have lost stability for the biaxial deformation case.
+The five-parameter Mooney-Rivlin model, fit to the experimental data up to 100 +percent strain, is selected as an adequate representation of the material response. +The constitutive model is specified via the following input:
+C10 = 1.787381e+00
+C01 = 5.722875e-02
+C20 =-5.876502e-02
+C11 = 2.684331e-02
+C02 =-5.112790e-03
+mapdl.tb("HYPER",1,"",5,"MOONEY")
+mapdl.tbdata(1,C10,C01,C20,C11,C02)
+
The following figure shows a contour plot of the strain energy density at the end +of simulation. The plot offers a general idea of the overall deformation of the +specimen.
+ +With the exception of the clamp regions, the deformation shows a uniform pattern +in the gage region along the axis of twisting. Perpendicular to the axis of twisting +is a large strain-energy density near the outside edge of the specimen, decreasing +toward the center.
+The following figure shows a comparison of the model with the experimental moment +vs. theta data:
+ +After a seemingly anomalous first data point, the error between the simulation and +experiment is in the range of 2 to 4 percent. Throughout the entire simulation, the +five-parameter Mooney-Rivlin model predicts a higher moment for an equivalent twist, +which is not entirely expected by the error plots for the hyperelastic test suite +comparisons; nevertheless, a maximum four percent error appears to be a reasonable +margin of error for this simulation.
+When performing a similar type of calibration and validation, consider the following +recommendations:
+Obtain test data from at least two (and preferably all three) of the +experiments in the hyperelastic test suite.
Ensure that the test data covers the range of deformation over which the +constitutive model will be used.
If the error between the experimental data and the constitutive model is too +great, try limiting the experimental data to the range of deformation over which +the constitutive model will be used.
Use the constitutive model within the range of fitted data only.
Use an independent experiment to validate that the constitutive model +adequately matches the material behavior.
The following references were consulted when creating this example problem:
+1. ASTM International. (2006). (http://www.astm.org/Standards/D1043.htm). +Standard Test Method for Stiffness Properties of Plastics as a Function of Temperature by Means of a Torsion Test. +West Conshohocken. +2. ASTM International. (2006). [ASTM Standard D412](http://www.astm.org/Standards/D412.htm). +Standard Test Methods for Vulcanized Rubber and Thermoplastic Elastomers-Tension. +West Conshohocken.
+The following files were used in this problem:
+tension_torsion.dat – Tension-torsion simulation input file.
tension_torsion.cdb – The common database file containing the model information for this problem +(called by tension_torsion.dat ).
+ |
For more information, see Obtaining the input files.
+ +This examples shows how to use PyMAPDL to import an existing FE model and to +run a modal and PSD analysis. PyDPF modules are also used for post-processing.
+The following topics are available:
+This example is inspired from the model and analysis defined in Chapter 20 of +the Mechanical APDL Technology Showcase Manual.
+Matplotlib is used for plotting purposes.
The original FE model is given in the Ansys Mechanical APDL Technology
+Showcase Manual. The pcb_mesh_file.cdb
contains a FE model of a single
+circuit board. The model is meshed with SOLID186, SHELL181 and BEAM188 elements.
+All components of the PCB model is assigned with linear elastic isotropic materials.
+Bonded and flexible surface-to-surface contact pairs are used to define the contact
+between the IC packages and the circuit board.
# sphinx_gallery_thumbnail_path = '_static/tse20_setup.png'
+
+import _.pyplot as plt
+
+from ansys.mapdl.core import launch_mapdl
+from ansys.mapdl.core.examples.downloads import download_tech_demo_data
+
+# start MAPDL as a service
+mapdl = launch_mapdl()
+print(mapdl)
+
Product: Ansys Mechanical Enterprise
+MAPDL Version: 21.2
+ansys.mapdl Version: 0.63.0
+
# read model of single circuit board
+# download the cdb file
+pcb_mesh_file = download_tech_demo_data("td-20", "pcb_mesh_file.cdb")
+
+# enter preprocessor and read in cdb
+mapdl.prep7()
+mapdl.cdread("COMB", pcb_mesh_file)
+mapdl.allsel()
+mapdl.eplot(background="w")
+mapdl.cmsel("all")
+
The original model will be duplicated to create a layered PCB of three layers +that are bound together.
+# duplicate single PCB to get three layers
+# get the maximum node number for the single layers PCB in the input file
+max_nodenum = mapdl.get("max_nodenum", "node", "", "num", "max")
+
+# generate additional PCBs offset by 20 mm in the -y direction
+mapdl.egen(3, max_nodenum, "all", dy=-20)
+
+
+# bind the three layers together
+# select components of interest
+mapdl.cmsel("s", "N_JOINT_BOARD")
+mapdl.cmsel("a", "N_JOINT_LEGS")
+mapdl.cmsel("a", "N_BASE")
+
+# get number of currently selected nodes
+nb_selected_nodes = mapdl.mesh.n_node
+current_node = 0
+queries = mapdl.queries
+
+# also select similar nodes for copies of the single PCB
+# and couple all dofs at the interface
+for node_id in range(1, nb_selected_nodes + 1):
+ current_node = queries.ndnext(current_node)
+ mapdl.nsel("a", "node", "", current_node + max_nodenum)
+ mapdl.nsel("a", "node", "", current_node + 2 * max_nodenum)
+mapdl.cpintf("all")
+
+# define fixed support boundary condition
+# get max coupled set number
+cp_max = mapdl.get("cp_max", "cp", 0, "max")
+
+# unselect nodes scoped in CP equations
+mapdl.nsel("u", "cp", "", 1, "cp_max")
+
+# create named selection for base excitation
+mapdl.cm("n_base_excite", "node")
+
+# fix displacement for base excitation nodes
+mapdl.d("all", "all")
+
+# select all and plot the model using MAPDL's plotter and VTK's
+mapdl.allsel("all")
+mapdl.cmsel("all")
+mapdl.graphics("power")
+mapdl.rgb("index", 100, 100, 100, 0)
+mapdl.rgb("index", 80, 80, 80, 13)
+mapdl.rgb("index", 60, 60, 60, 14)
+mapdl.rgb("index", 0, 0, 0, 15)
+mapdl.triad("rbot")
+mapdl.pnum("type", 1)
+mapdl.number(1)
+mapdl.hbc(1, "on")
+mapdl.pbc("all", "", 1)
+mapdl.view(1, 1, 1, 1)
+# mapdl.eplot(vtk=False)
+mapdl.eplot(vtk=True)
+
A modal analysis is run using Block Lanczos. +Only 10 modes are extracted for the sake of run times, but using a higher +number of nodes is recommended (suggestion: 300 modes).
+# enter solution processor and define analysis settings
+mapdl.slashsolu()
+mapdl.antype("modal")
+# set number of modes to extract
+# using a higher number of modes is recommended
+nb_modes = 10
+# use Block Lanczos to extract specified number of modes
+mapdl.modopt("lanb", nb_modes)
+mapdl.mxpand(nb_modes)
+output = mapdl.solve()
+print(output)
+
*** NOTE *** CP = 0.781 TIME= 06:52:51
+ The automatic domain decomposition logic has selected the MESH domain
+ decomposition method with 2 processes per solution.
+
+ ***** ANSYS SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.812 TIME= 06:52:51
+ There is no title defined for this analysis.
+
+ *** NOTE *** CP = 0.828 TIME= 06:52:51
+ To view 3-D mode shapes of beam or pipe elements, expand the modes with
+ element results calculation active via the MXPAND command's
+ Elcalc=YES.
+
+ *** WARNING *** CP = 0.844 TIME= 06:52:51
+ Previous testing revealed that 3 of the 26046 selected elements violate
+ shape warning limits. To review warning messages, please see the
+ output or error file, or issue the CHECK command.
+
+ *** NOTE *** CP = 0.844 TIME= 06:52:51
+ The model data was checked and warning messages were found.
+ Please review output or errors file (
+ C:\Users\gayuso\AppData\Local\Temp\ansys_pasiuwhdkb\file0.err ) for
+ these warning messages.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS BEAM188 . KEYOPT(3) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 1 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 2 IS BEAM188 . KEYOPT(3) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 2 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 3 IS BEAM188 . KEYOPT(3) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 3 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 4 IS BEAM188 . KEYOPT(3) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 4 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 5 IS BEAM188 . KEYOPT(3) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 5 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+ ELEMENT TYPE 6 IS SHELL181. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED AND KEYOPT(3)=2 IS SUGGESTED FOR
+ HIGHER ACCURACY OF MEMBRANE STRESSES; OTHERWISE, KEYOPT(3)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 6 HAS KEYOPT(3)=2. FOR THE SPECIFIED ANALYSIS TYPE, LUMPED MASS
+ MATRIX OPTION (LUMPM, ON) IS SUGGESTED.
+
+ ELEMENT TYPE 7 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 8 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 9 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 10 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 11 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 12 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 13 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 14 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 15 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 16 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 17 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 18 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 19 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 20 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+ ELEMENT TYPE 21 IS SOLID186. KEYOPT(2)=0 IS SUGGESTED.
+
+
+
+ *** ANSYS - ENGINEERING ANALYSIS SYSTEM RELEASE 2021 R2 21.2 ***
+ DISTRIBUTED Ansys Mechanical Enterprise
+
+ 00000000 VERSION=WINDOWS x64 06:52:51 JUL 25, 2022 CP= 0.844
+
+
+
+
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .MODAL
+ EXTRACTION METHOD. . . . . . . . . . . . . .BLOCK LANCZOS
+ NUMBER OF MODES TO EXTRACT. . . . . . . . . . . 10
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+ NUMBER OF MODES TO EXPAND . . . . . . . . . . . 10
+ ELEMENT RESULTS CALCULATION . . . . . . . . . .OFF
+
+ *** NOTE *** CP = 0.844 TIME= 06:52:51
+ SHELL181 and SHELL281 will not support real constant input at a future
+ release. Please move to section input.
+
+ *** NOTE *** CP = 0.891 TIME= 06:52:51
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ *** NOTE *** CP = 0.922 TIME= 06:52:51
+ Internal nodes from 43998 to 44297 are created.
+ 300 internal nodes are used for quadratic and/or cubic options of
+ BEAM188, PIPE288, and/or SHELL208.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 22 and contact element type 22 has been set up. The
+ companion pair has real constant set ID 23. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.0609
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23362 and target element 23450.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 23 and contact element type 22 has been set up. The
+ companion pair has real constant set ID 22. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6035
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23389 and target element 23348.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 24 and contact element type 24 has been set up. The
+ companion pair has real constant set ID 25. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.7893
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 23534 and target element 23703.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 25 and contact element type 24 has been set up. The
+ companion pair has real constant set ID 24. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6670
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23619 and target element 23500.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 26 and contact element type 26 has been set up. The
+ companion pair has real constant set ID 27. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.4344
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23799 and target element 23840.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 27 and contact element type 26 has been set up. The
+ companion pair has real constant set ID 26. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.2769
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 8.437694987E-15 was detected between contact
+ element 23816 and target element 23774.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 28 and contact element type 28 has been set up. The
+ companion pair has real constant set ID 29. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2044
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 23925 and target element 24048.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 29 and contact element type 28 has been set up. The
+ companion pair has real constant set ID 28. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.8833
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.993605777E-15 was detected between contact
+ element 24004 and target element 23917.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 30 and contact element type 30 has been set up. The
+ companion pair has real constant set ID 31. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.6992
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.33226763E-14 was detected between contact
+ element 24136 and target element 24168.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 31 and contact element type 30 has been set up. The
+ companion pair has real constant set ID 30. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7212
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 24143 and target element 24111.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 32 and contact element type 32 has been set up. The
+ companion pair has real constant set ID 33. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.1818
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 2.131628207E-14 was detected between contact
+ element 24242 and target element 24365.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 33 and contact element type 32 has been set up. The
+ companion pair has real constant set ID 32. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7511
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 24279 and target element 24217.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 34 and contact element type 34 has been set up. The
+ companion pair has real constant set ID 35. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2093
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 24457 and target element 24613.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 35 and contact element type 34 has been set up. The
+ companion pair has real constant set ID 34. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7849
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 24514 and target element 24456.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 36 and contact element type 36 has been set up. The
+ companion pair has real constant set ID 37. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.8622
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 24670 and target element 24765.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 37 and contact element type 36 has been set up. The
+ companion pair has real constant set ID 36. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7993
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 24705 and target element 24663.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 38 and contact element type 38 has been set up. The
+ companion pair has real constant set ID 39. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2658
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 9.769962617E-15 was detected between contact
+ element 24836 and target element 24926.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 39 and contact element type 38 has been set up. The
+ companion pair has real constant set ID 38. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.8514
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 8.881784197E-15 was detected between contact
+ element 24879 and target element 24787.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 40 and contact element type 40 has been set up. The
+ companion pair has real constant set ID 41. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.8593
+ Average contact pair depth 4.0000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 4.0000
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ One of the contact searching regions contains at least 63 target
+ elements. You may reduce the pinball radius.
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 24979 and target element 25077.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 41 and contact element type 40 has been set up. The
+ companion pair has real constant set ID 40. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 1.8845
+ Average contact pair depth 2.5000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 2.5000
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 25011 and target element 24931.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 42 and contact element type 42 has been set up. The
+ companion pair has real constant set ID 43. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.2391
+ Average contact pair depth 4.0000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 4.0000
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 8.881784197E-15 was detected between contact
+ element 25172 and target element 25232.
+ ***************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 43 and contact element type 42 has been set up. The
+ companion pair has real constant set ID 42. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.4761
+ Average contact pair depth 2.5000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 2.5000
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 25184 and target element 25127.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 44 and contact element type 44 has been set up. The
+ companion pair has real constant set ID 45. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.3552
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25356 and target element 25570.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 45 and contact element type 44 has been set up. The
+ companion pair has real constant set ID 44. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7967
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 25446 and target element 25239.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 46 and contact element type 46 has been set up. The
+ companion pair has real constant set ID 47. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.1237
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25628 and target element 25709.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 47 and contact element type 46 has been set up. The
+ companion pair has real constant set ID 46. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.5685
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 25639 and target element 25608.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 48 and contact element type 48 has been set up. The
+ companion pair has real constant set ID 49. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.0637
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25779 and target element 25820.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 49 and contact element type 48 has been set up. The
+ companion pair has real constant set ID 48. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.8027
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25787 and target element 25736.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 50 and contact element type 50 has been set up. The
+ companion pair has real constant set ID 51. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2471
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 1.33226763E-14 was detected between contact
+ element 25924 and target element 26035.
+ ****************************************
+
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 51 and contact element type 50 has been set up. The
+ companion pair has real constant set ID 50. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6964
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 1.953 TIME= 06:52:52
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 25939 and target element 25890.
+ ****************************************
+
+
+
+
+ *** NOTE *** CP = 2.016 TIME= 06:52:52
+ Internal nodes from 43998 to 44297 are created.
+ 300 internal nodes are used for quadratic and/or cubic options of
+ BEAM188, PIPE288, and/or SHELL208.
+
+
+
+ D I S T R I B U T E D D O M A I N D E C O M P O S E R
+
+ ...Number of elements: 26046
+ ...Number of nodes: 44197
+ ...Decompose to 2 CPU domains
+ ...Element load balance ratio = 1.001
+
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ THERMAL STRAINS INCLUDED IN THE LOAD VECTOR . . YES
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 22 and contact element type 22 has been set up. The
+ companion pair has real constant set ID 23. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.0609
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23362 and target element 23450.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 23 and contact element type 22 has been set up. The
+ companion pair has real constant set ID 22. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6035
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23389 and target element 23348.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 24 and contact element type 24 has been set up. The
+ companion pair has real constant set ID 25. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.7893
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 23534 and target element 23703.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 25 and contact element type 24 has been set up. The
+ companion pair has real constant set ID 24. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6670
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 23619 and target element 23500.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 32 and contact element type 32 has been set up. The
+ companion pair has real constant set ID 33. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.1818
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 2.131628207E-14 was detected between contact
+ element 24242 and target element 24365.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 33 and contact element type 32 has been set up. The
+ companion pair has real constant set ID 32. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.7511
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 24279 and target element 24217.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 38 and contact element type 38 has been set up. The
+ companion pair has real constant set ID 39. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2658
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 9.769962617E-15 was detected between contact
+ element 24836 and target element 24926.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 39 and contact element type 38 has been set up. The
+ companion pair has real constant set ID 38. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.8514
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 8.881784197E-15 was detected between contact
+ element 24879 and target element 24787.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 40 and contact element type 40 has been set up. The
+ companion pair has real constant set ID 41. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 2.8593
+ Average contact pair depth 4.0000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 4.0000
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ One of the contact searching regions contains at least 63 target
+ elements. You may reduce the pinball radius.
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 24979 and target element 25077.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 41 and contact element type 40 has been set up. The
+ companion pair has real constant set ID 40. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 1.8845
+ Average contact pair depth 2.5000
+ Pinball region factor PINB 1.0000
+ The resulting pinball region 2.5000
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.065814104E-14 was detected between contact
+ element 25011 and target element 24931.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 48 and contact element type 48 has been set up. The
+ companion pair has real constant set ID 49. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.0637
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25779 and target element 25820.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 49 and contact element type 48 has been set up. The
+ companion pair has real constant set ID 48. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.8027
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.421085472E-14 was detected between contact
+ element 25787 and target element 25736.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 50 and contact element type 50 has been set up. The
+ companion pair has real constant set ID 51. Both pairs should have
+ the same behavior.
+ ANSYS will keep the current pair and deactivate its companion pair,
+ resulting in asymmetric contact.
+ Shell edge - solid surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Default influence distance FTOLN will be used.
+ Average contact surface length 3.2471
+ Average contact pair depth 4.0000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 1.33226763E-14 was detected between contact
+ element 25924 and target element 26035.
+ ****************************************
+
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Symmetric Deformable- deformable contact pair identified by real
+ constant set 51 and contact element type 50 has been set up. The
+ companion pair has real constant set ID 50. Both pairs should have
+ the same behavior.
+ ANSYS will deactivate the current pair and keep its companion pair,
+ resulting in asymmetric contact.
+ Auto surface constraint is built
+ Contact algorithm: MPC based approach
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Contact related postprocess items (ETABLE, pressure ...) are not
+ available.
+ Contact detection at: nodal point (normal to target surface)
+ MPC will be built internally to handle bonded contact.
+ Average contact surface length 2.6964
+ Average contact pair depth 2.5000
+ User defined pinball region PINB 0.86250
+ Default target edge extension factor TOLS 10.000
+ Initial penetration/gap is excluded.
+ Bonded contact (always) is defined.
+
+ *** NOTE *** CP = 2.891 TIME= 06:52:53
+ Max. Initial penetration 7.105427358E-15 was detected between contact
+ element 25939 and target element 25890.
+ ****************************************
+
+
+
+ *********** PRECISE MASS SUMMARY ***********
+
+ TOTAL RIGID BODY MASS MATRIX ABOUT ORIGIN
+ Translational mass | Coupled translational/rotational mass
+ 0.25166E-03 0.0000 0.0000 | 0.0000 0.34581E-01 0.50068E-02
+ 0.0000 0.25166E-03 0.0000 | -0.34581E-01 0.0000 0.25711E-01
+ 0.0000 0.0000 0.25166E-03 | -0.50068E-02 -0.25711E-01 0.0000
+ ------------------------------------------ | ------------------------------------------
+ | Rotational mass (inertia)
+ | 6.4515 0.51185 -3.5215
+ | 0.51185 9.6801 0.68875
+ | -3.5215 0.68875 3.5678
+
+ TOTAL MASS = 0.25166E-03
+ The mass principal axes coincide with the global Cartesian axes
+
+ CENTER OF MASS (X,Y,Z)= 102.17 -19.895 137.41
+
+ TOTAL INERTIA ABOUT CENTER OF MASS
+ 1.5999 0.32438E-03 0.11573E-01
+ 0.32438E-03 2.3014 0.74412E-03
+ 0.11573E-01 0.74412E-03 0.84133
+
+ PRINCIPAL INERTIAS = 1.6001 2.3014 0.84115
+ ORIENTATION VECTORS OF THE INERTIA PRINCIPAL AXES IN GLOBAL CARTESIAN
+ ( 1.000,-0.000, 0.015) ( 0.000, 1.000, 0.001) (-0.015,-0.001, 1.000)
+
+
+ *** MASS SUMMARY BY ELEMENT TYPE ***
+
+ TYPE MASS
+ 1 0.326079E-05
+ 2 0.326079E-05
+ 3 0.326079E-05
+ 4 0.326079E-05
+ 5 0.326079E-05
+ 6 0.159600E-03
+ 7 0.429027E-05
+ 8 0.777647E-05
+ 9 0.197978E-05
+ 10 0.735761E-05
+ 11 0.186775E-05
+ 12 0.704400E-05
+ 13 0.696150E-05
+ 14 0.368481E-05
+ 15 0.459882E-05
+ 16 0.330798E-05
+ 17 0.197978E-05
+ 18 0.111823E-04
+ 19 0.391721E-05
+ 20 0.411780E-05
+ 21 0.568872E-05
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 11792803.9 at element 17387.
+ Minimum = 528.07874 at element 3660.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 60 BEAM188 0.000 0.000000
+ 2 60 BEAM188 0.000 0.000000
+ 3 60 BEAM188 0.000 0.000000
+ 4 60 BEAM188 0.000 0.000000
+ 5 60 BEAM188 0.000 0.000000
+ 6 13038 SHELL181 1.125 0.000086
+ 7 252 SOLID186 0.062 0.000248
+ 8 432 SOLID186 0.078 0.000181
+ 9 168 SOLID186 0.031 0.000186
+ 10 396 SOLID186 0.000 0.000000
+ 11 108 SOLID186 0.000 0.000000
+ 12 384 SOLID186 0.062 0.000163
+ 13 384 SOLID186 0.016 0.000041
+ 14 210 SOLID186 0.016 0.000074
+ 15 270 SOLID186 0.078 0.000289
+ 16 408 SOLID186 0.047 0.000115
+ 17 150 SOLID186 0.000 0.000000
+ 18 588 SOLID186 0.094 0.000159
+ 19 240 SOLID186 0.078 0.000326
+ 20 216 SOLID186 0.062 0.000289
+ 21 324 SOLID186 0.016 0.000048
+ 22 228 CONTA174 0.016 0.000069
+ 23 228 TARGE170 0.000 0.000000
+ 24 435 CONTA174 0.031 0.000072
+ 25 435 TARGE170 0.000 0.000000
+ 26 156 CONTA174 0.000 0.000000
+ 27 156 TARGE170 0.000 0.000000
+ 28 354 CONTA174 0.000 0.000000
+ 29 354 TARGE170 0.000 0.000000
+ 30 108 CONTA174 0.000 0.000000
+ 31 108 TARGE170 0.000 0.000000
+ 32 348 CONTA174 0.016 0.000045
+ 33 348 TARGE170 0.000 0.000000
+ 34 342 CONTA174 0.000 0.000000
+ 35 342 TARGE170 0.000 0.000000
+ 36 204 CONTA174 0.016 0.000077
+ 37 204 TARGE170 0.000 0.000000
+ 38 234 CONTA174 0.000 0.000000
+ 39 234 TARGE170 0.000 0.000000
+ 40 300 CONTA174 0.047 0.000156
+ 41 300 TARGE170 0.000 0.000000
+ 42 159 CONTA174 0.047 0.000295
+ 43 159 TARGE170 0.000 0.000000
+ 44 519 CONTA174 0.016 0.000030
+ 45 519 TARGE170 0.000 0.000000
+ 46 210 CONTA174 0.000 0.000000
+ 47 210 TARGE170 0.000 0.000000
+ 48 204 CONTA174 0.000 0.000000
+ 49 204 TARGE170 0.000 0.000000
+ 50 288 CONTA174 0.000 0.000000
+ 51 288 TARGE170 0.000 0.000000
+ Time at end of element matrix formulation CP = 4.40625.
+
+ BLOCK LANCZOS CALCULATION OF UP TO 10 EIGENVECTORS.
+ NUMBER OF EQUATIONS = 159678
+ MAXIMUM WAVEFRONT = 708
+ MAXIMUM MODES STORED = 10
+ MINIMUM EIGENVALUE = 0.00000E+00
+ MAXIMUM EIGENVALUE = 0.10000E+31
+
+
+ *** NOTE *** CP = 7.078 TIME= 06:52:58
+ The initial memory allocation (-m) has been exceeded.
+ Supplemental memory allocations are being used.
+
+ Local memory allocated for solver = 470.292 MB
+ Local memory required for in-core solution = 448.291 MB
+ Local memory required for out-of-core solution = 208.135 MB
+
+ Total memory allocated for solver = 851.493 MB
+ Total memory required for in-core solution = 811.685 MB
+ Total memory required for out-of-core solution = 378.173 MB
+
+ *** NOTE *** CP = 8.641 TIME= 06:53:00
+ The Distributed Sparse Matrix Solver used by the Block Lanczos
+ eigensolver is currently running in the in-core memory mode. This
+ memory mode uses the most amount of memory in order to avoid using the
+ hard drive as much as possible, which most often results in the
+ fastest solution time. This mode is recommended if enough physical
+ memory is present to accommodate all of the solver data.
+
+ *** ANSYS - ENGINEERING ANALYSIS SYSTEM RELEASE 2021 R2 21.2 ***
+ DISTRIBUTED Ansys Mechanical Enterprise
+
+ 00000000 VERSION=WINDOWS x64 06:53:02 JUL 25, 2022 CP= 10.781
+
+
+
+
+
+ *** FREQUENCIES FROM BLOCK LANCZOS ITERATION ***
+
+ MODE FREQUENCY (HERTZ)
+
+
+ 1 21.68428280230
+ 2 21.69024198077
+ 3 21.69131650666
+ 4 33.82973502589
+ 5 33.83798485758
+ 6 33.83938717337
+ 7 37.06064330146
+ 8 37.07091158772
+ 9 37.07187102168
+ 10 43.83753554036
+
+ *** ANSYS - ENGINEERING ANALYSIS SYSTEM RELEASE 2021 R2 21.2 ***
+ DISTRIBUTED Ansys Mechanical Enterprise
+
+ 00000000 VERSION=WINDOWS x64 06:53:03 JUL 25, 2022 CP= 10.875
+
+
+
+
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION ***** X DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 0.13337E-03 1.000000 0.177881E-07 0.312579 0.706832E-04
+ 2 21.6902 0.46104E-01 0.58730E-04 0.440351 0.344927E-08 0.373191 0.137061E-04
+ 3 21.6913 0.46101E-01 0.87053E-04 0.652706 0.757817E-08 0.506358 0.301129E-04
+ 4 33.8297 0.29560E-01 -0.85976E-04 0.644632 0.739184E-08 0.636250 0.293725E-04
+ 5 33.8380 0.29553E-01 -0.38997E-04 0.292392 0.152076E-08 0.662973 0.604293E-05
+ 6 33.8394 0.29551E-01 -0.57555E-04 0.431539 0.331259E-08 0.721184 0.131630E-04
+ 7 37.0606 0.26983E-01 0.25886E-04 0.194086 0.670065E-09 0.732958 0.266259E-05
+ 8 37.0709 0.26975E-01 0.14838E-04 0.111256 0.220178E-09 0.736827 0.874909E-06
+ 9 37.0719 0.26975E-01 0.18637E-04 0.139738 0.347343E-09 0.742931 0.138021E-05
+ 10 43.8375 0.22812E-01 -0.12095E-03 0.906870 0.146291E-07 1.00000 0.581308E-04
+ -----------------------------------------------------------------------------------------------------------------
+ sum 0.569074E-07 0.226129E-03
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION ***** Y DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 0.73666E-02 1.000000 0.542664E-04 0.343547 0.215635
+ 2 21.6902 0.46104E-01 0.33431E-02 0.453826 0.111766E-04 0.414303 0.444117E-01
+ 3 21.6913 0.46101E-01 0.50476E-02 0.685209 0.254787E-04 0.575602 0.101243
+ 4 33.8297 0.29560E-01 0.18755E-02 0.254589 0.351732E-05 0.597869 0.139765E-01
+ 5 33.8380 0.29553E-01 0.89959E-03 0.122118 0.809258E-06 0.602992 0.321569E-02
+ 6 33.8394 0.29551E-01 0.13665E-02 0.185497 0.186726E-05 0.614814 0.741981E-02
+ 7 37.0606 0.26983E-01 0.31196E-02 0.423480 0.973187E-05 0.676423 0.386709E-01
+ 8 37.0709 0.26975E-01 0.19657E-02 0.266836 0.386383E-05 0.700884 0.153535E-01
+ 9 37.0719 0.26975E-01 0.28496E-02 0.386823 0.811999E-05 0.752290 0.322659E-01
+ 10 43.8375 0.22812E-01 0.62552E-02 0.849139 0.391281E-04 1.00000 0.155481
+ -----------------------------------------------------------------------------------------------------------------
+ sum 0.157959E-03 0.627673
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION ***** Z DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 -0.19752E-05 0.023957 0.390136E-11 0.276278E-03 0.155026E-07
+ 2 21.6902 0.46104E-01 -0.13045E-05 0.015822 0.170176E-11 0.396790E-03 0.676218E-08
+ 3 21.6913 0.46101E-01 -0.25987E-05 0.031519 0.675314E-11 0.875019E-03 0.268345E-07
+ 4 33.8297 0.29560E-01 -0.60916E-04 0.738845 0.371071E-08 0.263652 0.147450E-04
+ 5 33.8380 0.29553E-01 -0.30181E-04 0.366070 0.910916E-09 0.328160 0.361965E-05
+ 6 33.8394 0.29551E-01 -0.49330E-04 0.598325 0.243346E-08 0.500487 0.966969E-05
+ 7 37.0606 0.26983E-01 0.12143E-04 0.147286 0.147459E-09 0.510930 0.585948E-06
+ 8 37.0709 0.26975E-01 0.67274E-05 0.081597 0.452579E-10 0.514135 0.179838E-06
+ 9 37.0719 0.26975E-01 0.79651E-05 0.096609 0.634435E-10 0.518628 0.252101E-06
+ 10 43.8375 0.22812E-01 0.82447E-04 1.000000 0.679752E-08 1.00000 0.270109E-04
+ -----------------------------------------------------------------------------------------------------------------
+ sum 0.141211E-07 0.561122E-04
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION *****ROTX DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 -1.0941 1.000000 1.19712 0.282791 0.185559
+ 2 21.6902 0.46104E-01 -0.49643 0.453718 0.246440 0.341006 0.381991E-01
+ 3 21.6913 0.46101E-01 -0.74956 0.685070 0.561836 0.473726 0.870866E-01
+ 4 33.8297 0.29560E-01 -0.91221 0.833733 0.832132 0.670296 0.128984
+ 5 33.8380 0.29553E-01 -0.43610 0.398583 0.190185 0.715223 0.294794E-01
+ 6 33.8394 0.29551E-01 -0.66259 0.605584 0.439023 0.818931 0.680502E-01
+ 7 37.0606 0.26983E-01 -0.43459 0.397204 0.188871 0.863547 0.292757E-01
+ 8 37.0709 0.26975E-01 -0.27377 0.250213 0.749480E-01 0.881252 0.116172E-01
+ 9 37.0719 0.26975E-01 -0.39680 0.362658 0.157447 0.918445 0.244048E-01
+ 10 43.8375 0.22812E-01 -0.58757 0.537023 0.345243 1.00000 0.535139E-01
+ -----------------------------------------------------------------------------------------------------------------
+ sum 4.23325 0.656169
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION *****ROTY DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 0.18704E-01 0.627437 0.349826E-03 0.233000 0.361386E-04
+ 2 21.6902 0.46104E-01 0.82795E-02 0.277746 0.685502E-04 0.278658 0.708153E-05
+ 3 21.6913 0.46101E-01 0.12340E-01 0.413962 0.152277E-03 0.380081 0.157308E-04
+ 4 33.8297 0.29560E-01 -0.52401E-02 0.175786 0.274589E-04 0.398370 0.283663E-05
+ 5 33.8380 0.29553E-01 -0.21221E-02 0.071189 0.450333E-05 0.401370 0.465213E-06
+ 6 33.8394 0.29551E-01 -0.26739E-02 0.089698 0.714953E-05 0.406132 0.738577E-06
+ 7 37.0606 0.26983E-01 0.12926E-02 0.043363 0.167090E-05 0.407244 0.172611E-06
+ 8 37.0709 0.26975E-01 0.73521E-03 0.024663 0.540527E-06 0.407604 0.558388E-07
+ 9 37.0719 0.26975E-01 0.89887E-03 0.030154 0.807971E-06 0.408143 0.834668E-07
+ 10 43.8375 0.22812E-01 -0.29810E-01 1.000000 0.888614E-03 1.00000 0.917976E-04
+ -----------------------------------------------------------------------------------------------------------------
+ sum 0.150140E-02 0.155101E-03
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+ ***** PARTICIPATION FACTOR CALCULATION *****ROTZ DIRECTION
+ CUMULATIVE RATIO EFF.MASS
+ MODE FREQUENCY PERIOD PARTIC.FACTOR RATIO EFFECTIVE MASS MASS FRACTION TO TOTAL MASS
+ 1 21.6843 0.46116E-01 0.38768 0.418447 0.150298 0.941155E-01 0.421268E-01
+ 2 21.6902 0.46104E-01 0.17775 0.191858 0.315959E-01 0.113901 0.885597E-02
+ 3 21.6913 0.46101E-01 0.26826 0.289550 0.719650E-01 0.158965 0.201709E-01
+ 4 33.8297 0.29560E-01 0.36987 0.399221 0.136804 0.244630 0.383445E-01
+ 5 33.8380 0.29553E-01 0.17635 0.190342 0.310986E-01 0.264104 0.871658E-02
+ 6 33.8394 0.29551E-01 0.26789 0.289152 0.717670E-01 0.309044 0.201154E-01
+ 7 37.0606 0.26983E-01 0.33130 0.357593 0.109762 0.377775 0.307648E-01
+ 8 37.0709 0.26975E-01 0.20886 0.225431 0.436217E-01 0.405091 0.122266E-01
+ 9 37.0719 0.26975E-01 0.30278 0.326807 0.916758E-01 0.462498 0.256957E-01
+ 10 43.8375 0.22812E-01 0.92648 1.000000 0.858367 1.00000 0.240590
+ -----------------------------------------------------------------------------------------------------------------
+ sum 1.59695 0.447608
+ -----------------------------------------------------------------------------------------------------------------
+
+
+
+
+
+ *** NOTE *** CP = 10.875 TIME= 06:53:03
+ The modes requested are mass normalized (Nrmkey on MODOPT). However,
+ the modal masses and kinetic energies below are calculated with unit
+ normalized modes.
+
+ ***** MODAL MASSES, KINETIC ENERGIES, AND TRANSLATIONAL EFFECTIVE MASSES SUMMARY *****
+
+ EFFECTIVE MASS
+ MODE FREQUENCY MODAL MASS KENE | X-DIR RATIO% Y-DIR RATIO% Z-DIR RATIO%
+ 1 21.68 0.9470E-05 0.8789E-01 | 0.1779E-07 0.01 0.5427E-04 21.56 0.3901E-11 0.00
+ 2 21.69 0.9779E-05 0.9081E-01 | 0.3449E-08 0.00 0.1118E-04 4.44 0.1702E-11 0.00
+ 3 21.69 0.7728E-05 0.7178E-01 | 0.7578E-08 0.00 0.2548E-04 10.12 0.6753E-11 0.00
+ 4 33.83 0.2795E-04 0.6314 | 0.7392E-08 0.00 0.3517E-05 1.40 0.3711E-08 0.00
+ 5 33.84 0.2850E-04 0.6441 | 0.1521E-08 0.00 0.8093E-06 0.32 0.9109E-09 0.00
+ 6 33.84 0.2333E-04 0.5274 | 0.3313E-08 0.00 0.1867E-05 0.74 0.2433E-08 0.00
+ 7 37.06 0.1111E-04 0.3012 | 0.6701E-09 0.00 0.9732E-05 3.87 0.1475E-09 0.00
+ 8 37.07 0.1103E-04 0.2991 | 0.2202E-09 0.00 0.3864E-05 1.54 0.4526E-10 0.00
+ 9 37.07 0.1007E-04 0.2732 | 0.3473E-09 0.00 0.8120E-05 3.23 0.6344E-10 0.00
+ 10 43.84 0.5791E-05 0.2197 | 0.1463E-07 0.01 0.3913E-04 15.55 0.6798E-08 0.00
+ --------------------------------------------------------------------------------------------------------------
+ sum | 0.5691E-07 0.02 0.1580E-03 62.77 0.1412E-07 0.01
+ --------------------------------------------------------------------------------------------------------------
+
+
+ *** ANSYS BINARY FILE STATISTICS
+ BUFFER SIZE USED= 16384
+ 38.000 MB WRITTEN ON ELEMENT SAVED DATA FILE: file0.esav
+ 83.375 MB WRITTEN ON ASSEMBLED MATRIX FILE: file0.full
+ 12.438 MB WRITTEN ON MODAL MATRIX FILE: file0.mode
+ 14.375 MB WRITTEN ON RESULTS FILE: file0.rst
+
This sections illustrates different methods to post-process the results of the +modal analysis : PyMAPDL method, PyMAPDL result reader, PyDPF-Post +and PyDPF-Core. All methods lead to the same result and are just given as an +example of how each module can be used.
+# using MAPDL methods
+mapdl.post1()
+mapdl.set(1, 1)
+mapdl.plnsol("u", "sum")
+
Not recommended - PyMAPDL reader library is in process to being deprecated. +It is recommended to use DPF Post.
+mapdl_result = mapdl.result
+mapdl_result.plot_nodal_displacement(0)
+
from ansys.dpf import post
+
+solution_path = mapdl.result_file
+solution = post.load_solution(solution_path)
+print(solution)
+displacement = solution.displacement(time_scoping=1)
+total_deformation = displacement.norm
+total_deformation.plot_contour(show_edges=True, background="w")
+
Modal Analysis Solution object.
+
+
+Data Sources
+------------------------------
+DPF DataSources:
+ Result files:
+ result key: rst and path: C:/Users/gayuso/AppData/Local/Temp/ansys_pasiuwhdkb\file.rst
+ Secondary files:
+
+
+DPF Model
+------------------------------
+Modal analysis
+Unit system: NMM: mm, ton, N, s, mA, degC
+Physics Type: Mecanic
+Available results:
+ - displacement: Nodal Displacement
+------------------------------
+DPF Meshed Region:
+ 44097 nodes
+ 26046 elements
+ Unit: mm
+ With solid (3D) elements, shell (2D) elements, shell (3D) elements, beam (1D) elements
+------------------------------
+DPF Time/Freq Support:
+ Number of sets: 10
+Cumulative Frequency (Hz) LoadStep Substep
+1 21.684283 1 1
+2 21.690242 1 2
+3 21.691317 1 3
+4 33.829735 1 4
+5 33.837985 1 5
+6 33.839387 1 6
+7 37.060643 1 7
+8 37.070912 1 8
+9 37.071871 1 9
+10 43.837536 1 10
+
+This may contain complex results.
+
from ansys.dpf import core
+
+model = core.Model(solution_path)
+results = model.results
+print(results)
+displacements = results.displacement()
+total_def = core.operators.math.norm_fc(displacements)
+total_def_container = total_def.outputs.fields_container()
+mesh = model.metadata.meshed_region
+mesh.plot(total_def_container.get_field_by_time_id(1))
+
Modal analysis
+Unit system: NMM: mm, ton, N, s, mA, degC
+Physics Type: Mecanic
+Available results:
+ - displacement: Nodal Displacement
+
The response spectrum analysis is defined, solved and post-processed.
+# define PSD analysis with input spectrum
+mapdl.slashsolu()
+mapdl.antype("spectr")
+
+# power spectral density
+mapdl.spopt("psd")
+
+# use input table 1 with acceleration spectrum in terms of acceleration due to gravity
+mapdl.psdunit(1, "accg", 9.81 * 1000)
+
+# define the frequency points in the input table 1
+mapdl.psdfrq(1, "", 1, 40, 50, 70.71678, 100, 700, 900)
+
+# define the PSD values in the input table 1
+mapdl.psdval(1, 0.01, 0.01, 0.1, 1, 10, 10, 1)
+
+# set the damping ratio as 5%
+mapdl.dmprat(0.05)
+
+# apply base excitation on the set of nodes N_BASE_EXCITE in the y-direction from table 1
+mapdl.d("N_BASE_EXCITE", "uy", 1)
+
+# calculate the participation factor for PSD with base excitation from input table 1
+mapdl.pfact(1, "base")
+
+# write the displacent solution relative to the base excitation to the results file from the PSD analysis
+mapdl.psdres("disp", "rel")
+
+# write the absolute velocity solution to the results file from the PSD analysis
+mapdl.psdres("velo", "abs")
+
+# write the absolute acceleration solution to the results file from the PSD analysis
+mapdl.psdres("acel", "abs")
+
+# combine only those modes whose significance level exceeds 0.0001
+mapdl.psdcom()
+output = mapdl.solve()
+print(output)
+
*** NOTE *** CP = 16.328 TIME= 06:53:12
+ The automatic domain decomposition logic has selected the MESH domain
+ decomposition method with 2 processes per solution.
+
+ ***** ANSYS SOLVE COMMAND *****
+
+ Time at start of random vibration closed-form solution CP= 16.328125.
+
+
+ FREQUENCIES USED FOR RANDOM VIBRATION SOLUTION
+
+ MODE FREQUENCY
+
+ 1 21.6843
+ 2 21.6902
+ 3 21.6913
+ 4 33.8297
+ 5 33.8380
+ 6 33.8394
+ 7 37.0606
+ 8 37.0709
+ 9 37.0719
+ 10 43.8375
+
+ PERFORM INTEGRATION FOR DISPLACEMENT-TYPE QUANTITIES
+
+ PERFORM INTEGRATION FOR VELOCITY-TYPE QUANTITIES
+
+ PERFORM INTEGRATION FOR ACCELERATION-TYPE QUANTITIES
+
+ Modal covariance matrix computed CP= 16.328125.
+
+ Quasi-static modal covariance matrix computed CP= 16.328125.
+
+ Covariant-modal covariance matrix computed CP= 16.328125.
+
+ Psd file file0.psd created. CP= 16.328125.
+
+ Time at start of random vibration mode combinations CP= 16.328125.
+
+ BASE EXCITATION PROBLEM
+
+
+ ***** SUMMARY OF TERMS INCLUDED IN MODE COMBINATIONS *****
+ (MODAL COVARIANCE MATRIX TERMS ONLY)
+
+ *** DISPLACEMENT-TYPE QUANTITY ***
+
+ MAXIMUM TERM = 0.73456E-04
+
+ MODE MODE COVARIANCE COVARIANCE
+ I J TERM RATIO
+
+ 1 1 0.73456E-04 1.0000
+ 2 1 0.33327E-04 0.45370
+ 2 2 0.15120E-04 0.20584
+ 3 1 0.50316E-04 0.68498
+ 3 2 0.22828E-04 0.31078
+ 3 3 0.34466E-04 0.46920
+ 4 1 0.64485E-05 0.87787E-01
+ 4 2 0.29267E-05 0.39843E-01
+ 4 3 0.44189E-05 0.60158E-01
+ 4 4 0.26183E-05 0.35644E-01
+ 5 1 0.30932E-05 0.42109E-01
+ 5 2 0.14039E-05 0.19112E-01
+ 5 3 0.21196E-05 0.28856E-01
+ 5 4 0.12558E-05 0.17096E-01
+ 5 5 0.60234E-06 0.82001E-02
+ 6 1 0.46985E-05 0.63964E-01
+ 6 2 0.21325E-05 0.29031E-01
+ 6 3 0.32198E-05 0.43833E-01
+ 6 4 0.19076E-05 0.25969E-01
+ 6 5 0.91495E-06 0.12456E-01
+ 6 6 0.13898E-05 0.18920E-01
+ 7 1 0.10933E-04 0.14884
+ 7 2 0.49619E-05 0.67549E-01
+ 7 3 0.74918E-05 0.10199
+ 7 4 0.37206E-05 0.50651E-01
+ 7 5 0.17855E-05 0.24307E-01
+ 7 6 0.27124E-05 0.36925E-01
+ 7 7 0.71392E-05 0.97190E-01
+ 8 1 0.68895E-05 0.93791E-01
+ 8 2 0.31268E-05 0.42567E-01
+ 8 3 0.47210E-05 0.64270E-01
+ 8 4 0.23433E-05 0.31900E-01
+ 8 5 0.11245E-05 0.15309E-01
+ 8 6 0.17083E-05 0.23256E-01
+ 8 7 0.44986E-05 0.61241E-01
+ 8 8 0.28346E-05 0.38590E-01
+ 9 1 0.99875E-05 0.13597
+ 9 2 0.45329E-05 0.61708E-01
+ 9 3 0.68440E-05 0.93171E-01
+ 9 4 0.33968E-05 0.46243E-01
+ 9 5 0.16301E-05 0.22192E-01
+ 9 6 0.24763E-05 0.33712E-01
+ 9 7 0.65214E-05 0.88780E-01
+ 9 8 0.41093E-05 0.55942E-01
+ 9 9 0.59571E-05 0.81098E-01
+ 10 1 0.23871E-04 0.32496
+ 10 2 0.10834E-04 0.14748
+ 10 3 0.16357E-04 0.22268
+ 10 4 0.70587E-05 0.96095E-01
+ 10 5 0.33864E-05 0.46101E-01
+ 10 6 0.51441E-05 0.70030E-01
+ 10 7 0.12750E-04 0.17358
+ 10 8 0.80366E-05 0.10941
+ 10 9 0.11651E-04 0.15861
+ 10 10 0.36571E-04 0.49786
+
+ *** VELOCITY-TYPE QUANTITY ***
+
+ MAXIMUM TERM = 15.547
+
+ MODE MODE COVARIANCE COVARIANCE
+ I J TERM RATIO
+
+ 1 1 15.547 1.0000
+ 2 1 7.0557 0.45383
+ 2 2 3.2021 0.20596
+ 3 1 10.653 0.68521
+ 3 2 4.8347 0.31097
+ 3 3 7.2996 0.46952
+ 4 1 3.8958 0.25058
+ 4 2 1.7681 0.11372
+ 4 3 2.6695 0.17171
+ 4 4 1.0786 0.69377E-01
+ 5 1 1.8688 0.12020
+ 5 2 0.84811 0.54551E-01
+ 5 3 1.2805 0.82365E-01
+ 5 4 0.51739 0.33279E-01
+ 5 5 0.24818 0.15963E-01
+ 6 1 2.8387 0.18259
+ 6 2 1.2883 0.82864E-01
+ 6 3 1.9451 0.12511
+ 6 4 0.78592 0.50551E-01
+ 6 5 0.37699 0.24249E-01
+ 6 6 0.57266 0.36834E-01
+ 7 1 6.5885 0.42378
+ 7 2 2.9901 0.19233
+ 7 3 4.5146 0.29039
+ 7 4 1.7955 0.11549
+ 7 5 0.86132 0.55401E-01
+ 7 6 1.3084 0.84155E-01
+ 7 7 3.0886 0.19866
+ 8 1 4.1517 0.26704
+ 8 2 1.8842 0.12119
+ 8 3 2.8448 0.18298
+ 8 4 1.1314 0.72770E-01
+ 8 5 0.54272 0.34908E-01
+ 8 6 0.82441 0.53027E-01
+ 8 7 1.9463 0.12519
+ 8 8 1.2264 0.78885E-01
+ 9 1 6.0186 0.38712
+ 9 2 2.7315 0.17569
+ 9 3 4.1241 0.26527
+ 9 4 1.6401 0.10549
+ 9 5 0.78677 0.50606E-01
+ 9 6 1.1951 0.76872E-01
+ 9 7 2.8215 0.18148
+ 9 8 1.7779 0.11436
+ 9 9 2.5774 0.16578
+ 10 1 13.822 0.88902
+ 10 2 6.2727 0.40347
+ 10 3 9.4709 0.60918
+ 10 4 3.7285 0.23982
+ 10 5 1.7885 0.11504
+ 10 6 2.7168 0.17475
+ 10 7 6.3657 0.40945
+ 10 8 4.0114 0.25802
+ 10 9 5.8153 0.37404
+ 10 10 14.121 0.90826
+
+ *** ACCELERATION-TYPE QUANTITY ***
+
+ MAXIMUM TERM = 0.36471E+08
+
+ MODE MODE COVARIANCE COVARIANCE
+ I J TERM RATIO
+
+ 1 1 0.36471E+08 1.0000
+ 2 1 0.16552E+08 0.45383
+ 2 2 0.75116E+07 0.20596
+ 3 1 0.24990E+08 0.68521
+ 3 2 0.11341E+08 0.31097
+ 3 3 0.17124E+08 0.46952
+ 4 1 0.93868E+07 0.25738
+ 4 2 0.42600E+07 0.11680
+ 4 3 0.64320E+07 0.17636
+ 4 4 0.24200E+07 0.66353E-01
+ 5 1 0.45026E+07 0.12346
+ 5 2 0.20434E+07 0.56028E-01
+ 5 3 0.30852E+07 0.84593E-01
+ 5 4 0.11608E+07 0.31827E-01
+ 5 5 0.55679E+06 0.15267E-01
+ 6 1 0.68394E+07 0.18753
+ 6 2 0.31039E+07 0.85106E-01
+ 6 3 0.46865E+07 0.12850
+ 6 4 0.17632E+07 0.48346E-01
+ 6 5 0.84577E+06 0.23190E-01
+ 6 6 0.12847E+07 0.35226E-01
+ 7 1 0.15678E+08 0.42987
+ 7 2 0.71150E+07 0.19509
+ 7 3 0.10743E+08 0.29455
+ 7 4 0.40413E+07 0.11081
+ 7 5 0.19385E+07 0.53152E-01
+ 7 6 0.29446E+07 0.80738E-01
+ 7 7 0.67544E+07 0.18520
+ 8 1 0.98787E+07 0.27086
+ 8 2 0.44832E+07 0.12293
+ 8 3 0.67690E+07 0.18560
+ 8 4 0.25465E+07 0.69822E-01
+ 8 5 0.12215E+07 0.33491E-01
+ 8 6 0.18554E+07 0.50874E-01
+ 8 7 0.42560E+07 0.11670
+ 8 8 0.26818E+07 0.73531E-01
+ 9 1 0.14321E+08 0.39266
+ 9 2 0.64992E+07 0.17820
+ 9 3 0.98129E+07 0.26906
+ 9 4 0.36916E+07 0.10122
+ 9 5 0.17707E+07 0.48552E-01
+ 9 6 0.26898E+07 0.73750E-01
+ 9 7 0.61698E+07 0.16917
+ 9 8 0.38877E+07 0.10660
+ 9 9 0.56359E+07 0.15453
+ 10 1 0.31765E+08 0.87095
+ 10 2 0.14416E+08 0.39526
+ 10 3 0.21766E+08 0.59679
+ 10 4 0.81902E+07 0.22457
+ 10 5 0.39286E+07 0.10772
+ 10 6 0.59676E+07 0.16362
+ 10 7 0.13688E+08 0.37532
+ 10 8 0.86252E+07 0.23649
+ 10 9 0.12504E+08 0.34284
+ 10 10 0.27823E+08 0.76287
+
+
+ ***** SUMMARY OF OUTPUT QUANTITIES COMPUTED *****
+ AND WRITTEN ON RESULTS FILE
+
+ DISPLACEMENT-TYPE QUANTITIES COMPUTED
+ AND WRITTEN ON RESULTS FILE AS LOAD STEP 3
+ VALUES ARE RELATIVE TO BASE
+
+ THESE ARE STATISTICAL QUANTITIES WHICH
+ CANNOT BE COMBINED OR TRANSFORMED IN ANY
+ VECTORIAL SENSE
+
+
+ VELOCITY-TYPE QUANTITIES COMPUTED
+ AND WRITTEN ON RESULTS FILE AS LOAD STEP 4
+ VALUES ARE ABSOLUTE
+
+ THESE ARE STATISTICAL QUANTITIES WHICH
+ CANNOT BE COMBINED OR TRANSFORMED IN ANY
+ VECTORIAL SENSE
+
+
+ ACCELERATION-TYPE QUANTITIES COMPUTED
+ AND WRITTEN ON RESULTS FILE AS LOAD STEP 5
+ VALUES ARE ABSOLUTE
+
+ THESE ARE STATISTICAL QUANTITIES WHICH
+ CANNOT BE COMBINED OR TRANSFORMED IN ANY
+ VECTORIAL SENSE
+
The response spectrum analysis is post-processed. First, the standard +MAPDL POST1 postprocessor is used. Then, the MAPDL time-history +POST26 postprocessor is used to generate the response power spectral +density.
+Note
+The graph generated through POST26 is exported as a picture in the working +directory. Finally, the results from POST26 are saved to Python variables +to be plotted in the Python environment with the use of Matplotlib +library.
+mapdl.post1()
+mapdl.set(1, 1)
+mapdl.plnsol("u", "sum")
+mapdl.set("last")
+mapdl.plnsol("u", "sum")
+
mapdl.post26()
+
+# allow storage for 200 variables
+mapdl.numvar(200)
+mapdl.cmsel("s", "MY_MONITOR")
+monitored_node = mapdl.queries.ndnext(0)
+mapdl.store("psd")
+
+# store the psd analysis u_y data for the node MYMONITOR as the reference no 2
+mapdl.nsol(2, monitored_node, "u", "y")
+
+# compute the response power spectral density for displacement associated with variable 2
+mapdl.rpsd(3, 2)
+mapdl.show("png")
+
+# plot the variable 3
+mapdl.plvar(3)
+
+# print the variable 3
+mapdl.prvar(3)
+
+# x-axis is set for Log X scale
+mapdl.gropt("logx", 1)
+
+# y-axis is set for Log X scale
+mapdl.gropt("logy", 1)
+
+# plot the variable 3
+mapdl.plvar(3)
+mapdl.show("close")
+
# store MAPDL results to python variables
+mapdl.dim("frequencies", "array", 4000, 1)
+mapdl.dim("response", "array", 4000, 1)
+mapdl.vget("frequencies(1)", 1)
+mapdl.vget("response(1)", 3)
+frequencies = mapdl.parameters["frequencies"]
+response = mapdl.parameters["response"]
+
+# use Matplotlib to create graph
+fig = plt.figure()
+ax = fig.add_subplot(111)
+plt.xscale("log")
+plt.yscale("log")
+ax.plot(frequencies, response)
+ax.set_xlabel("Frequencies")
+ax.set_ylabel("Response power spectral density")
+
mapdl.exit()
+
The following file was used in this problem:
+pcb_mesh_file.cdb
contains a FE model of a single
+circuit board
pcb_mesh_file.cdb – Input file containing the model of a single +circuit board.
+ |
For more information, see Obtaining the input files.
+ +This examples shows how to use PyMAPDL to import an existing FE model and +to perform a7 nonlinear buckling and post-buckling analysis using nonlinear +stabilization. The problem uses a stiffened cylinder subjected to uniform +external pressure to show how to find the nonlinear buckling loads, achieve +convergence at the post-buckling stage, and interpret the results.
+This example is inspired from the model and analysis defined in Chapter 21 +of the Mechanical APDL Technology Showcase Manual.
+The original FE model is given in the Ansys Mechanical APDL Technology +Showcase Manual. The .cdb contains a FE model of a ring-stiffened cylinder.
+A circular cylinder made of bare 2024-T3 aluminum alloy is stiffened inside +with five Z-section rings. Its ends are closed with thick aluminum bulkheads. +A riveted L section exists between the top plate and the top ring and the +bottom plate and bottom ring. +The cylinder is subjected to a differential external pressure. The pressure +causes a local buckling phenomenon characterized by buckling of the skin +between stiffening rings, leading eventually to collapse.
+The finite element model of the ring stiffened cylinder is meshed with +SHELL281 elements with an element size of 10 mm. The fine mesh is required +for buckling analysis, and a full 360-degree model is necessary because +the deformation is no longer axisymmetric after buckling occurs.
+All shell elements have uniform thickness. Five sections are created in the +model with no offsets, so the shell sections are offset to the midplane +by default.
+from ansys.mapdl.core import launch_mapdl
+from ansys.mapdl.core.examples.downloads import download_tech_demo_data
+
+# define geometric parameters
+bs = 95.3 # Ring spacing (mm)
+ts = 1.034 # Skin thickness (mm)
+tw = 0.843 # Ring thickness (mm)
+r = 344 * ts # Radius of cylinder (mm)
+L = 431.8 + 2 * (19 - 9.5) # Length of cylinder (mm)
+pext = 0.24 # Differential external pressure (MPa)
+
+# start MAPDL as a service
+mapdl = launch_mapdl(run_location="D:\PyAnsys\Examples\Buckling_PostBuckling_TD21")
+print(mapdl)
+
+mapdl.filname("buckling") # change filename
+# mapdl.nerr(nmerr=200, nmabt=10000, abort=-1, ifkey=0, num=0)
+
+# enter preprocessor
+mapdl.prep7()
+
+# define material properties for 2024-T3 Alluminum alloy
+EX = 73000 # Young's Modulus (MPA)
+ET = 73 # Tangent modulus
+mapdl.mp("ex", 1, EX) # Young's Modulus (MPA)
+mapdl.mp("prxy", 1, 0.33) # Poisson's ratio
+EP = EX * ET / (EX - ET)
+mapdl.tb("biso", 1)
+mapdl.tbdata(1, 268.9, EP)
+# create material plot
+mapdl.show("png")
+mapdl.tbplot("biso", 1)
+mapdl.show("close")
+
+# define shell elements and their sections
+mapdl.et(1, 181)
+# cylinder
+mapdl.sectype(1, "shell")
+mapdl.secdata(ts, 1)
+# L
+mapdl.sectype(2, "shell")
+mapdl.secdata(ts + 1.64, 1)
+# Z shaped ring stiffener
+mapdl.sectype(3, "shell")
+mapdl.secdata(tw, 1)
+# Plate at z=0 with thickness=25 mm
+mapdl.sectype(4, "shell")
+mapdl.secdata(25, 1)
+# Plate at z=L with thickness=25 mm
+mapdl.sectype(5, "shell")
+mapdl.secdata(25, 1)
+
+
+# read model of stiffened cylinder
+# download the cdb file
+ring_mesh_file = download_tech_demo_data(
+ "td-21", "ring_stiffened_cylinder_mesh_file.cdb"
+)
+
+# read in cdb
+mapdl.cdread("db", ring_mesh_file)
+mapdl.allsel()
+mapdl.eplot(background="w")
+mapdl.cmsel("all")
+
Product: Ansys Mechanical Enterprise
+MAPDL Version: 23.1
+ansys.mapdl Version: 0.65.dev0
+
+
+ALSO SELECT ALL COMPONENTS
+
Displacement boundary conditions are defined to prevent the six rigid body +motions. A total of six displacements are therefore applied to three nodes +located on the top plate at 0, 90, and 270 degrees; the nodes are restricted +so that all rigid translations and rotations are not possible for the +cylinder.
+Loading consists of a uniformly distributed external differential +pressure: \(P_{ext} = 0.24 MPa\)
+print("Begin static prestress analysis")
+
+mapdl.csys(1) # activate cylindrical coordinate system
+
+# Define pressure on plate at z=0
+mapdl.nsel("s", "loc", "z", 0)
+mapdl.esln("s", 1)
+mapdl.sfe("all", 2, "pres", 1, pext)
+mapdl.allsel()
+
+# Define pressure on the rim of plate at z=0
+mapdl.nsel("s", "loc", "z", 0)
+mapdl.nsel("r", "loc", "x", r - ts / 2, 760 / 2)
+mapdl.esln("s", 1)
+mapdl.sfe("all", 1, "pres", 1, pext)
+mapdl.allsel()
+
+# Define pressure on plate at z=L
+mapdl.nsel("s", "loc", "z", L)
+mapdl.esln("s", 1)
+mapdl.sfe("all", 2, "pres", 1, pext)
+mapdl.allsel()
+
+# Define pressure on the rim of plate at z=L
+mapdl.nsel("s", "loc", "z", L)
+mapdl.nsel("r", "loc", "x", r - ts / 2, 760 / 2)
+mapdl.esln("s", 1)
+mapdl.sfe("all", 1, "pres", 1, pext)
+mapdl.allsel()
+
+# Define pressure on cylinder
+mapdl.nsel("s", "loc", "x", r - ts / 2)
+mapdl.esln("s", 1)
+mapdl.sfe("all", 2, "pres", 1, pext)
+mapdl.allsel()
+
+# Define displacement BSs to avoid rigid body motion
+mapdl.csys(0) # activate cartesian coordinate system
+mapdl.nsel("s", "loc", "x", r - ts / 2)
+mapdl.nsel("r", "loc", "y", 0)
+mapdl.nsel("r", "loc", "z", 0)
+mapdl.d("all", "ux", 0)
+mapdl.d("all", "uy", 0)
+mapdl.d("all", "uz", 0)
+mapdl.allsel()
+#
+mapdl.nsel("s", "loc", "x", 0)
+mapdl.nsel("r", "loc", "y", r - ts / 2)
+mapdl.nsel("r", "loc", "z", 0)
+mapdl.d("all", "uz", 0)
+mapdl.allsel()
+#
+mapdl.nsel("s", "loc", "x", 0)
+mapdl.nsel("r", "loc", "y", -(r - ts / 2))
+mapdl.nsel("r", "loc", "z", 0)
+mapdl.d("all", "uy", 0)
+mapdl.d("all", "uz", 0)
+mapdl.allsel()
+#
+
+# Print DOF constraints
+print(mapdl.dlist())
+
+# Solve static prestress analysis
+mapdl.slashsolu()
+mapdl.pstres("on")
+mapdl.antype("STATIC")
+output = mapdl.solve()
+print(output)
+
+# Plot total deformation
+mapdl.post1()
+mapdl.set("last")
+mapdl.post_processing.plot_nodal_displacement("NORM", smooth_shading=True)
+
+print("End static prestress analysis")
+
Begin static prestress analysis
+LIST CONSTRAINTS FOR SELECTED NODES 1 TO 85474 BY 1
+ CURRENTLY SELECTED DOF SET= UX UY UZ ROTX ROTY ROTZ
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE LABEL REAL IMAG
+ 1 UX 0.00000000 0.00000000
+ 1 UY 0.00000000 0.00000000
+ 1 UZ 0.00000000 0.00000000
+ 2 UZ 0.00000000 0.00000000
+ 902 UY 0.00000000 0.00000000
+ 902 UZ 0.00000000 0.00000000
+***** MAPDL SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ Section ID set 2 (and possibly others), with only 1 layer and 3
+ integration points, is associated with material plasticity. The
+ number of integration points will be changed to 5 for improved
+ accuracy.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The model data was checked and warning messages were found.
+ Please review output or errors file ( ) for these warning messages.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS SHELL281. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ PRESTRESS EFFECTS CALCULATED. . . . . . . . . .YES
+ PLASTIC MATERIAL PROPERTIES INCLUDED. . . . . .YES
+ NEWTON-RAPHSON OPTION . . . . . . . . . . . . .PROGRAM CHOSEN
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Present time 0 is less than or equal to the previous time. Time will
+ default to 1.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ This nonlinear analysis defaults to using the full Newton-Raphson
+ solution procedure. This can be modified using the NROPT command.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ The program chosen initial timestep/load-factor is arbitrary. It is
+ necessary for the user to supply a suitable initial
+ timestep/load-factor through the NSUB or DELTIM command for
+ convergence and overall efficiency.
+
+
+
+ D I S T R I B U T E D D O M A I N D E C O M P O S E R
+
+ ...Number of elements: 26796
+ ...Number of nodes: 73662
+ ...Decompose to 0 CPU domains
+ ...Element load balance ratio = 0.000
+
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ AUTOMATIC TIME STEPPING . . . . . . . . . . . . ON
+ INITIAL NUMBER OF SUBSTEPS . . . . . . . . . 1
+ MAXIMUM NUMBER OF SUBSTEPS . . . . . . . . . 1000
+ MINIMUM NUMBER OF SUBSTEPS . . . . . . . . . 1
+ START WITH TIME STEP FROM PREVIOUS SUBSTEP . YES
+ MAXIMUM NUMBER OF EQUILIBRIUM ITERATIONS. . . . 15
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ TERMINATE ANALYSIS IF NOT CONVERGED . . . . . .YES (EXIT)
+ CONVERGENCE CONTROLS. . . . . . . . . . . . . .USE DEFAULTS
+ COPY INTEGRATION POINT VALUES TO NODE . . . . .YES, FOR ELEMENTS WITH
+ ACTIVE MAT. NONLINEARITIES
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+ FOR THE LAST SUBSTEP
+
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Predictor is ON by default for structural elements with rotational
+ degrees of freedom. Use the PRED,OFF command to turn the predictor
+ OFF if it adversely affects the convergence.
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 489978589 at element 0.
+ Minimum = 165335.668 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ ALL CURRENT MAPDL DATA WRITTEN TO FILE NAME=
+ FOR POSSIBLE RESUME FROM THIS POINT
+ FORCE CONVERGENCE VALUE = 3478. CRITERION= 17.39
+ MOMENT CONVERGENCE VALUE = 0.000 CRITERION= 15.96
+
+ DISTRIBUTED SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 441966, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Distributed sparse solver maximum pivot= 0 at node 0 .
+ Distributed sparse solver minimum pivot= 0 at node 0 .
+ Distributed sparse solver minimum pivot in absolute value= 0 at node 0
+ .
+ DISP CONVERGENCE VALUE = 2.213 CRITERION= 0.1106
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -2.213
+ FORCE CONVERGENCE VALUE = 0.5808E-05 CRITERION= 17.39 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.2147E-05 CRITERION= 15.96 <<< CONVERGED
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ A reference moment value times the tolerance is used by the
+ Newton-Raphson method for checking convergence. The calculated
+ reference MOMENT CONVERGENCE VALUE = 0 is less than a threshold. This
+ threshold is internally calculated. You can overwrite it by
+ specifying MINREF on the CNVTOL command. Check results carefully.
+ DISP CONVERGENCE VALUE = 0.7695E-09 CRITERION= 0.1106 <<< CONVERGED
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC = 0.7695E-09
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 2
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 2
+ *** TIME = 1.00000 TIME INC = 1.00000
+End static prestress analysis
+
This preliminary analysis predicts the theoretical buckling pressure of the +ideal linear elastic structure (perfect cylinder) and the buckled mode shapes +used in the next step to generate the imperfections. +It is also an efficient way to check the completeness and +correctness of modeling. +To run the linear buckling analysis, a static solution with prestress effects +must be obtained, followed by the eigenvalue buckling solution using the +Block Lanczos method and mode expansion.
+print("Begin linear buckling analysis")
+
+# Define and solve linear buckling analysis
+mapdl.slashsolu()
+mapdl.outres("all", "all")
+mapdl.antype("BUCKLE")
+mapdl.bucopt("lanb", "10")
+mapdl.mxpand(10)
+output = mapdl.solve()
+print(output)
+
+# Plot total deformation of first and 10th mode
+mapdl.post1()
+mapdl.set(1, 1)
+mapdl.post_processing.plot_nodal_displacement("NORM", smooth_shading=True)
+mapdl.set(1, 10)
+mapdl.post_processing.plot_nodal_displacement("NORM", smooth_shading=True)
+
+print("End linear buckling analysis")
+
Begin linear buckling analysis
+***** MAPDL SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS SHELL281. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .BUCKLING
+ EXTRACTION METHOD. . . . . . . . . . . . . .BLOCK LANCZOS
+ PRESTRESS EFFECTS INCLUDED IF AVAILABLE . . . .YES
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS
+ ITEM FREQUENCY COMPONENT
+ ALL ALL
+
+
+ BLOCK LANCZOS CALCULATION OF UP TO 10 EIGENVECTORS.
+ NUMBER OF EQUATIONS = 441966
+ MAXIMUM WAVEFRONT = 0
+ MAXIMUM MODES STORED = 10
+ MINIMUM EIGENVALUE = -0.10000E+31
+ MAXIMUM EIGENVALUE = 0.10000E+31
+ CENTER EIGENVALUE = 0.00000E+00
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** EIGENVALUES (LOAD MULTIPLIERS FOR BUCKLING) *****
+ *** FROM BLOCK LANCZOS ITERATION ***
+
+ SHAPE NUMBER LOAD MULTIPLIER
+
+ 1 0.62493510
+ 2 0.62493510
+ 3 0.62746216
+ 4 0.62748425
+ 5 0.63023610
+ 6 0.63025918
+ 7 0.63985985
+ 8 0.63985995
+ 9 0.64191573
+ 10 0.64191576
+End linear buckling analysis
+
If a structure is perfectly symmetric, nonsymmetric buckling does not occur +numerically, and a nonlinear buckling analysis fails because +nonsymmetric buckling responses cannot be triggered. In this problem, +the geometry, elements, and pressure are all axisymmetric. +It is not possible, therefore, to simulate nonaxisymmetric buckling with +the initial model. To overcome this problem, small geometric imperfections +(similar to those caused by manufacturing a real structure) must be +introduced to trigger the buckling responses. +Because the radius of the cylinder is 355.69 mm and the maximum +displacement of a mode shape is 1 mm, a factor of 0.1 is applied when +updating the geometry with mode shapes. The factor assumes the manufacturing +tolerance of the radius to be on the order of 0.1.
+print("Begin adding imperfections")
+
+mapdl.finish()
+mapdl.prep7()
+for i in range(1, 11):
+ mapdl.upgeom(0.1, 1, i, "buckling", "rst") # Add imperfections as a tenth of each
+ # mode shape
+mapdl.finish()
+
+print("Finish adding imperfections")
+
Begin adding imperfections
+Finish adding imperfections
+
The nonlinear buckling analysis is a static analysis performed after adding +imperfections with large deflection active (NLGEOM,ON), extended to a point +where the stiffened cylinder can reach its limit load. +To perform the analysis, the load must be allowed to increase using very +small time increments so that the expected critical buckling load can +be predicted accurately. +Note - as this is a buckling analysis, divergence is expected.
+print("Begin nonlinear static analysis on imperfect geometry")
+
+mapdl.slashsolu()
+mapdl.antype("STATIC")
+mapdl.nlgeom("on")
+mapdl.pred("on")
+mapdl.time(1)
+mapdl.nsubst(100, 10000, 10)
+mapdl.rescontrol("define", "all", 1)
+mapdl.outres("all", "all")
+mapdl.ncnv(2) # Do not terminate the program execution if the solution diverges
+mapdl.allow_ignore = True # in order for PyMAPDL to not raise an error
+output = mapdl.solve()
+print(output)
+mapdl.finish()
+
+print("End nonlinear static analysis on imperfect geometry")
+
Begin nonlinear static analysis on imperfect geometry
+***** MAPDL SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS SHELL281. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ NONLINEAR GEOMETRIC EFFECTS . . . . . . . . . .ON
+ PLASTIC MATERIAL PROPERTIES INCLUDED. . . . . .YES
+ NEWTON-RAPHSON OPTION . . . . . . . . . . . . .PROGRAM CHOSEN
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ This nonlinear analysis defaults to using the full Newton-Raphson
+ solution procedure. This can be modified using the NROPT command.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+
+
+ D I S T R I B U T E D D O M A I N D E C O M P O S E R
+
+ ...Number of elements: 26796
+ ...Number of nodes: 73662
+ ...Decompose to 0 CPU domains
+ ...Element load balance ratio = 0.000
+
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ AUTOMATIC TIME STEPPING . . . . . . . . . . . . ON
+ INITIAL NUMBER OF SUBSTEPS . . . . . . . . . 100
+ MAXIMUM NUMBER OF SUBSTEPS . . . . . . . . . 10000
+ MINIMUM NUMBER OF SUBSTEPS . . . . . . . . . 10
+ MAXIMUM NUMBER OF EQUILIBRIUM ITERATIONS. . . . 15
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ STRESS-STIFFENING . . . . . . . . . . . . . . . ON
+ PREDICTOR USAGE . . . . . . . . . . . . . . . .ON (AFTER FIRST SUBSTEP)
+ TERMINATE ANALYSIS IF NOT CONVERGED . . . . . .YES (REMAIN)
+ CONVERGENCE CONTROLS. . . . . . . . . . . . . .USE DEFAULTS
+ COPY INTEGRATION POINT VALUES TO NODE . . . . .YES, FOR ELEMENTS WITH
+ ACTIVE MAT. NONLINEARITIES
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS
+ ITEM FREQUENCY COMPONENT
+ ALL ALL
+
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 489978592 at element 0.
+ Minimum = 165328.012 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ ALL CURRENT MAPDL DATA WRITTEN TO FILE NAME=
+ FOR POSSIBLE RESUME FROM THIS POINT
+ FORCE CONVERGENCE VALUE = 34.78 CRITERION= 0.1739
+ MOMENT CONVERGENCE VALUE = 0.1824E-05 CRITERION= 0.1596
+
+ DISTRIBUTED SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 441966, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Distributed sparse solver maximum pivot= 0 at node 0 .
+ Distributed sparse solver minimum pivot= 0 at node 0 .
+ Distributed sparse solver minimum pivot in absolute value= 0 at node 0
+ .
+ DISP CONVERGENCE VALUE = 0.2221E-01 CRITERION= 0.1110E-02
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2221E-01
+ FORCE CONVERGENCE VALUE = 1.654 CRITERION= 0.1739
+ MOMENT CONVERGENCE VALUE = 0.2307 CRITERION= 0.1596
+ DISP CONVERGENCE VALUE = 0.2244E-03 CRITERION= 0.1111E-02 <<< CONVERGED
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2244E-03
+ FORCE CONVERGENCE VALUE = 0.2717E-03 CRITERION= 0.1739 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.1623E-03 CRITERION= 0.1596 <<< CONVERGED
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ A reference moment value times the tolerance is used by the
+ Newton-Raphson method for checking convergence. The calculated
+ reference MOMENT CONVERGENCE VALUE = 0 is less than a threshold. This
+ threshold is internally calculated. You can overwrite it by
+ specifying MINREF on the CNVTOL command. Check results carefully.
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 2
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 26796 SHELL281 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 2
+ *** TIME = 0.100000E-01 TIME INC = 0.100000E-01
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000E-01 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 3.342 CRITERION= 0.3478
+ MOMENT CONVERGENCE VALUE = 0.4703 CRITERION= 0.3191
+ DISP CONVERGENCE VALUE = 0.4679E-03 CRITERION= 0.1111E-02 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.4679E-03
+ FORCE CONVERGENCE VALUE = 0.1163E-02 CRITERION= 0.3478 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.2879E-03 CRITERION= 0.3191 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 2 COMPLETED. CUM ITER = 3
+ *** TIME = 0.200000E-01 TIME INC = 0.100000E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.15000E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 6.409 CRITERION= 0.6086
+ MOMENT CONVERGENCE VALUE = 0.9124 CRITERION= 0.5585
+ DISP CONVERGENCE VALUE = 0.9445E-03 CRITERION= 0.1667E-02 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.9445E-03
+ FORCE CONVERGENCE VALUE = 0.4674E-02 CRITERION= 0.6086 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.6922E-03 CRITERION= 0.5585 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 3 COMPLETED. CUM ITER = 4
+ *** TIME = 0.350000E-01 TIME INC = 0.150000E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.22500E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 14.89 CRITERION= 0.9998
+ MOMENT CONVERGENCE VALUE = 2.142 CRITERION= 0.9175
+ DISP CONVERGENCE VALUE = 0.2356E-02 CRITERION= 0.2502E-02 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2356E-02
+ FORCE CONVERGENCE VALUE = 0.2851E-01 CRITERION= 0.9998 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.3006E-02 CRITERION= 0.9175 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 4 COMPLETED. CUM ITER = 5
+ *** TIME = 0.575000E-01 TIME INC = 0.225000E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.33750E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 35.48 CRITERION= 1.587
+ MOMENT CONVERGENCE VALUE = 5.147 CRITERION= 1.456
+ DISP CONVERGENCE VALUE = 0.6229E-02 CRITERION= 0.3757E-02
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.6229E-02
+ FORCE CONVERGENCE VALUE = 0.1940 CRITERION= 1.587 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.1811E-01 CRITERION= 1.456 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2802E-04 CRITERION= 0.3757E-02 <<< CONVERGED
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC = -0.2802E-04
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 2
+ *** LOAD STEP 1 SUBSTEP 5 COMPLETED. CUM ITER = 7
+ *** TIME = 0.912500E-01 TIME INC = 0.337500E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.50625E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 88.92 CRITERION= 2.467
+ MOMENT CONVERGENCE VALUE = 12.81 CRITERION= 2.264
+ DISP CONVERGENCE VALUE = 0.1802E-01 CRITERION= 0.5646E-02
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1802E-01
+ FORCE CONVERGENCE VALUE = 1.576 CRITERION= 2.467 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.1360 CRITERION= 2.264 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2509E-03 CRITERION= 0.5646E-02 <<< CONVERGED
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC = -0.2509E-03
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 2
+ *** LOAD STEP 1 SUBSTEP 6 COMPLETED. CUM ITER = 9
+ *** TIME = 0.141875 TIME INC = 0.506250E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.75938E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 252.2 CRITERION= 3.787
+ MOMENT CONVERGENCE VALUE = 33.74 CRITERION= 3.475
+ DISP CONVERGENCE VALUE = 0.6000E-01 CRITERION= 0.1142E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.6000E-01
+ FORCE CONVERGENCE VALUE = 17.33 CRITERION= 3.787
+ MOMENT CONVERGENCE VALUE = 1.320 CRITERION= 3.475 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2965E-02 CRITERION= 0.1157E-01 <<< CONVERGED
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2965E-02
+ FORCE CONVERGENCE VALUE = 0.3051E-01 CRITERION= 3.787 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.9014E-02 CRITERION= 3.475 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 2
+ *** LOAD STEP 1 SUBSTEP 7 COMPLETED. CUM ITER = 11
+ *** TIME = 0.217813 TIME INC = 0.759375E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.10000 INCREASED (FACTOR = 1.3169)
+
+ FORCE CONVERGENCE VALUE = 781.3 CRITERION= 5.525
+ MOMENT CONVERGENCE VALUE = 79.26 CRITERION= 5.071
+ DISP CONVERGENCE VALUE = 0.1687 CRITERION= 0.2356E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1687
+ FORCE CONVERGENCE VALUE = 177.9 CRITERION= 5.526
+ MOMENT CONVERGENCE VALUE = 11.17 CRITERION= 5.071
+ DISP CONVERGENCE VALUE = 0.2494E-01 CRITERION= 0.2481E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2494E-01
+ FORCE CONVERGENCE VALUE = 3.277 CRITERION= 5.526 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.3322 CRITERION= 5.071 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.8120E-03 CRITERION= 0.2484E-01 <<< CONVERGED
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC = -0.8120E-03
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 3
+ *** LOAD STEP 1 SUBSTEP 8 COMPLETED. CUM ITER = 14
+ *** TIME = 0.317813 TIME INC = 0.100000
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 2522. CRITERION= 7.264
+ MOMENT CONVERGENCE VALUE = 157.6 CRITERION= 6.666
+ DISP CONVERGENCE VALUE = 0.3201 CRITERION= 0.3187E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3201
+ FORCE CONVERGENCE VALUE = 802.8 CRITERION= 7.265
+ MOMENT CONVERGENCE VALUE = 48.60 CRITERION= 6.667
+ DISP CONVERGENCE VALUE = 0.1286 CRITERION= 0.3533E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1286
+ FORCE CONVERGENCE VALUE = 71.58 CRITERION= 7.265
+ MOMENT CONVERGENCE VALUE = 5.723 CRITERION= 6.667 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.4113E-01 CRITERION= 0.3557E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4113E-01
+ FORCE CONVERGENCE VALUE = 4.570 CRITERION= 7.265 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.3269 CRITERION= 6.667 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1397E-02 CRITERION= 0.3557E-01 <<< CONVERGED
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC = 0.1397E-02
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 4
+ *** LOAD STEP 1 SUBSTEP 9 COMPLETED. CUM ITER = 18
+ *** TIME = 0.417813 TIME INC = 0.100000
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 9178. CRITERION= 9.006
+ MOMENT CONVERGENCE VALUE = 777.1 CRITERION= 8.264
+ DISP CONVERGENCE VALUE = 0.8389 CRITERION= 0.6052E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.8389
+ FORCE CONVERGENCE VALUE = 3620. CRITERION= 9.008
+ MOMENT CONVERGENCE VALUE = 267.5 CRITERION= 8.266
+ DISP CONVERGENCE VALUE = 0.6188 CRITERION= 0.7166E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.6188
+ FORCE CONVERGENCE VALUE = 1032. CRITERION= 9.010
+ MOMENT CONVERGENCE VALUE = 89.59 CRITERION= 8.268
+ DISP CONVERGENCE VALUE = 1.023 CRITERION= 0.9582E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -1.023
+ FORCE CONVERGENCE VALUE = 3337. CRITERION= 9.011
+ MOMENT CONVERGENCE VALUE = 313.5 CRITERION= 8.269
+ DISP CONVERGENCE VALUE = 0.1755 CRITERION= 0.9586E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1755
+ FORCE CONVERGENCE VALUE = 142.2 CRITERION= 9.011
+ MOMENT CONVERGENCE VALUE = 44.23 CRITERION= 8.270
+ DISP CONVERGENCE VALUE = 0.3050 CRITERION= 0.9623E-01
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3050
+ FORCE CONVERGENCE VALUE = 246.8 CRITERION= 9.012
+ MOMENT CONVERGENCE VALUE = 18.13 CRITERION= 8.270
+ DISP CONVERGENCE VALUE = 0.2704 CRITERION= 0.9628E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2704
+ FORCE CONVERGENCE VALUE = 243.5 CRITERION= 9.012
+ MOMENT CONVERGENCE VALUE = 17.49 CRITERION= 8.270
+ DISP CONVERGENCE VALUE = 0.9261 CRITERION= 0.9628E-01
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.9261
+ FORCE CONVERGENCE VALUE = 2146. CRITERION= 10.59
+ MOMENT CONVERGENCE VALUE = 238.1 CRITERION= 9.720
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 8
+ *** LOAD STEP 1 SUBSTEP 10 NOT COMPLETED. CUM ITER = 26
+ *** BEGIN BISECTION NUMBER 1 NEW TIME INCREMENT= 0.45000E-01
+
+ FORCE CONVERGENCE VALUE = 2995. CRITERION= 8.048
+ MOMENT CONVERGENCE VALUE = 194.5 CRITERION= 7.386
+ DISP CONVERGENCE VALUE = 0.3766 CRITERION= 0.3557E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3766
+ FORCE CONVERGENCE VALUE = 496.4 CRITERION= 8.049
+ MOMENT CONVERGENCE VALUE = 33.11 CRITERION= 7.386
+ DISP CONVERGENCE VALUE = 0.1569 CRITERION= 0.3743E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1569
+ FORCE CONVERGENCE VALUE = 105.3 CRITERION= 8.050
+ MOMENT CONVERGENCE VALUE = 7.260 CRITERION= 7.387 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.6500E-01 CRITERION= 0.3929E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.6500E-01
+ FORCE CONVERGENCE VALUE = 16.99 CRITERION= 8.050
+ MOMENT CONVERGENCE VALUE = 1.221 CRITERION= 7.387 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1541E-01 CRITERION= 0.3939E-01 <<< CONVERGED
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1541E-01
+ FORCE CONVERGENCE VALUE = 0.8279 CRITERION= 8.050 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.1052 CRITERION= 7.387 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 4
+ *** LOAD STEP 1 SUBSTEP 10 COMPLETED. CUM ITER = 29
+ *** TIME = 0.462813 TIME INC = 0.450000E-01
+ *** AUTO STEP TIME: NEXT TIME INC = 0.45000E-01 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 5962. CRITERION= 8.835
+ MOMENT CONVERGENCE VALUE = 543.9 CRITERION= 8.107
+ DISP CONVERGENCE VALUE = 0.6835 CRITERION= 0.5040E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.6835
+ FORCE CONVERGENCE VALUE = 1134. CRITERION= 8.835
+ MOMENT CONVERGENCE VALUE = 90.52 CRITERION= 8.108
+ DISP CONVERGENCE VALUE = 0.5647 CRITERION= 0.6684E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.5647
+ FORCE CONVERGENCE VALUE = 1111. CRITERION= 8.836
+ MOMENT CONVERGENCE VALUE = 74.43 CRITERION= 8.109
+ DISP CONVERGENCE VALUE = 0.1671 CRITERION= 0.7284E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1671
+ FORCE CONVERGENCE VALUE = 105.0 CRITERION= 8.836
+ MOMENT CONVERGENCE VALUE = 9.946 CRITERION= 8.109
+ DISP CONVERGENCE VALUE = 0.7323E-01 CRITERION= 0.7417E-01 <<< CONVERGED
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.7323E-01
+ FORCE CONVERGENCE VALUE = 22.34 CRITERION= 8.836
+ MOMENT CONVERGENCE VALUE = 1.546 CRITERION= 8.109 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.4771E-02 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4771E-02
+ FORCE CONVERGENCE VALUE = 0.1063 CRITERION= 8.836 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.1221 CRITERION= 8.109 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 5
+ *** LOAD STEP 1 SUBSTEP 11 COMPLETED. CUM ITER = 34
+ *** TIME = 0.507812 TIME INC = 0.450000E-01
+ *** AUTO TIME STEP: NEXT TIME INC = 0.67500E-01 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 0.3334E+05 CRITERION= 10.02
+ MOMENT CONVERGENCE VALUE = 7795. CRITERION= 9.195
+ DISP CONVERGENCE VALUE = 1.683 CRITERION= 0.8513E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 1.683
+ FORCE CONVERGENCE VALUE = 0.3672E+05 CRITERION= 10.02
+ MOMENT CONVERGENCE VALUE = 0.1468E+05 CRITERION= 9.198
+ DISP CONVERGENCE VALUE = 7.150 CRITERION= 0.2864
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 7.150
+ FORCE CONVERGENCE VALUE = 0.1337E+06 CRITERION= 10.09
+ MOMENT CONVERGENCE VALUE = 0.6255E+06 CRITERION= 9.261
+ DISP CONVERGENCE VALUE = 380.7 CRITERION= 18.90
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -380.7
+ FORCE CONVERGENCE VALUE = 0.4605E+07 CRITERION= 84.79
+ MOMENT CONVERGENCE VALUE = 0.2265E+08 CRITERION= 77.81
+ DISP CONVERGENCE VALUE = 0.1374E+05 CRITERION= 703.1
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1374E+05
+
+ *** ERROR *** CP = 0.000 TIME= 00:00:00
+ Element 17426 has excessive thickness change.
+
+ *** ERROR *** CP = 0.000 TIME= 00:00:00
+ Element 2517 has excessive thickness change.
+ *** LOAD STEP 1 SUBSTEP 12 NOT COMPLETED. CUM ITER = 39
+ *** BEGIN BISECTION NUMBER 1 NEW TIME INCREMENT= 0.23625E-01
+
+ FORCE CONVERGENCE VALUE = 7739. CRITERION= 9.250
+ MOMENT CONVERGENCE VALUE = 1071. CRITERION= 8.489
+ DISP CONVERGENCE VALUE = 0.3148 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3148
+ FORCE CONVERGENCE VALUE = 521.2 CRITERION= 9.250
+ MOMENT CONVERGENCE VALUE = 168.1 CRITERION= 8.489
+ DISP CONVERGENCE VALUE = 3.185 CRITERION= 0.1758
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 3.185
+ FORCE CONVERGENCE VALUE = 0.1925E+05 CRITERION= 9.252
+ MOMENT CONVERGENCE VALUE = 6530. CRITERION= 8.490
+ DISP CONVERGENCE VALUE = 2.477 CRITERION= 0.1758
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 2.477
+ FORCE CONVERGENCE VALUE = 0.2903E+05 CRITERION= 9.255
+ MOMENT CONVERGENCE VALUE = 0.3408E+05 CRITERION= 8.493
+ DISP CONVERGENCE VALUE = 9.697 CRITERION= 0.5765
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 9.697
+ FORCE CONVERGENCE VALUE = 0.5777E+06 CRITERION= 9.488
+ MOMENT CONVERGENCE VALUE = 0.2332E+07 CRITERION= 8.707
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 5
+ *** LOAD STEP 1 SUBSTEP 12 NOT COMPLETED. CUM ITER = 43
+ *** BEGIN BISECTION NUMBER 2 NEW TIME INCREMENT= 0.10631E-01
+
+ FORCE CONVERGENCE VALUE = 2830. CRITERION= 9.023
+ MOMENT CONVERGENCE VALUE = 316.6 CRITERION= 8.280
+ DISP CONVERGENCE VALUE = 0.1987 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1987
+ FORCE CONVERGENCE VALUE = 150.4 CRITERION= 9.023
+ MOMENT CONVERGENCE VALUE = 40.22 CRITERION= 8.280
+ DISP CONVERGENCE VALUE = 0.2897 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2897
+ FORCE CONVERGENCE VALUE = 259.6 CRITERION= 9.023
+ MOMENT CONVERGENCE VALUE = 18.92 CRITERION= 8.280
+ DISP CONVERGENCE VALUE = 0.4809 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4809
+ FORCE CONVERGENCE VALUE = 690.2 CRITERION= 9.023
+ MOMENT CONVERGENCE VALUE = 46.30 CRITERION= 8.280
+ DISP CONVERGENCE VALUE = 1.755 CRITERION= 0.1271
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 1.755
+ FORCE CONVERGENCE VALUE = 6684. CRITERION= 9.024
+ MOMENT CONVERGENCE VALUE = 973.2 CRITERION= 8.281
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 5
+ *** LOAD STEP 1 SUBSTEP 12 NOT COMPLETED. CUM ITER = 47
+ *** BEGIN BISECTION NUMBER 3 NEW TIME INCREMENT= 0.47841E-02
+
+ FORCE CONVERGENCE VALUE = 1140. CRITERION= 8.920
+ MOMENT CONVERGENCE VALUE = 114.9 CRITERION= 8.186
+ DISP CONVERGENCE VALUE = 0.1121 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1121
+ FORCE CONVERGENCE VALUE = 42.68 CRITERION= 8.920
+ MOMENT CONVERGENCE VALUE = 8.289 CRITERION= 8.186
+ DISP CONVERGENCE VALUE = 0.7531E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.7531E-01
+ FORCE CONVERGENCE VALUE = 16.17 CRITERION= 8.920
+ MOMENT CONVERGENCE VALUE = 1.451 CRITERION= 8.186 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1739E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1739E-01
+ FORCE CONVERGENCE VALUE = 1.085 CRITERION= 8.920 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.2552 CRITERION= 8.186 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 3
+ *** LOAD STEP 1 SUBSTEP 12 COMPLETED. CUM ITER = 49
+ *** TIME = 0.512597 TIME INC = 0.478406E-02
+ *** AUTO STEP TIME: NEXT TIME INC = 0.47841E-02 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 437.0 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 32.47 CRITERION= 8.263
+ DISP CONVERGENCE VALUE = 0.1258 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1258
+ FORCE CONVERGENCE VALUE = 56.91 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 5.574 CRITERION= 8.263 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 1.113 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -1.113
+ FORCE CONVERGENCE VALUE = 4126. CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 575.1 CRITERION= 8.263
+ DISP CONVERGENCE VALUE = 0.3482 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3482
+ FORCE CONVERGENCE VALUE = 202.8 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 90.86 CRITERION= 8.262
+ DISP CONVERGENCE VALUE = 0.3248 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.3248
+ FORCE CONVERGENCE VALUE = 703.1 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 63.27 CRITERION= 8.262
+ DISP CONVERGENCE VALUE = 0.1437 CRITERION= 0.7422E-01
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1437
+ FORCE CONVERGENCE VALUE = 67.13 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 12.22 CRITERION= 8.263
+ DISP CONVERGENCE VALUE = 0.2515 CRITERION= 0.7422E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2515
+ FORCE CONVERGENCE VALUE = 225.4 CRITERION= 9.004
+ MOMENT CONVERGENCE VALUE = 17.31 CRITERION= 8.263
+ DISP CONVERGENCE VALUE = 0.1216 CRITERION= 0.7422E-01
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1216
+ FORCE CONVERGENCE VALUE = 57.19 CRITERION= 10.58
+ MOMENT CONVERGENCE VALUE = 5.638 CRITERION= 9.712 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 1.048 CRITERION= 0.7422E-01
+ EQUIL ITER 8 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 1.048
+ FORCE CONVERGENCE VALUE = 4350. CRITERION= 10.80
+ MOMENT CONVERGENCE VALUE = 481.8 CRITERION= 9.911
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 9
+ *** LOAD STEP 1 SUBSTEP 13 NOT COMPLETED. CUM ITER = 58
+ *** BEGIN BISECTION NUMBER 1 NEW TIME INCREMENT= 0.21528E-02
+
+ FORCE CONVERGENCE VALUE = 143.3 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 9.974 CRITERION= 8.220
+ DISP CONVERGENCE VALUE = 0.4821E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4821E-01
+ FORCE CONVERGENCE VALUE = 10.86 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 1.356 CRITERION= 8.220 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.7755E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.7755E-01
+ FORCE CONVERGENCE VALUE = 22.42 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 1.937 CRITERION= 8.221 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.5666E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.5666E-01
+ FORCE CONVERGENCE VALUE = 13.12 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 1.281 CRITERION= 8.221 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1207 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1207
+ FORCE CONVERGENCE VALUE = 55.45 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 4.396 CRITERION= 8.221 <<< CONVERGED
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 5
+ *** LOAD STEP 1 SUBSTEP 13 NOT COMPLETED. CUM ITER = 62
+ *** BEGIN BISECTION NUMBER 2 NEW TIME INCREMENT= 0.96877E-03
+
+ FORCE CONVERGENCE VALUE = 54.02 CRITERION= 8.937
+ MOMENT CONVERGENCE VALUE = 3.686 CRITERION= 8.201
+ DISP CONVERGENCE VALUE = 0.2413E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2413E-01
+ FORCE CONVERGENCE VALUE = 2.383 CRITERION= 8.937 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.4496 CRITERION= 8.201 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 13 COMPLETED. CUM ITER = 62
+ *** TIME = 0.513565 TIME INC = 0.968773E-03
+ *** AUTO STEP TIME: NEXT TIME INC = 0.96877E-03 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 39.63 CRITERION= 8.954
+ MOMENT CONVERGENCE VALUE = 2.841 CRITERION= 8.217
+ DISP CONVERGENCE VALUE = 0.3882E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3882E-01
+ FORCE CONVERGENCE VALUE = 6.308 CRITERION= 8.954 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.7885 CRITERION= 8.217 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 14 COMPLETED. CUM ITER = 63
+ *** TIME = 0.514534 TIME INC = 0.968773E-03
+ *** AUTO TIME STEP: NEXT TIME INC = 0.14532E-02 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 177.7 CRITERION= 8.980
+ MOMENT CONVERGENCE VALUE = 13.17 CRITERION= 8.240
+ DISP CONVERGENCE VALUE = 0.3462 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3462
+ FORCE CONVERGENCE VALUE = 348.9 CRITERION= 8.980
+ MOMENT CONVERGENCE VALUE = 22.75 CRITERION= 8.241
+ DISP CONVERGENCE VALUE = 1.482 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -1.482
+ FORCE CONVERGENCE VALUE = 5235. CRITERION= 8.980
+ MOMENT CONVERGENCE VALUE = 761.6 CRITERION= 8.240
+ DISP CONVERGENCE VALUE = 0.3994 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3994
+ FORCE CONVERGENCE VALUE = 250.6 CRITERION= 8.979
+ MOMENT CONVERGENCE VALUE = 109.2 CRITERION= 8.240
+ DISP CONVERGENCE VALUE = 0.2678 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2678
+ FORCE CONVERGENCE VALUE = 374.0 CRITERION= 8.979
+ MOMENT CONVERGENCE VALUE = 40.17 CRITERION= 8.240
+ DISP CONVERGENCE VALUE = 0.1573 CRITERION= 0.7422E-01
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1573
+ FORCE CONVERGENCE VALUE = 85.54 CRITERION= 8.980
+ MOMENT CONVERGENCE VALUE = 11.95 CRITERION= 8.240
+ DISP CONVERGENCE VALUE = 0.1360 CRITERION= 0.7422E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1360
+ FORCE CONVERGENCE VALUE = 86.90 CRITERION= 8.980
+ MOMENT CONVERGENCE VALUE = 7.445 CRITERION= 8.240 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1102 CRITERION= 0.7422E-01
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1102
+ FORCE CONVERGENCE VALUE = 53.46 CRITERION= 10.55
+ MOMENT CONVERGENCE VALUE = 4.531 CRITERION= 9.686 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2589 CRITERION= 0.7422E-01
+ EQUIL ITER 8 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2589
+ FORCE CONVERGENCE VALUE = 268.2 CRITERION= 10.77
+ MOMENT CONVERGENCE VALUE = 19.45 CRITERION= 9.884
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 9
+ *** LOAD STEP 1 SUBSTEP 15 NOT COMPLETED. CUM ITER = 72
+ *** BEGIN BISECTION NUMBER 1 NEW TIME INCREMENT= 0.65392E-03
+
+ FORCE CONVERGENCE VALUE = 58.54 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 4.289 CRITERION= 8.228
+ DISP CONVERGENCE VALUE = 0.1294 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1294
+ FORCE CONVERGENCE VALUE = 61.77 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 4.735 CRITERION= 8.228 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2145 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2145
+ FORCE CONVERGENCE VALUE = 143.2 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 10.70 CRITERION= 8.228
+ DISP CONVERGENCE VALUE = 0.6552E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.6552E-01
+ FORCE CONVERGENCE VALUE = 10.25 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 1.454 CRITERION= 8.228 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2108 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2108
+ FORCE CONVERGENCE VALUE = 196.7 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 14.50 CRITERION= 8.228
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 5
+ *** LOAD STEP 1 SUBSTEP 15 NOT COMPLETED. CUM ITER = 76
+ *** BEGIN BISECTION NUMBER 2 NEW TIME INCREMENT= 0.29426E-03
+
+ FORCE CONVERGENCE VALUE = 24.66 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 1.900 CRITERION= 8.222
+ DISP CONVERGENCE VALUE = 0.6161E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.6161E-01
+ FORCE CONVERGENCE VALUE = 16.81 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 1.550 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.3000 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.3000
+ FORCE CONVERGENCE VALUE = 345.4 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 28.45 CRITERION= 8.222
+ DISP CONVERGENCE VALUE = 0.9271E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.9271E-01
+ FORCE CONVERGENCE VALUE = 21.13 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 3.953 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1182 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1182
+ FORCE CONVERGENCE VALUE = 53.95 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 4.324 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.5180E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.5180E-01
+ FORCE CONVERGENCE VALUE = 10.69 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 1.181 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.7971E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.7971E-01
+ FORCE CONVERGENCE VALUE = 27.32 CRITERION= 8.959
+ MOMENT CONVERGENCE VALUE = 2.305 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2621 CRITERION= 0.7422E-01
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2621
+ FORCE CONVERGENCE VALUE = 255.6 CRITERION= 10.53
+ MOMENT CONVERGENCE VALUE = 20.50 CRITERION= 9.664
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 8
+ *** LOAD STEP 1 SUBSTEP 15 NOT COMPLETED. CUM ITER = 83
+ *** BEGIN BISECTION NUMBER 3 NEW TIME INCREMENT= 0.10000E-03
+
+ FORCE CONVERGENCE VALUE = 11.54 CRITERION= 8.956
+ MOMENT CONVERGENCE VALUE = 1.060 CRITERION= 8.219
+ DISP CONVERGENCE VALUE = 0.4012E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4012E-01
+ FORCE CONVERGENCE VALUE = 6.714 CRITERION= 8.956 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.7801 CRITERION= 8.219 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 1
+ *** LOAD STEP 1 SUBSTEP 15 COMPLETED. CUM ITER = 83
+ *** TIME = 0.514634 TIME INC = 0.100000E-03
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000E-03 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 28.39 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 2.158 CRITERION= 8.220
+ DISP CONVERGENCE VALUE = 0.5154 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.5154
+ FORCE CONVERGENCE VALUE = 996.2 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 93.89 CRITERION= 8.220
+ DISP CONVERGENCE VALUE = 0.1513 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1513
+ FORCE CONVERGENCE VALUE = 46.69 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 14.29 CRITERION= 8.220
+ DISP CONVERGENCE VALUE = 0.1749 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1749
+ FORCE CONVERGENCE VALUE = 129.2 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 10.61 CRITERION= 8.220
+ DISP CONVERGENCE VALUE = 0.6899E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.6899E-01
+ FORCE CONVERGENCE VALUE = 19.35 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 2.207 CRITERION= 8.220 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.8524E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.8524E-01
+ FORCE CONVERGENCE VALUE = 27.44 CRITERION= 8.958
+ MOMENT CONVERGENCE VALUE = 2.327 CRITERION= 8.220 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.4444E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4444E-01
+ FORCE CONVERGENCE VALUE = 8.756 CRITERION= 8.958 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.9666 CRITERION= 8.220 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 6
+ *** LOAD STEP 1 SUBSTEP 16 COMPLETED. CUM ITER = 89
+ *** TIME = 0.514734 TIME INC = 0.100000E-03
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000E-03 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 10.90 CRITERION= 8.960
+ MOMENT CONVERGENCE VALUE = 1.171 CRITERION= 8.222
+ DISP CONVERGENCE VALUE = 0.1377 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1377
+ FORCE CONVERGENCE VALUE = 82.42 CRITERION= 8.960
+ MOMENT CONVERGENCE VALUE = 6.212 CRITERION= 8.222 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.2067 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2067
+ FORCE CONVERGENCE VALUE = 135.0 CRITERION= 8.960
+ MOMENT CONVERGENCE VALUE = 10.00 CRITERION= 8.222
+ DISP CONVERGENCE VALUE = 0.4928E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.4928E-01
+ FORCE CONVERGENCE VALUE = 5.373 CRITERION= 8.960 <<< CONVERGED
+ MOMENT CONVERGENCE VALUE = 0.8629 CRITERION= 8.222 <<< CONVERGED
+ >>> SOLUTION CONVERGED AFTER EQUILIBRIUM ITERATION 3
+ *** LOAD STEP 1 SUBSTEP 17 COMPLETED. CUM ITER = 92
+ *** TIME = 0.514834 TIME INC = 0.100000E-03
+ *** AUTO TIME STEP: NEXT TIME INC = 0.15000E-03 INCREASED (FACTOR = 1.5000)
+
+ FORCE CONVERGENCE VALUE = 13.64 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 2.192 CRITERION= 8.224
+ DISP CONVERGENCE VALUE = 0.1057 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1057
+ FORCE CONVERGENCE VALUE = 46.42 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 3.675 CRITERION= 8.224 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.9430 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.9430
+ FORCE CONVERGENCE VALUE = 3204. CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 398.8 CRITERION= 8.224
+ DISP CONVERGENCE VALUE = 0.2859 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.2859
+ FORCE CONVERGENCE VALUE = 146.8 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 61.78 CRITERION= 8.224
+ DISP CONVERGENCE VALUE = 0.2422 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2422
+ FORCE CONVERGENCE VALUE = 455.6 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 40.41 CRITERION= 8.224
+ DISP CONVERGENCE VALUE = 0.1148 CRITERION= 0.7422E-01
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1148
+ FORCE CONVERGENCE VALUE = 49.29 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 7.475 CRITERION= 8.224 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1648 CRITERION= 0.7422E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1648
+ FORCE CONVERGENCE VALUE = 96.52 CRITERION= 8.962
+ MOMENT CONVERGENCE VALUE = 7.504 CRITERION= 8.224 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.6973E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.6973E-01
+ FORCE CONVERGENCE VALUE = 21.02 CRITERION= 10.53
+ MOMENT CONVERGENCE VALUE = 2.113 CRITERION= 9.667 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.9208E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 8 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.9208E-01
+ FORCE CONVERGENCE VALUE = 32.98 CRITERION= 10.75
+ MOMENT CONVERGENCE VALUE = 2.723 CRITERION= 9.864 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1312 CRITERION= 0.7422E-01
+ EQUIL ITER 9 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1312
+ FORCE CONVERGENCE VALUE = 67.80 CRITERION= 10.97
+ MOMENT CONVERGENCE VALUE = 5.182 CRITERION= 10.07 <<< CONVERGED
+ >>> SOLUTION PATTERNS SHOW DIVERGENCE AT ITERATION = 10
+ *** LOAD STEP 1 SUBSTEP 18 NOT COMPLETED. CUM ITER = 102
+ *** BEGIN BISECTION NUMBER 1 NEW TIME INCREMENT= 0.10000E-03
+
+ FORCE CONVERGENCE VALUE = 10.10 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 1.683 CRITERION= 8.223
+ DISP CONVERGENCE VALUE = 0.1036 CRITERION= 0.7422E-01
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1036
+ FORCE CONVERGENCE VALUE = 44.92 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 3.556 CRITERION= 8.224 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.3994 CRITERION= 0.7422E-01
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.3994
+ FORCE CONVERGENCE VALUE = 577.0 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 49.52 CRITERION= 8.223
+ DISP CONVERGENCE VALUE = 0.1151 CRITERION= 0.7422E-01
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1151
+ FORCE CONVERGENCE VALUE = 28.35 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 6.978 CRITERION= 8.223 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1348 CRITERION= 0.7422E-01
+ EQUIL ITER 4 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1348
+ FORCE CONVERGENCE VALUE = 74.52 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 6.026 CRITERION= 8.223 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.6109E-01 CRITERION= 0.7422E-01 <<< CONVERGED
+ EQUIL ITER 5 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.6109E-01
+ FORCE CONVERGENCE VALUE = 14.38 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 1.547 CRITERION= 8.223 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.8651E-01 CRITERION= 0.7422E-01
+ EQUIL ITER 6 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.8651E-01
+ FORCE CONVERGENCE VALUE = 31.28 CRITERION= 8.961
+ MOMENT CONVERGENCE VALUE = 2.604 CRITERION= 8.223 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.9241 CRITERION= 0.7422E-01
+ EQUIL ITER 7 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.9241
+ FORCE CONVERGENCE VALUE = 3187. CRITERION= 10.53
+ MOMENT CONVERGENCE VALUE = 317.2 CRITERION= 9.666
+ DISP CONVERGENCE VALUE = 0.3616 CRITERION= 0.7422E-01
+ EQUIL ITER 8 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.3616
+ FORCE CONVERGENCE VALUE = 279.6 CRITERION= 10.75
+ MOMENT CONVERGENCE VALUE = 45.13 CRITERION= 9.864
+ DISP CONVERGENCE VALUE = 1.388 CRITERION= 0.1293
+ EQUIL ITER 9 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 1.388
+ FORCE CONVERGENCE VALUE = 6388. CRITERION= 10.97
+ MOMENT CONVERGENCE VALUE = 901.9 CRITERION= 10.07
+ DISP CONVERGENCE VALUE = 0.2434 CRITERION= 0.1293
+ EQUIL ITER 10 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2434
+ FORCE CONVERGENCE VALUE = 397.3 CRITERION= 11.19
+ MOMENT CONVERGENCE VALUE = 150.2 CRITERION= 10.27
+ DISP CONVERGENCE VALUE = 0.8643 CRITERION= 0.1293
+ EQUIL ITER 11 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.8643
+ FORCE CONVERGENCE VALUE = 1849. CRITERION= 11.42
+ MOMENT CONVERGENCE VALUE = 175.5 CRITERION= 10.48
+ DISP CONVERGENCE VALUE = 0.1396 CRITERION= 0.1293
+ EQUIL ITER 12 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1396
+ FORCE CONVERGENCE VALUE = 84.71 CRITERION= 11.66
+ MOMENT CONVERGENCE VALUE = 32.81 CRITERION= 10.70
+ DISP CONVERGENCE VALUE = 0.2072 CRITERION= 0.1293
+ EQUIL ITER 13 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.2072
+ FORCE CONVERGENCE VALUE = 103.4 CRITERION= 11.89
+ MOMENT CONVERGENCE VALUE = 8.223 CRITERION= 10.91 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.1151 CRITERION= 0.1293 <<< CONVERGED
+ EQUIL ITER 14 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.1151
+ FORCE CONVERGENCE VALUE = 29.64 CRITERION= 12.14
+ MOMENT CONVERGENCE VALUE = 2.837 CRITERION= 11.14 <<< CONVERGED
+ DISP CONVERGENCE VALUE = 0.7430E-01 CRITERION= 0.1293 <<< CONVERGED
+ EQUIL ITER 15 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -0.7430E-01
+ FORCE CONVERGENCE VALUE = 12.61 CRITERION= 12.38
+ MOMENT CONVERGENCE VALUE = 1.019 CRITERION= 11.36 <<< CONVERGED
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ Solution not converged at time 0.514934108 (load step 1 substep 18).
+ Run continued at user request.
+ *** LOAD STEP 1 SUBSTEP 18 COMPLETED. CUM ITER = 116
+ *** TIME = 0.514934 TIME INC = 0.100000E-03
+ *** MAX PLASTIC STRAIN STEP = 0.1223E-04 CRITERION = 0.1500
+ *** AUTO STEP TIME: NEXT TIME INC = 0.10000E-03 UNCHANGED
+
+ FORCE CONVERGENCE VALUE = 0.1381E+06 CRITERION= 8.966
+ MOMENT CONVERGENCE VALUE = 0.2126E+07 CRITERION= 8.228
+ DISP CONVERGENCE VALUE = 38.66 CRITERION= 1.929
+ EQUIL ITER 1 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= -38.66
+ FORCE CONVERGENCE VALUE = 0.1716E+07 CRITERION= 10.01
+ MOMENT CONVERGENCE VALUE = 0.1078E+08 CRITERION= 9.188
+ DISP CONVERGENCE VALUE = 4183. CRITERION= 209.2
+ EQUIL ITER 2 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 4183.
+ FORCE CONVERGENCE VALUE = 0.1094E+08 CRITERION= 8790.
+ MOMENT CONVERGENCE VALUE = 0.6503E+08 CRITERION= 8067.
+ DISP CONVERGENCE VALUE = 0.1526E+06 CRITERION= 7739.
+ EQUIL ITER 3 COMPLETED. NEW TRIANG MATRIX. MAX DOF INC= 0.1934E+06
+
+ *** ERROR *** CP = 0.000 TIME= 00:00:00
+ Element 19905 has excessive thickness change.
+
+ *** ERROR *** CP = 0.000 TIME= 00:00:00
+ Element 3389 has excessive thickness change.
+
+ *** ERROR *** CP = 0.000 TIME= 00:00:00
+ Element 0 (type = 1, SHELL281) (and maybe other elements) has become
+ highly distorted. Excessive distortion of elements is usually a
+ symptom indicating the need for corrective action elsewhere. Try
+ incrementing the load more slowly (increase the number of substeps or
+ decrease the time step size). You may need to improve your mesh to
+ obtain elements with better aspect ratios. Also consider the behavior
+ of materials, contact pairs, and/or constraint equations. Please rule
+ out other root causes of this failure before attempting rezoning or
+ nonlinear adaptive solutions. If this message appears in the first
+ iteration of first substep, be sure to perform element shape checking.
+
+ *** WARNING *** CP = 0.000 TIME= 00:00:00
+ The unconverged solution (identified as time 1 substep 999999) is
+ output for analysis debug purposes. Results should not be used for
+ any other purpose.
+
+
+
+
+ R E S T A R T I N F O R M A T I O N
+
+ REASON FOR TERMINATION. . . . . . . . . .ERROR IN ELEMENT FORMULATION
+ FILES NEEDED FOR RESTARTING . . . . . . . buckling0.Rnnn
+ buckling.ldhi
+ buckling.rdb
+ TIME OF LAST SOLUTION . . . . . . . . . . 0.51493
+ TIME AT START OF THE LOAD STEP . . . . 0.0000
+ TIME AT END OF THE LOAD STEP . . . . . 1.0000
+
+ ALL CURRENT MAPDL DATA WRITTEN TO FILE NAME=
+ FOR POSSIBLE RESUME FROM THIS POINT
+
+
+
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+End nonlinear static analysis on imperfect geometry
+
An unconverged solution of the nonlinear static analysis could mean that +buckling has occurred. In this example, the change in time (or load) +increment, and displacement value, occurs between substeps 10 and 11, +which corresponds to TIME = 0.51781 and TIME = 0.53806 and to a pressure +between 0.124 MPa and 0.129 MPa. It is therefore very likely that buckling +occurred at this time; to be sure, the analysis is continued. The goal is to +verify the assessment made at this stage by obtaining the load-displacement +behavior over a larger range. Because the post-buckling state is unstable, +special techniques are necessary to compensate - in this case, nonlinear +stabilization is used.
+print('Begin post-buckling analysis')
+
+mapdl.slashsolu() # Restart analysis with stabilization
+mapdl.antype("static", "restart", 1, 10)
+mapdl.nsubst(100, 50000, 10)
+mapdl.rescontrol("define", "last")
+mapdl.stabilize("constant", "energy", 0.000145) # Use energy option
+output = mapdl.solve()
+mapdl.finish()
+
+print('End of post-buckling analysis run')
+
print('Begin POST1 postprocessing of post-buckling analysis')
+mapdl.post1()
+mapdl.set("last")
+mapdl.post_processing.plot_nodal_displacement("NORM", smooth_shading=True)
+mapdl.post_processing.plot_nodal_eqv_stress()
+mapdl.finish()
+print('End POST1 postprocessing of post-buckling analysis')
+
print('Begin POST26 postprocessing of post-buckling analysis')
+mapdl.post26()
+
+
+mapdl.numvar(100) # allow storage for 100 variables
+mapdl.enersol(13, "sene") # store stiffness energy
+mapdl.enersol(14, "sten") # store artificial stabilization energy
+
+# time history plot of stiffness and stabilization energies
+mapdl.show("png")
+mapdl.plvar(13, 14)
+mapdl.show("close")
+
+# pressure versus axial shortening for some nodes under the upper ring
+mapdl.nsol(2, 67319, "U", "Z", "UZ1")
+mapdl.prod(
+ ir=3, ia=2, ib="", ic="", name="strain1", facta="", factb="", factc=-1 / 431.8
+)
+mapdl.prod(ir=12, ia=1, ib="", ic="", name="Load", facta="", factb="", factc=0.24)
+mapdl.xvar(3)
+mapdl.show("png")
+mapdl.xrange(0.01)
+mapdl.yrange(0.24)
+mapdl.axlab("X", "Axial Shortening")
+mapdl.axlab("Y", "Applied Pressure ")
+mapdl.plvar(12)
+mapdl.show("close")
+mapdl.xvar(3)
+mapdl.show("png")
+mapdl.xrange(0.002)
+mapdl.yrange(1)
+mapdl.axlab("X", "Axial Shortening")
+mapdl.axlab("Y", "Time")
+mapdl.plvar(1)
+mapdl.show("png")
+mapdl.show("close")
+
+# pressure versus radial displacement for the node with max. deformation
+mapdl.nsol(6, 65269, "U", "Y", "UY_1")
+mapdl.prod(ir=7, ia=6, ib=6, ic="", name="UY2_1")
+mapdl.nsol(8, 65269, "U", "X", "UX_1")
+mapdl.prod(ir=9, ia=8, ib=8, ic="", name="UX2_1")
+mapdl.add(10, 7, 9, "sum")
+mapdl.sqrt(ir=11, ia=10, name="Urad")
+mapdl.xvar(11)
+mapdl.show("png")
+mapdl.xrange(4)
+mapdl.yrange(0.24)
+mapdl.axlab("X", "Radial Displacement")
+mapdl.axlab("Y", "Applied Pressure")
+mapdl.plvar(12)
+mapdl.show("png")
+mapdl.show("close")
+mapdl.finish()
+
+print('End POST26 postprocessing of post-buckling analysis')
+
Exit MAPDL instance.
+mapdl.exit()
+print("Exited MAPDL")
+
Exited MAPDL
+
This example problem shows how to simulate stent-artery interaction during and after stent +placement in an occluded artery. +The analysis exposes advanced modeling techniques using PyMAPDL such as: +* Contact +* Element birth and death +* Mixed u-P formulation +* Nonlinear stabilization
+The following topics are available:
+This example is inspired from the model and analysis defined in Chapter 25 of the Mechanical +APDL Technology Showcase Manual.
+A bare metal stent is an effective device for opening atherosclerotic arteries and +other blockages:
+ +The success of stenting depends largely on how the stent and the artery interact +mechanically. In both the stent-design process and in pre-clinical patient-specific +evaluations, computer simulation using finite element analysis (FEA) has become an +accepted tool for studying stent-artery interaction.
+A viable stent-artery finite element model must properly reflect the nonlinear nature +of the phenomenon, such as the biological tissue properties, large arterial wall +deformation, and the sliding contact between the stent and the artery wall.
+# starting MAPDL as a service and importing an external model
+from ansys.mapdl.core import launch_mapdl
+
+# start MAPDL as a service
+mapdl = launch_mapdl()
+print(mapdl)
+
First, we define the material properties.
+# define 316L Stainless steel
+mapdl.prep7()
+mapdl.mptemp()
+mapdl.mptemp(sloc="1", t1="0")
+mapdl.mpdata(lab="EX", mat="1", c1="200e3")
+mapdl.mpdata(lab="PRXY", mat="1", c1="0.3")
+mapdl.mptemp()
+mapdl.mptemp(sloc="1", t1="0")
+mapdl.mpdata(lab="DENS", mat="1", c1="8000e-9")
+
Then, we can define the elements.
+# for straight line segments
+mapdl.et(itype="1", ename="beam189")
+mapdl.sectype(secid="1", type_="beam", subtype="csolid")
+mapdl.secdata(val1=0.05)
+
+# for arcs
+mapdl.et(itype="2", ename="beam189")
+mapdl.sectype(secid="2", type_="beam", subtype="csolid")
+mapdl.secdata(val1=0.05)
+
We define the 5-parameter Mooney-Rivlin hyperelastic artery material +model.
+c10 = 18.90e-3
+c01 = 2.75e-3
+c20 = 590.43e-3
+c11 = 857.2e-3
+nu1 = 0.49
+dd = 2 * (1 - 2 * nu1) / (c10 + c01)
+
+mapdl.tb(lab="hyper", mat="2", npts="5", tbopt="mooney")
+mapdl.tbdata(stloc="1", c1="c10", c2="c01", c3="c20", c4="c11", c6="dd")
+
We define the linear elastic material model for stiff calcified plaque.
+mapdl.mp(lab="EX", mat="3", c0=".00219e3")
+mapdl.mp(lab="NUXY", mat="3", c0="0.49")
+
We define the Solid185 element type to mesh both the artery and plaque.
+# for artery
+mapdl.et(itype="9", ename="SOLID185")
+mapdl.keyopt(
+ itype="9", knum="6", value="1") # Use mixed u-P formulation to avoid locking
+mapdl.keyopt(itype="9", knum="2", value="3") # Use Simplified Enhanced Strain method
+
+# for plaque
+mapdl.et(itype="16", ename="SOLID185")
+mapdl.keyopt(itype="16", knum="2", value="0") # Use B-bar
+
We define the settings to model the stent, the artery and the plaque.
+We use force-distributed boundary constraints on 2 sides of artery wall to allow +for radial expansion of tissue without rigid body motion.
+Settings for MPC Surface-based, force-distributed contact on proximal plane +parallel to x-y plane
+mapdl.mat("2")
+mapdl.r(nset="3")
+mapdl.real(nset="3")
+mapdl.et(itype="3", ename="170")
+mapdl.et(itype="4", ename="174")
+mapdl.keyopt(itype="4", knum="12", value="5")
+mapdl.keyopt(itype="4", knum="4", value="1")
+mapdl.keyopt(itype="4", knum="2", value="2")
+mapdl.keyopt(itype="3", knum="2", value="1")
+mapdl.keyopt(itype="3", knum="4", value="111111")
+mapdl.type(itype="3")
+
+mapdl.mat("2")
+mapdl.r(nset="4")
+mapdl.real(nset="4")
+mapdl.et(itype="5", ename="170")
+mapdl.et(itype="6", ename="174")
+mapdl.keyopt(itype="6", knum="12", value="5")
+mapdl.keyopt(itype="6", knum="4", value="1")
+mapdl.keyopt(itype="6", knum="2", value="2")
+mapdl.keyopt(itype="5", knum="2", value="1")
+mapdl.keyopt(itype="5", knum="4", value="111111")
+mapdl.type(itype="5")
+
Settings for standard contact between stent and inner plaque wall contact +surface
+mapdl.mp(lab="MU", mat="1", c0="0")
+mapdl.mat("1")
+mapdl.mp(lab="EMIS", mat="1", c0="7.88860905221e-31")
+mapdl.r(nset="6")
+mapdl.real(nset="6")
+mapdl.et(itype="10", ename="170")
+mapdl.et(itype="11", ename="177")
+mapdl.r(nset="6", r3="1.0", r4="1.0", r5="0")
+mapdl.rmore(r9="1.0E20", r10="0.0", r11="1.0")
+mapdl.rmore(r7="0.0", r8="0", r9="1.0", r10="0.05", r11="1.0", r12="0.5")
+mapdl.rmore(r7="0", r8="1.0", r9="1.0", r10="0.0")
+mapdl.keyopt(itype="11", knum="5", value="0")
+mapdl.keyopt(itype="11", knum="7", value="1")
+mapdl.keyopt(itype="11", knum="8", value="0")
+mapdl.keyopt(itype="11", knum="9", value="0")
+mapdl.keyopt(itype="11", knum="10", value="2")
+mapdl.keyopt(itype="11", knum="11", value="0")
+mapdl.keyopt(itype="11", knum="12", value="0")
+mapdl.keyopt(itype="11", knum="2", value="3")
+mapdl.keyopt(itype="10", knum="5", value="0")
+
Settings for MPC based, force-distributed constraint on proximal stent nodes
+mapdl.mat("1")
+mapdl.r(nset="7")
+mapdl.real(nset="7")
+mapdl.et(itype="12", ename="170")
+mapdl.et(itype="13", ename="175")
+mapdl.keyopt(itype="13", knum="12", value="5")
+mapdl.keyopt(itype="13", knum="4", value="1")
+mapdl.keyopt(itype="13", knum="2", value="2")
+mapdl.keyopt(itype="12", knum="2", value="1")
+mapdl.keyopt(itype="12", knum="4", value="111111")
+mapdl.type(itype="12")
+
Settings for MPC based, force-distributed constraint on distal stent +nodes.
+mapdl.mat("1")
+mapdl.r(nset="8")
+mapdl.real(nset="8")
+mapdl.et(itype="14", ename="170")
+mapdl.et(itype="15", ename="175")
+mapdl.keyopt(itype="15", knum="12", value="5")
+mapdl.keyopt(itype="15", knum="4", value="1")
+mapdl.keyopt(itype="15", knum="2", value="2")
+mapdl.keyopt(itype="14", knum="2", value="1")
+mapdl.keyopt(itype="14", knum="4", value="111111")
+mapdl.type(itype="14")
+
Once all the setups are ready, we read the geometry file.
+mapdl.cdread(option="db", fname="stent", ext="cdb")
+mapdl.allsel(labt="all")
+mapdl.finish()
+
We, then, apply the static analysis.
+# enter solution processor and define analysis settings
+mapdl.run("/solu")
+mapdl.antype(antype="0")
+mapdl.nlgeom(key="on")
+
We apply the Load Step 1: +Balloon angioplasty of the artery to expand it past the +radius of the stent - IGNORE STENT
+mapdl.nsubst(nsbstp="20", nsbmx="20")
+mapdl.nropt(option1="full")
+mapdl.cncheck(option="auto")
+mapdl.esel(type_="s", item="type", vmin="11")
+mapdl.cm(cname="contact2", entity="elem")
+mapdl.ekill(elem="contact2") # Kill contact elements in stent-plaque contact
+ #pair so that the stent is ignored in the first loadstep
+mapdl.nsel(type_="s", item="loc", comp="x", vmin="0", vmax="0.01e-3")
+mapdl.nsel(type_="r", item="loc", comp="y", vmin="0", vmax="0.01e-3")
+mapdl.d(node="all", lab="all")
+mapdl.allsel()
+
+mapdl.sf(nlist="load", lab="pres", value="10e-2") # Apply 0.1 Pa/mm^2 pressure to inner plaque wall
+mapdl.allsel()
+mapdl.nldiag(label="cont", key="iter")
+mapdl.solve()
+mapdl.save()
+
We then apply the Load Step 2: Reactivate contact between stent and plaque.
+mapdl.ealive(elem="contact2")
+mapdl.allsel()
+
+mapdl.nsubst(nsbstp="2", nsbmx="2")
+mapdl.save()
+mapdl.solve()
+
We apply the Load Step 3.
+mapdl.nsubst(nsbstp="1", nsbmx="1", nsbmn="1")
+mapdl.solve()
+
We apply the Load Step 4: Apply blood pressure (13.3 kPa) load to +inner wall of plaque and allow the stent to act as a scaffold.
+mapdl.nsubst(nsbstp="300", nsbmx="3000", nsbmn="30")
+mapdl.sf(nlist="load", lab="pres", value="13.3e-3")
+mapdl.allsel()
+
Finally, we apply stabilization with energy option.
+mapdl.stabilize(key="const", method="energy", value="0.1")
+
mapdl.solve()
+mapdl.save()
+mapdl.finish()
+
This section illustrates the use of PyDPF-Core to post-process the results.
+from ansys.dpf import core as dpf
+from ansys.dpf.core import operators as ops
+import pyvista
+
# Loading the result file
+model = dpf.Model(mapdl.result_file)
+ds = dpf.DataSources(mapdl.result_file)
+
+mesh = model.metadata.meshed_region
+mesh.plot()
+
# Collecting the computed displacement
+u = model.results.displacement(time_scoping=[4]).eval()
+
+u[0].plot(deform_by = u[0])
+
# Collecting the computed stress
+s_op = model.results.stress(time_scoping=[3])
+s_op.inputs.requested_location.connect(dpf.locations.nodal)
+s = s_op.eval()
+
+# Calculating Von Mises stress
+s_VM = dpf.operators.invariant.von_mises_eqv_fc(fields_container=s)
+s_VM_plot = s_VM.eval()
+
+s_VM_plot[0].plot(deform_by = u[0])
+
# Creating the mesh associated to the stent
+esco = mesh.named_selection("STENT")
+print(esco)
+
+# Transposing elemental location to nodal one
+op = dpf.operators.scoping.transpose()
+op.inputs.mesh_scoping.connect(esco)
+op.inputs.meshed_region.connect(mesh)
+op.inputs.inclusive.connect(1)
+nsco = op.eval()
+print(nsco)
+
# Collecting the computed displacements of the stent
+u_stent = model.results.displacement(mesh_scoping=nsco, time_scoping=[4])
+u_stent = u_stent.outputs.fields_container()
+
+# Linking the stent mesh to the global one
+op = dpf.operators.mesh.from_scoping() # operator instantiation
+op.inputs.scoping.connect(nsco)
+op.inputs.inclusive.connect(1)
+op.inputs.mesh.connect(mesh)
+mesh_sco = op.eval()
+u_stent[0].meshed_region = mesh_sco
+
+# Plotting the meshes
+mesh.plot(color="w", show_edges=True, text='Mesh of the model', )
+mesh_sco.plot(color="black", show_edges=True, text='Mesh of the stent')
+
u_stent[0].plot(deformed_by=u_stent[0])
+
mapdl.exit()
+
The following files were used in this problem:
+stent.dat – Input file for the cardiovascular stent +problem.
stent.cdb – The common database file containing the model +information for this problem (called by stent.dat).
+ |
For more information, see Obtaining the input files.
+ +This example problem shows how to simulate the friction stir welding (FSW) +process. Several characteristics of FSW are presented, including +tool-workpiece surface interaction, heat generation due to friction, and +plastic deformation. A nonlinear direct coupled-field analysis is performed, as +thermal and mechanical behaviors are mutually dependent and coupled together +during the FSW process.
+Because it is often difficult to find a full set of engineering data to +simulate the FSW process, the problem emphasizes the simulation rather than the +numerical results. A simplified version of the model created by Zhu and Chao +illustrates the FSW simulation method.
+The following features and capabilities are highlighted:
+Direct Structural-thermal analysis using coupled-field solid elements
Plastic heat generation in coupled-field elements
Frictional heat generation using contact elements
Surface-projection-based contact method
Contact elements with bonding capability
The following topics are available:
+You can also perform this example analysis entirely in the Ansys Mechanical +Application. For more information, see Friction Stir Welding (FSW) Simulation +in the Workbench Technology Showcase: Example Problems.
+Friction stir welding (FSW) is a solid-state welding technique that involves +the joining of metals without filler materials. A cylindrical rotating tool +plunges into a rigidly clamped workpiece and moves along the joint to be +welded. As the tool translates along the joint, heat is generated by friction +between the tool shoulder and the workpiece. Additional heat is generated by +plastic deformation of the workpiece material. +The generated heat results in thermal softening of the workpiece material. +The translation of the tool causes the softened workpiece material to flow +from the front to the back of the tool where it consolidates. +As cooling occurs, a solid continuous joint between the two plates is formed. +No melting occurs during the process, and the resulting +temperature remains below the solidus temperature of the metals being joined. +FSW offers many advantages over conventional welding techniques, and has been +successfully applied in the aerospace, automobile, and shipbuilding industries.
+Thermal and mechanical behaviors are mutually dependent during the FSW process. +Because the temperature field affects stress distribution, this example uses a +fully thermomechanically coupled model. +The model consists of a coupled-field solid element with structural and thermal +degrees of freedom. The model has two rectangular steel plates and a cylindrical +tool. All necessary mechanical and thermal +28.5. Boundary Conditions and Loading are applied on the model. The +simulation occurs over three load steps, representing the 28.5.3. Loading of +the process.
+The temperature rises at the contact interface due to frictional contact +between the tool and workpiece. FSW generally occurs when the temperature at +the weld line region reaches 70 to 90 percent of the melting temperature of the +workpiece material. The temperature obtained around the weld line region in +this example falls within the range reported by Zhu and Chao [Zhu2004] and +Prasanna and Rao [Prasanna2010], while the maximum resulting temperature is +well below the melting temperature of the workpiece.
+The calculated frictional heat generation and plastic heat generation show that +the friction between the tool shoulder and workpiece is responsible for +generating most of the heat. A bonding temperature is specified at the contact +interface of the plates to model the welding behind the tool. When the +temperature at the contact surface exceeds this bonding temperature, the +contact is changed to bonded.
+The Zhu and Chao thermomechanical model
+The model used in this example is a simplified version of the thermomechanical +model developed by Zhu and Chao for FSW with 304L stainless steel [Zhu2004]. +Zhu and Chao presented nonlinear thermal and thermomechanical simulations using +the finite element analysis code WELDSIM. They initially formulated a +heat-transfer problem using a moving heat source, and later used the transient +temperature outputs from the thermal analysis to determine residual stresses in +the welded plates via a 3-D elastoplastic thermomechanical simulation.
+A direct coupled-field analysis is performed on a reduced-scale version of the +Zhu and Chao model [Zhu2004]. Also, rather than using a moving heat source as +in the reference model, a rotating and moving tool is used for a more realistic +simulation.
+The tool pin is ignored. The heat generated at the pin represents approximately +two percent of the total heat and is therefore negligible.
+The simulation welds two 304L stainless steel plates (workpiece) with a +cylindrical shape tool, as shown in the following figure:
+Product: Ansys Mechanical Enterprise
+MAPDL Version: 22.2
+ansys.mapdl Version: 0.68.dev0
+
+
Figure 28.1: 3-D model of workpiece and tool
+The FSW process generally requires a tool made of a harder material than the +workpiece material being welded. In the past, FSW was used for soft workpiece +materials such as aluminium. With the development of tools made from +super-abrasive materials such as polycrystalline cubic boron nitride (PCBN), +FSW has become possible with high-temperature materials such as stainless +steel. A cylindrical PCBN tool is modeled in this case.
+The workpiece sides parallel to the weld line are constrained in all the +directions to simulate the clamping ends. The bottom side of the workpiece is +constrained in the perpendicular (z) direction to simulate support at the +bottom. Heat losses are considered on all the surfaces of the model. All +28.5. Boundary Conditions and Loading are symmetric across the weld +centerline.
+The simulation is performed in three load steps, each representing a respective +phase ( 28.5.3. Loading) of the FSW process.
+Modeling is a two-part task, as described in these topics:
+ +Two rectangular shaped plates (similar to those used in the reference model) +are used as the workpiece. Dimensions have been reduced to decrease the +simulation time.
+The plate size is 3 x 1.25 x 0.125 in (76.2 x 31.75 x 3.18 mm). The tool +shoulder diameter is 0.6 in (15.24 mm).
+Plate thickness remains the same as that of the reference model, but the plate +length and width are reduced. The plate width is reduced because the regions +away from the weld line are not significantly affected by the welding process, +and this example focuses primarily on the heat generation and temperature rise +in the region nearest the weld line.
+The height of the tool is equal to the shoulder diameter. Both the workpiece
+(steel plates) and the tool are modeled using coupled-field element
+SOLID226
with the structural-thermal option (KEYOPT(1)= 11
).
# sphinx_gallery_thumbnail_path = '_static/tse28_setup.png'
+
+import numpy as np
+import pyvista
+
+from ansys.mapdl.core import launch_mapdl
+mapdl = launch_mapdl()
+mapdl.prep7()
+
+# ***** Problem parameters ********
+l = 76.2e-03 # Length of each plate,m
+w = 31.75e-03 # Width of each plate,m
+t = 3.18e-03 # Thickness of each plate,m
+r1 = 7.62e-03 # Shoulder radius of tool,m
+h = 15.24e-03 # Height of tool, m
+l1 = r1 # Starting location of tool on weldline
+l2 = l-l1
+tcc1 = 2e06 # Thermal contact conductance b/w plates,W/m^2'C
+tcc2 = 10 # Thermal contact conductance b/w tool &
+# workpiece,W/m^2'C
+fwgt = 0.95 # weight factor for distribution of heat b/w tool
+# & workpiece
+fplw = 0.8 # Fraction of plastic work converted to heat
+uz1 = t/4000 # Depth of penetration,m
+nr1 = 3.141593*11 # No. of rotations in second load step
+nr2 = 3.141593*45 # No. of rotations in third load step
+uy1 = 60.96e-03 # Travelling distance along weld line
+tsz = 0.01 # Time step size
+
+# ==========================================================
+# * Geometry
+# ==========================================================
+# * Node for pilot node
+mapdl.n(1, 0, 0, h)
+# * Workpiece geometry (two rectangular plates)
+mapdl.block(0, w, -l1, l2, 0, -t)
+mapdl.block(0, -w, -l1, l2, 0, -t)
+# * Tool geometry
+mapdl.cyl4(0, 0, r1, 0, r1, 90, h)
+mapdl.cyl4(0, 0, r1, 90, r1, 180, h)
+mapdl.cyl4(0, 0, r1, 180, r1, 270, h)
+mapdl.cyl4(0, 0, r1, 270, r1, 360, h)
+mapdl.vglue(3, 4, 5, 6)
+
A hexahedral mesh with dropped midside nodes is used because the presence of +midside nodes (or quadratic interpolation functions) can lead to oscillations +in the thermal solution, leading to nonphysical temperature distribution. A +hexahedral mesh is used instead of a tetrahedral mesh to avoid mesh-orientation +dependency. For more accurate results, a finer mesh is used in the weld-line +region. The following figure shows the 3-D meshed model:
+# ==========================================================
+# * Meshing
+# ==========================================================
+mapdl.et(1, "SOLID226", 11) # Coupled-field solid element,KEYOPT(1) is
+# set to 11 for a structural-thermal analysis
+mapdl.allsel()
+mapdl.lsel("s", "", "", 4, 5)
+mapdl.lsel("a", "", "", 14, 19, 5)
+mapdl.lesize("all", "", "", 22, 5)
+mapdl.lsel("s", "", "", 16, 17)
+mapdl.lsel("a", "", "", 2, 7, 5)
+mapdl.lesize("all", "", "", 22, "1/5")
+mapdl.lsel("s", "", "", 1)
+mapdl.lsel("a", "", "", 3)
+mapdl.lsel("a", "", "", 6)
+mapdl.lsel("a", "", "", 8)
+mapdl.lsel("a", "", "", 13)
+mapdl.lsel("a", "", "", 15)
+mapdl.lsel("a", "", "", 18)
+mapdl.lsel("a", "", "", 20)
+mapdl.lesize("all", "", "", 44)
+mapdl.lsel("s", "", "", 9, "")
+mapdl.lsel("a", "", "", 22)
+mapdl.lesize("all", "", "", 2)
+mapdl.allsel("all")
+mapdl.mshmid(2) # midside nodes dropped
+mapdl.vsweep(1)
+mapdl.vsweep(2)
+mapdl.vsel("u", "volume", "", 1, 2)
+mapdl.mat(2)
+mapdl.esize(0.0015)
+mapdl.vsweep("all")
+mapdl.allsel("all")
+
+mapdl.eplot(vtk=True, background='white')
+
Figure 28.2: 3-D meshed model of workpiece and tool
+Contact is modeled as follows for the FSW simulation:
+Contact pair between the plates
Contact pair between tool and workpiece
Rigid surface constraint
During the simulation, the surfaces to be joined come into contact. A standard
+surface-to-surface contact pair using TARGE170
and CONTA174
, as shown
+in the following figure:
The surface-projection-based contact method (KEYOPT(4) = 3
for contact
+elements) is defined at the contact interface. The surface-projection-based
+contact method is well suited to highly nonlinear problems that include
+geometrical, material, and contact nonlinearities.
The problem simulates welding using the bonding capability of contact
+elements. To achieve continuous bonding and simulate a perfect thermal contact
+between the plates, a high thermal contact conductance (TCC) of 2 ⋅ 10E6 W/m2
+°C is specified. (A small TCC value yields an imperfect contact and a
+temperature discontinuity across the interface.) The conductance is specified
+as a real constant for CONTA174
elements.
The maximum temperature ranges from 70 to 90 percent of the melting temperature
+of the workpiece material. Welding occurs after the temperature of the material
+around the contacting surfaces exceeds the bonding temperature (approximately
+70 percent of the workpiece melting temperature). In this case, 1000 °C is
+considered to be the bonding temperature based on the reference results. The
+bonding temperature is specified using the real constant TBND
for
+CONTA174
. When the temperature at the contact surface for closed contact
+exceeds the bonding temperature, the contact type changes to bonded. The
+contact status remains bonded for the remainder of the simulation, even though
+the temperature subsequently decreases below the bonding value.
# * Define contact pair between two plates
+mapdl.et(6, "TARGE170")
+mapdl.et(7, "CONTA174")
+mapdl.keyopt(7, 1, 1) # Displacement & temp DOF
+mapdl.keyopt(7, 4, 3) # To include surface projection based method
+mapdl.mat(1)
+mapdl.asel("s", "", "", 5)
+mapdl.nsla("", 1)
+#mapdl.nplot()
+mapdl.cm("tn.cnt", "node") # Creating component on weld side of plate1
+
+mapdl.asel("s", "", "", 12)
+mapdl.nsla("", 1)
+#mapdl.nplot()
+mapdl.cm("tn.tgt", "node") # Creating component on weld side of plate2
+
+mapdl.allsel("all")
+mapdl.type(6)
+mapdl.r(6)
+mapdl.rmodif(6, 14, tcc1) # A real constant TCC, thermal contact
+# conductance coeffi. b/w the plates, W/m^2'C
+mapdl.rmodif(6, 35, 1000) # A real constant TBND,Bonding temperature
+# for welding, 'C
+mapdl.real(6)
+mapdl.cmsel("s", "tn.cnt")
+mapdl.nplot(title='Example of Contact Nodes', background='white')
+mapdl.esurf()
+mapdl.type(7)
+mapdl.real(6)
+mapdl.cmsel("s", "tn.tgt")
+mapdl.esurf()
+mapdl.allsel("all")
+
The tool plunges into the work piece, rotates, and moves along the weld line.
+Because the frictional contact between the tool and workpiece is primarily
+responsible for heat generation, a standard surface-to-surface contact pair is
+defined between the tool and workpiece. The CONTA174
element is used to
+model the contact surface on the top surface of the workpiece, and the
+TARGE170
element is used for the tool, as shown in this figure:
Figure 28.4: Contact pair between tool and workpiece.
+CONTA174
in blue, and TARGE170
in red.
Two real constants are specified to model friction-induced heat generation.
+The fraction of frictional dissipated energy converted into heat is modeled
+first; the FHTG
real constant is set to 1 to convert all frictional
+dissipated energy into heat. The factor for the distribution of heat between
+contact and target surfaces is defined next; the FWGT
real constant is set
+to 0.95, so that 95 percent of the heat generated from the friction flows into
+the workpiece and only five percent flows into the tool.
A low TCC value (10 W/m2 °C) is specified for this contact pair because most of
+the heat generated transfers to the workpiece. Some additional heat is also
+generated by plastic deformation of the workpiece material. Because the
+workpiece material softens and the value of friction coefficient drops as the
+temperature increases, a variable coefficient of friction (0.4 to 0.2) is
+defined (Mapdl.tb("FRIC")
with
+mapdl.tbtemp()
and
+Mapdl.tbdata()
).
# * Define contact pair between tool & workpiece
+mapdl.et(4, "TARGE170")
+mapdl.et(5, "CONTA174")
+mapdl.keyopt(5, 1, 1) # Displacement & temp DOF
+mapdl.keyopt(5, 5, 3) # Close gap/reduce penetration with auto cnof
+mapdl.keyopt(5, 9, 1) # Exclude both initial penetration or gap
+mapdl.keyopt(5, 10, 0) # Contact stiffness update each iteration
+# based
+
+# Bottom & lateral(all except top) surfaces of tool for target
+mapdl.vsel("u", "volume", "", 1, 2)
+mapdl.allsel("below", "volume")
+mapdl.nsel("r", "loc", "z", 0, h)
+mapdl.nsel("u", "loc", "z", h)
+mapdl.type(4)
+mapdl.r(5)
+mapdl.tb("fric", 5, 6) # Definition of friction co efficient at
+# different temp
+mapdl.tbtemp(25)
+mapdl.tbdata(1, 0.4) # friction co-efficient at temp 25
+mapdl.tbtemp(200)
+mapdl.tbdata(1, 0.4) # friction co-efficient at temp 200
+mapdl.tbtemp(400)
+mapdl.tbdata(1, 0.4) # friction co-efficient at temp 400
+mapdl.tbtemp(600)
+mapdl.tbdata(1, 0.3) # friction co-efficient at temp 600
+mapdl.tbtemp(800)
+mapdl.tbdata(1, 0.3) # friction co-efficient at temp 800
+mapdl.tbtemp(1000)
+mapdl.tbdata(1, 0.2) # friction co-efficient at temp 1000
+mapdl.rmodif(5, 9, 500e6) # Max.friction stress
+mapdl.rmodif(5, 14, tcc2) # Thermal contact conductance b/w tool and
+# workpiece, 10 W/m^2'C
+mapdl.rmodif(5, 15, 1) # A real constant FHTG,the fraction of
+# frictional dissipated energy converted
+# into heat
+mapdl.rmodif(5, 18, fwgt) # A real constant FWGT, weight factor for
+# the distribution of heat between the
+# contact and target surfaces, 0.95
+mapdl.real(5)
+mapdl.mat(5)
+mapdl.esln()
+mapdl.esurf()
+mapdl.allsel("all")
+
The workpiece remains fixed in all stages of the simulation. The tool rotates
+and moves along the weld line. A pilot node is created at the center of the top
+surface of the tool in order to apply the rotation and translation on the tool.
+The motion of the pilot node controls the motion of the entire tool. A rigid
+surface constraint is defined between the pilot node (TARGE170
) and the
+nodes of the top surface of the tool (CONTA174
). A multipoint constraint
+(MPC) algorithm with contact surface behavior defined as bonded always is used
+to constrain the contact nodes to the rigid body motion defined by the pilot
+node.
The following contact settings are used for the CONTA174
elements:
To include MPC contact algorithm: KEYOPT(2) = 2
For a rigid surface constraint: KEYOPT(4) = 2
To set the behavior of contact surface as bonded (always): KEYOPT(12) = 5
Figure 28.5: Rigid surface constrained. +Pilot node or master with applied boundary conditions and the constrained +top surface of the tool (blue).**
+# * Define Rigid Surface Constraint on tool top surface
+mapdl.et(2, "TARGE170")
+mapdl.keyopt(2, 2, 1) # User defined boundary condition on rigid
+# target nodes
+
+mapdl.et(3, "CONTA174")
+mapdl.keyopt(3, 1, 1) # To include Temp DOF
+mapdl.keyopt(3, 2, 2) # To include MPC contact algorithm
+mapdl.keyopt(3, 4, 2) # For a rigid surface constraint
+mapdl.keyopt(3, 12, 5) # To set the behavior of contact surface as a
+# bonded (always)
+
+mapdl.vsel("u", "volume", "", 1, 2) # Selecting Tool volume
+mapdl.allsel("below", "volume")
+mapdl.nsel("r", "loc", "z", h) # Selecting nodes on the tool top surface
+mapdl.type(3)
+mapdl.r(3)
+mapdl.real(3)
+mapdl.esln()
+mapdl.esurf() # Create contact elements
+mapdl.allsel("all")
+
+# * Define pilot node at the top of the tool
+mapdl.nsel("s", "node", "", 1)
+mapdl.tshap("pilo")
+mapdl.type(2)
+mapdl.real(3)
+mapdl.e(1) # Create target element on pilot node
+mapdl.allsel()
+
+# Top surfaces of plates nodes for contact
+mapdl.vsel("s", "volume", "", 1, 2)
+mapdl.allsel("below", "volume")
+mapdl.nsel("r", "loc", "z", 0)
+mapdl.type(5)
+mapdl.real(5)
+mapdl.esln()
+mapdl.esurf()
+mapdl.allsel("all")
+
Accurate temperature calculation is critical to the FSW process because the +stresses and strains developed in the weld are temperature-dependent. Thermal +properties of the 304L steel plates such as thermal conductivity, specific +heat, and density are temperature-dependent. Mechanical properties of the +plates such as Young’s modulus and the coefficient of thermal expansion are +considered to be constant due to the limitations of data available in the +literature.
+It is assumed that the plastic deformation of the material uses the Von Misses
+yield criterion, as well as the associated flow rule and the work-hardening
+rule. Therefore, a bilinear isotropic hardening model (TB,PLASTIC,,,,BISO
)
+is selected.
The following table shows the material properties of the workpiece:
+Table 28.1: Workpiece material properties
+Property |
+Value |
+
---|---|
Linear properties |
+|
Young’s modulus |
+193 GPa |
+
Poisson’s ratio |
+0.3 |
+
Coefficient of thermal expansion |
+18.7 µm/m °C |
+
Bilinear isotropic hardening constants (``TB,PLASTIC,,,,BISO``) |
+|
Yield stress |
+290 MPa |
+
Tangent modulus |
+2.8 GPa |
+
Temperature-dependent material properties |
+|
Temperature (°C) |
+0 |
+
Thermal conductivity (W/m °C) |
+16 |
+
Specific heat (J/Kg °C) |
+500 |
+
Density (Kg/m3) |
+7894 |
+
Mapdl.tbdata()
+defines the yield stress and tangent modulus.
The fraction of the plastic work dissipated as heat during FSW is about 80
+percent. Therefore, the fraction of plastic work converted to heat
+(Taylor-Quinney coefficient) is set to 0.8 (Mapdl.mp("QRATE")
) for the calculation of plastic heat generation in
+the workpiece material.
To weld a high-temperature material such as 304L stainless steel, a tool +composed of hard material is required. Tools made from super-abrasive materials +such as PCBN are suitable for such processes, and so a cylindrical PCBN tool is +used here. The material properties of the PCBN tool are obtained from the +references: [Ozel2008] and [Mishra2007].
+The following table shows the material properties of the PCBN tool:
+Table 28.2: Material properties of the PCBN tool
+Property |
+Value |
+
---|---|
Young modulus |
+680 GPa |
+
Poisson’s ratio |
+0.22 |
+
Thermal conductivity |
+100 W/m °C |
+
Specific heat |
+750 J/Kg °C |
+
Density |
+4280 Kg/m3 |
+
The following code setup the material properties:
+# ==========================================================
+# * Material properties
+# ==========================================================
+# * Material properties for 304l stainless steel Plates
+mapdl.mp("ex", 1, 193e9) # Elastic modulus (N/m^2)
+mapdl.mp("nuxy", 1, 0.3) # Poisson's ratio
+mapdl.mp("alpx", 1, 1.875e-5) # Coefficient of thermal expansion, µm/m'c
+# Fraction of plastic work converted to heat, 80%
+mapdl.mp("qrate", 1, fplw)
+
+# *BISO material model
+EX = 193e9
+ET = 2.8e9
+EP = EX*ET/(EX-ET)
+mapdl.tb("plas", 1, 1, "", "biso") # Bilinear isotropic material
+mapdl.tbdata(1, 290e6, EP) # Yield stress & plastic tangent modulus
+mapdl.mptemp(1, 0, 200, 400, 600, 800, 1000)
+mapdl.mpdata("kxx", 1, 1, 16, 19, 21, 24, 29, 30) # therm cond.(W/m'C)
+mapdl.mpdata("c", 1, 1, 500, 540, 560, 590, 600, 610) # spec heat(J/kg'C)
+mapdl.mpdata("dens", 1, 1, 7894, 7744, 7631, 7518, 7406, 7406) # kg/m^3
+
+# * Material properties for PCBN tool
+mapdl.mp("ex", 2, 680e9) # Elastic modulus (N/m^2)
+mapdl.mp("nuxy", 2, 0.22) # Poisson's ratio
+mapdl.mp("kxx", 2, 100) # Thermal conductivity(W/m'C)
+mapdl.mp("c", 2, 750) # Specific heat(J/kg'C)
+mapdl.mp("dens", 2, 4280) # Density,kg/m^3
+
This section describes the thermal and mechanical boundary conditions imposed +on the FSW model:
+ +The frictional and plastic heat generated during the FSW process propagates +rapidly into remote regions of the plates. On the top and side surfaces of the +workpiece, convection and radiation account for heat loss to the +ambient. Conduction losses also occur from the bottom surface of the workpiece +to the backing plate.
+A view with name (P_0x7fda04ed2820_5) is already registered
+ => returning previous one
+
Figure 28.6: Thermal boundary conditions. +Convection loads (red) and conduction loads (yellow)
+Available data suggest that the value of the convection coefficient lies +between 10 and 30 W/m2 °C for the workpiece surfaces, except for the bottom +surface. The value of the convection coefficient is 30 W/m2°C for workpiece and +tool. +This coefficient affects the output temperature. A lower coefficient +increases the output temperature of the model. A high overall heat-transfer +coefficient (about 10 times the convective coefficient) of 300 W/m2 °C is +assumed for the conductive heat loss through the bottom surface of the +workpiece. As a result, the bottom surface of the workpiece is also treated as +a convection surface for modeling conduction losses. Because the percentage of +heat lost due to radiation is low, radiation heat losses are ignored. An +initial temperature of 25 °C is applied on the model. +Temperature boundary conditions are not imposed anywhere on the model.
+# Initial boundary conditions.
+mapdl.tref(25) # Reference temperature 25'C
+mapdl.allsel()
+mapdl.nsel("all")
+mapdl.ic("all", "temp", 25) # Initial condition at nodes,temp 25'C
+
+
+# Thermal boundary conditions
+# Convection heat loss from the workpiece surfaces
+mapdl.vsel("s", "volume", "", 1, 2) # Selecting the workpiece
+mapdl.allsel("below", "volume")
+mapdl.nsel("r", "loc", "z", 0)
+mapdl.nsel("a", "loc", "x", -w)
+mapdl.nsel("a", "loc", "x", w)
+mapdl.nsel("a", "loc", "y", -l1)
+mapdl.nsel("a", "loc", "y", l2)
+mapdl.sf("all", "conv", 30, 25)
+
+# Convection (high)heat loss from the workpiece bottom
+mapdl.nsel("s", "loc", "z", -t)
+mapdl.sf("all", "conv", 300, 25)
+mapdl.allsel("all")
+
+# Convection heat loss from the tool surfaces
+mapdl.vsel("u", "volume", "", 1, 2) # Selecting the tool
+mapdl.allsel("below", "volume")
+mapdl.csys(1)
+mapdl.nsel("r", "loc", "x", r1)
+mapdl.nsel("a", "loc", "z", h)
+mapdl.sf("all", "conv", 30, 25)
+mapdl.allsel("all")
+
+# Constraining all DOFs at pilot node except the Temp DOF
+mapdl.d(1, "all")
+mapdl.ddele(1, "temp")
+mapdl.allsel("all")
+
The workpiece is fixed by clamping each plate. The clamped portions of the +plates are constrained in all directions. To simulate support at the bottom of +the plates, all bottom nodes of the workpiece are constrained in the +perpendicular direction (z direction).
+Figure 28.7: Mechanical boundary conditions:
+X-direction (UX
) in red, Y-direction (UY
) in green, and Z-direction (UZ
) in blue.
# Mechanical Boundary Conditions
+# 20% ends of the each plate is constraint
+mapdl.nsel("s", "loc", "x", -0.8*w, -w)
+mapdl.nsel("a", "loc", "x", 0.8*w, w)
+mapdl.d("all", "uz", 0) # Displacement constraint in x-direction
+mapdl.d("all", "uy", 0) # Displacement constraint in y-direction
+mapdl.d("all", "ux", 0) # Displacement constraint in z-direction
+mapdl.allsel("all")
+
+# Bottom of workpiece is constraint in z-direction
+mapdl.nsel("s", "loc", "z", -t)
+mapdl.d("all", "uz") # Displacement constraint in z-direction
+mapdl.allsel("all")
+
The FSW process consists of three primary phases:
+Plunge – The tool plunges slowly into the workpiece
Dwell – Friction between the rotating tool and workpiece generates heat +at the initial tool position until the workpiece temperature reaches the +value required for the welding.
Traverse (or Traveling) – The rotating tool moves along the weld line.
During the traverse phase, the temperature at the weld line region rises, but +the maximum temperature values do not surpass the melting temperature of the +workpiece material. As the temperature drops, a solid continuous joint appears +between the two plates.
+For illustrative purposes, each phase of the FSW process is considered a separate +load step. A rigid surface constraint is already defined for applying loading on the +tool.
+The following table shows the details for each load step.
+Table 28.3: Load steps
+Load step |
+Time period (sec) |
+Loadings on pilot node |
+Boundary Condition |
+
---|---|---|---|
1 |
+1 |
+Displacement boundary condition |
+
|
+
2 |
+5.5 |
+Rotational boundary condition |
+
|
+
3 |
+22.5 |
+Displacement and rotational boundary conditions together on the pilot node |
+
|
+
The tool plunges into the workpiece at a very shallow depth, then rotates to +generate heat. The depth and rotating speeds are the critical parameters for +the weld temperatures. The parameters are determined based on the experimental +data of Zhu and Chao [Zhu2004]. The tool travels from one end of the welding +line to the other at a speed of 2.7 mm/s.
+A nonlinear transient analysis is performed in three load steps using
+structural-thermal options of SOLID226
and
+CONTA174
.
FSW simulation includes factors such as nonlinearity, contact, friction, large +plastic deformation, structural-thermal coupling, and different loadings at +each load step. The solution settings applied consider all of these factors.
+The first load step in the solution process converges within a few substeps, +but the second and third load steps converge only after applying the proper +solution settings shown in the following table:
+Table 28.4: Solution settings
+Solution setting |
+Description of setting and comments |
+
---|---|
|
+Transient analysis. |
+
|
+For contact problems,this option is useful for enhancing convergence. |
+
|
+Controls the time-step cutback during a nonlinear solution and specifies the maximum equivalent plastic strain allowed within a time-step. If the calculated value exceeds the specified value, the program performs a cutback (bisection). |
+
|
+Includes large-deflection effects or large strain effects, according to the element type. |
+
|
+Recommended for contact elements with high friction coefficients. |
+
|
+To speed up convergence in a coupled-field transient analysis, the structural dynamic effects are turned off. These structural effects are not important in the modeling of heat generation due to friction; however,the thermal dynamic effects are considered here. |
+
|
+The loads applied to intermediate substeps within the load step are ramped because the structural dynamic effects are set to off. |
+
To allow for a faster solution, automatic time-stepping is activated
+(Mapdl.autots("on")
). The initial time
+step size (Mapdl.deltim()
) is set to
+0.1, and the minimum time step is set to 0.001. The maximum time step is set as
+0.2 in load steps 2 and 3. A higher maximum time-step size may result in an
+unconverged solution.
The time step values are determined based on mesh or element size. For +stability, no time-step limitation exists for the implicit integration +algorithm. Because this problem is inherently nonlinear and an accurate +solution is necessary, a disturbance must not propagate to more than one +element in a time step; therefore, an upper limit on the time step size is +required. It is important to choose a time step size that does not violate the +subsequent criterion (minimum element size, maximum thermal conductivity over +the whole model, minimum density, and minimum specific heat).
+mapdl.solu()
+mapdl.antype(4) # Transient analysis
+mapdl.lnsrch('on')
+mapdl.cutcontrol('plslimit', 0.15)
+mapdl.kbc(0) # Ramped loading within a load step
+mapdl.nlgeom("on") # Turn on large deformation effects
+mapdl.timint("off", "struc") # Structural dynamic effects are turned off.
+mapdl.nropt('unsym')
+
+## Solving
+# Load step1
+mapdl.time(1)
+mapdl.nsubst(10, 1000, 10)
+mapdl.d(1, "uz", -uz1) # Tool plunges into the workpiece
+mapdl.outres("all", "all")
+mapdl.allsel()
+mapdl.solve()
+mapdl.save()
+
+# Load step2
+mapdl.time(6.5)
+mapdl.d(1, "rotz", nr1) # Rotation of tool, 60rpm
+mapdl.deltim(tsz, 0.001, 0.2)
+mapdl.outres("all", 10)
+mapdl.allsel()
+mapdl.solve()
+mapdl.save()
+
+# Load step3
+mapdl.time(29)
+mapdl.d(1, "rotz", nr2) # Rotation of tool,60rpm
+mapdl.d(1, "uy", uy1) # Displacement of tool along weldline
+mapdl.deltim(tsz, 0.001, 0.2)
+mapdl.outres("all", 10)
+mapdl.solve()
+mapdl.finish()
+mapdl.save()
+
The following results topics for the FSW simulation are available:
+It is important to observe the change in various quantities around the weld +line during the FSW process. The following figure shows the deflection of the +workpiece due to plunging of the tool in the first load step:
+Figure 28.9: Deflection at workpiece after load step 1
+The deflection causes high stresses to develop on the workpiece beneath the +tool, as shown in this figure:
+Figure 28.10: Von Mises stress after load step 1
+Following load step 1, the temperature remains unchanged (25 °C), as shown in +this figure:
+Figure 28.11: Temperature after load step 1
+As the tool begins to rotate at this location, the frictional stresses develop +and increase rapidly. The following two figures show the increment in contact +frictional stresses from load step 1 to load step 2:
+Figure 28.12: Frictional stress after load step 1
+Figure 28.13: Frictional stress after load step 2
+All frictional dissipated energy is converted into heat during load step 2. The +heat is generated at the tool-workpiece interface. Most of the heat is +transferred to the workpiece (FWGT is specified to 0.95). As a result, the +temperature of the workpiece increases rapidly compared to that of the tool.
+The following two figures shows the temperature rise due to heat generation in the +second and third load steps:
+Figure 28.14: Temperature after load step 2
+Figure 28.15: Temperature after load step 3
+The maximum temperature on the workpiece occurs beneath the tool during the +last two load steps. Heat generation is due to the mechanical loads. No +external heat sources are used. As the temperature increases, the material +softens and the coefficient of friction decreases. A temperature-dependent +coefficient of friction (0.4 to 0.2) helps to prevent the maximum temperature +from exceeding the material melting point.
+The observed temperature rise in the model shows that heat generation during +the second and third load steps is due to friction between the tool shoulder +and workpiece, as well as plastic deformation of the workpiece material.
+The melting temperature of 304L stainless steel is 1450 °C. As shown in the +following figure, the maximum temperature range at the weld line region on the +workpiece beneath the tool is well below the melting temperature of the +workpiece material during the second and third load steps, but above 70 percent +of the melting temperature:
+Figure 28.16: Maximum temperature (on workpiece beneath the tool) variation with time
+The two plates can be welded together within this temperature range.
+The following figure shows the temperature distributions on the top surface of +the workpiece along the transverse distance (perpendicular to the weld line):
+Figure 28.17: Temperature distribution on the top surface of workpiece at various locations
+As shown in the following figure and table, the temperature plots indicate the +temperature distribution at various locations on the weld line when the maximum +temperature occurs at those locations:
+ +Table 28.5: Locations on weld line
+Location Number |
+Distance on the weld line in y direction |
+Time when maximum temperature occurs |
+
---|---|---|
1 |
+0.016 m |
+15.25 Sec |
+
2 |
+0.027 m |
+19.2 Sec |
+
3 |
+0.040 m |
+24 Sec |
+
The following figure shows the temperature distribution in the thickness direction +at location 1:
+Figure 28.19: Temperature distribution in thickness direction at location 1
+As expected, the highest temperature caused by heat generation appears around +the weld line region. By comparing the above temperature results with the +reference results, it can be determined that the temperatures obtained at the +weld line are well below the melting temperature of the workpiece material, but +still sufficient for friction stir welding.
+The following table and figure show the time-history response of the +temperature at various locations on the weld line:
+Location number |
+Distance on the weld line |
+
---|---|
1 |
+0.018 m |
+
2 |
+0.023 m |
+
3 |
+0.027 m |
+
4 |
+0.032 m |
+
5 |
+0.035 m |
+
6 |
+0.039 m |
+
Figure 28.20: Temperature variation with time on various joint locations
+A bonding temperature of 1000 °C is already defined for the welding simulation +at the interface of the plates. The contact status at this interface after the last +load step is shown in the following figure:
+Figure 28.21: Contact status at interface with bonding temperature 1000 °C +Elements can be in near-contact (blue), sliding (green) or sticking (red) states.
+The sticking portion of the interface shows the bonding or welding region of +the plates. If the bonding temperature was assumed to be 900 °C, then the +welding region would increase, as shown in this figure:
+Figure 28.22: Contact status at interface with bonding temperature 900 °C +Elements can be in near-contact (blue), sliding (green) or sticking (red) states.
+Friction and plastic deformation generate heat. A calculation of frictional and +plastic heat generation is performed. The generation of heat due to friction +begins in the second load step.
+The CONTA174
element’s FDDIS
(SMISC item
) output option is used to
+calculate frictional heat generation on the workpiece. This option gives the
+frictional energy dissipation per unit area for an element. After multiplying
+this value with the corresponding element area, the friction heat-generation
+rate for an element is calculated. By summing the values from each CONTA174
+element of the workpiece, the total frictional heat generation rate is
+calculated for a given time.
It is possible to calculate the total frictional heat-generation rate at each
+time-step (Mapdl.etable
). The
+following figure shows the plot of total frictional heat generation rate on the
+workpiece with time:
Figure 28.23: Total frictional heat rate variation with time
+The plot indicates that the frictional heat starts from the second load step +(after 1 second).
+The element contact area can be calculated using the
+CONTA174
element CAREA
(NMISC, 58
) output
+option.
mapdl.post1()
+mapdl.set("last")
+nst = mapdl.get_value("nst", "active", "", "set", "nset") # To get number of data sets on result file
+
+# Total frictional heat rate
+mapdl.esel("s", "real", "", 5)
+mapdl.esel("r", "ename", "", 174) # Selecting the contact elements on Workpiece
+fht = np.zeros(nst)
+for i in range(1, nst):
+ mapdl.set("", "", "", "", "", "", i)
+
+ # Frictional energy dissipation per unit
+ # area for an element, FDDIS
+ mapdl.etable("fri", "smisc", 18)
+ mapdl.etable("are1", "nmisc", 58) # Area of each contact element
+
+ # Multiplying frictional energy dissipation
+ # per unit area with the area of
+ # corresponding element
+ mapdl.smult("frri", "fri", "are1")
+ mapdl.ssum() # Summing up the Frictional heat rate
+
+ # Total Frictional heat rate on
+ # workpiece at a particular time
+ frhi = mapdl.get('frhi', 'ssum',, 'item', 'frri')
+ fht(i) = frhi
+
+mapdl.parsav("all")
+mapdl.allsel("all")
+mapdl.finish()
+
+mapdl.post26()
+mapdl.file("fsw", "rst")
+mapdl.numvar(200)
+mapdl.solu(191, "ncmit") # Solution summary data per substep to be
+# stored for cumulative no. of iterations.
+mapdl.store("merge") # Merge data from results file
+mapdl.filldata(191, "", "", "", 1, 1)
+mapdl.realvar(191, 191)
+mapdl.parres("new", "fsw", "parm")
+mapdl.vput("fht", 11, "", "", "fric_heat")
+mapdl.plvar(11) # Plot of frictional heat rate against time
+
A similar calculation is performed to check the heat generation from plastic
+deformation on the workpiece. The SOLID226
element’s output option
+PHEAT
(NMISC, 5
) gives the plastic heat generation rate per unit
+volume. After multiplying this value with the corresponding element volume,
+the plastic heat generation rate for an element is calculated. By summing the
+values from each element (SOLID226
) of the workpiece, the total plastic
+heat generation rate is calculated for a particular time.
It is possible to calculate the total frictional heat generation rate at each
+time-step (Mapdl.etable
). The following
+figure shows the plot of the total plastic heat-generation rate with time.
Figure 28.24: Total plastic heat rate variation with time
+mapdl.post1()
+mapdl.set("last")
+nst = mapdl.get("nst", "active", "", "set", "nset") # To get number of data sets on result file
+
+# Total plastic heat rate
+mapdl.esel("s", "mat", "", 1) # Selecting the coupled elements on workpiece
+mapdl.etable("vlm1", "volu") # Volume of the each element
+pha = np.zeros(nst)
+
+for i in range(1, nst):
+ mapdl.set("", "", "", "", "", "", i)
+
+ # Plastic heat rate per unit volume on
+ # each element, PHEAT
+ mapdl.etable("pi", "nmisc", 5)
+
+ # Multiplying Pl. heat rate per unit
+ # volume with the volume of
+ # corresponding element
+ mapdl.smult("psi", "pi", "vlm1")
+
+ mapdl.ssum() # Summing up the Plastic heat rate
+ # Total Plastic heat rate on workpiece
+ # at a particular time
+ ppi = mapdl.get('ppi','ssum',,'item','psi')
+
+ pha[i] = ppi
+
+mapdl.parsav("all")
+mapdl.allsel("all")
+
+mapdl.post26()
+mapdl.file("fsw", "rst")
+mapdl.numvar(200)
+
+# solution summary data per substep to be
+# stored for cumulative no. of iterations.
+mapdl.solu(191, "ncmit")
+mapdl.store("merge") # Merge data from results file
+mapdl.filldata(191, "", "", "", 1, 1)
+mapdl.realvar(191, 191)
+mapdl.parres("new", "fsw", "parm")
+mapdl.vput("pha", 10, "", "", "pheat_nmisc")
+mapdl.plvar(10) # Plot of Plastic heat rate against time
+
Figure 28.23 and Figure 28.24 +show that friction is responsible for generating most of the heat needed, while the +contribution of heat due to plastic deformation is less significant. Because the +tool-penetration is shallow and the tool pin is ignored, the plastic heat is small +compared to frictional heat.
+To perform a similar FSW analysis, consider the following hints and +recommendations:
+FSW is a coupled-field (structural-thermal) process. The temperature field +affects the stress distribution during the entire process. Also, heat generated +in structural deformation affects the temperature field. The direct method of +coupling is recommended for such processes. This method involves just one +analysis that uses a coupled-field element containing all necessary degrees of +freedom. Direct coupling is advantageous when the coupled-field interaction +involves strongly coupled physics or is highly nonlinear.
A nonlinear transient analysis is preferable for simulations where the +objective is to study the transient temperature and transient heat +transfer.
The dynamic effects of different physics should be controlled. In this +problem, for example, the dynamic effects of the structural degrees of freedom +are disabled as they are unimportant.
Separating the solution process into three load steps helps you to understand +the physics and solve the problem.
The contact between the two plates must be nearly perfect to maintain +temperature continuity. For a perfect thermal contact, specify a high thermal +contact conductance (TCC) coefficient between workpiece plates. A high +coefficient results in temperature continuity across the interface.
Because the problem is nonlinear, proper solution settings are required. Set
+the following analysis controls to the appropriate values to achieve the
+converged solution: Mapdl.lnsrch()
,
+Mapdl.cutcontrol()
,
+Mapdl.kbc()
,
+Mapdl.neqit()
,
+Mapdl.nropt()
,
+and Mapdl.autots()
.
Convergence at the second and third load steps is difficult to achieve. The
+depth of penetration of the tool on the workpiece (UZ
), rotational speed of the
+tool (ROTZ
), and time-step size play crucial roles in the convergence of the
+second load step. Use a very small time-step size if the rotational speed is
+higher than 60 RPM.
A symmetric mesh (about the joint line) is preferred to capture the exact +outputs and their effects on the workpiece. A hex mesh with dropped midside +nodes is recommended for the workpiece as well as the tool. +This approach helps to maintain symmetry and prevent the temperature +from reaching negative values during the simulation.
A minimum of two element layers is required in the thickness direction. A fine +sweep mesh near the weld line yields more accurate results; however, too fine a +mesh increases computational time. A fine mesh is unnecessary on the tool side. +To minimize computational time, the tool can be considered to be rigid with no +temperature degrees of freedom.
The following papers are cited in this example problem:
+Zhu, X. K. & Chao, Y. J. (2004). Numerical simulation of transient +temperature and residual stresses in friction stir welding of 304L stainless +steel. Journal of Materials Processing Technology. 146(2), +263-272.
+Prasanna, P., Rao, B. S., & Rao, G. K. (2010). Finite element modeling for +maximum temperature in friction stir welding and its validation. +Journal of Advanced Manufacturing Technology. 51, +925-933.
+Ozel, T., Karpat, Y., & Srivastava, A. (2008). Hard turning with variable +micro-geometry PcBN tools. CIRP Annals - Manufacturing +Technology. 57, 73-76.
+Mishra, R. S. (2007). Friction Stir Welding and +Processing. Ed. R. S. Mishra and M. W. Mahoney. Materials Park, +OH: ASM International.
+The following files were used in this problem:
+fsw.cdb
– Common database file containing the FSW model information
+ |
For more information, see Obtaining the input files.
+ +This section demonstrates a range of Mechanical APDL elements and capabilities +in straightforward problems which have “classical” or readily-obtainable +theoretical solutions using PyMAPDL.
+These problems may then serve as the basis for additional validation and +qualification of Mechanical APDL capabilities for specific applications that +may be of interest.
+Statically indeterminate reaction force analysis
+Thermally loaded support structure
+Deflection of a hinged support
+Laterally Loaded Tapered Support Structure
+Plastic compression of a pipe assembly
+Large lateral deflection of unequal stiffness springs
+Cylindrical Shell Under Pressure
+Large Deflection Eccentric Compression of Slender Column
+Bending of a Circular Plate Using Axisymmetric Shell Elements
+Bending of a Solid Beam (Plane Elements)
+Out-of-Plane Bending of a Curved Bar
+Cylindrical Membrane Under Pressure
+Force on the Boundary of a Semi-Infinite Body (Boussinesq Problem)
+One Dimensional Terzaghi’s Consolidation Problem with Permeability as Function of Depth
+Sound Diffusion in a Flat Room
+00:51.759 total execution time for verif-manual files:
+Sound Diffusion in a Flat Room ( |
+00:12.813 |
+0.0 MB |
+
Pinched cylinder ( |
+00:07.438 |
+0.0 MB |
+
Bending of a Solid Beam (Plane Elements) ( |
+00:03.204 |
+0.0 MB |
+
Force on the Boundary of a Semi-Infinite Body (Boussinesq Problem) ( |
+00:02.234 |
+0.0 MB |
+
Laterally Loaded Tapered Support Structure ( |
+00:02.222 |
+0.0 MB |
+
One Dimensional Terzaghi’s Consolidation Problem with Permeability as Function of Depth ( |
+00:02.182 |
+0.0 MB |
+
Out-of-Plane Bending of a Curved Bar ( |
+00:02.144 |
+0.0 MB |
+
Plastic compression of a pipe assembly ( |
+00:01.812 |
+0.0 MB |
+
Parametric calculation ( |
+00:01.790 |
+0.0 MB |
+
Deflection of a hinged support ( |
+00:01.716 |
+0.0 MB |
+
Combined bending and torsion ( |
+00:01.711 |
+0.0 MB |
+
Thermally loaded support structure ( |
+00:01.571 |
+0.0 MB |
+
Beam stresses and deflections ( |
+00:01.414 |
+0.0 MB |
+
Stresses in a Long Cylinder ( |
+00:01.313 |
+0.0 MB |
+
Tie Rod with Lateral Loading ( |
+00:01.141 |
+0.0 MB |
+
Residual Stress Problem ( |
+00:01.071 |
+0.0 MB |
+
Bending of a Circular Plate Using Axisymmetric Shell Elements ( |
+00:01.066 |
+0.0 MB |
+
Cylindrical Membrane Under Pressure ( |
+00:01.006 |
+0.0 MB |
+
Bending of a Tee-Shaped Beam ( |
+00:00.990 |
+0.0 MB |
+
Large Deflection Eccentric Compression of Slender Column ( |
+00:00.964 |
+0.0 MB |
+
Cylindrical Shell Under Pressure ( |
+00:00.897 |
+0.0 MB |
+
Statically indeterminate reaction force analysis ( |
+00:00.642 |
+0.0 MB |
+
Large lateral deflection of unequal stiffness springs ( |
+00:00.419 |
+0.0 MB |
+
Note
+Go to the end +to download the full example code
+A prismatical bar with built-in ends is loaded axially at two +intermediate cross sections. Determine the reactions \(R_1\) +and \(R_2\).
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 26, problem 10.
Static Analysis ANTYPE=0
3-D Spar (or Truss) Elements (LINK180)
\(E = 30 \cdot 10^6 psi\)
\(a = b = 0.3\)
\(l = 10 in\)
\(F_1 = 2*F_2 = 1000 lb\)
\(P = R_1 + R_2\) where \(P\) is load.
\(\frac{R_2}{R_1} = \frac{a}{b}\) +Where \(a\) and \(b\) are the ratios of distances between +the load and the wall.
# sphinx_gallery_thumbnail_path = '_static/vm1_setup.png'
+
+from ansys.mapdl.core import launch_mapdl
+
+# start mapdl and clear it
+mapdl = launch_mapdl()
+mapdl.clear() # optional as MAPDL just started
+
+# enter verification example mode and the pre-processing routine
+mapdl.verify()
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Set up the material and its type (a single material, with a linking-type +section and a Young’s modulus of 30e6).
+mapdl.antype("STATIC")
+mapdl.et(1, "LINK180")
+mapdl.sectype(1, "LINK")
+mapdl.secdata(1)
+mapdl.mp("EX", 1, 30e6)
+
MATERIAL 1 EX = 0.3000000E+08
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1, 0, 0)
+mapdl.n(2, 0, 4)
+mapdl.n(3, 0, 7)
+mapdl.n(4, 0, 10)
+mapdl.e(1, 2)
+mapdl.egen(3, 1, 1)
+
GENERATE 3 TOTAL SETS OF ELEMENTS WITH NODE INCREMENT OF 1
+ SET IS SELECTED ELEMENTS IN RANGE 1 TO 1 IN STEPS OF 1
+
+ MAXIMUM ELEMENT NUMBER= 3
+
Full constrain nodes 1 and 4, by incrementing from node 1 to node 4 +in steps of 3. Apply y-direction forces to nodes 2 and 3, with +values of -500 lb and -1000 lb respectively. Then exit prep7.
+Effectiely, this sets: +- \(F_1 = 2*F_2 = 1000 lb\)
+mapdl.d(1, "ALL", "", "", 4, 3)
+mapdl.f(2, "FY", -500)
+mapdl.f(3, "FY", -1000)
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.run("/SOLU")
+out = mapdl.solve()
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Select the nodes at y=10
and y=0
, and
+sum the forces there. Then store the y-components in two variables:
+reaction_1
and reaction_2
.
mapdl.post1()
+mapdl.nsel("S", "LOC", "Y", 10)
+mapdl.fsum()
+reaction_1 = mapdl.get("REAC_1", "FSUM", "", "ITEM", "FY")
+mapdl.nsel("S", "LOC", "Y", 0)
+mapdl.fsum()
+reaction_2 = mapdl.get("REAC_2", "FSUM", "", "ITEM", "FY")
+
Now that we have the reaction forces we can compare them to the +expected values of 900 lbs and 600 lbs for reactions 1 and 2 respectively.
+Analytical results obtained from: +- \(P = R_1 + R_2\) where \(P\) is load of 1500 lbs +- \(\frac{R_2}{R_1} = \frac{a}{b}\)
+Hint: Solve for each reaction force independently.
+results = f"""
+ --------------------- RESULTS COMPARISON ---------------------
+ | TARGET | Mechanical APDL | RATIO
+ /INPUT FILE= LINE= 0
+ R1, lb 900.0 {abs(reaction_1)} {abs(reaction_1) / 900}
+ R2, lb 600.0 {abs(reaction_2)} {abs(reaction_2) / 600}
+ ----------------------------------------------------------------
+ """
+print(results)
+
--------------------- RESULTS COMPARISON ---------------------
+| TARGET | Mechanical APDL | RATIO
+/INPUT FILE= LINE= 0
+R1, lb 900.0 900.0 1.0
+R2, lb 600.0 600.0 1.0
+----------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 0.642 seconds)
+ + +Note
+Go to the end +to download the full example code
+Problem description:
++++
+- +
A standard 30 inch WF beam, with a cross-sectional area \(A\), +is supported as shown below and loaded on the overhangs by a +uniformly distributed load \(w\). Determine the maximum bending +stress, \(\sigma_max\), in the middle portion of the beam and +the deflection, \(\delta\), at the middle of the beam.
Reference:
++++
+- +
S. Timoshenko, Strength of Material, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 98, problem 4.
Analysis type(s):
++++
+- +
Static Analysis
ANTYPE=0
Element type(s):
+++ ++
+- +
3-D 2 Node Beam (BEAM188)
Material properties:
++++
+- +
\(E = 30 \cdot 10^6 psi\)
Geometric properties:
++++
+- +
\(a = 120 in\)
- +
\(l = 240 in\)
- +
\(h = 30 in\)
- +
\(A = 50.65 in^2\)
- +
\(I_z = 7892 in^4\)
Loading:
++++
+- +
\(w = (10000/12) lb/in\)
Analytical equations:
+\(M\) is the bending moment for the middle portion of the beam: +\(M = 10000 \cdot 10 \cdot 60 = 6 \cdot 10^6 lb \cdot in\)
Determination of the maximum stress in the middle portion of the beam is +\(\sigma_max = \frac{M h}{2 I_z}\)
The deflection, \(\delta\), at the middle of the beam can be defined +by the formulas of the transversally loaded beam: +\(\delta = 0.182 in\)
# sphinx_gallery_thumbnail_path = '_static/vm2_setup.png'
+
from ansys.mapdl.core import launch_mapdl
+
+# Start mapdl and clear it.
+mapdl = launch_mapdl()
+mapdl.clear()
+
+# Enter verification example mode and the pre-processing routine.
+mapdl.verify()
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Set up the element type (a beam-type).
+# Type of analysis: static.
+mapdl.antype("STATIC")
+
+# Element type: BEAM188.
+mapdl.et(1, "BEAM188")
+
+# Special Features are defined by keyoptions of beam element:
+
+# KEYOPT(3)
+# Shape functions along the length:
+# Cubic
+mapdl.keyopt(1, 3, 3) # Cubic shape function
+
+# KEYOPT(9)
+# Output control for values extrapolated to the element
+# and section nodes:
+# Same as KEYOPT(9) = 1 plus stresses and strains at all section nodes
+mapdl.keyopt(1, 9, 3, mute=True)
+
Set up the material.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("PRXY", 1, 0.3)
+print(mapdl.mplist())
+
LIST MATERIALS 1 TO 1 BY 1
+ PROPERTY= ALL
+
+ MATERIAL NUMBER 1
+
+ TEMP EX
+ 0.3000000E+08
+
+ TEMP PRXY
+ 0.3000000
+
Set up the cross-section properties for a beam element.
+SECTION ID NUMBER IS: 1
+ BEAM SECTION TYPE IS: I Section
+ BEAM SECTION NAME IS: ISection
+ COMPUTED BEAM SECTION DATA SUMMARY:
+ Area = 50.650
+ Iyy = 7892.0
+ Iyz = 0.76051E-12
+ Izz = 590.47
+ Warping Constant = 0.12403E+06
+ Torsion Constant = 14.962
+ Centroid Y = 0.10702E-14
+ Centroid Z = 15.048
+ Shear Center Y =-0.96799E-12
+ Shear Center Z = 15.048
+ Shear Correction-xy = 0.54626
+ Shear Correction-yz = 0.20960E-12
+ Shear Correction-xz = 0.38629
+
+ Beam Section is offset to CENTROID of cross section
+
Set up the nodes and elements. Create nodes then create elements +between nodes.
+# Define nodes
+for node_num in range(1, 6):
+ mapdl.n(node_num, (node_num - 1) * 120, 0, 0)
+
+# Define one node for the orientation of the beam cross-section.
+orient_node = mapdl.n(6, 60, 1)
+
+# Print the list of the created nodes.
+print(mapdl.nlist())
+
LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 0.0000 0.0000 0.0000 0.00 0.00 0.00
+ 2 120.00 0.0000 0.0000 0.00 0.00 0.00
+ 3 240.00 0.0000 0.0000 0.00 0.00 0.00
+ 4 360.00 0.0000 0.0000 0.00 0.00 0.00
+ 5 480.00 0.0000 0.0000 0.00 0.00 0.00
+ 6 60.000 1.0000 0.0000 0.00 0.00 0.00
+
Define elements
+for elem_num in range(1, 5):
+ mapdl.e(elem_num, elem_num + 1, orient_node)
+
+# Print the list of the created elements.
+print(mapdl.elist())
+
+# Display elements with their nodes numbers.
+mapdl.eplot(show_node_numbering=True, line_width=5, cpos="xy", font_size=40)
+
LIST ALL SELECTED ELEMENTS. (LIST NODES)
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 1 1 1 1 0 1 1 2 6
+ 2 1 1 1 0 1 2 3 6
+ 3 1 1 1 0 1 3 4 6
+ 4 1 1 1 0 1 4 5 6
+
Application of boundary conditions (BC).
+# BC for the beams seats
+mapdl.d(2, "UX", lab2="UY")
+mapdl.d(4, "UY")
+
+# BC for all nodes of the beam
+mapdl.nsel("S", "LOC", "Y", 0)
+mapdl.d("ALL", "UZ")
+mapdl.d("ALL", "ROTX")
+mapdl.d("ALL", "ROTY")
+mapdl.nsel("ALL")
+
array([1, 2, 3, 4, 5, 6], dtype=int32)
+
Apply a distributed force of \(w = (10000/12) lb/in\) +in the y-direction.
+***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system. Print the solver output.
+mapdl.run("/SOLU")
+out = mapdl.solve()
+mapdl.finish()
+print(out)
+
***** MAPDL SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS BEAM188 . KEYOPT(1)=1 IS SUGGESTED FOR NON-CIRCULAR CROSS
+ SECTIONS AND KEYOPT(3)=2 IS ALWAYS SUGGESTED.
+
+ ELEMENT TYPE 1 IS BEAM188 . KEYOPT(15) IS ALREADY SET AS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Present time 0 is less than or equal to the previous time. Time will
+ default to 1.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Internal nodes from 7 to 14 are created.
+ 8 internal nodes are used for quadratic and/or cubic options of
+ BEAM188, PIPE288, and/or SHELL208.
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 1
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+ FOR THE LAST SUBSTEP
+
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Predictor is ON by default for structural elements with rotational
+ degrees of freedom. Use the PRED,OFF command to turn the predictor
+ OFF if it adversely affects the convergence.
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 2.999405619E+10 at element 0.
+ Minimum = 2.999405619E+10 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 4 BEAM188 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 60, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Sparse solver maximum pivot= 0 at node 0 .
+ Sparse solver minimum pivot= 0 at node 0 .
+ Sparse solver minimum pivot in absolute value= 0 at node 0 .
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 4 BEAM188 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 4 BEAM188 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 1
+ *** TIME = 1.00000 TIME INC = 1.00000 NEW TRIANG MATRIX
+
Enter post-processing. To get the stress and deflection results
+from the middle node and cross-section of the beam we can use
+Mapdl.get_value
.
# Enter the post-processing routine and select the first load step.
+mapdl.post1()
+mapdl.set(1)
+
+# Get the maximum stress at the middle of the beam.
+s_eqv_max = mapdl.get_value("secr", 2, "s", "eqv", "max")
+
+# Get the deflection at the middle of the beam.
+mid_node_uy = mapdl.get_value(entity="NODE", entnum=3, item1="u", it1num="y")
+
Now that we have the results we can compare the nodal displacement and stress +experienced by middle node of the beam to the known stresses -11,400 psi and +0.182 inches of the deflection.
+# Results obtained by hand-calculations.
+stress_target = 11400.0
+deflection_target = 0.182
+
+# Calculate the deviation.
+stress_ratio = s_eqv_max / stress_target
+deflection_ratio = mid_node_uy / deflection_target
+
+# Print output results.
+output = f"""
+----------------------------- VM3 RESULTS COMPARISON -----------------------------
+ | TARGET | Mechanical APDL | RATIO |
+----------------------------------------------------------------------------------
+ Stress{stress_target:18.3f} {s_eqv_max:16.3f} {stress_ratio:14.3f}
+ Deflection{deflection_target:14.3f} {mid_node_uy:16.3f} {deflection_ratio:14.3f}
+----------------------------------------------------------------------------------
+"""
+print(output)
+
----------------------------- VM3 RESULTS COMPARISON -----------------------------
+ | TARGET | Mechanical APDL | RATIO |
+----------------------------------------------------------------------------------
+ Stress 11400.000 11440.746 1.004
+ Deflection 0.182 0.182 1.003
+----------------------------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.414 seconds)
+ + +Note
+Go to the end +to download the full example code
+Find the stresses in the copper and steel wire structure shown below. +The wires have a cross-sectional area of math:A. The structure is +subjected to a load math:Q and a temperature rise of math:Delta T after +assembly.
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 30, problem 9.
Static Analysis ANTYPE=0
3-D Spar (or Truss) Elements (LINK180)
\(E_c = 16 \cdot 10^6 psi\)
\(E_s = 30 \cdot 10^6 psi\)
\(\alpha_c = 70 \cdot 10^{-7} in/in-^\circ F\)
\(\alpha_s = 92 \cdot 10^{-7} in/in-^\circ F\)
\(A = 0.1 in^2\)
\(Q = 4000 lb\)
\(\Delta T = 10 ^\circ F\)
The compressive force \(X\) is given by the following equation
\(X = \frac{\Delta T (\alpha_c - \alpha_s) (A_s - E_s) }{1 + \frac{1 E_s A_s}{2 E_c A_c}} + \frac{Q}{1 + \frac{2 E_c A_c}{E_s A_s}}\)
Length of wires (20 in.), spacing between wires (10 in.), and the reference +temperature (70°F) are arbitrarily selected. The rigid lower beam is modeled +by nodal coupling.
# sphinx_gallery_thumbnail_path = '_static/vm3_setup.png'
+
+from ansys.mapdl.core import launch_mapdl
+
+# start mapdl and clear it
+mapdl = launch_mapdl()
+mapdl.clear() # optional as MAPDL just started
+
+# enter verification example mode and the pre-processing routine
+mapdl.verify()
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Set up the materials and their properties. We are using copper and +steel here. +- EX - X-direction elastic modulus +- ALPX - Secant x - coefficient of thermal expansion
+mapdl.antype("STATIC")
+mapdl.et(1, "LINK180")
+mapdl.sectype(1, "LINK")
+mapdl.secdata(0.1)
+mapdl.mp("EX", 1, 16e6)
+mapdl.mp("ALPX", 1, 92e-7)
+mapdl.mp("EX", 2, 30e6)
+mapdl.mp("ALPX", 2, 70e-7)
+# Define the reference temperature for the thermal strain calculations.
+mapdl.tref(70)
+
REFERENCE TEMPERATURE= 70.000 (TUNIF= 70.000)
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup. We create a square of nodes and use fill to add +mid-point nodes to two opposite sides.
+mapdl.n(1, -10)
+mapdl.n(3, 10)
+mapdl.fill()
+mapdl.n(4, -10, -20)
+mapdl.n(6, 10, -20)
+mapdl.fill()
+mapdl.nplot(nnum=True, cpos="xy")
+
Create two elements (using material #1) that are two sides of our +square, as links. Then create a single element using material #2 +between the first 2 that is parallel to them.
+mapdl.e(1, 4)
+mapdl.e(3, 6)
+mapdl.mat(2)
+mapdl.e(2, 5)
+mapdl.eplot(show_node_numbering=True, cpos="xy")
+
Couple the degrees of freedom in y-displacement across nodes 5, 4, +and 6.
Fix nodes 1, 2, and 3 in place.
Apply a force of -4000 in the y-direction to node 5
Apply a uniform temperature of 80 to the whole body
Finally, exit the post-processor.
mapdl.cp(1, "UY", 5, 4, 6)
+mapdl.d(1, "ALL", "", "", 3)
+mapdl.f(5, "FY", -4000)
+mapdl.bfunif("TEMP", 80)
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode
Specify a timestep of 1 to be used for this load step
Solve the system.
mapdl.run("/SOLU")
+mapdl.nsubst(1)
+mapdl.solve()
+
***** MAPDL SOLVE COMMAND *****
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Present time 0 is less than or equal to the previous time. Time will
+ default to 1.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 1
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+ FOR THE LAST SUBSTEP
+
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 150000 at element 0.
+ Minimum = 80000 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 3 LINK180 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 1, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Sparse solver maximum pivot= 0 at node 0 .
+ Sparse solver minimum pivot= 0 at node 0 .
+ Sparse solver minimum pivot in absolute value= 0 at node 0 .
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 3 LINK180 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 3 LINK180 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 1
+ *** TIME = 1.00000 TIME INC = 1.00000 NEW TRIANG MATRIX
+
Access the queries functions
Find a steel node and a copper node
Then use these to get the steel and copper elements
Finally extract the stress experienced by each element
mapdl.post1()
+q = mapdl.queries
+steel_n = q.node(0, 0, 0)
+copper_n = q.node(10, 0, 0)
+steel_e = q.enearn(steel_n)
+copper_e = q.enearn(copper_n)
+mapdl.etable("STRS_ST", "LS", 1)
+mapdl.etable("STRS_CO", "LS", 1)
+
+stress_steel = mapdl.get("_", "ELEM", steel_e, "ETAB", "STRS_ST")
+stress_copper = mapdl.get("_", "ELEM", copper_e, "ETAB", "STRS_CO")
+
Now that we have the response we can compare the values to the +expected stresses of 19695 and 10152 respectively.
+steel_target = 19695
+steel_ratio = stress_steel / steel_target
+copper_target = 10152
+copper_ratio = stress_copper / copper_target
+
+message = f"""
+------------------- VM3 RESULTS COMPARISON ---------------------
+
+ | TARGET | Mechanical APDL | RATIO
+----------------------------------------------------------------
+ Steel {steel_target} {stress_steel} {steel_ratio:.6f}
+ Copper {copper_target} {stress_copper} {copper_ratio:.6f}
+
+----------------------------------------------------------------
+
+"""
+print(message)
+
------------------- VM3 RESULTS COMPARISON ---------------------
+
+ | TARGET | Mechanical APDL | RATIO
+----------------------------------------------------------------
+ Steel 19695 19695.4839 1.000025
+ Copper 10152 10152.2581 1.000025
+
+----------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.571 seconds)
+ + +Note
+Go to the end +to download the full example code
+A structure consisting of two equal steel bars, each of length \(l\) +and cross-sectional area \(A\), with hinged ends is subjected to +the action of a load \(F\). Determine the stress, \(\sigma\), +in the bars and the deflection, \(\delta\), of point 2. Neglect +the weight of the bars as a small quantity in comparison with the load +\(F\).
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 10, problem 2.
Static Analysis ANTYPE=0
3-D Spar (or Truss) Elements (LINK180)
\(E = 30 \cdot 10^6 psi\)
\(l = 15 ft\)
\(A = 0.5 in^2\)
\(\Theta = 30 ^\circ\)
\(F = 5000 lb\)
The tensile force in the bars is \(S\) +- \(S = \frac{P}{2 sin \Theta}\)
The necessary cross-sectional area \(A\) is +- \(A = \frac{S}{\sigma}\)
The elongation of the bar \(AB\) is +- \(B_1 D = \frac{\sigma l}{E}\)
The deflection \(BB_1\) is +- \(BB_1 = \frac{B_1 D}{sin \Theta}\)
Consistent length units are used. The dimensions \(a\) and \(b\) are +calculated parametrically in the input as follows: +- \(a = 2 l cos \Theta\), +- \(b = l sin \Theta\).
# sphinx_gallery_thumbnail_path = '_static/vm4_setup.png'
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Create a simple hinge geometry. +We use the LINK180 element type to model this and an elastic modulus +of 30e6. +We store the x-coordinate of node 3 and the y-coordinate of node 2 for +ease of use later on.
+length_bar = 15 * 12
+theta = 30
+theta_rad = theta * pi / 180.0
+node3_x = 2 * length_bar * cos(theta_rad)
+node2_y = length_bar * sin(theta_rad)
+
+mapdl.et(1, "LINK180")
+mapdl.sectype(1, "LINK")
+mapdl.secdata(0.5)
+mapdl.mp("EX", 1, 30e6)
+
MATERIAL 1 EX = 0.3000000E+08
+
We create three nodes in an isosceles triangle shape, with elements +along the equal sides, forming a hinge.
+ +Fix nodes 1 and 3 in place
Apply a force of -5000 in the negative y-direction to node 2
Then finish the prep7 section
mapdl.d(1, "ALL", "", "", 3, 2)
+mapdl.f(2, "FY", -5000)
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.run("/SOLU")
+out = mapdl.solve()
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing, get the results and view the nodal displacement +as well as the equivalent stress on the nodes.
+We make the line width larger for ease of visualization as well as +using two perceptually linear colormaps to enhance display of the +data.
+mapdl.post1()
+mapdl.post_processing.plot_nodal_displacement(
+ "Y",
+ cmap="magma",
+ line_width=5,
+ cpos="xy",
+ scalar_bar_args={"title": "Displacement", "vertical": False},
+)
+
Use the post_processing
attribute to get the principal nodal
+stress as an array.
Note
+This returns the same data as prnsol
, except instead of returning
+text, it returns a numpy array.
Node 1 : 10000.0 psi
+Node 2 : 10000.0 psi
+Node 3 : 10000.0 psi
+
Now that we have the results we can compare the nodal displacement and +stress experienced by node 2 to the known quantities 10000 psi and +-0.12 inches. To do this we:
+Find the mid-node from the coordinates using the Query
class
Get the y-displacement from node 2
Get the element nearest to node 2
Get the stress on this element
Compare
q = mapdl.queries
+mid_node = q.node(node3_x * 0.5, -node2_y, 0)
+displacement = mapdl.get_value("NODE", mid_node, "U", "Y")
+left_element = q.enearn(mid_node)
+mapdl.etable("STRS", "LS", 1)
+stress = mapdl.get_value("ELEM", left_element, "ETAB", "STRS")
+
+results = f"""
+--------------------- RESULTS COMPARISON -----------------------
+| TARGET | TARGET | Mechanical APDL | RATIO
+------------------------------------------------------------------
+Stress [psi] 10000 {stress} {stress/10000:.2f}
+Displacement [in] -0.12 {displacement:.2f} {abs(displacement) / 0.12:.2f}
+------------------------------------------------------------------
+"""
+
+print(results)
+
--------------------- RESULTS COMPARISON -----------------------
+| TARGET | TARGET | Mechanical APDL | RATIO
+------------------------------------------------------------------
+Stress [psi] 10000 10000.0 1.00
+Displacement [in] -0.12 -0.12 1.00
+------------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.716 seconds)
+ + +Note
+Go to the end +to download the full example code
+A cantilever beam of thickness \(t\) and length \(l\) +has a depth which tapers uniformly from \(d\) at the tip +to \(3d\) at the wall. It is loaded by a force \(F\) +at the tip, as shown. Find the maximum bending stress at the +mid-length (\(X = l\)) and the fixed end of the beam.
S. H. Crandall, N. C. Dahl, An Introduction to the Mechanics +of Solids, McGraw-Hill Book Co., Inc., New York, NY, 1959, +pg. 342, problem 7.18.
Static Analysis ANTYPE=0
2-D 4-Node Sructural Solid Elements (PLANE182)
2-D 8-Node Structural Solid Elements (PLANE183)
\(E = 30 \cdot 10^6 psi\)
\(\nu = 0.0\)
\(d = 3in\)
\(t = 2in\)
\(l = 50 in\)
\(d = 3 in\)
\(t = 2 in\)
\(F = 4000 lb\)
Two different solutions are obtained. The first solution uses +lower order PLANE182 elements and the second solution uses higher +order PLANE82 elements. The 2 inch thickness is incorporated +by using the plane stress with thickness option. Poisson’s +ratio is set to 0.0 to agree with beam theory.
# sphinx_gallery_thumbnail_path = '_static/vm5_setup.png'
+
from ansys.mapdl.core import launch_mapdl
+
+# start mapdl and clear it
+mapdl = launch_mapdl()
+mapdl.clear() # optional as MAPDL just started
+
+# enter verification example mode and the pre-processing routine
+mapdl.verify()
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Set up the material using PLANE182 with a thickness of 2 (using real +constants), and create a material with a Young’s modulus of 30e6, +and a poisson’s ratio of 0.0 to agree with beam theory.
+mapdl.antype("STATIC")
+mapdl.et(1, "PLANE182", kop1=2, kop3=3)
+mapdl.r(1, 2)
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.0)
+
MATERIAL 1 NUXY = 0.000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1, 25)
+mapdl.n(7, 75)
+mapdl.fill()
+mapdl.n(8, 25, -3)
+mapdl.n(14, 75, -9)
+mapdl.fill()
+mapdl.e(2, 1, 8, 9)
+mapdl.egen(6, 1, 1)
+mapdl.eplot(show_node_numbering=True, cpos="xy")
+
Fix the nodes at the larger end (the “wall” end) and apply a vertical force +to the whole structure.
+# constrain nodes at fixed end
+mapdl.nsel("S", "LOC", "X", 75)
+mapdl.d("ALL", "ALL")
+mapdl.nsel("ALL")
+mapdl.f(1, "FY", -4000)
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.run("/SOLU")
+mapdl.solve()
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Get the stress at the fixed end and the mid point +of the structure by querying the stress at nodes closest to these locations. +We’ve gathered the code into a function because we’ll have use for it later.
+def fetch_mid_and_end_stress(m):
+ q = m.queries
+ m.post1()
+ end = q.node(75.0, 0.0, 0.0)
+ fixed_end_stress = m.get_value("NODE", end, "S", "X")
+ mid = q.node(50.0, 0.0, 0.0)
+ mid_stress = m.get_value("NODE", mid, "S", "EQV")
+ return fixed_end_stress, mid_stress
+
+
+fixed_end_stress_182, mid_stress_182 = fetch_mid_and_end_stress(mapdl)
+
View the equivalent stress, and displacement, of the cantilever with a
+displacement_factor
of 26 to scale up the deformation to a visible
+amount.
result = mapdl.result
+result.plot_principal_nodal_stress(
+ 0,
+ "SEQV",
+ show_edges=True,
+ show_displacement=True,
+ displacement_factor=26.0,
+ cmap="Oranges",
+ cpos="xy",
+)
+
Now we need to perform the simulation again but this time using the PLANE183
+element type. We additionally remove midside nodes with emid
.
mapdl.prep7()
+mapdl.et(1, "PLANE183", kop3=3)
+mapdl.emid()
+mapdl.nsel("R", "LOC", "X", 75)
+mapdl.nsel("R", "LOC", "Y", -4.5)
+
+mapdl.d("ALL", "ALL")
+mapdl.nsel("ALL")
+mapdl.finish()
+mapdl.run("/SOLU")
+mapdl.solve()
+mapdl.finish()
+
+mapdl.post1()
+# reuse our function from earlier
+fixed_end_stress_183, mid_stress_183 = fetch_mid_and_end_stress(mapdl)
+mapdl.finish()
+
+result = mapdl.result
+result.plot_principal_nodal_stress(
+ 0,
+ "SEQV",
+ show_edges=True,
+ show_displacement=True,
+ displacement_factor=26.0,
+ cmap="Blues",
+ cpos="xy",
+)
+
Now that we have the stresses we can compare them to the expected values +of stress at the midpoint (8333) and the fixed end (7407) for both +simulations.
+results_182 = f"""
+----------------- PLANE 182 RESULTS COMPARISON ----------------
+| LABEL | TARGET | Mechanical APDL | RATIO
+ mid stress 8333 {mid_stress_182:.2f} {mid_stress_182 / 8333:.2f}
+ end stress 7407 {fixed_end_stress_182:.2f} {fixed_end_stress_182 / 7407:.2f}
+----------------------------------------------------------------
+"""
+
+results_183 = f"""
+----------------- PLANE 183 RESULTS COMPARISON ----------------
+| LABEL | TARGET | Mechanical APDL | RATIO
+ mid stress 8333 {mid_stress_183:.2f} {mid_stress_183 / 8333:.2f}
+ end stress 7407 {fixed_end_stress_183:.2f} {fixed_end_stress_183 / 7407:.2f}
+----------------------------------------------------------------
+"""
+print(results_182)
+print(results_183)
+
----------------- PLANE 182 RESULTS COMPARISON ----------------
+| LABEL | TARGET | Mechanical APDL | RATIO
+ mid stress 8333 8163.66 0.98
+ end stress 7407 7151.10 0.97
+----------------------------------------------------------------
+
+
+----------------- PLANE 183 RESULTS COMPARISON ----------------
+| LABEL | TARGET | Mechanical APDL | RATIO
+ mid stress 8333 8363.71 1.00
+ end stress 7407 7408.98 1.00
+----------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 2.222 seconds)
+ + +Note
+Go to the end +to download the full example code
+A thin-walled cylinder is pinched by a force \(F\) at the middle +of the cylinder length. Determine the radial displacement \(\delta\) +at the point where the force \(F\) is applied. +The ends of the cylinder are free edges.
R. D. Cook, Concepts and Applications of Finite Element Analysis, 2nd Edition, +John Wiley and Sons, Inc., New York, NY, 1981, pp. 284-287. +H. Takemoto, R. D. Cook, “Some Modifications of an Isoparametric Shell +Element”, International Journal for Numerical Methods in Engineering, Vol.7 +No. 3, 1973.
Static Analysis ANTYPE=0
4-Node Finite Strain Shell Elements (SHELL181)
8-Node Finite Strain Shell Elements (SHELL281)
\(E = 10.5 \cdot 10^6 psi\)
\(\nu = 0.3125\)
\(l = 10.35 in\)
\(r = 4.953 in\)
\(t = 0.094 in\)
\(F = 100 lb\)
A one-eighth symmetry model is used. One-fourth of the load is applied +due to symmetry.
# sphinx_gallery_thumbnail_path = '_static/vm6_setup.png'
+
from ansys.mapdl.core import launch_mapdl
+
+# Start mapdl.
+mapdl = launch_mapdl()
+
Enter verification example mode and the pre-processing routine.
+def start_prep7():
+ mapdl.clear()
+ mapdl.verify()
+ mapdl.prep7()
+
+
+start_prep7()
+
Set up the element type (a shell-type).
+# Define the element type number.
+def define_element(elem_type):
+ # Type of analysis: Static.
+ mapdl.antype("STATIC")
+
+ # Define the element type number.
+ elem_num = 1
+
+ if elem_type == "SHELL181":
+
+ # Element type: SHELL181.
+ mapdl.et(elem_num, elem_type)
+
+ # Special Features are defined by keyoptions of shell element:
+
+ # KEYOPT(3)
+ # Integration option:
+ # Full integration with incompatible modes.
+ mapdl.keyopt(elem_num, 3, 2) # Cubic shape function
+
+ elif elem_type == "SHELL281":
+
+ # Element type: SHELL181.
+ mapdl.et(elem_num, "SHELL281")
+
+ return elem_type, mapdl.etlist()
+
+
+# Return the number of the element type.
+elem_type, elem_type_list = define_element(elem_type="SHELL181")
+print(
+ f"Selected element type is: {elem_type},\n"
+ f"Printout the element list with its own properties:\n {elem_type_list}"
+)
+
Selected element type is: SHELL181,
+Printout the element list with its own properties:
+ LIST ELEMENT TYPES FROM 1 TO 1 BY 1
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEMENT TYPE 1 IS SHELL181 4-NODE SHELL
+ KEYOPT( 1- 6)= 0 0 2 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY UZ ROTX ROTY ROTZ
+ THREE-DIMENSIONAL MODEL
+
Set up the material properties, where: +Young Modulus is \(E = 10.5 \cdot 10^6 psi\), +Poisson’s ratio is \(\nu = 0.3125\).
+LIST MATERIALS 1 TO 1 BY 1
+ PROPERTY= ALL
+
+ MATERIAL NUMBER 1
+
+ TEMP EX
+ 0.1050000E+08
+
+ TEMP NUXY
+ 0.3125000
+
Set up the cross-section properties for a shell element.
+# Define cross-section number and thickness of the shell element.
+sec_num = 1
+t = 0.094
+
+# Define shell cross-section.
+def define_section():
+ # Define shell cross-section.
+ mapdl.sectype(secid=sec_num, type_="SHELL", name="shell181")
+ mapdl.secdata(t, mat_num, 0, 5)
+ return mapdl.slist()
+
+
+section_list = define_section()
+print(section_list)
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ LIST SECTION ID SETS 1 TO 1 BY 1
+
+ SECTION ID NUMBER: 1
+ SHELL SECTION TYPE:
+ SHELL SECTION NAME IS: shell181
+ SHELL SECTION DATA SUMMARY:
+ Number of Layers = 1
+ Total Thickness = 0.094000
+
+ Layer Thickness MatID Ori. Angle Num Intg. Pts
+
+ 1 0.0940 1 0.0000 5
+
+ Shell Section is offset to MID surface of Shell
+
+ Section Solution Controls
+ User Transverse Shear Stiffness (11)= 0.0000
+ (22)= 0.0000
+ (12)= 0.0000
+ Added Mass Per Unit Area = 0.0000
+ Hourglass Scale Factor; Membrane = 1.0000
+ Bending = 1.0000
+ Drill Stiffness Scale Factor = 1.0000
+
Set up the keypoints and create the area through the keypoints.
+# Define geometry of the simplified mathematical model.
+def define_geometry():
+ # Change active coordinate system
+ # to the global cylindrical coordinate system.
+ mapdl.csys(1)
+
+ # Define keypoints by coordinates.
+ mapdl.k(1, 4.953)
+ mapdl.k(2, 4.953, "", 5.175)
+
+ # Generate additional keypoints from a pattern of keypoints.
+ mapdl.kgen(2, 1, 2, 1, "", 90)
+
+ # Create an area through keypoints.
+ mapdl.a(1, 2, 4, 3)
+
+ if elem_type == "SHELL181":
+ # Plot the lines.
+ mapdl.lplot(color_lines=True, cpos="iso")
+
+ # Plot the area using PyVista parameters.
+ mapdl.aplot(
+ title="Display the selected area",
+ cpos="iso",
+ vtk=True,
+ color="#06C2AC",
+ show_line_numbering=True,
+ show_area_numbering=True,
+ show_lines=True,
+ )
+
+
+define_geometry()
+
+
+# Define the number of the keypoint where F is applied using inline function.
+def keypoint_number(mapdl):
+ keypoint_num = mapdl.queries.kp(4.953, 90, 0)
+ return keypoint_num
+
+
+# Call the function to get the number of keypoint.
+top_keypoint = keypoint_number(mapdl)
+print(f"The number of the keypoint where F is applied: {top_keypoint}")
+
The number of the keypoint where F is applied: 3
+
Define line division of the lines, then mesh the area with shell elements.
+# Define mesh properties and create the mesh with shell elements.
+def meshing():
+ # Specify the default number of line divisions.
+ mapdl.esize(size="", ndiv=8)
+
+ # Mesh the area.
+ mapdl.amesh(1)
+
+ # Define global cartesian coordinate system.
+ mapdl.csys(0)
+
+ if elem_type == "SHELL181":
+ # Plot the mesh.
+ mapdl.eplot(
+ title="Plot of the currently selected elements",
+ vtk=True,
+ cpos="iso",
+ show_edges=True,
+ edge_color="white",
+ show_node_numbering=True,
+ color="purple",
+ )
+
+ # Print the list of elements.
+ print(mapdl.elist())
+
+ # Plot the nodes using VTK.
+ mapdl.nplot(
+ vtk=True, nnum=True, background="", cpos="iso", show_bounds=True, point_size=10
+ )
+
+ # Print the list of nodes.
+ print(mapdl.nlist())
+
+
+meshing()
+
LIST ALL SELECTED ELEMENTS. (LIST NODES)
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 1 1 1 1 0 1 1 3 33 32
+ 2 1 1 1 0 1 3 4 40 33
+ 3 1 1 1 0 1 4 5 47 40
+ 4 1 1 1 0 1 5 6 54 47
+ 5 1 1 1 0 1 6 7 61 54
+ 6 1 1 1 0 1 7 8 68 61
+ 7 1 1 1 0 1 8 9 75 68
+ 8 1 1 1 0 1 9 2 11 75
+ 9 1 1 1 0 1 32 33 34 31
+ 10 1 1 1 0 1 33 40 41 34
+ 11 1 1 1 0 1 40 47 48 41
+ 12 1 1 1 0 1 47 54 55 48
+ 13 1 1 1 0 1 54 61 62 55
+ 14 1 1 1 0 1 61 68 69 62
+ 15 1 1 1 0 1 68 75 76 69
+ 16 1 1 1 0 1 75 11 12 76
+ 17 1 1 1 0 1 31 34 35 30
+ 18 1 1 1 0 1 34 41 42 35
+ 19 1 1 1 0 1 41 48 49 42
+ 20 1 1 1 0 1 48 55 56 49
+ 21 1 1 1 0 1 55 62 63 56
+ 22 1 1 1 0 1 62 69 70 63
+ 23 1 1 1 0 1 69 76 77 70
+ 24 1 1 1 0 1 76 12 13 77
+ 25 1 1 1 0 1 30 35 36 29
+ 26 1 1 1 0 1 35 42 43 36
+ 27 1 1 1 0 1 42 49 50 43
+ 28 1 1 1 0 1 49 56 57 50
+ 29 1 1 1 0 1 56 63 64 57
+ 30 1 1 1 0 1 63 70 71 64
+ 31 1 1 1 0 1 70 77 78 71
+ 32 1 1 1 0 1 77 13 14 78
+ 33 1 1 1 0 1 29 36 37 28
+ 34 1 1 1 0 1 36 43 44 37
+ 35 1 1 1 0 1 43 50 51 44
+ 36 1 1 1 0 1 50 57 58 51
+ 37 1 1 1 0 1 57 64 65 58
+ 38 1 1 1 0 1 64 71 72 65
+ 39 1 1 1 0 1 71 78 79 72
+ 40 1 1 1 0 1 78 14 15 79
+ 41 1 1 1 0 1 28 37 38 27
+ 42 1 1 1 0 1 37 44 45 38
+ 43 1 1 1 0 1 44 51 52 45
+ 44 1 1 1 0 1 51 58 59 52
+ 45 1 1 1 0 1 58 65 66 59
+ 46 1 1 1 0 1 65 72 73 66
+ 47 1 1 1 0 1 72 79 80 73
+ 48 1 1 1 0 1 79 15 16 80
+ 49 1 1 1 0 1 27 38 39 26
+ 50 1 1 1 0 1 38 45 46 39
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 51 1 1 1 0 1 45 52 53 46
+ 52 1 1 1 0 1 52 59 60 53
+ 53 1 1 1 0 1 59 66 67 60
+ 54 1 1 1 0 1 66 73 74 67
+ 55 1 1 1 0 1 73 80 81 74
+ 56 1 1 1 0 1 80 16 17 81
+ 57 1 1 1 0 1 26 39 25 18
+ 58 1 1 1 0 1 39 46 24 25
+ 59 1 1 1 0 1 46 53 23 24
+ 60 1 1 1 0 1 53 60 22 23
+ 61 1 1 1 0 1 60 67 21 22
+ 62 1 1 1 0 1 67 74 20 21
+ 63 1 1 1 0 1 74 81 19 20
+ 64 1 1 1 0 1 81 17 10 19
+LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 4.9530 0.0000 0.0000 0.00 0.00 0.00
+ 2 4.9530 0.0000 5.1750 0.00 0.00 0.00
+ 3 4.9530 0.0000 0.64687 0.00 0.00 0.00
+ 4 4.9530 0.0000 1.2937 0.00 0.00 0.00
+ 5 4.9530 0.0000 1.9406 0.00 0.00 0.00
+ 6 4.9530 0.0000 2.5875 0.00 0.00 0.00
+ 7 4.9530 0.0000 3.2344 0.00 0.00 0.00
+ 8 4.9530 0.0000 3.8812 0.00 0.00 0.00
+ 9 4.9530 0.0000 4.5281 0.00 0.00 0.00
+ 10 0.0000 4.9530 5.1750 0.00 0.00 0.00
+ 11 4.8578 0.96628 5.1750 0.00 0.00 0.00
+ 12 4.5760 1.8954 5.1750 0.00 0.00 0.00
+ 13 4.1183 2.7517 5.1750 0.00 0.00 0.00
+ 14 3.5023 3.5023 5.1750 0.00 0.00 0.00
+ 15 2.7517 4.1183 5.1750 0.00 0.00 0.00
+ 16 1.8954 4.5760 5.1750 0.00 0.00 0.00
+ 17 0.96628 4.8578 5.1750 0.00 0.00 0.00
+ 18 0.0000 4.9530 0.0000 0.00 0.00 0.00
+ 19 0.0000 4.9530 4.5281 0.00 0.00 0.00
+ 20 0.0000 4.9530 3.8812 0.00 0.00 0.00
+ 21 0.0000 4.9530 3.2344 0.00 0.00 0.00
+ 22 0.0000 4.9530 2.5875 0.00 0.00 0.00
+ 23 0.0000 4.9530 1.9406 0.00 0.00 0.00
+ 24 0.0000 4.9530 1.2937 0.00 0.00 0.00
+ 25 0.0000 4.9530 0.64688 0.00 0.00 0.00
+ 26 0.96628 4.8578 0.0000 0.00 0.00 0.00
+ 27 1.8954 4.5760 0.0000 0.00 0.00 0.00
+ 28 2.7517 4.1183 0.0000 0.00 0.00 0.00
+ 29 3.5023 3.5023 0.0000 0.00 0.00 0.00
+ 30 4.1183 2.7517 0.0000 0.00 0.00 0.00
+ 31 4.5760 1.8954 0.0000 0.00 0.00 0.00
+ 32 4.8578 0.96628 0.0000 0.00 0.00 0.00
+ 33 4.8578 0.96628 0.64687 0.00 0.00 0.00
+ 34 4.5760 1.8954 0.64688 0.00 0.00 0.00
+ 35 4.1183 2.7517 0.64688 0.00 0.00 0.00
+ 36 3.5023 3.5023 0.64688 0.00 0.00 0.00
+ 37 2.7517 4.1183 0.64688 0.00 0.00 0.00
+ 38 1.8954 4.5760 0.64688 0.00 0.00 0.00
+ 39 0.96628 4.8578 0.64688 0.00 0.00 0.00
+ 40 4.8578 0.96628 1.2937 0.00 0.00 0.00
+ 41 4.5760 1.8954 1.2937 0.00 0.00 0.00
+ 42 4.1183 2.7517 1.2937 0.00 0.00 0.00
+ 43 3.5023 3.5023 1.2937 0.00 0.00 0.00
+ 44 2.7517 4.1183 1.2938 0.00 0.00 0.00
+ 45 1.8954 4.5760 1.2938 0.00 0.00 0.00
+ 46 0.96628 4.8578 1.2937 0.00 0.00 0.00
+ 47 4.8578 0.96628 1.9406 0.00 0.00 0.00
+ 48 4.5760 1.8954 1.9406 0.00 0.00 0.00
+ 49 4.1183 2.7517 1.9406 0.00 0.00 0.00
+ 50 3.5023 3.5023 1.9406 0.00 0.00 0.00
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 51 2.7517 4.1183 1.9406 0.00 0.00 0.00
+ 52 1.8954 4.5760 1.9406 0.00 0.00 0.00
+ 53 0.96628 4.8578 1.9406 0.00 0.00 0.00
+ 54 4.8578 0.96628 2.5875 0.00 0.00 0.00
+ 55 4.5760 1.8954 2.5875 0.00 0.00 0.00
+ 56 4.1183 2.7517 2.5875 0.00 0.00 0.00
+ 57 3.5023 3.5023 2.5875 0.00 0.00 0.00
+ 58 2.7517 4.1183 2.5875 0.00 0.00 0.00
+ 59 1.8954 4.5760 2.5875 0.00 0.00 0.00
+ 60 0.96628 4.8578 2.5875 0.00 0.00 0.00
+ 61 4.8578 0.96628 3.2344 0.00 0.00 0.00
+ 62 4.5760 1.8954 3.2344 0.00 0.00 0.00
+ 63 4.1183 2.7517 3.2344 0.00 0.00 0.00
+ 64 3.5023 3.5023 3.2344 0.00 0.00 0.00
+ 65 2.7517 4.1183 3.2344 0.00 0.00 0.00
+ 66 1.8954 4.5760 3.2344 0.00 0.00 0.00
+ 67 0.96628 4.8578 3.2344 0.00 0.00 0.00
+ 68 4.8578 0.96628 3.8812 0.00 0.00 0.00
+ 69 4.5760 1.8954 3.8812 0.00 0.00 0.00
+ 70 4.1183 2.7517 3.8813 0.00 0.00 0.00
+ 71 3.5023 3.5023 3.8813 0.00 0.00 0.00
+ 72 2.7517 4.1183 3.8813 0.00 0.00 0.00
+ 73 1.8954 4.5760 3.8813 0.00 0.00 0.00
+ 74 0.96628 4.8578 3.8813 0.00 0.00 0.00
+ 75 4.8578 0.96628 4.5281 0.00 0.00 0.00
+ 76 4.5760 1.8954 4.5281 0.00 0.00 0.00
+ 77 4.1183 2.7517 4.5281 0.00 0.00 0.00
+ 78 3.5023 3.5023 4.5281 0.00 0.00 0.00
+ 79 2.7517 4.1183 4.5281 0.00 0.00 0.00
+ 80 1.8954 4.5760 4.5281 0.00 0.00 0.00
+ 81 0.96628 4.8578 4.5281 0.00 0.00 0.00
+
Application of symmetric boundary conditions for simplified model.
+# Select nodes by location and apply BC.
+def define_bc():
+ # Select nodes by location and apply BC.
+ mapdl.nsel("S", "LOC", "X", 0)
+ mapdl.dsym("SYMM", "X", 0)
+ mapdl.nsel("S", "LOC", "Y", 0)
+ mapdl.dsym("SYMM", "Y", 0)
+ mapdl.nsel("S", "LOC", "Z", 0)
+ mapdl.dsym("SYMM", "Z", 0)
+ mapdl.nsel("ALL")
+
+
+define_bc()
+
Apply the force of \(F = (100/4) lb\) in the y-direction.
+# Define loads.
+def define_loads():
+ # Parametrization of the :math:`F` load for the quarter of the model.
+ force = 100 / 4
+
+ # Application of the load to the model.
+ mapdl.fk(top_keypoint, "FY", -force)
+ mapdl.finish()
+
+
+define_loads()
+
Enter solution mode and solve the system. Print the solver output.
+def solve_procedure():
+ mapdl.run("/solu")
+ out = mapdl.solve()
+ mapdl.finish()
+ return out
+
+
+simulation_info = solve_procedure()
+print(simulation_info)
+
***** MAPDL SOLVE COMMAND *****
+
+ TRANSFER SOLID MODEL BOUNDARY CONDITIONS TO FINITE ELEMENT MODEL
+ FORCES TRANSFERRED FROM KEYPOINTS = 1
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS SHELL181. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED AND KEYOPT(3)=2 IS SUGGESTED FOR
+ HIGHER ACCURACY OF MEMBRANE STRESSES; OTHERWISE, KEYOPT(3)=0 IS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Present time 0 is less than or equal to the previous time. Time will
+ default to 1.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 1
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+ FOR THE LAST SUBSTEP
+
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Predictor is ON by default for structural elements with rotational
+ degrees of freedom. Use the PRED,OFF command to turn the predictor
+ OFF if it adversely affects the convergence.
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 596623.888 at element 0.
+ Minimum = 596623.886 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL181 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 407, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Sparse solver maximum pivot= 0 at node 0 .
+ Sparse solver minimum pivot= 0 at node 0 .
+ Sparse solver minimum pivot in absolute value= 0 at node 0 .
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL181 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL181 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 1
+ *** TIME = 1.00000 TIME INC = 1.00000 NEW TRIANG MATRIX
+
Enter post-processing for the model with elements shell181
.
+Plotting nodal displacement.
+Get the the radial displacement at the node where force F is applied.
# Start post-processing mode.
+def post_processing():
+ mapdl.post1()
+ mapdl.set(1)
+
+
+post_processing()
+
Plot nodal displacement using PyVista.
+def plot_nodal_disp():
+ mapdl.post_processing.plot_nodal_displacement(
+ title="Nodal Displacements",
+ component="Y",
+ cpos="zx",
+ scalar_bar_args={"title": "Nodal Displacements", "vertical": True},
+ show_node_numbering=True,
+ show_axes=True,
+ show_edges=True,
+ )
+
+
+plot_nodal_disp()
+
To determine the radial displacement \(\delta\) at the point
+where F is applied, we can use Mapdl.get_value
.
def get_displacements():
+ # Select keypoint by its number ``top_keypoint``.
+ mapdl.ksel("S", vmin=top_keypoint)
+
+ # Select the node associated with the selected keypoint.
+ mapdl.nslk()
+
+ # Get the number of the selected node by :meth:`Mapdl.get <ansys.mapdl.core.Mapdl.get>`
+ top_node = int(mapdl.get("_", "node", 0, "num", "max"))
+
+ # Define radial displacement at the node where F is applied.
+ deflect_shell = mapdl.get_value(
+ entity="node", entnum=top_node, item1="u", it1num="y"
+ )
+
+ return top_node, deflect_shell
+
+
+# Call the function and get the value of the deflection.
+top_node_181, deflect_shell_181 = get_displacements()
+print(
+ f"Number of the node attached to the top keypoint: {top_node_181},\n"
+ f"Radial displacement: {(round(deflect_shell_181, 4))}"
+)
+
Number of the node attached to the top keypoint: 18,
+Radial displacement: -0.11
+
Perform the simulation again using the element type SHELL281.
+LIST ALL SELECTED ELEMENTS. (LIST NODES)
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 1 1 1 1 0 1 1 4 73 63 3 72 65 64
+ 2 1 1 1 0 1 4 6 95 73 5 94 87 72
+ 3 1 1 1 0 1 6 8 117 95 7 116 109 94
+ 4 1 1 1 0 1 8 10 139 117 9 138 131 116
+ 5 1 1 1 0 1 10 12 161 139 11 160 153 138
+ 6 1 1 1 0 1 12 14 183 161 13 182 175 160
+ 7 1 1 1 0 1 14 16 205 183 15 204 197 182
+ 8 1 1 1 0 1 16 2 20 205 17 19 219 204
+ 9 1 1 1 0 1 63 73 75 61 65 74 66 62
+ 10 1 1 1 0 1 73 95 97 75 87 96 88 74
+ 11 1 1 1 0 1 95 117 119 97 109 118 110 96
+ 12 1 1 1 0 1 117 139 141 119 131 140 132 118
+ 13 1 1 1 0 1 139 161 163 141 153 162 154 140
+ 14 1 1 1 0 1 161 183 185 163 175 184 176 162
+ 15 1 1 1 0 1 183 205 207 185 197 206 198 184
+ 16 1 1 1 0 1 205 20 22 207 219 21 220 206
+ 17 1 1 1 0 1 61 75 77 59 66 76 67 60
+ 18 1 1 1 0 1 75 97 99 77 88 98 89 76
+ 19 1 1 1 0 1 97 119 121 99 110 120 111 98
+ 20 1 1 1 0 1 119 141 143 121 132 142 133 120
+ 21 1 1 1 0 1 141 163 165 143 154 164 155 142
+ 22 1 1 1 0 1 163 185 187 165 176 186 177 164
+ 23 1 1 1 0 1 185 207 209 187 198 208 199 186
+ 24 1 1 1 0 1 207 22 24 209 220 23 221 208
+ 25 1 1 1 0 1 59 77 79 57 67 78 68 58
+ 26 1 1 1 0 1 77 99 101 79 89 100 90 78
+ 27 1 1 1 0 1 99 121 123 101 111 122 112 100
+ 28 1 1 1 0 1 121 143 145 123 133 144 134 122
+ 29 1 1 1 0 1 143 165 167 145 155 166 156 144
+ 30 1 1 1 0 1 165 187 189 167 177 188 178 166
+ 31 1 1 1 0 1 187 209 211 189 199 210 200 188
+ 32 1 1 1 0 1 209 24 26 211 221 25 222 210
+ 33 1 1 1 0 1 57 79 81 55 68 80 69 56
+ 34 1 1 1 0 1 79 101 103 81 90 102 91 80
+ 35 1 1 1 0 1 101 123 125 103 112 124 113 102
+ 36 1 1 1 0 1 123 145 147 125 134 146 135 124
+ 37 1 1 1 0 1 145 167 169 147 156 168 157 146
+ 38 1 1 1 0 1 167 189 191 169 178 190 179 168
+ 39 1 1 1 0 1 189 211 213 191 200 212 201 190
+ 40 1 1 1 0 1 211 26 28 213 222 27 223 212
+ 41 1 1 1 0 1 55 81 83 53 69 82 70 54
+ 42 1 1 1 0 1 81 103 105 83 91 104 92 82
+ 43 1 1 1 0 1 103 125 127 105 113 126 114 104
+ 44 1 1 1 0 1 125 147 149 127 135 148 136 126
+ 45 1 1 1 0 1 147 169 171 149 157 170 158 148
+ 46 1 1 1 0 1 169 191 193 171 179 192 180 170
+ 47 1 1 1 0 1 191 213 215 193 201 214 202 192
+ 48 1 1 1 0 1 213 28 30 215 223 29 224 214
+ 49 1 1 1 0 1 53 83 85 51 70 84 71 52
+ 50 1 1 1 0 1 83 105 107 85 92 106 93 84
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 51 1 1 1 0 1 105 127 129 107 114 128 115 106
+ 52 1 1 1 0 1 127 149 151 129 136 150 137 128
+ 53 1 1 1 0 1 149 171 173 151 158 172 159 150
+ 54 1 1 1 0 1 171 193 195 173 180 194 181 172
+ 55 1 1 1 0 1 193 215 217 195 202 216 203 194
+ 56 1 1 1 0 1 215 30 32 217 224 31 225 216
+ 57 1 1 1 0 1 51 85 48 34 71 86 49 50
+ 58 1 1 1 0 1 85 107 46 48 93 108 47 86
+ 59 1 1 1 0 1 107 129 44 46 115 130 45 108
+ 60 1 1 1 0 1 129 151 42 44 137 152 43 130
+ 61 1 1 1 0 1 151 173 40 42 159 174 41 152
+ 62 1 1 1 0 1 173 195 38 40 181 196 39 174
+ 63 1 1 1 0 1 195 217 36 38 203 218 37 196
+ 64 1 1 1 0 1 217 32 18 36 225 33 35 218
+LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 4.9530 0.0000 0.0000 0.00 0.00 0.00
+ 2 4.9530 0.0000 5.1750 0.00 0.00 0.00
+ 3 4.9530 0.0000 0.32344 0.00 0.00 0.00
+ 4 4.9530 0.0000 0.64687 0.00 0.00 0.00
+ 5 4.9530 0.0000 0.97031 0.00 0.00 0.00
+ 6 4.9530 0.0000 1.2937 0.00 0.00 0.00
+ 7 4.9530 0.0000 1.6172 0.00 0.00 0.00
+ 8 4.9530 0.0000 1.9406 0.00 0.00 0.00
+ 9 4.9530 0.0000 2.2641 0.00 0.00 0.00
+ 10 4.9530 0.0000 2.5875 0.00 0.00 0.00
+ 11 4.9530 0.0000 2.9109 0.00 0.00 0.00
+ 12 4.9530 0.0000 3.2344 0.00 0.00 0.00
+ 13 4.9530 0.0000 3.5578 0.00 0.00 0.00
+ 14 4.9530 0.0000 3.8812 0.00 0.00 0.00
+ 15 4.9530 0.0000 4.2047 0.00 0.00 0.00
+ 16 4.9530 0.0000 4.5281 0.00 0.00 0.00
+ 17 4.9530 0.0000 4.8516 0.00 0.00 0.00
+ 18 0.0000 4.9530 5.1750 0.00 0.00 0.00
+ 19 4.9291 0.48548 5.1750 0.00 0.00 0.00
+ 20 4.8578 0.96628 5.1750 0.00 0.00 0.00
+ 21 4.7397 1.4378 5.1750 0.00 0.00 0.00
+ 22 4.5760 1.8954 5.1750 0.00 0.00 0.00
+ 23 4.3682 2.3348 5.1750 0.00 0.00 0.00
+ 24 4.1183 2.7517 5.1750 0.00 0.00 0.00
+ 25 3.8287 3.1421 5.1750 0.00 0.00 0.00
+ 26 3.5023 3.5023 5.1750 0.00 0.00 0.00
+ 27 3.1421 3.8287 5.1750 0.00 0.00 0.00
+ 28 2.7517 4.1183 5.1750 0.00 0.00 0.00
+ 29 2.3348 4.3682 5.1750 0.00 0.00 0.00
+ 30 1.8954 4.5760 5.1750 0.00 0.00 0.00
+ 31 1.4378 4.7397 5.1750 0.00 0.00 0.00
+ 32 0.96628 4.8578 5.1750 0.00 0.00 0.00
+ 33 0.48548 4.9291 5.1750 0.00 0.00 0.00
+ 34 0.0000 4.9530 0.0000 0.00 0.00 0.00
+ 35 0.0000 4.9530 4.8516 0.00 0.00 0.00
+ 36 0.0000 4.9530 4.5281 0.00 0.00 0.00
+ 37 0.0000 4.9530 4.2047 0.00 0.00 0.00
+ 38 0.0000 4.9530 3.8812 0.00 0.00 0.00
+ 39 0.0000 4.9530 3.5578 0.00 0.00 0.00
+ 40 0.0000 4.9530 3.2344 0.00 0.00 0.00
+ 41 0.0000 4.9530 2.9109 0.00 0.00 0.00
+ 42 0.0000 4.9530 2.5875 0.00 0.00 0.00
+ 43 0.0000 4.9530 2.2641 0.00 0.00 0.00
+ 44 0.0000 4.9530 1.9406 0.00 0.00 0.00
+ 45 0.0000 4.9530 1.6172 0.00 0.00 0.00
+ 46 0.0000 4.9530 1.2937 0.00 0.00 0.00
+ 47 0.0000 4.9530 0.97031 0.00 0.00 0.00
+ 48 0.0000 4.9530 0.64688 0.00 0.00 0.00
+ 49 0.0000 4.9530 0.32344 0.00 0.00 0.00
+ 50 0.48548 4.9291 0.0000 0.00 0.00 0.00
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 51 0.96628 4.8578 0.0000 0.00 0.00 0.00
+ 52 1.4378 4.7397 0.0000 0.00 0.00 0.00
+ 53 1.8954 4.5760 0.0000 0.00 0.00 0.00
+ 54 2.3348 4.3682 0.0000 0.00 0.00 0.00
+ 55 2.7517 4.1183 0.0000 0.00 0.00 0.00
+ 56 3.1421 3.8287 0.0000 0.00 0.00 0.00
+ 57 3.5023 3.5023 0.0000 0.00 0.00 0.00
+ 58 3.8287 3.1421 0.0000 0.00 0.00 0.00
+ 59 4.1183 2.7517 0.0000 0.00 0.00 0.00
+ 60 4.3682 2.3348 0.0000 0.00 0.00 0.00
+ 61 4.5760 1.8954 0.0000 0.00 0.00 0.00
+ 62 4.7397 1.4378 0.0000 0.00 0.00 0.00
+ 63 4.8578 0.96628 0.0000 0.00 0.00 0.00
+ 64 4.9291 0.48548 0.0000 0.00 0.00 0.00
+ 65 4.8578 0.96628 0.32344 0.00 0.00 0.00
+ 66 4.5760 1.8954 0.32344 0.00 0.00 0.00
+ 67 4.1183 2.7517 0.32344 0.00 0.00 0.00
+ 68 3.5023 3.5023 0.32344 0.00 0.00 0.00
+ 69 2.7517 4.1183 0.32344 0.00 0.00 0.00
+ 70 1.8954 4.5760 0.32344 0.00 0.00 0.00
+ 71 0.96628 4.8578 0.32344 0.00 0.00 0.00
+ 72 4.9291 0.48548 0.64687 0.00 0.00 0.00
+ 73 4.8578 0.96628 0.64687 0.00 0.00 0.00
+ 74 4.7397 1.4378 0.64687 0.00 0.00 0.00
+ 75 4.5760 1.8954 0.64687 0.00 0.00 0.00
+ 76 4.3682 2.3348 0.64687 0.00 0.00 0.00
+ 77 4.1183 2.7517 0.64688 0.00 0.00 0.00
+ 78 3.8287 3.1421 0.64688 0.00 0.00 0.00
+ 79 3.5023 3.5023 0.64688 0.00 0.00 0.00
+ 80 3.1421 3.8287 0.64688 0.00 0.00 0.00
+ 81 2.7517 4.1183 0.64688 0.00 0.00 0.00
+ 82 2.3348 4.3682 0.64688 0.00 0.00 0.00
+ 83 1.8954 4.5760 0.64688 0.00 0.00 0.00
+ 84 1.4378 4.7397 0.64688 0.00 0.00 0.00
+ 85 0.96628 4.8578 0.64688 0.00 0.00 0.00
+ 86 0.48548 4.9291 0.64688 0.00 0.00 0.00
+ 87 4.8578 0.96628 0.97031 0.00 0.00 0.00
+ 88 4.5760 1.8954 0.97031 0.00 0.00 0.00
+ 89 4.1183 2.7517 0.97031 0.00 0.00 0.00
+ 90 3.5023 3.5023 0.97031 0.00 0.00 0.00
+ 91 2.7517 4.1183 0.97031 0.00 0.00 0.00
+ 92 1.8954 4.5760 0.97031 0.00 0.00 0.00
+ 93 0.96628 4.8578 0.97031 0.00 0.00 0.00
+ 94 4.9291 0.48548 1.2937 0.00 0.00 0.00
+ 95 4.8578 0.96628 1.2937 0.00 0.00 0.00
+ 96 4.7397 1.4378 1.2937 0.00 0.00 0.00
+ 97 4.5760 1.8954 1.2937 0.00 0.00 0.00
+ 98 4.3682 2.3348 1.2937 0.00 0.00 0.00
+ 99 4.1183 2.7517 1.2937 0.00 0.00 0.00
+ 100 3.8287 3.1421 1.2937 0.00 0.00 0.00
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 101 3.5023 3.5023 1.2937 0.00 0.00 0.00
+ 102 3.1421 3.8287 1.2938 0.00 0.00 0.00
+ 103 2.7517 4.1183 1.2938 0.00 0.00 0.00
+ 104 2.3348 4.3682 1.2938 0.00 0.00 0.00
+ 105 1.8954 4.5760 1.2937 0.00 0.00 0.00
+ 106 1.4378 4.7397 1.2938 0.00 0.00 0.00
+ 107 0.96628 4.8578 1.2938 0.00 0.00 0.00
+ 108 0.48548 4.9291 1.2938 0.00 0.00 0.00
+ 109 4.8578 0.96628 1.6172 0.00 0.00 0.00
+ 110 4.5760 1.8954 1.6172 0.00 0.00 0.00
+ 111 4.1183 2.7517 1.6172 0.00 0.00 0.00
+ 112 3.5023 3.5023 1.6172 0.00 0.00 0.00
+ 113 2.7517 4.1183 1.6172 0.00 0.00 0.00
+ 114 1.8954 4.5760 1.6172 0.00 0.00 0.00
+ 115 0.96628 4.8578 1.6172 0.00 0.00 0.00
+ 116 4.9291 0.48548 1.9406 0.00 0.00 0.00
+ 117 4.8578 0.96628 1.9406 0.00 0.00 0.00
+ 118 4.7397 1.4378 1.9406 0.00 0.00 0.00
+ 119 4.5760 1.8954 1.9406 0.00 0.00 0.00
+ 120 4.3682 2.3348 1.9406 0.00 0.00 0.00
+ 121 4.1183 2.7517 1.9406 0.00 0.00 0.00
+ 122 3.8287 3.1421 1.9406 0.00 0.00 0.00
+ 123 3.5023 3.5023 1.9406 0.00 0.00 0.00
+ 124 3.1421 3.8287 1.9406 0.00 0.00 0.00
+ 125 2.7517 4.1183 1.9406 0.00 0.00 0.00
+ 126 2.3348 4.3682 1.9406 0.00 0.00 0.00
+ 127 1.8954 4.5760 1.9406 0.00 0.00 0.00
+ 128 1.4378 4.7397 1.9406 0.00 0.00 0.00
+ 129 0.96628 4.8578 1.9406 0.00 0.00 0.00
+ 130 0.48548 4.9291 1.9406 0.00 0.00 0.00
+ 131 4.8578 0.96628 2.2641 0.00 0.00 0.00
+ 132 4.5760 1.8954 2.2641 0.00 0.00 0.00
+ 133 4.1183 2.7517 2.2641 0.00 0.00 0.00
+ 134 3.5023 3.5023 2.2641 0.00 0.00 0.00
+ 135 2.7517 4.1183 2.2641 0.00 0.00 0.00
+ 136 1.8954 4.5760 2.2641 0.00 0.00 0.00
+ 137 0.96628 4.8578 2.2641 0.00 0.00 0.00
+ 138 4.9291 0.48548 2.5875 0.00 0.00 0.00
+ 139 4.8578 0.96628 2.5875 0.00 0.00 0.00
+ 140 4.7397 1.4378 2.5875 0.00 0.00 0.00
+ 141 4.5760 1.8954 2.5875 0.00 0.00 0.00
+ 142 4.3682 2.3348 2.5875 0.00 0.00 0.00
+ 143 4.1183 2.7517 2.5875 0.00 0.00 0.00
+ 144 3.8287 3.1421 2.5875 0.00 0.00 0.00
+ 145 3.5023 3.5023 2.5875 0.00 0.00 0.00
+ 146 3.1421 3.8287 2.5875 0.00 0.00 0.00
+ 147 2.7517 4.1183 2.5875 0.00 0.00 0.00
+ 148 2.3348 4.3682 2.5875 0.00 0.00 0.00
+ 149 1.8954 4.5760 2.5875 0.00 0.00 0.00
+ 150 1.4378 4.7397 2.5875 0.00 0.00 0.00
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 151 0.96628 4.8578 2.5875 0.00 0.00 0.00
+ 152 0.48548 4.9291 2.5875 0.00 0.00 0.00
+ 153 4.8578 0.96628 2.9109 0.00 0.00 0.00
+ 154 4.5760 1.8954 2.9109 0.00 0.00 0.00
+ 155 4.1183 2.7517 2.9109 0.00 0.00 0.00
+ 156 3.5023 3.5023 2.9109 0.00 0.00 0.00
+ 157 2.7517 4.1183 2.9109 0.00 0.00 0.00
+ 158 1.8954 4.5760 2.9109 0.00 0.00 0.00
+ 159 0.96628 4.8578 2.9109 0.00 0.00 0.00
+ 160 4.9291 0.48548 3.2344 0.00 0.00 0.00
+ 161 4.8578 0.96628 3.2344 0.00 0.00 0.00
+ 162 4.7397 1.4378 3.2344 0.00 0.00 0.00
+ 163 4.5760 1.8954 3.2344 0.00 0.00 0.00
+ 164 4.3682 2.3348 3.2344 0.00 0.00 0.00
+ 165 4.1183 2.7517 3.2344 0.00 0.00 0.00
+ 166 3.8287 3.1421 3.2344 0.00 0.00 0.00
+ 167 3.5023 3.5023 3.2344 0.00 0.00 0.00
+ 168 3.1421 3.8287 3.2344 0.00 0.00 0.00
+ 169 2.7517 4.1183 3.2344 0.00 0.00 0.00
+ 170 2.3348 4.3682 3.2344 0.00 0.00 0.00
+ 171 1.8954 4.5760 3.2344 0.00 0.00 0.00
+ 172 1.4378 4.7397 3.2344 0.00 0.00 0.00
+ 173 0.96628 4.8578 3.2344 0.00 0.00 0.00
+ 174 0.48548 4.9291 3.2344 0.00 0.00 0.00
+ 175 4.8578 0.96628 3.5578 0.00 0.00 0.00
+ 176 4.5760 1.8954 3.5578 0.00 0.00 0.00
+ 177 4.1183 2.7517 3.5578 0.00 0.00 0.00
+ 178 3.5023 3.5023 3.5578 0.00 0.00 0.00
+ 179 2.7517 4.1183 3.5578 0.00 0.00 0.00
+ 180 1.8954 4.5760 3.5578 0.00 0.00 0.00
+ 181 0.96628 4.8578 3.5578 0.00 0.00 0.00
+ 182 4.9291 0.48548 3.8812 0.00 0.00 0.00
+ 183 4.8578 0.96628 3.8812 0.00 0.00 0.00
+ 184 4.7397 1.4378 3.8812 0.00 0.00 0.00
+ 185 4.5760 1.8954 3.8812 0.00 0.00 0.00
+ 186 4.3682 2.3348 3.8812 0.00 0.00 0.00
+ 187 4.1183 2.7517 3.8812 0.00 0.00 0.00
+ 188 3.8287 3.1421 3.8813 0.00 0.00 0.00
+ 189 3.5023 3.5023 3.8813 0.00 0.00 0.00
+ 190 3.1421 3.8287 3.8813 0.00 0.00 0.00
+ 191 2.7517 4.1183 3.8813 0.00 0.00 0.00
+ 192 2.3348 4.3682 3.8813 0.00 0.00 0.00
+ 193 1.8954 4.5760 3.8813 0.00 0.00 0.00
+ 194 1.4378 4.7397 3.8813 0.00 0.00 0.00
+ 195 0.96628 4.8578 3.8813 0.00 0.00 0.00
+ 196 0.48548 4.9291 3.8813 0.00 0.00 0.00
+ 197 4.8578 0.96628 4.2047 0.00 0.00 0.00
+ 198 4.5760 1.8954 4.2047 0.00 0.00 0.00
+ 199 4.1183 2.7517 4.2047 0.00 0.00 0.00
+ 200 3.5023 3.5023 4.2047 0.00 0.00 0.00
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 201 2.7517 4.1183 4.2047 0.00 0.00 0.00
+ 202 1.8954 4.5760 4.2047 0.00 0.00 0.00
+ 203 0.96628 4.8578 4.2047 0.00 0.00 0.00
+ 204 4.9291 0.48548 4.5281 0.00 0.00 0.00
+ 205 4.8578 0.96628 4.5281 0.00 0.00 0.00
+ 206 4.7397 1.4378 4.5281 0.00 0.00 0.00
+ 207 4.5760 1.8954 4.5281 0.00 0.00 0.00
+ 208 4.3682 2.3348 4.5281 0.00 0.00 0.00
+ 209 4.1183 2.7517 4.5281 0.00 0.00 0.00
+ 210 3.8287 3.1421 4.5281 0.00 0.00 0.00
+ 211 3.5023 3.5023 4.5281 0.00 0.00 0.00
+ 212 3.1421 3.8287 4.5281 0.00 0.00 0.00
+ 213 2.7517 4.1183 4.5281 0.00 0.00 0.00
+ 214 2.3348 4.3682 4.5281 0.00 0.00 0.00
+ 215 1.8954 4.5760 4.5281 0.00 0.00 0.00
+ 216 1.4378 4.7397 4.5281 0.00 0.00 0.00
+ 217 0.96628 4.8578 4.5281 0.00 0.00 0.00
+ 218 0.48548 4.9291 4.5281 0.00 0.00 0.00
+ 219 4.8578 0.96628 4.8516 0.00 0.00 0.00
+ 220 4.5760 1.8954 4.8516 0.00 0.00 0.00
+ 221 4.1183 2.7517 4.8516 0.00 0.00 0.00
+ 222 3.5023 3.5023 4.8516 0.00 0.00 0.00
+ 223 2.7517 4.1183 4.8516 0.00 0.00 0.00
+ 224 1.8954 4.5760 4.8516 0.00 0.00 0.00
+ 225 0.96628 4.8578 4.8516 0.00 0.00 0.00
+
Enter solution mode and solve the system. Print the solver output.
+solve_procedure()
+
***** MAPDL SOLVE COMMAND *****
+
+ TRANSFER SOLID MODEL BOUNDARY CONDITIONS TO FINITE ELEMENT MODEL
+ FORCES TRANSFERRED FROM KEYPOINTS = 1
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ There is no title defined for this analysis.
+
+ *** SELECTION OF ELEMENT TECHNOLOGIES FOR APPLICABLE ELEMENTS ***
+ ---GIVE SUGGESTIONS ONLY---
+
+ ELEMENT TYPE 1 IS SHELL281. IT IS ASSOCIATED WITH ELASTOPLASTIC
+ MATERIALS ONLY. KEYOPT(8)=2 IS SUGGESTED.
+
+
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ S O L U T I O N O P T I O N S
+
+ PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
+ DEGREES OF FREEDOM. . . . . . UX UY UZ ROTX ROTY ROTZ
+ ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
+ GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Present time 0 is less than or equal to the previous time. Time will
+ default to 1.
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ The conditions for direct assembly have been met. No .emat or .erot
+ files will be produced.
+
+ L O A D S T E P O P T I O N S
+
+ LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
+ TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
+ NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 1
+ STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
+ PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
+ DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
+ FOR THE LAST SUBSTEP
+
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Predictor is ON by default for structural elements with rotational
+ degrees of freedom. Use the PRED,OFF command to turn the predictor
+ OFF if it adversely affects the convergence.
+
+
+ Range of element maximum matrix coefficients in global coordinates
+ Maximum = 3034922.21 at element 0.
+ Minimum = 3034922.21 at element 0.
+
+ *** ELEMENT MATRIX FORMULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL281 0.000 0.000000
+ Time at end of element matrix formulation CP = 0.
+
+ SPARSE MATRIX DIRECT SOLVER.
+ Number of equations = 1199, Maximum wavefront = 0
+ Memory available (MB) = 0.0 , Memory required (MB) = 0.0
+
+ Sparse solver maximum pivot= 0 at node 0 .
+ Sparse solver minimum pivot= 0 at node 0 .
+ Sparse solver minimum pivot in absolute value= 0 at node 0 .
+
+ *** ELEMENT RESULT CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL281 0.000 0.000000
+
+ *** NODAL LOAD CALCULATION TIMES
+ TYPE NUMBER ENAME TOTAL CP AVE CP
+
+ 1 64 SHELL281 0.000 0.000000
+ *** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 1
+ *** TIME = 1.00000 TIME INC = 1.00000 NEW TRIANG MATRIX
+
Enter post-processing for the model with elements shell281
.
+Plotting nodal displacement.
+Get the the radial displacement at the node where force F is applied.
post_processing()
+plot_nodal_disp()
+top_node_281, deflect_shell_281 = get_displacements()
+
Now we have the deflections, we can compare them to the expected values +of radial deflection at the node where force \(F\) was applied +for both simulations. The expected value for \(\delta_{\mathrm{shell181}}\) is 0.1139, +and \(\delta_{\mathrm{shell281}}\) is 0.1139.
+# Results obtained by hand-calculations.
+deflect_target_181 = 0.1139
+deflect_target_281 = 0.1139
+
+# Calculate the deviation.
+deflect_ratio_shell_181 = abs(deflect_shell_181) / deflect_target_181
+deflect_ratio_shell_281 = abs(deflect_shell_281) / deflect_target_281
+
+# Print output results.
+output = f"""
+----------------------------------------------------------------------------
+------------------------- VM3 RESULTS COMPARISON ---------------------------
+----------------------------------------------------------------------------
+ | TARGET | Mechanical APDL | RATIO |
+----------------------------------------------------------------------------
+ Deflection, in SHELL181{deflect_target_181:11.4f} {abs(deflect_shell_181):17.4f}
+ {deflect_ratio_shell_181:15.3f}
+ Deflection, in SHELL281{deflect_target_281:11.4f} {abs(deflect_shell_281):17.4f}
+ {deflect_ratio_shell_281:15.3f}
+----------------------------------------------------------------------------
+"""
+print(output)
+
----------------------------------------------------------------------------
+------------------------- VM3 RESULTS COMPARISON ---------------------------
+----------------------------------------------------------------------------
+ | TARGET | Mechanical APDL | RATIO |
+----------------------------------------------------------------------------
+ Deflection, in SHELL181 0.1139 0.1100
+ 0.965
+ Deflection, in SHELL281 0.1139 0.1137
+ 0.998
+----------------------------------------------------------------------------
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 7.438 seconds)
+ + +Note
+Go to the end +to download the full example code
+Two coaxial tubes, the inner one of 1020 CR steel and cross-sectional +area \(A_{\mathrm{s}}\), and the outer one of 2024-T4 aluminum alloy +and of area \(A_{\mathrm{a}}\), are compressed between heavy, flat end plates, +as shown below. Determine the load-deflection curve of the assembly +as it is compressed into the plastic region by an axial displacement. +Assume that the end plates are so stiff that both tubes are shortened by +exactly the same amount.
S. H. Crandall, N. C. Dahl, An Introduction to the Mechanics of Solids, +McGraw-Hill Book Co., Inc., New York, NY, 1959, pg. 180, ex. 5.1.
Static, Plastic Analysis (ANTYPE=0
)
Plastic Straight Pipe Element (PIPE288)
4-Node Finite Strain Shell (SHELL181)
3-D Structural Solid Elements (SOLID185)
\(E_{\mathrm{s}} = 26875000\,psi\)
\(\sigma_{\mathrm{(yp)s}} = 86000\,psi\)
\(E_{\mathrm{a}} = 11000000\,psi\)
\(\sigma_{\mathrm{(yp)a}} = 55000\,psi\)
\(\nu = 0.3\)
\(l = 10\,in\)
\(A_{\mathrm{s}} = 7\,in^2\)
\(A_{\mathrm{a}} = 12\,in^2\)
1st Load Step: \(\delta = 0.032\,in\)
2nd Load Step: \(\delta = 0.050\,in\)
3rd Load Step: \(\delta = 0.100\,in\)
The following tube dimensions, which provide the desired cross-sectional +areas, are arbitrarily chosen:
+Inner (steel) tube: inside radius = 1.9781692 in., wall thickness = 0.5 in.
Outer (aluminum) tube: inside radius = 3.5697185 in., wall thickness = 0.5 in.
The problem can be solved in three ways:
+using PIPE288
- the plastic straight pipe element
using SOLID185
- the 3-D structural solid element
using SHELL181
- the 4-Node Finite Strain Shell
In the SOLID185 and SHELL181 cases, since the problem is axisymmetric,
+only a one element \(\theta\) -sector is modeled. A small angle \(\theta = 6°\)
+is arbitrarily chosen to reasonably approximate the circular boundary
+with straight sided elements.
+The nodes at the boundaries have the UX
(radial) degree of freedom coupled.
+In the SHELL181 model, the nodes at the boundaries additionally have
+the ROTY
degree of freedom coupled.
# sphinx_gallery_thumbnail_path = '_static/vm7_setup.png'
+
Start MAPDL and import Numpy and Pandas libraries.
+from ansys.mapdl.core import launch_mapdl
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+
+# Start MAPDL.
+mapdl = launch_mapdl()
+
Enter verification example mode and the pre-processing routine.
+mapdl.clear()
+mapdl.verify()
+mapdl.prep7(mute=True)
+
Set up the element types .
+# Element type PIPE288.
+mapdl.et(1, "PIPE288")
+
+# Special features are defined by keyoptions of pipe element.
+# KEYOPT(4)(2)
+# Hoop strain treatment:
+# Thick pipe theory.
+mapdl.keyopt(1, 4, 2) # Cubic shape function
+
+# Element type SOLID185.
+mapdl.et(2, "SOLID185")
+
+# Element type SHELL181.
+mapdl.et(3, "SHELL181") # FULL INTEGRATION
+
+# Special features are defined by keyoptions of shell element.
+# KEYOPT(3)(2)
+# Integration option:
+# Full integration with incompatible modes.
+mapdl.keyopt(3, 3, 2)
+
+# Print
+print(mapdl.etlist())
+
LIST ELEMENT TYPES FROM 1 TO 3 BY 1
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEMENT TYPE 1 IS PIPE288 3-D 2-NODE PIPE
+ KEYOPT( 1- 6)= 0 0 0 2 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ ELEMENT TYPE 2 IS SOLID185 3-D 8-NODE STRUCTURAL SOLID
+ KEYOPT( 1- 6)= 0 0 0 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ ELEMENT TYPE 3 IS SHELL181 4-NODE SHELL
+ KEYOPT( 1- 6)= 0 0 2 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY UZ ROTX ROTY ROTZ
+ THREE-DIMENSIONAL MODEL
+
Set up the material properties.
+Young modulus of steel is: \(E_{\mathrm{s}} = 26875000\,psi\),
Yield strength of steel is: \(\sigma_{\mathrm{(yp)s}} = 86000\, psi\),
Young modulus of aluminum is: \(E_{\mathrm{a}} = 11000000\,psi\),
Yield strength of aluminum is: \(\sigma_{\mathrm{(yp)a}} = 55000\,psi\),
Poisson’s ratio is: \(\nu = 0.3\)
# Steel material model.
+# Define Young's moulus and Poisson ratio for steel.
+mapdl.mp("EX", 1, 26.875e6)
+mapdl.mp("PRXY", 1, 0.3)
+
+# Define non-linear material properties for steel.
+mapdl.tb("BKIN", 1, 1)
+mapdl.tbtemp(0)
+mapdl.tbdata(1, 86000, 0)
+
+# Aluminum material model.
+# Define Young's moulus and Poisson ratio for aluminum.
+mapdl.mp("EX", 2, 11e6)
+mapdl.mp("PRXY", 2, 0.3)
+
+# Define non-linear material properties for aluminum.
+mapdl.tb("BKIN", 2, 1)
+mapdl.tbtemp(0)
+mapdl.tbdata(1, 55000, 0)
+
+# Print
+print(mapdl.mplist())
+
LIST MATERIALS 1 TO 2 BY 1
+ PROPERTY= ALL
+
+ MATERIAL NUMBER 1
+
+ TEMP EX
+ 0.2687500E+08
+
+ TEMP PRXY
+ 0.3000000
+
+ MATERIAL NUMBER 2
+
+ TEMP EX
+ 0.1100000E+08
+
+ TEMP PRXY
+ 0.3000000
+
Use Matplotlib library to plot material model curves of steel and aluminum.
+# Define stress - strain properties of the steel.
+steel = {"stress_s": [0, 86000, 86000, 86000], "strain_s": [0, 0.032, 0.1, 0.2]}
+
+# Define yielding strength point of the steel on the curve.
+xp = steel["strain_s"][1]
+yp = steel["stress_s"][1]
+
+# Set up the settings of the steel curve.
+plt.plot(
+ steel["strain_s"],
+ steel["stress_s"],
+ label="1020 CR STEEL",
+ linewidth=2,
+ color="steelblue",
+ linestyle="-",
+ marker="o",
+)
+plt.plot(xp, yp, marker="o")
+
+# Annotation settings
+plt.annotate(
+ r"${(\sigma_{yp})_s}$",
+ xy=(xp, yp),
+ xytext=(0.05, 75000),
+ arrowprops=dict(facecolor="steelblue", shrink=0.05),
+ bbox=dict(facecolor="steelblue", edgecolor="black", boxstyle="round, pad=1"),
+)
+
+# Define stress - strain properties of the aluminum.
+aluminum = {"stress_a": [0, 55000, 55000, 55000], "strain_a": [0, 0.05, 0.1, 0.2]}
+
+# Define yielding strength point of the aluminum on the curve.
+xp = aluminum["strain_a"][1]
+yp = aluminum["stress_a"][1]
+
+# Set up the settings of the aluminum curve.
+plt.plot(
+ aluminum["strain_a"],
+ aluminum["stress_a"],
+ label="2024-T4 Aluminum",
+ linewidth=2,
+ color="sandybrown",
+ linestyle="-",
+ marker="o",
+)
+plt.plot(xp, yp, marker="o")
+
+# Annotation settings
+plt.annotate(
+ r"${(\sigma_{yp})_a}$",
+ xy=(xp, yp),
+ xytext=(0.07, 45000),
+ arrowprops=dict(facecolor="sandybrown", shrink=0.05),
+ bbox=dict(facecolor="sandybrown", edgecolor="black", boxstyle="round, pad=1"),
+)
+
+plt.grid(True)
+plt.legend()
+plt.title("Stress - Strain Curve", fontsize=18)
+plt.show()
+
Set up the cross-section properties for a shell and pipe elements.
+# Shell cross-section for inside tube(steel).
+mapdl.sectype(1, "SHELL")
+
+# Thickness (SHELL181)
+mapdl.secdata(0.5, 1, 0, 5)
+
+# Shell cross-section for outside tube(aluminum).
+mapdl.sectype(2, "SHELL")
+
+# Thickness (SHELL181)
+mapdl.secdata(0.5, 2, 0, 5)
+
+# Define pipe cross-section for inside tube(steel).
+mapdl.sectype(3, "PIPE")
+
+# Outside diameter and wall thickness settings for inside tube(PIPE288).
+mapdl.secdata(4.9563384, 0.5)
+
+# Pipe cross-section for outside tube(aluminum) .
+mapdl.sectype(4, "PIPE")
+
+# Outside diameter and wall thickness settings for outside tube (PIPE288).
+mapdl.secdata(8.139437, 0.5)
+
+# Print the section properties for all sections.
+print(mapdl.slist())
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ LIST SECTION ID SETS 1 TO 4 BY 1
+
+ SECTION ID NUMBER: 1
+ SHELL SECTION TYPE:
+ SHELL SECTION NAME IS:
+ SHELL SECTION DATA SUMMARY:
+ Number of Layers = 1
+ Total Thickness = 0.500000
+
+ Layer Thickness MatID Ori. Angle Num Intg. Pts
+
+ 1 0.5000 1 0.0000 5
+
+ Shell Section is offset to MID surface of Shell
+
+ Section Solution Controls
+ User Transverse Shear Stiffness (11)= 0.0000
+ (22)= 0.0000
+ (12)= 0.0000
+ Added Mass Per Unit Area = 0.0000
+ Hourglass Scale Factor; Membrane = 1.0000
+ Bending = 1.0000
+ Drill Stiffness Scale Factor = 1.0000
+
+ SECTION ID NUMBER: 2
+ SHELL SECTION TYPE:
+ SHELL SECTION NAME IS:
+ SHELL SECTION DATA SUMMARY:
+ Number of Layers = 1
+ Total Thickness = 0.500000
+
+ Layer Thickness MatID Ori. Angle Num Intg. Pts
+
+ 1 0.5000 2 0.0000 5
+
+ Shell Section is offset to MID surface of Shell
+
+ Section Solution Controls
+ User Transverse Shear Stiffness (11)= 0.0000
+ (22)= 0.0000
+ (12)= 0.0000
+ Added Mass Per Unit Area = 0.0000
+ Hourglass Scale Factor; Membrane = 1.0000
+ Bending = 1.0000
+ Drill Stiffness Scale Factor = 1.0000
+
+ SECTION ID NUMBER: 3
+ PIPE SECTION NAME IS:
+ PIPE SECTION DATA SUMMARY:
+ Outside Diameter = 4.9563
+ Thickness = 0.50000
+ Area = 6.9946
+ Iyy = 17.559
+ Torsion Constant = 35.118
+ Shear Correction-yy = 0.50995
+
+ SECTION ID NUMBER: 4
+ PIPE SECTION NAME IS:
+ PIPE SECTION DATA SUMMARY:
+ Outside Diameter = 8.1394
+ Thickness = 0.50000
+ Area = 11.991
+ Iyy = 87.735
+ Torsion Constant = 175.47
+ Shear Correction-yy = 0.50305
+
Set up the nodes and create the elements through the nodes.
+# Generate nodes and elements for PIPE288.
+mapdl.n(1, x=0, y=0, z=0)
+mapdl.n(2, x=0, y=0, z=10)
+
+# Create element for steel(inside) tube cross-section.
+mapdl.mat(1)
+mapdl.secnum(3)
+mapdl.e(1, 2)
+
+# Create element for aluminum(outside) tube cross-section.
+mapdl.mat(2)
+mapdl.secnum(4)
+mapdl.e(1, 2)
+
+# Activate the global cylindrical coordinate system.
+mapdl.csys(1)
+
+# Generate nodes and elements for SOLID185.
+mapdl.n(node=101, x=1.9781692)
+mapdl.n(node=101, x=1.9781692)
+mapdl.n(node=102, x=2.4781692)
+mapdl.n(node=103, x=3.5697185)
+mapdl.n(node=104, x=4.0697185)
+mapdl.n(node=105, x=1.9781692, z=10)
+mapdl.n(node=106, x=2.4781692, z=10)
+mapdl.n(node=107, x=3.5697185, z=10)
+mapdl.n(node=108, x=4.0697185, z=10)
+
+# Generate 2nd set of nodes to form a theta degree slice.
+mapdl.ngen(itime=2, inc=10, node1=101, node2=108, dy=theta)
+
+# Rotate nodal coordinate systems into the active system.
+mapdl.nrotat(node1=101, node2=118, ninc=1)
+
+# Create elements for the inside (steel) tube.
+mapdl.type(2)
+mapdl.mat(1)
+mapdl.e(101, 102, 112, 111, 105, 106, 116, 115)
+
+# Create elements for the outside (aluminum) tube
+mapdl.mat(2)
+mapdl.e(103, 104, 114, 113, 107, 108, 118, 117)
+
+# Generate nodes.
+mapdl.n(node=201, x=2.2281692)
+mapdl.n(node=203, x=2.2281692, z=10)
+mapdl.n(node=202, x=3.8197185)
+mapdl.n(node=204, x=3.8197185, z=10)
+
+# Generate nodes to form a theta degree slice
+mapdl.ngen(itime=2, inc=4, node1=201, node2=204, dy=theta)
+
+# Create element for steel (inside) tube cross-section.
+mapdl.type(3)
+mapdl.secnum(1)
+mapdl.e(203, 201, 205, 207)
+
+# Create element for aluminum (outside) tube cross-section.
+mapdl.secnum(2)
+mapdl.e(204, 202, 206, 208)
+
+# Plot element model to demonstrate the axisymmetric element model.
+cpos = [
+ (19.67899462804619, 17.856836088414664, 22.644135378046194),
+ (2.03485925, 0.21270071036846988, 5.0),
+ (0.0, 0.0, 1.0),
+]
+mapdl.eplot(cpos=cpos)
+
Application of boundary conditions (BC) for simplified axisymmetric model.
+# Apply constraints to the PIPE288 model.
+# Fix all DOFs for bottom end of PIPE288.
+mapdl.d(node=1, lab="ALL")
+
+# Allow only UZ DOF at top end of the PIPE288.
+mapdl.d(node=2, lab="UX", lab2="UY", lab3="ROTX", lab4="ROTY", lab5="ROTZ")
+
+# Apply constraints to SOLID185 and SHELL181 models"
+# Couple nodes at boundary in radial direction for SOLID185.
+mapdl.cp(nset=1, lab="UX", node1=101, node2=111, node3=105, node4=115)
+mapdl.cpsgen(itime=4, nset1=1)
+
+# Couple nodes at boundary in radial direction for the SHELL181.
+mapdl.cp(5, lab="UX", node1=201, node2=205, node3=203, node4=20)
+mapdl.cpsgen(itime=2, nset1=5)
+
+# Couple nodes at boundary in ROTY direction for SHELL181.
+mapdl.cp(7, lab="ROTY", node1=201, node2=205)
+mapdl.cpsgen(itime=4, nset1=7)
+
+# Select only nodes in SOLID185 and SHELL181 models.
+mapdl.nsel(type_="S", item="NODE", vmin=101, vmax=212)
+
+# Select only nodes at theta = 0 from the selected set.
+mapdl.nsel("R", "LOC", "Y", 0)
+
+# Apply symmetry boundary conditions.
+mapdl.dsym("SYMM", "Y", 1)
+
+# Select only nodes in SOLID185 and SHELL181 models.
+mapdl.nsel(type_="S", item="NODE", vmin=101, vmax=212)
+
+# elect nodes at theta from the selected set.
+mapdl.nsel("R", "LOC", "Y", theta)
+
+# Apply symmetry boundary conditions.
+mapdl.dsym("SYMM", "Y", 1)
+
+# Select all nodes and reselect only nodes at Z = 0.
+mapdl.nsel("ALL")
+mapdl.nsel("R", "LOC", "Z", 0)
+
+# Constrain bottom nodes in Z direction.
+mapdl.d("ALL", "UZ", 0)
+
+# Select all nodes.
+mapdl.nsel("ALL")
+mapdl.finish(mute=True)
+
Enter solution mode and solve the system.
+# Start solution procedure.
+mapdl.slashsolu()
+
+# Define solution function.
+def solution(deflect):
+ mapdl.nsel("R", "LOC", "Z", 10)
+ mapdl.d(node="ALL", lab="UZ", value=deflect)
+ mapdl.nsel("ALL")
+ mapdl.solve()
+
+
+# Run each load step to reproduce needed deflection subsequently.
+# Load Step 1
+solution(deflect=defl_ls1)
+
+# Load Step 2
+solution(deflect=defl_ls2)
+
+# Load Step 3
+solution(deflect=defl_ls3)
+mapdl.finish(mute=True)
+
Enter post-processing.
+# Enter the post-processing routine.
+mapdl.post1(mute=True)
+
Set up the function to get load values of each load step of the simplified +axisymmetric model and convert it to the full model.
+def getload():
+
+ # Select the nodes in the PIPE288 element model.
+ mapdl.nsel(type_="S", item="NODE", vmin=1, vmax=2)
+ mapdl.nsel("R", "LOC", "Z", 0)
+
+ # Sum the nodal force contributions of elements.
+ mapdl.fsum()
+
+ # Extrapolation of the force results in the full 360 (deg) model.
+ load_288 = mapdl.get_value("FSUM", 0, "ITEM", "FZ")
+
+ # Select the nodes in the SOLID185 element model.
+ mapdl.nsel(type_="S", item="NODE", vmin=101, vmax=118)
+ mapdl.nsel("R", "LOC", "Z", 0)
+ mapdl.fsum()
+
+ # Get the force value of the simplified model.
+ load_185_theta = mapdl.get_value("FSUM", 0, "ITEM", "FZ")
+
+ # Extrapolation of the force results in the full 360 (deg) model.
+ load_185 = load_185_theta * 360 / theta
+
+ # Select the nodes in the SHELL181 element model.
+ mapdl.nsel("S", "NODE", "", 201, 212)
+ mapdl.nsel("R", "LOC", "Z", 0)
+
+ # Sum the nodal force contributions of elements.
+ mapdl.fsum()
+
+ # Get the force value of the simplified model.
+ load_181_theta = mapdl.get_value("FSUM", 0, "ITEM", "FZ")
+
+ # Extrapolation of the force results in the full 360 (deg) model.
+ load_181 = load_181_theta * 360 / theta
+
+ # Return load results of each element model.
+ return abs(round(load_288, 0)), abs(round(load_185, 0)), abs(round(load_181, 0))
+
Obtain the loads of the model using getload()
function.
# Activate load step 1 and extract load data.
+mapdl.set(1, 1)
+pipe288_ls1, solid185_ls1, shell181_ls1 = getload()
+
+# Activate load step 2 and extract load data.
+mapdl.set(2, 1)
+pipe288_ls2, solid185_ls2, shell181_ls2 = getload()
+
+# Activate load step 3 and extract load data.
+mapdl.set(3, 1)
+pipe288_ls3, solid185_ls3, shell181_ls3 = getload()
+
Finally we have the results of the loads for the simplified axisymmetric model,
+which can be compared with expected target values for models with PIPE288
,
+SOLID185
, and SHELL181
elements. Loads expected for each load step are:
1st load step with deflection \(\delta = 0.032 (in)\) has \(load_1 = 1024400\,(lb)\).
2nd load step with deflection \(\delta = 0.05 (in)\) has \(load_2 = 1262000\,(lb)\).
3rd load step with deflection \(\delta = 0.1 (in)\) has \(load_3 = 1262000\,(lb)\).
target_res = np.asarray(
+ [1024400, 1262000, 1262000, 1024400, 1262000, 1262000, 1024400, 1262000, 1262000]
+)
+
+simulation_res = np.asarray(
+ [
+ pipe288_ls1,
+ pipe288_ls2,
+ pipe288_ls2,
+ solid185_ls1,
+ solid185_ls2,
+ solid185_ls3,
+ shell181_ls1,
+ shell181_ls2,
+ shell181_ls3,
+ ]
+)
+
+main_columns = {
+ "Target": target_res,
+ "Mechanical APDL": simulation_res,
+ "Ratio": list(np.divide(simulation_res, target_res)),
+}
+
+row_tuple = [
+ ("PIPE288", "Load, lb for Deflection = 0.032 in"),
+ ("PIPE288", "Load, lb for Deflection = 0.05 in"),
+ ("PIPE288", "Load, lb for Deflection = 0.1 in"),
+ ("SOLID185", "Load, lb for Deflection = 0.032 in"),
+ ("SOLID185", "Load, lb for Deflection = 0.05 in"),
+ ("SOLID185", "Load, lb for Deflection = 0.1 in"),
+ ("SHELL181", "Load, lb for Deflection = 0.032 in"),
+ ("SHELL181", "Load, lb for Deflection = 0.05 in"),
+ ("SHELL181", "Load, lb for Deflection = 0.1 in"),
+]
+
+index_names = ["Element Type", "Load Step"]
+row_indexing = pd.MultiIndex.from_tuples(row_tuple)
+df = pd.DataFrame(main_columns, index=row_indexing)
+
+df.style.set_caption("Results Comparison",).set_table_styles(
+ [
+ {
+ "selector": "th.col_heading",
+ "props": [
+ ("background-color", "#FFEFD5"),
+ ("color", "black"),
+ ("border", "0.5px solid black"),
+ ("font-style", "italic"),
+ ("text-align", "center"),
+ ],
+ },
+ {
+ "selector": "th.row_heading",
+ "props": [
+ ("background-color", "#FFEFD5"),
+ ("color", "black"),
+ ("border", "0.5px solid black"),
+ ("font-style", "italic"),
+ ("text-align", "center"),
+ ],
+ },
+ {"selector": "td:hover", "props": [("background-color", "#FFF8DC")]},
+ {"selector": "th", "props": [("max-width", "120px")]},
+ {"selector": "", "props": [("border", "0.5px solid black")]},
+ {
+ "selector": "caption",
+ "props": [
+ ("color", "black"),
+ ("font-style", "italic"),
+ ("font-size", "24px"),
+ ("text-align", "center"),
+ ],
+ },
+ ],
+).set_properties(
+ **{
+ "background-color": "#FFFAFA",
+ "color": "black",
+ "border-color": "black",
+ "border-width": "0.5px",
+ "border-style": "solid",
+ "text-align": "center",
+ }
+).format(
+ "{:.3f}"
+)
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.812 seconds)
+ + +Note
+Go to the end +to download the full example code
+Write a user file macro to calculate the distance d
between either nodes
+or keypoints in PREP7
. Define abbreviations for calling the macro and
+verify the parametric expressions by using the macro to calculate
+the distance between nodes \(N_1\) and \(N_2\) and
+between keypoints \(K_3\) and \(K_4\).
None.
Parametric arithmetic.
None.
\(N_{\mathrm{1(x,y,z)}} = 1.5, 2.5, 3.5\)
\(N_{\mathrm{2(x,y,z)}} = -3.7, 4.6, -3\)
\(K_{\mathrm{3(x,y,z)}} = 100, 0, 30\)
\(K_{\mathrm{4(x,y,z)}} = -200,25,80\)
Instead of *CREATE
, *USE
, etc., we have created a class
+Create
with methods that correspond to each type of simulation.
+This class gives a possibility to change coordinates and reuse it.
+The simulation can be checked not just by target values, but also
+with the simple distances’ formula between keypoints as:
\(D = \sqrt[2]{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}\)
+import math
+# Define coordinates for keypoints K3 and K4.
+x1, y1, z1 = 100, 0, 30
+x2, y2, z2 = -200, 25, 80
+dist_kp = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
+print(dist_kp)
+
# sphinx_gallery_thumbnail_path = '_static/vm8_setup.png'
+
Start MAPDL and import Numpy and Pandas libraries.
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Start MAPDL.
+mapdl = launch_mapdl()
+
Enter verification example mode and the pre-processing routine.
+mapdl.clear()
+mapdl.verify()
+mapdl.prep7(mute=True)
+
Identifying the class create
with methods create_kp_method
and
+create_node_method
to calculate and plot the distances between keypoints
+and nodes.
class Create:
+ def __init__(self, p1, p2):
+ # Points Attributes.
+ self.p1 = p1
+ self.p2 = p2
+
+ def kp_distances(self):
+
+ # Define keypoints by coordinates.
+ kp1 = mapdl.k(npt=3, x=self.p1[0], y=self.p1[1], z=self.p1[2])
+ kp2 = mapdl.k(npt=4, x=self.p2[0], y=self.p2[1], z=self.p2[2])
+
+ # Get the distance between keypoints.
+ dist_kp, kx, ky, kz = mapdl.kdist(kp1, kp2)
+
+ # Plot keypoints.
+ mapdl.kplot(
+ show_keypoint_numbering=True,
+ vtk=True,
+ background="grey",
+ show_bounds=True,
+ font_size=26,
+ )
+ return dist_kp
+
+ def node_distances(self):
+
+ # Define nodes by coordinates.
+ node1 = mapdl.n(node=1, x=self.p1[0], y=self.p1[1], z=self.p1[2])
+ node2 = mapdl.n(node=2, x=self.p2[0], y=self.p2[1], z=self.p2[2])
+
+ # Get the distance between nodes.
+ dist_node, node_x, node_y, node_z = mapdl.ndist(node1, node2)
+
+ # Plot nodes.
+ mapdl.nplot(nnum=True, vtk=True, color="grey", show_bounds=True, font_size=26)
+ return dist_node
+
+ @property
+ def p1(self):
+ # Getting value
+ return self._p1
+
+ @p1.setter
+ def p1(self, new_value):
+ # Check the data type:
+ if not isinstance(new_value, list):
+ raise ValueError("The coordinates should be implemented by the list!")
+ # Check the quantity of items:
+ if len(new_value) != 3:
+ raise ValueError(
+ "The coordinates should have three items in the list as [X, Y, Z]"
+ )
+ self._p1 = new_value
+
+ @property
+ def p2(self):
+ return self._p2
+
+ @p2.setter
+ def p2(self, new_value):
+ # Check the data type:
+ if not isinstance(new_value, list):
+ raise ValueError("The coordinates should be implemented by the list!")
+ # Check the quantity of items:
+ if len(new_value) != 3:
+ raise ValueError(
+ "The coordinates should have three items in the list as [X, Y, Z]"
+ )
+ self._p2 = new_value
+
Using already created method for keypoints to get the distance between them +and print out an output. The keypoints have got next coordinates:
+\(K_{\mathrm{3(x,y,z)}} = 100, 0, 30\)
\(K_{\mathrm{4(x,y,z)}} = -200, 25,80\)
Distance between keypoint is: 305.16
+
+
+LIST ALL SELECTED KEYPOINTS. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NO. X,Y,Z LOCATION KESIZE NODE ELEM MAT REAL TYP ESYS
+ 3 100. 0.00 30.0 0.00 0 0 0 0 0 0
+ 4 -200. 25.0 80.0 0.00 0 0 0 0 0 0
+
Using already created method for nodes to get the distance between them and +print out an output. The nodes have got next coordinates:
+\(N_{\mathrm{1(x,y,z)}} = 1.5, 2.5, 3.5\)
\(N_{\mathrm{2(x,y,z)}} = -3.7, 4.6, -3\)
Distance between nodes is: 8.58
+
+
+LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 1.5000 2.5000 3.5000 0.00 0.00 0.00
+ 2 -3.7000 4.6000 -3.0000 0.00 0.00 0.00
+
Finally we have the results of the distances for both simulations, +which can be compared with expected target values:
+1st simulation to get the distance between keypoints \(K_3\) and \(K_4\), +where \(LEN_1 = 305.16\,(in)\)
2nd simulation to get the distance between nodes \(N_1\) and \(N_2\), +where \(LEN_2 = 8.58\,(in)\)
For better representation of the results we can use pandas
dataframe
+with following settings below:
# Define the names of the rows.
+row_names = ["N1 - N2 distance (LEN2)", "K3 - K4 distance (LEN1)"]
+
+# Define the names of the columns.
+col_names = ["Target", "Mechanical APDL", "RATIO"]
+
+# Define the values of the target results.
+target_res = np.asarray([8.5849, 305.16])
+
+# Create an array with outputs of the simulations.
+simulation_res = np.asarray([node_dist, kp_dist])
+
+# Identifying and filling corresponding columns.
+main_columns = {
+ "Target": target_res,
+ "Mechanical APDL": simulation_res,
+ "Ratio": list(np.divide(simulation_res, target_res)),
+}
+
+# Create and fill the output dataframe with pandas.
+df2 = pd.DataFrame(main_columns, index=row_names).round(2)
+
+# Apply settings for the dataframe.
+df2.head()
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.790 seconds)
+ + +Note
+Go to the end +to download the full example code
+A two-spring system is subjected to a force \(F\) as shown below. +Determine the strain energy of the system and +the displacements \(\delta_x\) and \(\delta_y\).
G. N. Vanderplaats, Numerical Optimization Techniques for Engineering +Design with Applications, McGraw-Hill Book Co., Inc., New York, +NY,1984, pp. 72-73, ex. 3-1.
Nonlinear Transient Dynamic Analysis (ANTYPE = 4
)
Spring-damper elements (COMBIN14)
Spring-damper elements (COMBIN40)
\(k_1 = 8\,N/cm\)
\(k_2 = 1\,N/cm\)
\(m = 1\)
\(l = 10\,cm\)
\(F = 5{\sqrt[2]{2}}\,N\)
\(\alpha = 45\,º\)
The solution to this problem is best obtained by adding mass and using
+the “slow dynamics” technique with approximately critical damping.
+Combination elements COMBIN40
are used to provide damping
+in the \(X\) and \(Y\) directions. Approximate damping coefficients
+\(c_x\) and \(c_y\), in the \(X\) and \(Y\) directions respectively,
+are determined from:
\(c_x = \sqrt[2]{k_xm}\)
\(c_y = \sqrt[2]{k_ym}\)
where m is arbitrarily assumed to be unity.
+\(k_x\) and \(k_y\) cannot be known before solving so are approximated
+by \(k_y = k_2 = 1\,N/cm\) and \(k_x = k_y/2 = 0.5\,N/cm\),
+hence \(c_x = 1.41\) and \(c_y = 2.0\). Large deflection analysis is
+performed due to the fact that the resistance to the load is a function of
+the deformed position. POST1
is used to extract results from
+the solution phase.
# sphinx_gallery_thumbnail_path = '_static/vm9_setup.png'
+
Start MAPDL and import Numpy and Pandas libraries.
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Start MAPDL.
+mapdl = launch_mapdl()
+
Enter verification example mode and the pre-processing routine.
+mapdl.clear()
+mapdl.verify()
+mapdl.prep7(mute=True)
+
Parameterization block includes main variables as :
+\(l = 10\,cm\) - spring length.
\(k_1 = 8\,N/cm\) - stiffness of the 1st spring.
\(k_2 = 1\,N/cm\) - stiffness of the 2nd spring.
\(m = 1\) - mass.
\(F = 5\sqrt[2]{2}\,N\) - main load
\(\alpha = 45\,º\) - force angle
\(c_x = \sqrt[2]{k_xm} = 1,41\) - damping coefficient, x-direction.
\(c_y = \sqrt[2]{k_ym} = 2.0\) - damping coefficient, y-direction.
Set up the element types.
+# Element type COMBIN14.
+mapdl.et(1, "COMBIN14")
+
+# Special Features are defined by keyoptions of the element COMBIN14.
+# KEYOPT(3)(2)
+# Degree-of-freedom selection for 2-D and 3-D behavior:
+# 2-D longitudinal spring-damper (2-D elements must lie in an X-Y plane)
+mapdl.keyopt(1, 3, 2)
+
+# Element type COMBIN40.
+mapdl.et(3, "COMBIN40")
+
+# Special features are defined by keyoptions of the element COMBIN40.
+# KEYOPT(3)(1)
+# Element degrees of freedom:
+# UX (Displacement along nodal X axes)
+mapdl.keyopt(3, 3, 1)
+
+# KEYOPT(6)(2)
+# Mass location:
+# Mass at node J
+mapdl.keyopt(3, 6, 2)
+
+# Element type COMBIN40.
+mapdl.et(4, "COMBIN40")
+
+# Special features are defined by keyoptions of the element COMBIN40.
+# KEYOPT(3)(2)
+# Element degrees of freedom:
+# UX (Displacement along nodal X axes)
+mapdl.keyopt(4, 3, 2)
+
+# KEYOPT(6)(2)
+# Mass location:
+# Mass at node J
+mapdl.keyopt(4, 6, 2)
+
+# Print the list of the elements and their attributes.
+print(mapdl.etlist())
+
LIST ELEMENT TYPES FROM 1 TO 4 BY 1
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEMENT TYPE 1 IS COMBIN14 SPRING-DAMPER
+ KEYOPT( 1- 6)= 0 0 2 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ ELEMENT TYPE 3 IS COMBIN40 COMBINATION
+ KEYOPT( 1- 6)= 0 0 1 0 0 2
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ ELEMENT TYPE 4 IS COMBIN40 COMBINATION
+ KEYOPT( 1- 6)= 0 0 2 0 0 2
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY
+ THREE-DIMENSIONAL MODEL
+
Define damping coefficients \(c_x = 1.41\), \(c_y = 2.0\) and +stiffness values \(k_1 = 8\,N/cm\), \(k_2 = 1\,N/cm\) for the +spring elements.
+# Define real constant 1 with stiffness k2.
+mapdl.r(nset=1, r1=k_spring2) # SPRING STIFFNESS = 1
+
+# Define real constant 2 with stiffness k1.
+mapdl.r(nset=2, r1=k_spring1) # SPRING STIFFNESS = 8
+
+# Define real constant 3 with damping coef. in X-direction and mass.
+mapdl.r(nset=3, r2=c_damp_x, r3=mass)
+
+# Define real constant 4 with damping coef. in y-direction and mass.
+mapdl.r(nset=4, r2=c_damp_y, r3=mass)
+
+# Print the real constant list.
+print(mapdl.rlist())
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ LIST REAL SETS 1 TO 4 BY 1
+
+ REAL CONSTANT SET 1 ITEMS 1 TO 6
+ 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000
+
+ REAL CONSTANT SET 2 ITEMS 1 TO 6
+ 8.0000 0.0000 0.0000 0.0000 0.0000 0.0000
+
+ REAL CONSTANT SET 3 ITEMS 1 TO 6
+ 0.0000 1.4100 1.0000 0.0000 0.0000 0.0000
+
+ REAL CONSTANT SET 4 ITEMS 1 TO 6
+ 0.0000 2.0000 1.0000 0.0000 0.0000 0.0000
+
Set up the nodes coordinates using python for
loop.
# Lists with nodes coordinates.
+node_x_coord = [0, 0, 0, -1, 0]
+node_y_coord = [0, 10, 20, 10, 9]
+
+# Create nodes.
+for i in range(0, 5):
+ mapdl.n(node=i + 1, x=node_x_coord[i], y=node_y_coord[i])
+
+# Print the list of the created nodes.
+print(mapdl.nlist())
+
LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 0.0000 0.0000 0.0000 0.00 0.00 0.00
+ 2 0.0000 10.000 0.0000 0.00 0.00 0.00
+ 3 0.0000 20.000 0.0000 0.00 0.00 0.00
+ 4 -1.0000 10.000 0.0000 0.00 0.00 0.00
+ 5 0.0000 9.0000 0.0000 0.00 0.00 0.00
+
Create the elements through the nodes.
+# Create spring element COMBIN14 between nodes 1 nad 2
+# with stiffness k_2 = 1 N/cm.
+mapdl.type(1)
+mapdl.real(1)
+mapdl.e(1, 2)
+
+# Create spring element COMBIN14 between nodes 2 nad 3
+# with stiffness k_1 = 8 N/cm.
+mapdl.type(1)
+mapdl.real(2)
+mapdl.e(2, 3)
+
+# Create spring element COMBIN40 between nodes 4 nad 2
+# with damping coefficient c_x = 1.41.
+mapdl.type(3)
+mapdl.real(3)
+mapdl.e(4, 2)
+
+# Create spring element COMBIN40 between nodes 5 nad 2
+# with damping coefficient c_y = 2.0.
+mapdl.type(4)
+mapdl.real(4)
+mapdl.e(5, 2)
+
+# Print the list of the created elements.
+print(mapdl.elist())
+
LIST ALL SELECTED ELEMENTS. (LIST NODES)
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 1 1 1 1 0 1 1 2
+ 2 1 1 2 0 1 2 3
+ 3 1 3 3 0 1 4 2
+ 4 1 4 4 0 1 5 2
+
Application of boundary conditions (BC) for the spring model.
+# Unselect the node where the force is applied.
+mapdl.nsel("U", "NODE", vmin=2)
+
+# Apply BC to the selected set of the nodes.
+mapdl.d("ALL", "ALL")
+mapdl.nsel("ALL")
+
+# Finish pre-processing mode.
+mapdl.finish(mute=True)
+
Enter solution mode and apply settings for Transient Dynamic Analysis.
+# Starts solution (/solu) mode.
+mapdl.slashsolu()
+
+# Define transient analysis with large deflection setting.
+mapdl.antype("TRANS")
+mapdl.nlgeom("ON")
+
+# Specifies the stepped loading condition within a load step.
+mapdl.kbc(1)
+
+# Apply forces to the node 2.
+mapdl.f(2, "FX", f_x)
+mapdl.f(2, "FY", f_y)
+
+# Uses automatic time stepping.
+mapdl.autots("ON")
+
+# Specifies the number of substeps to be taken this load step.
+mapdl.nsubst(30)
+
+# Controls the solution printout.
+mapdl.outpr("", "LAST")
+mapdl.outpr("VENG", "LAST")
+
+# Sets the time for a load step.
+mapdl.time(15, mute=True)
+
Solve the system , avoiding the printing output.
+# Run the simulation.
+mapdl.solve()
+mapdl.finish(mute=True)
+
Enter post-processing, avoiding the printing output.
+# Enter the post-processing mode.
+mapdl.post1(mute=True)
+
Enter post-processing. To get results of the strain energy and displacements
+in X and Y directions from the node where the force is applied using
+Mapdl.get_value
.
# Defines the data set to be read from the results file by the time-point.
+mapdl.set(time=15)
+
+# Fills a table of element values for further processing for strain energy.
+mapdl.etable("SENE", "SENE")
+
+# Sum all active entries in element stress table.
+mapdl.ssum()
+
+# Get the value of the stain energy of the spring elements.
+strain_energy = mapdl.get_value(entity="SSUM", entnum=0, item1="ITEM", it1num="SENE")
+
+# Prints nodal solution results of the X, Y, and Z structural displacements
+# and vector sum.
+print(mapdl.prnsol("U", "COMP"))
+
+# Get the value of the displacements in X-direction.
+disp_x = mapdl.get_value(entity="NODE", entnum=2, item1="U", it1num="X")
+
+# Get the value of the displacements in Y-direction.
+disp_y = mapdl.get_value(entity="NODE", entnum=2, item1="U", it1num="Y")
+
PRINT U NODAL SOLUTION PER NODE
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** POST1 NODAL DEGREE OF FREEDOM LISTING *****
+
+ LOAD STEP= 1 SUBSTEP= 25
+ TIME= 15.000 LOAD CASE= 0
+
+ THE FOLLOWING DEGREE OF FREEDOM RESULTS ARE IN THE GLOBAL COORDINATE SYSTEM
+
+ NODE UX UY UZ USUM
+ 1 0.0000 0.0000 0.0000 0.0000
+ 2 8.6319 4.5321 0.0000 9.7494
+ 3 0.0000 0.0000 0.0000 0.0000
+ 4 0.0000 0.0000 0.0000 0.0000
+ 5 0.0000 0.0000 0.0000 0.0000
+
+ MAXIMUM ABSOLUTE VALUES
+ NODE 0 0 0 0
+ VALUE 8.6319 4.5321 0.0000 9.7494
+
Finally we have the results of the strain energy and +displacements in \(X\) and \(Y\) directions, which can be compared with +expected target values:
+Strain energy of the system \(U_{\mathrm{(energy)}} = 24.01\;N\,cm\).
Displacement in X-direction \(U_x = 8.631\,cm\).
Displacement in Y-direction \(U_y = 4.533\,cm\).
For better representation of the results we can use pandas
dataframe
+with following settings below:
# Define the names of the rows.
+row_names = ["Strain Energy, N-cm", "Deflection-x , cm", "Deflection-y , cm"]
+
+# Define the names of the columns.
+col_names = ["Target", "Mechanical APDL", "RATIO"]
+
+# Define the values of the target results.
+target_res = np.asarray([24.01, 8.631, 4.533])
+
+# Create an array with outputs of the simulations.
+simulation_res = np.asarray([strain_energy, disp_x, disp_y])
+
+# Identifying and filling corresponding columns.
+main_columns = {
+ "Target": target_res,
+ "Mechanical APDL": simulation_res,
+ "Ratio": list(np.divide(simulation_res, target_res)),
+}
+
+# Create and fill the output dataframe with pandas.
+df2 = pd.DataFrame(main_columns, index=row_names).round(2)
+
+# Apply settings for the dataframe.
+df2.head()
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 0.419 seconds)
+ + +Note
+Go to the end +to download the full example code
+Find the maximum tensile \(\sigma_{\mathrm{(B,Bot)}}\) and compressive +\(\sigma_{\mathrm{(B,Top)}}\) +bending stresses in an unsymmetrical T-beam subjected to uniform bending \(M_z\), +with dimensions and geometric properties as shown below.
S. H. Crandall, N. C. Dahl, An Introduction to the Mechanics of Solids, +McGraw-Hill Book Co., Inc., New York, NY, 1959, pg. 294, ex. 7.2.
Static Analysis (ANTYPE = 0
)
3-D 2 Node Beam (BEAM188
)
\(E = 30 \cdot 10^6 psi\)
\(\nu = 0.3\)
\(l = 100\,in\)
\(h = 1.5\,in\)
\(b = 8\,in\)
\(M_z = 100,000\,in\,lb\)
A length \((l = 100 in)\) is arbitrarily selected since the bending moment is constant.
+A T-section beam is modeled using flange width \((6b)\),
+flange thickness \((\frac{h}{2})\), overall depth \((2h + \frac{h}{2})\), and
+stem thickness \((b)\), input using Mapdl.secdata
.
# sphinx_gallery_thumbnail_path = '_static/vm10_setup.png'
+
Start MAPDL and import Numpy and Pandas libraries.
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Start MAPDL.
+mapdl = launch_mapdl()
+
Enter verification example mode and the pre-processing routine.
+mapdl.clear()
+mapdl.verify()
+mapdl.prep7(mute=True)
+
Set up the element type BEAM188
.
# Type of analysis: Static.
+mapdl.antype("STATIC")
+
+# Element type: BEAM188.
+mapdl.et(1, "BEAM188")
+
+# Special features are defined by keyoptions of BEAM188:
+
+# KEYOPT(3)
+# Shape functions along the length:
+# Cubic
+mapdl.keyopt(1, 3, 3) # Cubic shape function
+
+# Print the list with currently defined element types.
+print(mapdl.etlist())
+
LIST ELEMENT TYPES FROM 1 TO 1 BY 1
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEMENT TYPE 1 IS BEAM188 3-D 2-NODE BEAM
+ KEYOPT( 1- 6)= 0 0 3 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY UZ ROTX ROTY ROTZ
+ THREE-DIMENSIONAL MODEL
+
Set up the material, where:
+\(E = 30 \cdot 10^6 psi\) - Young Modulus of steel.
\(\nu = 0.3\) - Poisson’s ratio.
# Steel material model.
+# Define Young's moulus and Poisson ratio for steel.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("PRXY", 1, 0.3)
+
+# Print the list of material properties.
+print(mapdl.mplist())
+
LIST MATERIALS 1 TO 1 BY 1
+ PROPERTY= ALL
+
+ MATERIAL NUMBER 1
+
+ TEMP EX
+ 0.3000000E+08
+
+ TEMP PRXY
+ 0.3000000
+
Set up the cross-section properties for a beam elements, where:
+\(w_1 = 6b = 6 \cdot 1.5 = 9\,in\) - flange width.
\(w_2 = 2h + h/2 = 2 \cdot 8 + 8/2 = 20\,in\) - overall depth.
\(t_1 = h/2 = 8/2 = 4\,in\) - flange thickness.
\(t_2 = b = 1.5\,in\) - stem thickness.
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ LIST SECTION ID SETS 1 TO 1 BY 1
+
+ SECTION ID NUMBER: 1
+ BEAM SECTION SUBTYPE: T Section
+ BEAM SECTION NAME IS:
+ BEAM SECTION DATA SUMMARY:
+ Area = 60.000
+ Iyy = 2000.0
+ Iyz =-0.43997E-15
+ Izz = 247.50
+ Warping Constant = 673.35
+ Torsion Constant = 174.86
+ Centroid Y = 0.40146E-16
+ Centroid Z = 4.0000
+ Shear Center Y = 0.28006E-13
+ Shear Center Z = 0.30468
+ Shear Correction-xy = 0.54640
+ Shear Correction-yz =-0.13661E-14
+ Shear Correction-xz = 0.45475
+
+ Beam Section is offset to CENTROID of cross section
+
Set up the nodes and elements. Create nodes between elements.
+# Define nodes for the beam element.
+mapdl.n(1, x=0, y=0)
+mapdl.n(2, x=100, y=0)
+
+# Define one node for the orientation of the beam T-section.
+mapdl.n(3, x=0, y=1)
+
+# Print the list of the created nodes.
+print(mapdl.nlist())
+
LIST ALL SELECTED NODES. DSYS= 0
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ NODE X Y Z THXY THYZ THZX
+ 1 0.0000 0.0000 0.0000 0.00 0.00 0.00
+ 2 100.00 0.0000 0.0000 0.00 0.00 0.00
+ 3 0.0000 1.0000 0.0000 0.00 0.00 0.00
+
Create element between nodes 1 and 2 using node 3 as orientational node.
+# Create element.
+mapdl.e(1, 2, 3)
+
+# Print the list of the elements and their attributes.
+print(mapdl.elist())
+
+# Display elements with their nodes numbers.
+cpos = [
+ (162.20508123980457, 109.41124535475498, 112.95887397446565),
+ (50.0, 0.0, 0.0),
+ (-0.4135015240403764, -0.4134577015789461, 0.8112146563156641),
+]
+
+mapdl.eplot(show_node_numbering=True, line_width=5, cpos=cpos, font_size=40)
+
LIST ALL SELECTED ELEMENTS. (LIST NODES)
+ *****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ELEM MAT TYP REL ESY SEC NODES
+
+ 1 1 1 1 0 1 1 2 3
+
Application of boundary conditions (BC).
+mapdl.d(node=1, lab="ALL", mute=True)
+mapdl.d(node="ALL", lab="UZ", lab2="ROTX", lab3="ROTY", mute=True)
+
Apply a bending moment \(\mathrm{M_{z}}= 100000\,in\,lb\).
+# Parametrization of the bending moment.
+bending_mz = 100000
+
+# Application of the surface load to the beam element.
+mapdl.f(node=2, lab="MZ", value=bending_mz)
+mapdl.finish(mute=True)
+
Enter solution mode and run the simulation.
+# Start solution procedure.
+mapdl.slashsolu()
+
+# Define the number of substeps to be taken this load step.
+mapdl.nsubst(1)
+mapdl.solve(mute=True)
+
Enter post-processing.
+# Enter the post-processing routine.
+mapdl.post1(mute=True)
+
Using Mapdl.etable
get the results of
+the the maximum tensile and compressive bending stresses in
+an unsymmetric T-beam with Mapdl.get_value
.
# Create a table of element values for BEAM188.
+mapdl.etable(lab="STRS_B", item="LS", comp=1)
+mapdl.etable(lab="STRS_T", item="LS", comp=31)
+
+# Get the value of the maximum compressive stress.
+strss_top_compr = mapdl.get_value(
+ entity="ELEM", entnum=1, item1="ETAB", it1num="STRS_T"
+)
+
+# Get the value of the maximum tensile bending stress.
+strss_bot_tens = mapdl.get_value(entity="ELEM", entnum=1, item1="ETAB", it1num="STRS_B")
+
Finally we have the results of the the maximum tensile and +compressive bending stresses, which can be compared with expected target +values:
+maximum tensile bending stress \(\sigma_{\mathrm{(B,Bot)}} = 300\,psi\).
maximum compressive bending stress \(\sigma_{\mathrm{(B,Top)}} = -700\,psi\).
For better representation of the results we can use pandas
dataframe
+with following settings below:
# Define the names of the rows.
+row_names = [
+ "$$Stress - \sigma_{\mathrm{(B,Bot)}},\,psi$$",
+ "$$Stress - \sigma_{\mathrm{(B,Top)}},\,psi$$",
+]
+
+# Define the names of the columns.
+col_names = ["Target", "Mechanical APDL", "RATIO"]
+
+# Define the values of the target results.
+target_res = np.asarray([300, -700])
+
+# Create an array with outputs of the simulations.
+simulation_res = np.asarray([strss_bot_tens, strss_top_compr])
+
+# Identifying and filling corresponding columns.
+main_columns = {
+ "Target": target_res,
+ "Mechanical APDL": simulation_res,
+ "Ratio": list(np.divide(simulation_res, target_res)),
+}
+
+# Create and fill the output dataframe with pandas.
+df2 = pd.DataFrame(main_columns, index=row_names).round(1)
+
+# Apply settings for the dataframe.
+df2.head()
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 0.990 seconds)
+ + +Note
+Go to the end +to download the full example code
+A chain hoist is attached to the ceiling through three tie rods as shown below. +The tie rods are made of cold-rolled steel with yield strength \(\sigma_{yp}\) +and each has an area A. Find the deflection \(\delta\) at load \(F_1\) when +the deflections are elastic in all three rods. When the frame is loaded to \(F_2\) +(where all three rods become fully plastic), and then unloaded, +find the residual stress \(\sigma_r\) in the central rod.
S. H. Crandall, N. C. Dahl, An Introduction to the Mechanics of Solids, +McGraw-Hill Book Co., Inc., New York, NY, 1959, pg. 234, problem 5.31.
Static Analysis (ANTYPE = 0
)
3-D Spar (or Truss) Elements (LINK180
)
\(\sigma_{yp} = 30,000\,psi\)
\(E = 30 \cdot 10^6\,psi\)
\(A = 1\,in^2\)
\(l = 100\,in\)
\(\Theta = 30°\)
\(F_1 = 51,961.5\,lb\)
\(F_2 = 81,961.5\,lb\)
Automatic load stepping (:meth: Mapl.autots <ansys.mapdl.core.Mapdl.autots>,ON) +is used to obtain the nonlinear plastic solution (load steps 2 and 3).
# sphinx_gallery_thumbnail_path = '_static/vm11_setup_1.png'
+
+import math
+
+from ansys.mapdl.core import launch_mapdl
+
Start MAPDL.
+mapdl = launch_mapdl()
+mapdl.clear() # optional as MAPDL just started
+
Enter verification example mode and the pre-processing routine.
+mapdl.verify("vm11")
+mapdl.prep7()
+mapdl.title("VM11 RESIDUAL STRESS PROBLEM", mute=True)
+
Set up the element type LINK180
.
# Type of analysis: Static.
+mapdl.antype("STATIC")
+
+# Element type: LINK180.
+mapdl.et(1, "LINK180")
+mapdl.sectype(1, "LINK")
+mapdl.secdata(1)
+mapdl.mp("EX", 1, 30e6)
+mapdl.tb("PLAS", 1, tbopt="BKIN") # TABLE FOR BILINEAR KINEMATIC HARDENING
+mapdl.tbtemp(100)
+mapdl.tbdata(1, 30000) # YIELD STRESS
+
+# Print
+print(mapdl.mplist())
+
LIST MATERIALS 1 TO 1 BY 1
+ PROPERTY= ALL
+
+ MATERIAL NUMBER 1
+
+ TEMP EX
+ 0.3000000E+08
+
Set up parameters and geometry.
+ +Create elements.
+mapdl.e(1, 4)
+mapdl.e(2, 4)
+mapdl.e(3, 4)
+mapdl.outpr(freq=1)
+mapdl.d(1, "ALL", nend=3)
+mapdl.f(4, "FY", -51961.5) # APPLY LOAD F1
+mapdl.finish(mute=True)
+mapdl.eplot()
+
Enter solution mode and run the simulation.
+mapdl.slashsolu()
+mapdl.solve()
+mapdl.finish(mute=True)
+
Enter post-processing.
+# Enter the post-processing routine.
+mapdl.post1()
+
+q = mapdl.queries
+bot_node = q.node(0, -100, 0)
+def_node = mapdl.get_value("NODE", bot_node, "U", "Y")
+mapdl.finish()
+mapdl.slashsolu()
+mapdl.autots("ON") # TURN ON AUTOMATIC LOAD STEPPING
+mapdl.nsubst(10)
+mapdl.outpr(freq=10)
+mapdl.f(4, "FY", -81961.5) # APPLY LOAD F2
+mapdl.solve()
+mapdl.nsubst(5)
+mapdl.outpr(freq=5)
+mapdl.fdele(4, "FY") # REMOVE LOAD F2
+mapdl.solve()
+mapdl.finish()
+
+
+mapdl.post1()
+mapdl.etable("STRS", "LS", 1)
+strss = mapdl.get_value("ELEM", 2, "ETAB", "STRS")
+message = f"""
+------------------- VM11 RESULTS COMPARISON ---------------------
+ TARGET | TARGET | ANSYS | RATIO
+Def at F1 (in) {-0.07533:.5f} {def_node:.5f} {abs(def_node/0.07533):.5f}
+Stress (psi) {-5650:.5f} {strss:.5f} {abs(strss/-5650):.5f}
+-----------------------------------------------------------------
+"""
+print(message)
+
+mapdl.finish()
+
------------------- VM11 RESULTS COMPARISON ---------------------
+ TARGET | TARGET | ANSYS | RATIO
+Def at F1 (in) -0.07533 -0.07534 1.00011
+Stress (psi) -5650.00000 -5650.34429 1.00006
+-----------------------------------------------------------------
+
+
+EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.071 seconds)
+ + +Note
+Go to the end +to download the full example code
+A vertical bar of length \(l\) is subjected to the action of a +horizontal force F acting at a distance d from the axis of the bar. +Determine the maximum principal stress \(\sigma _{max}\) and the +maximum shear stress \(\tau _ {max}\) in the bar.
Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 299, problem 2.
Static analysis ANTYPE=0
Elastic straight pipe element (PIPE16
)
3D 2 Node pipe element (PIPE288
)
\(E = 30 \cdot 10^6 psi\)
\(u=0.3\)
\(l = 25 l\)
\(d = 3 ft\)
Section modulus \((l/c) = 10 in^3\)
Outer Diameter \(= 4.67017 in\)
Wall Thickness \(= 2.33508 in\)
\(F = 250 lb\)
\(M = Fd = 9000 in-lb\)
Use consistent length units of inches. Real constants for PIPE16 and +section properties for PIPE288 are used to define the pipe Outer Diameter +and Wall Thickness. These values are calculated for a solid cross-section +from the given section modulus. The offset load is applied as a centroidal +force and a moment.
# sphinx_gallery_thumbnail_path = '_static/vm12_setup.png'
+
+from ansys.mapdl.core import launch_mapdl
+import pandas
+
Start MAPDL.
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True)
+mapdl.clear() # optional as MAPDL just started
+
mapdl.verify("vm12")
+mapdl.prep7()
+
+mapdl.antype("STATIC")
+mapdl.et(1, "PIPE16")
+mapdl.r(1, 4.67017, 2.33508) # REAL CONSTANTS FOR SOLID CROSS SECTION
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.3)
+mapdl.n(1)
+mapdl.n(2, "", "", 300)
+mapdl.e(1, 2)
+mapdl.d(1, "ALL")
+mapdl.f(2, "MZ", 9000)
+mapdl.f(2, "FX", -250)
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.slashsolu()
+mapdl.outpr("BASIC", 1)
+
+mapdl.solve()
+mapdl.finish()
+mapdl.post1()
+mapdl.etable("P_STRS", "NMISC", 86)
+mapdl.etable("SHR", "NMISC", 88)
+
STORE SHR FROM ITEM=NMIS COMP= 88 FOR ALL SELECTED ELEMENTS
+
p_stress = mapdl.get("P_STRESS", "ELEM", 1, "ETAB", "P_STRS")
+shear = mapdl.get("SHEAR", "ELEM", 1, "ETAB", "SHR")
+p_trs = shear / 2
+
+# Fill the array with target values
+target_p_stress = 7527
+target_p_trs = 3777
+
+data = [
+ [target_p_stress, p_stress, abs(p_stress / target_p_stress)],
+ [target_p_trs, p_trs, abs(p_trs / target_p_trs)],
+]
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["MAX PRINSTRS psi", "MAX SH STRS psi"]
+
print(pandas.DataFrame(data, row_headers, col_headers))
+
TARGET Mechanical APDL RATIO
+MAX PRINSTRS psi 7527 7526.938790 0.999992
+MAX SH STRS psi 3777 3776.921205 0.999979
+
mapdl.clear("nostart")
+mapdl.prep7()
+mapdl.run("C*** USING PIPE288")
+mapdl.antype("STATIC")
+mapdl.et(1, "PIPE288", "", "", "", 2)
+mapdl.sectype(1, "PIPE")
+mapdl.secdata(4.67017, 2.33508)
+mapdl.keyopt(1, 3, 3) # CUBIC SHAPE FUNCTION
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.3)
+mapdl.n(1)
+mapdl.n(2, "", "", 300)
+mapdl.e(1, 2)
+mapdl.d(1, "ALL")
+mapdl.f(2, "MZ", 9000)
+mapdl.f(2, "FX", -250)
+mapdl.finish()
+
+mapdl.allsel()
+mapdl.eplot()
+
mapdl.slashsolu()
+mapdl.outpr("BASIC", 1)
+mapdl.solve()
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.post1()
+mapdl.set("LAST")
+mapdl.graphics("POWER")
+mapdl.eshape(1)
+mapdl.view(1, 1, 1, 1)
+
+mapdl.show(option="REV", fname="png")
+mapdl.plesol("S", 1)
+mapdl.show("close")
+
+p_stress = mapdl.get("P_STRESS", "PLNSOL", 0, "MAX")
+
+mapdl.show(option="REV", fname="png")
+mapdl.plesol("S", "INT")
+mapdl.show("close")
+
+shear = mapdl.get("SHEAR", "PLNSOL", 0, "MAX")
+p_trs = shear / 2
+
+
+# Fill the array with target values
+target_p_stress = 7527.0
+target_p_trs = 3777.0
+
+data = [
+ [target_p_stress, p_stress, abs(p_stress / target_p_stress)],
+ [target_p_trs, p_trs, abs(p_trs / target_p_trs)],
+]
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["MAX PRINSTRS psi", "MAX SH STRS psi"]
+
print(pandas.DataFrame(data, row_headers, col_headers))
+
+mapdl.finish()
+mapdl.starlist("vm12", "vrt")
+
TARGET Mechanical APDL RATIO
+MAX PRINSTRS psi 7527.0 7526.93994 0.999992
+MAX SH STRS psi 3777.0 3776.92212 0.999979
+
+LISTING OF THE DATA ON FILE
+
+ *** NOTE *** CP = 0.000 TIME= 00:00:00
+ Unable to open *LIST file vm12.vrt.
+
Stop MAPDL.
+mapdl.exit()
+
Total running time of the script: (0 minutes 1.711 seconds)
+ + +Note
+Go to the end +to download the full example code
+A long cylindrical pressure vessel of mean diameter d and wall thickness t has closed +ends and is subjected to an internal pressure P. Determine the axial stress +\(\sigma_y\) and the hoop stress \(\sigma_z\) in the vessel at the +midthickness of the wall.
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 45, article 11.
UGURAL AND FENSTER, ADV. STRENGTH AND APPL. ELAS., 1981.
Static Analysis ANTYPE=0
2-Node Finite Strain Axisymmetric Shell (SHELL208)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(t = 1 in\)
\(d = 120 in\)
\(P = 500 psi\)
An arbitrary axial length of 10 inches is selected. +Nodal coupling is used in the radial direction. An axial +force of 5654866.8 lb (\((Pπd^2)/4\)) is applied to +simulate the closed-end effect.
# sphinx_gallery_thumbnail_path = '_static/vm13_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+
+# Launch MAPDL with specified settings
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear any existing database
+mapdl.clear()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Run the /VERIFY command for VM13
+mapdl.verify("vm13")
+
+# Set the title of the analysis
+mapdl.title("VM13 CYLINDRICAL SHELL UNDER PRESSURE")
+
+# Enter the model creation preprocessor
+mapdl.prep7(mute=True)
+
Use 2-Node Axisymmetric Shell element (SHELL208) and “SHELL” as section type.
+mapdl.et(1, "SHELL208") # Element type SHELL208
+mapdl.sectype(1, "SHELL") # Section type SHELL
+mapdl.secdata(1) # Define section data
+mapdl.secnum(1) # Assign section number
+
SECTION ID NUMBER= 1
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.3)
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1, 60) # Node 1, 60 degrees
+mapdl.n(2, 60, 10) # Node 2, 60 degrees and 10 units in Z-direction
+
+# Define element connectivity
+mapdl.e(1, 2) # Element 1 with nodes 1 and 2
+
1
+
Couple the nodes #1 and 2 in radial direction (rotation around Z-axis). +Fix UY displacement for node 1. Fix ROTZ (rotation around Z-axis) for node 2. +Apply a concentrated force value of 5654866.8 lb in FY direction at node 2. +Internal pressure of 500 psi is applied. Then exit prep7 processor.
+\(P = 500 psi\)
+mapdl.cp(1, "UX", 1, 2) # Couple radial direction (rotation around Z-axis)
+mapdl.d(1, "UY", "", "", "", "", "ROTZ") # Fix UY displacement for node 1
+mapdl.d(2, "ROTZ") # Fix ROTZ (rotation around Z-axis) for node 2
+
+mapdl.f(2, "FY", 5654866.8) # Apply a concentrated force FY to node 2
+mapdl.sfe(1, 1, "PRES", "", 500) # Apply internal pressure of 500 psi to element 1
+
+# Selects all entities
+mapdl.allsel()
+mapdl.eplot()
+
+# Finish the pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+# Controls the solution printout
+mapdl.outpr("ALL", 1)
+# Solve the analysis
+mapdl.solve()
+# Finish the solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing and compute stress components.
+mapdl.post1()
+
+# Create element tables for stress components
+mapdl.etable("STRS_Y", "S", "Y")
+mapdl.etable("STRS_Z", "S", "Z")
+
+# Retrieve element stresses from the element tables using *Get
+stress_y = mapdl.get("STRSS_Y", "ELEM", 1, "ETAB", "STRS_Y")
+stress_z = mapdl.get("STRSS_Z", "ELEM", 1, "ETAB", "STRS_Z")
+
+# Fill the array with target values
+Target_values = np.array([15000, 29749])
+
results = f"""
+------------------- VM13 RESULTS COMPARISON ---------------------
+ RESULT | TARGET | Mechanical APDL | RATIO
+Stress, Y (psi) {Target_values[0]:.5f} {stress_y:.5f} {abs(stress_y/Target_values[0]):.5f}
+Stress, Z (psi) {Target_values[1]:.5f} {stress_z:.5f} {abs(stress_z/Target_values[1]):.5f}
+-----------------------------------------------------------------
+"""
+print(results)
+
------------------- VM13 RESULTS COMPARISON ---------------------
+ RESULT | TARGET | Mechanical APDL | RATIO
+Stress, Y (psi) 15000.00000 15000.00010 1.00000
+Stress, Z (psi) 29749.00000 30000.00000 1.00844
+-----------------------------------------------------------------
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 0.897 seconds)
+ + +Note
+Go to the end +to download the full example code
+Find the deflection \(\delta\) at the middle and the maximum tensile and compressive stresses +in an eccentrically compressed steel strut of length L. The cross-section is a channel +with the dimensions shown in the diagram. The ends are pinned at the point of load application. +The distance between the centroid and the back of the channel is e, and the compressive force F +acts in the plane of the back of the channel and in the symmetry plane of the channel.
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 263, problem 1.
Static, Large Deflection Analysis ANTYPE=0
Elastic Tapered Unsymmetric Beam Elements (BEAM188)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(L = 10 ft\)
\(h = 8 in\)
\(s = 0.22 in\)
\(t = 0.39 in\)
\(e = 0.6465 in\)
\(b = 2.26 in\)
\(F = 4000 lb\)
Only one-half of the structure is modeled because of symmetry. +The boundary conditions for the equivalent half model become fixed-free. +Large deflection is needed since the stiffness of the structure and the +loading change significantly with deflection. The offset e is defined in +the element coordinate system.
# sphinx_gallery_thumbnail_path = '_static/vm14_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import pandas
+
+# Launch MAPDL with specified settings
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear any existing database
+mapdl.clear()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Run the /VERIFY command for VM14
+mapdl.run("/VERIFY,VM14")
+
+# Set the title of the analysis
+mapdl.title("VM14 LARGE DEFLECTION ECCENTRIC COMPRESSION OF SLENDER COLUMN")
+
+# Enter the model creation preprocessor
+mapdl.prep7(mute=True)
+
Use 3D 2-Node Beam element (Beam188) and set cubic shape function Keyopt(3)=3.
+mapdl.et(1, "BEAM188", "", "", 3) # Element type BEAM188
+mapdl.sectype(1, "BEAM", "CHAN") # Section type BEAM CHAN
+mapdl.secdata(2.26, 2.26, 8, 0.39, 0.39, 0.22) # Section data
+mapdl.secoffset("USER", "", 0.6465) # Section offset
+
BEAM SECTION WITH SECTION ID NUMBER 1 IS OFFSET TO
+ OFFSET Y = 0.0000
+ OFFSET Z = 0.64650
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("PRXY", 1, 0.3)
+
MATERIAL 1 PRXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1) # Node 1
+mapdl.n(5, "", 60) # Node 5 at 60 degrees
+
+# Generate additional nodes
+mapdl.fill()
+
+# Define element connectivity
+mapdl.e(1, 2) # Element 1 with nodes 1 and 2
+
+# Generates elements from an existing pattern
+mapdl.egen(4, 1, 1)
+
GENERATE 4 TOTAL SETS OF ELEMENTS WITH NODE INCREMENT OF 1
+ SET IS SELECTED ELEMENTS IN RANGE 1 TO 1 IN STEPS OF 1
+
+ MAXIMUM ELEMENT NUMBER= 4
+
Fix all degrees of freedom for node 1. Apply a negative force 4000 lb in FY +direction at node 5. Apply symmetry boundary condition along z-direction. +Then exit prep7 processor.
+\(F = 4000 lb\)
+mapdl.d(1, "ALL") # Fix all degrees of freedom for node 1
+mapdl.f(5, "FY", -4000) # Apply a negative force FY to node 5
+mapdl.dsym("SYMM", "Z") # Apply symmetry boundary condition in Z-direction
+
+# select all entities
+mapdl.allsel()
+# element plot
+mapdl.eplot()
+
+# Finish the pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Activate large deflections
+mapdl.nlgeom("ON")
+
+# Set convergence tolerances
+mapdl.cnvtol("F", "", 1e-4)
+mapdl.cnvtol("M", "", 1e-4)
+
+mapdl.solve() # starts a solution
+mapdl.finish() # exists solution processor
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components.
+mapdl.post1()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL RESULTS INTERPRETATION (POST1) *****
+
q = mapdl.queries
+end_node = q.node(0, 60, 0)
+
deflection = mapdl.get("DEF", "NODE", end_node, "U", "X") # Nodal deflection
+strss_tens = float(
+ mapdl.get("STS_TENS", "SECR", 1, "S", "X", "MAX")[:11]
+) # Maximum section tensile stress
+strss_comp = float(
+ mapdl.get("STS_COMP", "SECR", 1, "S", "X", "MIN")[:11]
+) # Minimum section compressive stress
+
+# Fill the array with target values
+target_def = 0.1086
+target_tens = 1803.63
+target_comp = -2394.53
+
+data = [
+ [target_def, deflection, target_def / deflection],
+ [target_tens, strss_tens, target_tens / strss_tens],
+ [target_comp, strss_comp, target_comp / strss_comp],
+]
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["DEFLECTION (in)", "STRSS_TENS (psi)", "STRSS_COMP (psi)"]
+
print(pandas.DataFrame(data, row_headers, col_headers))
+
TARGET Mechanical APDL RATIO
+DEFLECTION (in) 0.1086 0.108815 0.998022
+STRSS_TENS (psi) 1803.6300 1807.344880 0.997945
+STRSS_COMP (psi) -2394.5300 -2396.000510 0.999386
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 0.964 seconds)
+ + +Note
+Go to the end +to download the full example code
+A flat circular plate of radius r and thickness t is subject to +various edge constraints and surface loadings. Determine the +deflection \(\delta\) at the middle and the maximum stress \(\sigma_{max}\) +for each case.
+Case 1: Uniform loading \(P\), clamped edge.
Case 2: Concentrated center loading \(F\), clamped edge.
Case 3: Uniform loading \(\frac{P}{4}\), simply supported edge.
S. Timoshenko, Strength of Materials, Part II, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1956, +pg. 96,97, and 103.
Static Analysis ANTYPE=0
2-Node Finite Strain Axisymmetric Shell (SHELL208)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(r = 40.0 in\)
\(t = 1.0 in\)
\(P = 6.0 psi\)
\(F = 7,539.82 lb\)
The stiffness matrix formed in the first load step is automatically reused +in the second load step. A new stiffness matrix is automatically formed in +the third load step because of changed boundary constraints. The mesh density +is biased near the centerline and outer edge to recover stress values near +those points.
# sphinx_gallery_thumbnail_path = '_static/vm15_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import pandas as pd
+
+# Launch MAPDL with specified settings
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear any existing database
+mapdl.clear()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Run the /VERIFY command for VM15
+mapdl.run("/VERIFY,VM15")
+
+# Set the title of the analysis
+mapdl.title("VM15 BENDING OF A CIRCULAR PLATE USING AXISYMMETRIC SHELL ELEMENTS")
+
+# Enter the model creation prep7 preprocessor
+mapdl.prep7(mute=True)
+
Use 2-Node Axisymmetric Shell (SHELL208) and include extra internal node, +via Keyopt(3)=2.
+mapdl.et(1, "SHELL208", "", "", 2) # Element type SHELL208
+mapdl.sectype(1, "SHELL") # Section type SHELL
+mapdl.secdata(1, 1) # Section data
+mapdl.secnum(1) # Section number
+
SECTION ID NUMBER= 1
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6) # Young's modulus
+mapdl.mp("NUXY", 1, 0.3) # Poisson's ratio
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1) # Node 1
+mapdl.n(11, 40) # Node 11 at 40 degrees
+mapdl.n(6, 20) # Node 6 at 20 degrees
+
+# Generate mesh with biased elements
+mapdl.fill(1, 6, 4, "", "", "", "", 20) # BIAS THE MESH TO ALLOW STRESS RECOVERY NEAR
+mapdl.fill(6, 11, 4, "", "", "", "", 0.05) # THE CENTERLINE AND EDGE CONSTRAINTS
+
+# Define element connectivity
+mapdl.e(1, 2) # Element 1 with nodes 1 and 2
+
+# Generates elements from an existing pattern
+mapdl.egen(10, 1, -1)
+
+# select all entities
+mapdl.allsel()
+# element plot
+mapdl.eplot()
+
+# Finish the pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system for three load steps.
+mapdl.slashsolu()
+
+# Set analysis type to static
+mapdl.antype("STATIC")
+
+# Controls the solution printout
+mapdl.outpr("", 1)
+
PRINT BASI ITEMS WITH A FREQUENCY OF 1
+ FOR ALL APPLICABLE ENTITIES
+
Fix all degrees of freedom (dof) at node 11 and fix UX & ROTZ dofs at node 1. +Solve for three load case scenarios as defined.
+Case 1: Apply uniform pressure loading, P = 6 psi near clamped edge. +Case 2: Concentrated center loading F = 7,539.82 lb, clamped edge. +Case 3: Uniform loading P/4, simply supported edge. +Then exit prep7 processor.
+# Apply boundary conditions and loads for CASE 1
+mapdl.d(1, "UX", "", "", "", "ROTZ") # Fix UX and ROTZ for node 1
+mapdl.d(11, "ALL") # Fix all degrees of freedom for node 11
+mapdl.sfe("ALL", 1, "PRES", "", 6) # Surface Pressure load = 6 PSI on all elements
+
+# start solve for 1st load case
+mapdl.solve()
+
+# Apply boundary conditions and loads for Load Case 2
+# Load Case 2: Concentrated Center Loading - Clamped Edge
+mapdl.f(1, "FY", -7539.82) # apply concentrated force FY on node 1
+mapdl.sfe(
+ "ALL", 1, "PRES", "", 0
+) # apply elemental surface pressure load of magnitude "0"
+
+# start solve for 2nd load case
+mapdl.solve()
+
+# Apply boundary conditions and loads for Load Case 3
+# Load Case 3: Uniform Loading - Simply Supported Edge
+mapdl.ddele(11, "ROTZ") # Delete clamped boundary condition constraint
+mapdl.f(1, "FY") # apply nodal force of magnitude "0"
+mapdl.sfe("ALL", 1, "PRES", "", 1.5) # elemental surface pressure load = 1.5 PSI
+
+# start solve for 3rd load case
+mapdl.solve()
+
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components.
+mapdl.post1()
+
+# Set displacement scaling for post-processing
+# mapdl.dscale(1, 35)
+
+# Set up and activate window 1
+mapdl.window(1, -1, 1, -1, -0.333)
+
+# reactivates suppressed printout
+mapdl.gopr()
+
+# Set 1st load case to be read from result file for post-processing
+mapdl.set(1, 1)
+
+mapdl.pldisp(1) # Displays the displaced structure
+mapdl.window(1, "OFF") # Turn off window 1
+mapdl.window(2, -1, 1, -0.333, 0.333, 1) # Turn on window 2
+
+# Don't erase existing displays
+mapdl.run("/NOERASE")
+
NO ERASE OPTION SET
+
q = mapdl.queries
+# Grab node using coordinates and assign it variable to "MID_NODE"
+MID_NODE = q.node(0, 0, 0)
+
# 1st load case, retrieve nodal defection UY for a node assigned to "DEF_C1"
+def_c1 = mapdl.get("DEF_C1", "NODE", MID_NODE, "U", "Y")
+# Define etable for elemental component stress (X)
+mapdl.etable("STRS", "S", "X")
+# using *get command extracting elemental stress via ETAB
+strss_c1 = mapdl.get("STRSS_C1", "ELEM", 10, "ETAB", "STRS")
+
+# Set 2nd load case to be read from result file for post-processing
+mapdl.set(2, 1)
+
+mapdl.pldisp() # Displays the displaced structure
+mapdl.window(2, "OFF") # Turn off window 2
+mapdl.window(3, -1, 1, 0.333, 1, 1) # Turn on window 3
+
+# retrieve nodal defection UY for a node assigned to "DEF_C2"
+def_c2 = mapdl.get("DEF_C2", "NODE", MID_NODE, "U", "Y")
+# Define etable for elemental component stress (X)
+mapdl.etable("STRS", "S", "X")
+# using *get command extracting elemental stress via ETAB
+strss_c2 = mapdl.get("STRSS_C2", "ELEM", 10, "ETAB", "STRS")
+
+# Set 2nd load case to be read from result file for post-processing
+mapdl.set(3, 1)
+
+mapdl.pldisp() # Displays the displaced structure
+# retrieve nodal defection UY for a node assigned to "DEF_C3"
+def_c3 = mapdl.get("DEF_C3", "NODE", MID_NODE, "U", "Y")
+# Define etable for elemental component stress (X)
+mapdl.etable("STRS", "S", "X")
+# using *get command extracting elemental stress via ETAB
+strss_c3 = mapdl.get("STRSS_C3", "ELEM", 1, "ETAB", "STRS")
+
# Set target values
+target_def = [-0.08736, -0.08736, -0.08904]
+target_strss = [7200, 3600, 2970]
+
+# Fill result values
+res_def = [def_c1, def_c2, def_c3]
+res_strss = [strss_c1, strss_c2, strss_c3]
+
+title = f"""
+
+------------------- VM15 RESULTS COMPARISON ---------------------
+"""
+print(title)
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["DEFLECTION (in)", "MAX STRESS (psi)"]
+
+for lc in range(len(res_def)):
+ data = [
+ [target_def[lc], res_def[lc], abs(target_def[lc] / res_def[lc])],
+ [target_strss[lc], abs(res_strss[lc]), abs(target_strss[lc] / res_strss[lc])],
+ ]
+
+ title = f"""
+
+RESULTS FOR CASE {lc+1:1d}:
+-------------------
+
+ """
+ print(title)
+ print(pd.DataFrame(data, row_headers, col_headers))
+
------------------- VM15 RESULTS COMPARISON ---------------------
+
+
+
+RESULTS FOR CASE 1:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+DEFLECTION (in) -0.08736 -0.087641 0.996795
+MAX STRESS (psi) 7200.00000 7040.372800 1.022673
+
+
+RESULTS FOR CASE 2:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+DEFLECTION (in) -0.08736 -0.088273 0.989656
+MAX STRESS (psi) 3600.00000 3568.271970 1.008892
+
+
+RESULTS FOR CASE 3:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+DEFLECTION (in) -0.08904 -0.08911 0.999212
+MAX STRESS (psi) 2970.00000 2966.45447 1.001195
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 1.066 seconds)
+ + +Note
+Go to the end +to download the full example code
+A beam of length \(l\) and height \(h\) is built-in at one end and loaded at the +free end with:
+Case 1: a moment \(M\).
Case 2: a shear force \(F\).
For each case, determine the deflection \(\delta\) at the free end and the bending +stress \(\sigma_{Bend}\) a distance d from the wall at the outside fiber.
+Formulas for Stress and Strain, R. J. Roark, 4th Edition, McGraw-Hill Book Co., Inc., +New York, NY, 1965, pp. 104, 106.
Static Analysis ANTYPE=0
2-D Structural Solid Elements (PLANE42)
2-D 4 Node structural elements(PLANE182)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.0\)
\(l = 10 in\)
\(h = 2.0 in\)
\(d = 1.0 in\)
Case 1, \(M = 2000 in-lb\)
Case 2, \(F = 300 lb\)
The stiffness matrix formed in the first load step is also used in the second +load step (automatically determined by Mechanical APDL). The end moment is +represented by equal and opposite forces separated by a distance h. The bending +stress is obtained from face stresses on element 1.
# sphinx_gallery_thumbnail_path = '_static/vm16_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import pandas as pd
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear the existing database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Run a /VERIFY command to verify the installation
+mapdl.run("/VERIFY,VM16")
+
+# Set the ANSYS version and reference verification manual
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Set the analysis title
+mapdl.title("VM16 BENDING OF A SOLID BEAM (PLANE ELEMENTS)")
+
TITLE=
+ VM16 BENDING OF A SOLID BEAM (PLANE ELEMENTS)
+
Enter the model creation prep7 preprocessor
+mapdl.prep7(mute=True)
+
Use 2-D Structural Solid (PLANE42) and include Surface solution for both faces, +via Keyopt(6)=2.
+mapdl.et(
+ 1, "PLANE42", "", "", "", "", "", 2
+) # PLANE42 WITH SURFACE PRINTOUT FOR FACES 1 AND 3
+
1
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio of 0.0 is specified.
+mapdl.mp("EX", 1, 30e6) # Elastic modulus
+mapdl.mp("NUXY", 1, 0.0) # Poisson's ratio
+
MATERIAL 1 NUXY = 0.000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1)
+mapdl.n(6, 10)
+
+# Generate additional nodes
+mapdl.fill()
+
+# Generates nodes from an existing pattern
+mapdl.ngen(2, 10, 1, 6, 1, "", 2)
+
+# Define elements
+mapdl.e(1, 2, 12, 11)
+
+# Generate additional elements from an existing pattern
+mapdl.egen(5, 1, 1)
+
+# select all entities
+mapdl.allsel()
+# element plot
+mapdl.eplot(background="w")
+
Fix all degrees of freedom (dof) at nodes 10 & 11. +For load case 1, apply end moment and then exit prep7 processor.
+# Set boundary conditions for case 1 (end moment)
+mapdl.d(1, "ALL", "", "", 11, 10) # Displacement constraint
+mapdl.f(6, "FX", 1000) # Applied force
+mapdl.f(16, "FX", -1000) # Applied force
+
+# Finish the pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system for the 1st load case.
+mapdl.slashsolu()
+
+# Set analysis type to static
+mapdl.antype("STATIC")
+
+# start solve for 1st load case
+mapdl.solve()
+
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components for load case 1.
+mapdl.post1()
+
+# Set "last" load case to be read from result file for post-processing
+mapdl.set("LAST")
+
+# Get displacement at node 16 in the Y-direction
+u1 = mapdl.get("U1", "NODE", 16, "U", "Y")
+
+mapdl.graphics("POWER") # Activates the graphics mode for power graphics
+mapdl.eshape(1) # Display element shape
+mapdl.view(1, 1, 1, 1) # Set the viewing options
+
+# for graphics displays
+mapdl.show(option="REV", fname="png")
+mapdl.plnsol("S", "X") # Plot bending stress along the X-axis
+
+# Get maximum bending stress for case 1
+bend_stress1 = mapdl.get("BEND_STRESS1", "PLNSOL", 0, "MAX")
+mapdl.show("close")
+# exists solution processor for case 1
+mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system for the 2nd load case.
+mapdl.slashsolu()
+
***** MAPDL SOLUTION ROUTINE *****
+
For load case 2, apply end load and then solve for 2nd load case.
+mapdl.f(6, "FX", "", "", 16, 10) # Applied force in the X-direction
+mapdl.f(6, "FY", 150, "", 16, 10) # Applied force in the Y-direction
+
+# start solve for 2nd load case
+mapdl.solve()
+# exists solution processor for case 2
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components for load case 2.
+mapdl.post1()
+
+# Set "last" load case to be read from result file for post-processing
+mapdl.set("LAST")
+
+# Retrieves the displacement "U2" of node 16 in the Y direction
+u2 = mapdl.get("U2", "NODE", 16, "U", "Y")
+
+mapdl.graphics("POWER") # Activates the graphics mode for power graphics
+mapdl.eshape(1) # Display element shape
+mapdl.view(1, 1, 1, 1) # Set the viewing options
+
+# for graphics displays
+mapdl.show(option="REV", fname="png")
+mapdl.plnsol("S", "X") # Plot bending stress along the X-axis
+
+# Retrieves the maximum bending stress from the plane stress plot
+bend_stress2 = mapdl.get("BEND_STRESS2", "PLNSOL", 0, "MAX")
+mapdl.show("close")
+
# Set target values
+target_def = [0.00500, 0.00500]
+target_strss = [3000, 4050]
+
+# Fill result values
+res_def = [u1, u2]
+res_strss = [bend_stress1, bend_stress2]
+
+title = f"""
+
+------------------- VM16 RESULTS COMPARISON ---------------------
+
+PLANE42
+=======
+"""
+print(title)
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Deflection (in)", "Bending Stress (psi)"]
+
+for lc in range(len(res_def)):
+ data = [
+ [target_def[lc], res_def[lc], abs(target_def[lc] / res_def[lc])],
+ [target_strss[lc], abs(res_strss[lc]), abs(target_strss[lc] / res_strss[lc])],
+ ]
+
+ title = f"""
+
+RESULTS FOR CASE {lc+1:1d}:
+-------------------
+
+ """
+ print(title)
+ print(pd.DataFrame(data, row_headers, col_headers))
+
------------------- VM16 RESULTS COMPARISON ---------------------
+
+PLANE42
+=======
+
+
+
+RESULTS FOR CASE 1:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) 0.005 0.005 1.0
+Bending Stress (psi) 3000.000 3000.000 1.0
+
+
+RESULTS FOR CASE 2:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) 0.005 0.00505 0.990099
+Bending Stress (psi) 4050.000 4050.00000 1.000000
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.run("/CLEAR,NOSTART")
+
CLEAR MAPDL DATABASE AND RESTART
+
+ Ansys Mechanical Enterprise
+
Switches to the preprocessor (PREP7)
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Use 2-D 4 Node structural elements (PLANE182) and include simplified enhanced +strain formulation, via Keyopt(1)=3.
+# Defines an element type as PLANE182
+mapdl.et(1, "PLANE182")
+# Sets a key option for the element type
+mapdl.keyopt(1, 1, 3)
+
ELEMENT TYPE 1 IS PLANE182 2-D 4-NODE PLANE STRS SOLID
+ KEYOPT( 1- 6)= 3 0 0 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY
+ TWO-DIMENSIONAL MODEL
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio of 0.0 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.0)
+
MATERIAL 1 NUXY = 0.000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+# Defines nodes
+mapdl.n(1)
+mapdl.n(6, 10)
+
+# Generate additional nodes
+mapdl.fill()
+
+# Generates additional nodes from an existing pattern
+mapdl.ngen(2, 10, 1, 6, 1, "", 2)
+
+# Defines elements
+mapdl.e(1, 2, 12, 11)
+
+# Generates additional elements from an existing pattern
+mapdl.egen(5, 1, 1)
+
+# select all entities
+mapdl.allsel()
+# element plot
+mapdl.eplot(background="w")
+
Fix all degrees of freedom (dof) at nodes 10 & 11. +For load case 1, apply end moment and then exit prep7 processor.
+mapdl.d(1, "ALL", "", "", 11, 10)
+# Applies nodal forces
+mapdl.f(6, "FX", 1000)
+mapdl.f(16, "FX", -1000)
+
+# exists solution processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system for the 1st load case.
+mapdl.slashsolu()
+
+# Set analysis type to static
+mapdl.antype("STATIC")
+
+# start solve for 1st load case
+mapdl.solve()
+
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components for load case 1.
+mapdl.post1()
+
+# Sets the LAST result as the active result set
+mapdl.set("LAST")
+
+# Retrieves the displacement "U1" of node 16 in the Y direction
+u1 = mapdl.get("U1", "NODE", 16, "U", "Y")
+
+mapdl.graphics("POWER") # Activates the graphics mode for power graphics
+mapdl.eshape(1) # Display element shape
+mapdl.view(1, 1, 1, 1) # Set the viewing options
+
+# for graphics displays
+mapdl.show(option="REV", fname="png")
+mapdl.plnsol("S", "X") # Plot bending stress along the X-axis
+
+# Retrieves the maximum bending stress from the plane stress plot
+bend_stress1 = mapdl.get("BEND_STRESS1", "PLNSOL", 0, "MAX")
+mapdl.show("close")
+
+# exists solution processor for case 1
+mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system for the 2nd load case.
+mapdl.slashsolu()
+
***** MAPDL SOLUTION ROUTINE *****
+
For load case 2, apply end load and then solve for 2nd load case.
+mapdl.f(6, "FX", "", "", 16, 10)
+mapdl.f(6, "FY", 150, "", 16, 10)
+
+# start solve for 2nd load case
+mapdl.solve()
+# exists solution processor for case 2
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress components for load case 2.
+mapdl.post1()
+
+# Sets the LAST result as the active result set
+mapdl.set("LAST")
+
+# Retrieves the displacement "U2" of node 16 in the Y direction
+u2 = mapdl.get("U2", "NODE", 16, "U", "Y")
+
+mapdl.graphics("POWER") # Activates the graphics mode for power graphics
+mapdl.eshape(1) # Display element shape
+mapdl.view(1, 1, 1, 1) # Set the viewing options
+
+# for graphics displays
+mapdl.show(option="REV", fname="png")
+mapdl.plnsol("S", "X") # Plot bending stress along the X-axis
+
+# Retrieves the maximum bending stress from the plane stress plot
+bend_stress2 = mapdl.get("BEND_STRESS2", "PLNSOL", 0, "MAX")
+mapdl.show("close")
+
# Set target values
+target_def = [0.00500, 0.00500]
+target_strss = [3000, 4050]
+
+# Fill result values
+res_def = [u1, u2]
+res_strss = [bend_stress1, bend_stress2]
+
+title = f"""
+
+PLANE182
+========
+"""
+print(title)
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Deflection (in)", "Bending Stress (psi)"]
+
+for lc in range(len(res_def)):
+ data = [
+ [target_def[lc], res_def[lc], abs(target_def[lc] / res_def[lc])],
+ [target_strss[lc], abs(res_strss[lc]), abs(target_strss[lc] / res_strss[lc])],
+ ]
+
+ title = f"""
+
+RESULTS FOR CASE {lc+1:1d}:
+-------------------
+
+ """
+ print(title)
+ print(pd.DataFrame(data, row_headers, col_headers))
+
PLANE182
+========
+
+
+
+RESULTS FOR CASE 1:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) 0.005 0.005 1.0
+Bending Stress (psi) 3000.000 3000.000 1.0
+
+
+RESULTS FOR CASE 2:
+-------------------
+
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) 0.005 0.00505 0.990099
+Bending Stress (psi) 4050.000 4050.00000 1.000000
+
mapdl.finish()
+
+# Exit MAPDL session
+mapdl.exit()
+
Total running time of the script: (0 minutes 3.204 seconds)
+ + +Note
+Go to the end +to download the full example code
+A portion of a horizontal circular ring, built-in at A, is loaded by a vertical (Z) +load F applied at the end B. The ring has a solid circular cross-section of diameter d. +Determine the deflection \(\delta\) at end B, the maximum bending +stress \(\sigma_{Bend}\) , and the maximum torsional shear stress τ.
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, +pg. 412, eq. 241.
Static Analysis ANTYPE=0
Elastic Curved Pipe Element (PIPE18)
3-D 3 Node Pipe Element (PIPE289)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(r = 100 in\)
\(d = 2 in\)
\(\theta = 90°\)
\(F = 50 lb\)
Node 10 is arbitrarily located on the radius of curvature side of the element to define the +plane of the elbow when PIPE18 elements are used. The wall thickness is set to half the diameter +for a solid bar. Since the section has no hole in the middle, ovalization cannot occur and +PIPE289 elements can be used to determine the deflection and stresses.
# sphinx_gallery_thumbnail_path = '_static/vm18_setup1.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Launch MAPDL with specified settings
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear the existing database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command
+mapdl.run("/VERIFY,VM18")
+
+# Set the title of the analysis
+mapdl.title("VM18 OUT-OF-PLANE BENDING OF A CURVED BAR")
+
+# Enter the model creation /Prep7 preprocessor
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Use Elastic Curved Pipe element (PIPE18) and set KEYOPT(6)=2 for printing member forces.
+mapdl.et(1, "PIPE18", "", "", "", "", "", 2)
+
+# Define geometry parameters (OD, wall thickness, radius) using "r" command (real constant)
+mapdl.r(1, 2, 1, 100)
+
REAL CONSTANT SET 1 ITEMS 1 TO 6
+ 2.0000 1.0000 100.00 0.0000 0.0000 0.0000
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio NUXY of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.3)
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+# Define nodes
+mapdl.n(1, 100)
+mapdl.n(2, "", 100)
+mapdl.n(10)
+
+# Define element
+mapdl.e(1, 2, 10)
+
1
+
Fix all dofs at node 1. Specify nodal force F = -50 lb along Z direction at node 2. +Then exit prep7 processor.
+mapdl.d(1, "ALL") # Define boundary conditions
+mapdl.f(2, "FZ", -50) # Define load
+
+# Selects all entities
+mapdl.allsel()
+# Element plot
+mapdl.eplot(vtk=False)
+
+# Finish preprocessing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+
+# Set output options
+mapdl.outpr("BASIC", 1)
+
+# Perform the solution
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress quantities.
+mapdl.post1()
+
+# Set the current results set to the last set to be read from result file
+mapdl.set("LAST")
+
+# Get displacement results at node 2 in the Z direction
+def_z = mapdl.get("DEF", "NODE", 2, "U", "Z")
+
+# Create an element table for bending stresses using ETABLE command
+strs_ben = mapdl.etable("STRS_BEN", "NMISC", 91)
+
+# Create an element table for shear stresses using ETABLE command
+strs_shr = mapdl.etable("STRS_SHR", "LS", 4)
+
+# Get bending stresses (ETAB: STRS_BEN) for element 1
+strss_b = mapdl.get("STRSS_B", "ELEM", 1, "ETAB", "STRS_BEN")
+
+# Get shear stresses (ETAB: STRS_SHR) for element 1
+strss_t = mapdl.get("STRSS_T", "ELEM", 1, "ETAB", "STRS_SHR")
+
# Set target values
+target_val = [-2.648, 6366, -3183]
+
+# Fill result values
+sim_res = [def_z, strss_b, strss_t]
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Deflection (in)", "Stress_Bend (psi)", "Shear Stress (psi)"]
+
+data = [target_val, sim_res, np.abs(target_val) / np.abs(sim_res)]
+
+title = f"""
+
+------------------- VM18 RESULTS COMPARISON ---------------------
+
+PIPE18:
+-------
+"""
+
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
------------------- VM18 RESULTS COMPARISON ---------------------
+
+PIPE18:
+-------
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) -2.648 -2.649729 0.999348
+Stress_Bend (psi) 6366.000 6366.197750 0.999969
+Shear Stress (psi) -3183.000 -3183.098880 0.999969
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.run("/CLEAR,NOSTART")
+
CLEAR MAPDL DATABASE AND RESTART
+
+ Ansys Mechanical Enterprise
+
mapdl.title("VM18 OUT-OF-PLANE BENDING OF A CURVED BAR Using PIPE289 ELEMENT MODEL")
+
TITLE=
+ VM18 OUT-OF-PLANE BENDING OF A CURVED BAR Using PIPE289 ELEMENT MODEL
+
mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Use 3-D 3-Node Pipe element (PIPE289) and set KEYOPT(4)= 2 Thick pipe theory.
+mapdl.et(1, "PIPE289", "", "", "", 2)
+mapdl.sectype(1, "PIPE") # Set section type PIPE
+mapdl.secdata(2, 1, 16) # Set section data (OD, wall thickness)
+
SECTION ID NUMBER: 1
+ PIPE SECTION NAME IS:
+ PIPE SECTION DATA SUMMARY:
+ Outside Diameter = 2.0000
+ Thickness = 1.0000
+ Area = 3.1414
+ Iyy = 0.78529
+ Torsion Constant = 1.5706
+ Shear Correction-yy = 0.86083
+ Num of Circum Cells = 16
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio NUXY of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("NUXY", 1, 0.3)
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.csys(1) # Set coordinate system to 1
+
+mapdl.n(1, 100) # Define nodes
+
+# Generate additional nodes
+mapdl.ngen(19, 1, 1, "", "", "", 5)
+
+# Define element
+mapdl.e(1, 3, 2)
+
+# Generate additional elements from an existing pattern
+mapdl.egen(9, 2, -1)
+
+# Reset coordinate system to global
+mapdl.csys(0)
+
ACTIVE COORDINATE SYSTEM SET TO 0 (CARTESIAN)
+
Fix all dofs at node 1. Specify nodal force F = -50 lb along Z direction at node 19. +Then exit prep7 processor.
+mapdl.d(1, "ALL")
+mapdl.f(19, "FZ", -50)
+
+# Selects all entities
+mapdl.allsel()
+# Element plot
+mapdl.eplot(vtk=False)
+
+# exists pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+
+# Set output options
+mapdl.outpr("BASIC", 1)
+
+# Perform the solution
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflection and stress quantities.
+mapdl.post1()
+
+# Set the current results set to the last set
+mapdl.set("LAST")
+mapdl.graphics("POWER") # Set graphics mode to POWER
+mapdl.eshape(1) # Set element shape
+mapdl.view(1, 1, 1, 1) # Set view
+
+# Get displacement results at node 19 in the Z direction
+def_z = mapdl.get("DEF", "NODE", 19, "U", "Z")
+
+# Create an element table for bending stresses using ETABLE command
+strs_ben = mapdl.etable("STRS_BEN", "SMISC", 35)
+
+# Get bending stresses (ETAB: STRS_BEN) for element 1 using ETABLE command
+strss_b = mapdl.get("STRSS_B", "ELEM", 1, "ETAB", "STRS_BEN")
+
+# for graphics displays
+mapdl.show(option="REV")
+# Plot elemtal solution values for SXY component
+mapdl.plesol("S", "XY")
+# Get minimum shear stress
+shear_sxy = mapdl.get("SHEAR", "PLNSOL", 0, "MIN")
+mapdl.show("close")
+
# Set target values
+target_val = [-2.648, 6366, -3183]
+
+# Fill result values
+sim_res = [def_z, strss_b, shear_sxy]
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Deflection (in)", "Stress_Bend (psi)", "Shear Stress (psi)"]
+
+data = [target_val, sim_res, np.abs(target_val) / np.abs(sim_res)]
+
+title = f"""
+
+PIPE289:
+--------
+"""
+
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
PIPE289:
+--------
+
+ TARGET Mechanical APDL RATIO
+Deflection (in) -2.648 -2.649533 0.999422
+Stress_Bend (psi) 6366.000 -6446.631350 0.987492
+Shear Stress (psi) -3183.000 -3199.472410 0.994852
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 2.144 seconds)
+ + +Note
+Go to the end +to download the full example code
+A long cylindrical membrane container of diameter d and wall thickness t is subjected to a +uniform internal pressure P. Determine the axial stress \(\sigma_1\) and the +hoop stress \(\sigma_2\) in the container. See VM13 for the problem sketch.
S. Timoshenko, Strength of Materials, Part II, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1956, +pg. 121, article 25.
Static Analysis ANTYPE=0
4-Node Finite Strain Shell Elements (SHELL181)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(d = 120 in\)
\(t = 1 in\)
\(p = 500 psi\)
An arbitrary axial length is selected. Since the problem is axisymmetric, only a one element +sector is needed. A small angle \(\theta\) = 10° is used for approximating the circular +boundary with a straight-sided element. Nodal coupling is used at the boundaries. An axial +traction of 15,000 psi is applied to the edge of the element to simulate the closed-end effect. +The internal pressure is applied as an equivalent negative pressure on the exterior (face 1) +of the element.
# sphinx_gallery_thumbnail_path = '_static/vm20_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear the existing database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the VM20 verification
+mapdl.run("/VERIFY,VM20")
+
+# Set the analysis title
+mapdl.title("VM20 CYLINDRICAL MEMBRANE UNDER PRESSURE")
+
+# Enter the model creation /Prep7 preprocessor
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Use 4-Node Structural Shell element (SHELL181) for finite strain membrane. Specify +key option for membrane stiffness only via setting Keyopt(1)=1. Include full integration +via setting Keyopt(3)=2.
+mapdl.et(1, "SHELL181") # Define element type as SHELL181
+mapdl.keyopt(1, 1, 1) # Set key option for membrane stiffness only
+mapdl.keyopt(1, 3, 2) # Set key option for full integration
+mapdl.sectype(1, "SHELL") # Section type SHELL
+mapdl.secdata(1, 1) # Define section data
+
Shell Section ID= 1 Number of layers= 1 Total Thickness= 1.000000
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio NUXY of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6) # Define modulus of elasticity
+mapdl.mp("NUXY", 1, 0.3) # Define Poisson's ratio
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.csys(1) # Define cylindrical coordinate system
+
+mapdl.n(1, 60) # Define nodes
+
+# Define additional node with translation
+mapdl.n(2, 60, "", 10)
+
+# Generate additional nodes from an existing pattern
+mapdl.ngen(2, 2, 1, 2, 1, "", 10)
+
+# Rotate nodal coordinate system to cylindrical
+mapdl.nrotat("ALL")
+
+# Define elements
+mapdl.e(1, 2, 4, 3)
+
1
+
Apply couplings and fix UZ displacement at specific node and UY displacement for all nodes. +Specify axial traction= -15000 psi and internal pressure= -500 psi on elements uaing SFE command. +Then exit prep7 processor.
+mapdl.cp(1, "UX", 1, 2, 3, 4) # Couple radial displacements
+mapdl.cp(2, "UZ", 2, 4) # Couple UZ displacements
+
+mapdl.d(1, "UZ", "", "", 3, 2) # Fix UZ displacement at specific node
+mapdl.d("ALL", "UY") # Fix UY displacement for all nodes
+
+mapdl.sfe(1, 4, "PRES", "", -15000) # Apply axial traction on elements
+mapdl.sfe(1, 1, "PRES", "", -500) # Apply internal pressure on elements
+
+# Selects all entities
+mapdl.allsel()
+# Element plot
+mapdl.eplot(background="w")
+
+# Finish the preprocessing steps
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+
+mapdl.outpr("NSOL", 1) # Output the nodal solution
+mapdl.outpr("RSOL", 1) # Output the result summary
+
+# Perform the solution
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute stress quantities.
+ +# Set target values
+target_stress = [15000, 29749]
+
+# Fill result values
+sim_res = [strs_hop, strs_ax]
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Stress_1 (psi)", "Stress_2 (psi)"]
+
+data = [target_stress, sim_res, np.abs(target_stress) / np.abs(sim_res)]
+
+title = f"""
+
+------------------- VM20 RESULTS COMPARISON ---------------------
+
+"""
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
------------------- VM20 RESULTS COMPARISON ---------------------
+
+
+ TARGET Mechanical APDL RATIO
+Stress_1 (psi) 15000.0 15000.000 1.000000
+Stress_2 (psi) 29749.0 29885.841 0.995421
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 1.006 seconds)
+ + +Note
+Go to the end +to download the full example code
+A tie rod is subjected to the action of a tensile force F and a uniform lateral load p. +Determine the maximum deflection \(z_{max}\), the slope \(\theta\) at the left-hand end, +and the maximum bending moment \(M_{max}\). In addition, determine the same three quantities +for the unstiffened tie rod (F = 0).
S. Timoshenko, Strength of Materials, Part II, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1956, +pg. 42, article 6.
Static, Stress Stiffening Analysis ANTYPE=0
3-D 2 node beam (BEAM188)
\(E = 30 \cdot 10^6 psi\)
\(l = 200 in\)
\(b = h = 2.5 in\)
\(F = 21,972.6 lb\)
\(p = 1.79253 lb/in\)
Due to symmetry, only one-half of the beam is modeled. The full load is applied for each +iteration. The first solution represents the unstiffened case. The second solution represents +the stiffened case.
# sphinx_gallery_thumbnail_path = '_static/vm21_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear the current database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command for VM21
+mapdl.run("/VERIFY,VM21")
+
+# Set the title of the analysis
+mapdl.title("VM21 TIE ROD WITH LATERAL LOADING NO STREES STIFFENING")
+
+# Enter the model creation /Prep7 preprocessor
+mapdl.prep7()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL ANALYSIS DEFINITION (PREP7) *****
+
Use 3-D 2-Node Beam Element and specify cubic shape function via setting Keyopt(3)=3.
+mapdl.et(1, "BEAM188")
+
+mapdl.keyopt(1, 3, 3) # Set KEYOPT(3) to 3 cubic shape function
+mapdl.sectype(1, "BEAM", "RECT") # Specify section properties for the beam element
+mapdl.secdata(2.5, 2.5) # Define section data
+
SECTION ID NUMBER IS: 1
+ BEAM SECTION TYPE IS: Rectangle
+ BEAM SECTION NAME IS:
+ COMPUTED BEAM SECTION DATA SUMMARY:
+ Area = 6.2500
+ Iyy = 3.2552
+ Iyz = 0.33487E-16
+ Izz = 3.2552
+ Warping Constant = 0.23513E-01
+ Torsion Constant = 5.5714
+ Centroid Y = 0.49392E-16
+ Centroid Z = 0.18500E-15
+ Shear Center Y = 0.42122E-16
+ Shear Center Z =-0.13858E-15
+ Shear Correction-xy = 0.84211
+ Shear Correction-yz =-0.22328E-15
+ Shear Correction-xz = 0.84211
+
+ Beam Section is offset to CENTROID of cross section
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’s ratio PRXY of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("PRXY", "", 0.3)
+
MATERIAL 1 PRXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1) # define nodes
+mapdl.n(5, 100)
+
+# Generate additional nodes
+mapdl.fill()
+
+# Define elements
+mapdl.e(1, 2)
+
+# Generate additional elements from an existing pattern
+mapdl.egen(4, 1, 1)
+
GENERATE 4 TOTAL SETS OF ELEMENTS WITH NODE INCREMENT OF 1
+ SET IS SELECTED ELEMENTS IN RANGE 1 TO 1 IN STEPS OF 1
+
+ MAXIMUM ELEMENT NUMBER= 4
+
Apply a displacement boundary condition in the UY, ROTX and ROTZ directions to all nodes. +Specify symmetry degree-of-freedom constraints on nodes, surface normal to X-dir (default). +Apply a tensile force in X-dir, F = -21972.6 lb and a uniform lateral load, p = 1.79253 lb/in. +Then exit prep7 processor.
+mapdl.d("ALL", "UY", "", "", "", "", "ROTX", "ROTZ")
+mapdl.d(1, "UZ")
+
+# Select nodes for symmetry boundary
+mapdl.nsel("S", "", "", 5)
+mapdl.dsym("SYMM", "X")
+
+# Select all nodes
+mapdl.nsel("ALL")
+
+# Apply nodal force along x-direction
+mapdl.f(1, "FX", -21972.6)
+# Specifies surface loads on beam and pipe elements.
+mapdl.sfbeam("ALL", 1, "PRES", 1.79253)
+
+# Selects all entities
+mapdl.allsel()
+# Element plot
+mapdl.eplot()
+
+# Finish pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+# Perform the solution
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute displacement and rotation quantities.
+mapdl.post1()
+
+# Select nodes for results output
+mapdl.nsel("S", "", "", 1, 5, 4)
+
+# Print displacement quantities in Z direction
+mapdl.prnsol("U", "Z")
+
+# Print rotation quantities in Y direction
+mapdl.prnsol("ROT", "Y")
+
+# Select all nodes
+mapdl.nsel("ALL")
+
+# Print results solution
+mapdl.prrsol()
+
'PRINT REACTION SOLUTIONS PER NODE\n *****MAPDL VERIFICATION RUN ONLY*****\n DO NOT USE RESULTS FOR PRODUCTION\n \n ***** POST1 TOTAL REACTION SOLUTION LISTING ***** \n \n LOAD STEP= 1 SUBSTEP= 1 \n TIME= 1.0000 LOAD CASE= 0 \n \n THE FOLLOWING X,Y,Z SOLUTIONS ARE IN THE GLOBAL COORDINATE SYSTEM \n \n NODE FX FY FZ MX MY MZ \n 1 0.0000 179.25 -0.12624E-014 -0.55705E-014\n 2 0.0000 0.81444E-016 -0.86438E-014\n 3 0.0000 0.81444E-016 -0.57626E-014\n 4 0.0000 0.81444E-016 -0.28813E-014\n 5 21973. 0.0000 0.40722E-016 -8962.7 0.92009E-013\n\n TOTAL VALUES\n VALUE 21973. 0.0000 179.25 -0.97733E-015 -8962.7 0.69151E-013'
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter /post26 time-history post-processing processor.
+mapdl.post26()
+
+# Specifies the total reaction force data to be stored at nodes associated to RGHT_END
+mapdl.rforce(2, RGHT_END, "M", "Y")
+
+# Store results
+mapdl.store()
+# Get maximum moment at node RGHT_END
+m_mx_c2 = mapdl.get("M_MX_C2", "VARI", 2, "EXTREM", "VMAX")
+
+# exists post-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.title("VM21 TIE ROD WITH LATERAL LOADING STRESS STIFFENING PRESENT")
+
TITLE=
+ VM21 TIE ROD WITH LATERAL LOADING STRESS STIFFENING PRESENT
+
Enter new solution mode and solve the nonlinear system including stress stiffening.
+mapdl.slashsolu()
+
+# Set number of substeps to 5
+mapdl.nsubst(5)
+# Activate auto time stepping
+mapdl.autots("ON")
+# Activate nonlinear geometry
+mapdl.nlgeom("ON")
+# Set a smaller convergence tolerance
+mapdl.cnvtol("F", "", 0.0001, "", 1)
+# Perform the solution
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute displacement and rotation quantities.
+mapdl.post1()
+
+# Select nodes for results output
+mapdl.nsel("S", "", "", 1, 5, 4)
+# Print displacement quantities in Z direction
+mapdl.prnsol("U", "Z")
+# Print rotation quantities in Y direction
+mapdl.prnsol("ROT", "Y")
+# Print results solution
+mapdl.prrsol()
+
+# Get results at node RGHT_END
+uz_mx_c1 = mapdl.get("UZ_MX_C1", "NODE", RGHT_END, "U", "Z")
+
+# Get results at node LFT_END
+slope_c1 = mapdl.get("SLOPE_C1", "NODE", LFT_END, "ROT", "Y")
+
+# exists post-processing processor
+mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter /post26 time-history post-processing processor.
+ +# Set target values
+target_res = [-0.19945, 0.0032352, -4580.1]
+target_res_strss = [-0.38241, 0.0061185, -8962.7]
+
+# Fill result values
+sim_res = [uz_mx_c1, slope_c1, m_mx_c1]
+sim_res_strss = [uz_mx_c2, slope_c2, m_mx_c2]
+
+title = f"""
+
+------------------- VM21 RESULTS COMPARISON ---------------------
+
+F neq 0 (stiffened):
+--------------------
+
+"""
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Z_max, in", "Slope, rad", "M_max , in-lb"]
+
+data = [target_res, sim_res, np.abs(target_res) / np.abs(sim_res)]
+
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
+title = f"""
+
+
+F = 0 (unstiffened):
+--------------------
+
+"""
+
+row_headers = ["Z_max, in", "Slope, rad", "M_max , in-lb"]
+data = [
+ target_res_strss,
+ sim_res_strss,
+ np.abs(target_res_strss) / np.abs(sim_res_strss),
+]
+
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
------------------- VM21 RESULTS COMPARISON ---------------------
+
+F neq 0 (stiffened):
+--------------------
+
+
+ TARGET Mechanical APDL RATIO
+Z_max, in -0.199450 -0.199560 0.999449
+Slope, rad 0.003235 0.003235 0.999957
+M_max , in-lb -4580.100000 -4579.818510 1.000061
+
+
+
+F = 0 (unstiffened):
+--------------------
+
+
+ TARGET Mechanical APDL RATIO
+Z_max, in -0.382410 -0.382554 0.999623
+Slope, rad 0.006118 0.006119 1.000000
+M_max , in-lb -8962.700000 -8962.650000 1.000006
+
mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 1.141 seconds)
+ + +Note
+Go to the end +to download the full example code
+A long thick-walled cylinder is initially subjected to an internal pressure p. +Determine the radial displacement \(\delta_r\) at the inner surface, the +radial stress \(\sigma_r\) , and tangential stress \(\sigma_t\) , at the +inner and outer surfaces and at the middle wall thickness. Internal pressure is then +removed and the cylinder is subjected to a rotation ω about its center line. Determine +the radial \(\sigma_r\) and tangential \(\sigma_t\) stresses at the inner wall +and at an interior point located at r = Xi.
S. Timoshenko, Strength of Materials, Part II, Elementary Theory and +Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1956, +pg. 213, problem 1 and pg. 213, article 42.
Static Analysis ANTYPE=0
2-D 8-Node Structural Solid Elements (PLANE183)
\(E = 30 \cdot 10^6 psi\)
\(\mu = 0.3\)
\(\rho = 0.00073 lb-sec^2/in^4\)
\(a = 4 inches\)
\(b = 8 inches\)
\(X_i = 5.43 inches\)
\(p = 30,000 psi\)
\(\Omega = 1000 rad/sec\)
The axial length is arbitrarily selected. Elements are oriented such that surface stresses +may be obtained at the inner and outer cylinder surfaces. +POST1 is used to display linearized stresses through the thickness of the cylinder when it is +subjected to an internal pressure.
# sphinx_gallery_thumbnail_path = '_static/vm25_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+import pandas as pd
+
+# Launching MAPDL with specified settings
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clearing the MAPDL database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command for VM25
+mapdl.run("/VERIFY,VM25")
+
+# Set the title of the analysis
+mapdl.title("VM25 Stresses in a Long Cylinder")
+
+# Enter the model creation /Prep7 preprocessor
+mapdl.prep7()
+
+# Deactivate automatic (smart) element sizing
+mapdl.smrtsize(sizlvl="OFF")
+
DEACTIVATE SMART SIZING
+
Use 2-D 8-Node or 6-Node Structural Solid and specify Axisymmetric element behavior +via setting Keyopt(3)=1.
+mapdl.et(1, "PLANE183", "", "", 1)
+
1
+
Set up the material and its type (a single material), Young’s modulus of 30e6, +Density, rho = 0.00073 and Poisson’s ratio NUXY of 0.3 is specified.
+mapdl.mp("EX", 1, 30e6)
+mapdl.mp("DENS", 1, 0.00073)
+mapdl.mp("NUXY", 1, 0.3)
+
MATERIAL 1 NUXY = 0.3000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+# Defining node 1 with coordinates (4)
+mapdl.n(1, 4)
+# Defining node 2 with coordinates (4+4/14)
+mapdl.n(2, "4+4/14")
+# Defining node 3 with coordinates (4+4/14, 0.5)
+mapdl.n(3, "4+4/14", 0.5)
+# Defining node 4 with coordinates (4, 0.5)
+mapdl.n(4, 4, 0.5)
+# Defining node 5 with coordinates (4+4/28)
+mapdl.n(5, "4+4/28")
+# Defining node 6 with coordinates (4+4/14, 0.25)
+mapdl.n(6, "4+4/14", 0.25)
+# Defining node 7 with coordinates (4+4/28, 0.5)
+mapdl.n(7, "4+4/28", 0.5)
+# Defining node 8 with coordinates (4, 0.25)
+mapdl.n(8, 4, 0.25)
+# Creating element 1 with nodes 2, 3, 4, 5, 6, 7, and 8
+mapdl.e(1, 2, 3, 4, 5, 6, 7, 8)
+
+# Generating additional nodes along element 14 using the specified
+# parameters (from an existing pattern)
+mapdl.egen(14, 8, 1, "", "", "", "", "", "", "", "4/14")
+# Merging nodes based on their coordinates
+mapdl.nummrg("NODE")
+# Generate a mesh using EGEN command
+mapdl.egen(2, 111, 1, 14, "", "", "", "", "", "", "", 0.5)
+# Merge the nodes that share the same coordinates
+mapdl.nummrg("NODE")
+
MERGE COINCIDENT NODES WITHIN TOLERANCE OF 0.10000E-03
+ NODE 4 USED FOR NODES 112
+ NODE 7 USED FOR NODES 116
+ NODE 3 USED FOR NODES 113
+ NODE 15 USED FOR NODES 124
+ NODE 11 USED FOR NODES 121
+ NODE 23 USED FOR NODES 132
+ NODE 19 USED FOR NODES 129
+ NODE 31 USED FOR NODES 140
+ NODE 27 USED FOR NODES 137
+ NODE 39 USED FOR NODES 148
+ NODE 35 USED FOR NODES 145
+ NODE 47 USED FOR NODES 156
+ NODE 43 USED FOR NODES 153
+ NODE 55 USED FOR NODES 164
+ NODE 51 USED FOR NODES 161
+ NODE 63 USED FOR NODES 172
+ NODE 59 USED FOR NODES 169
+ NODE 71 USED FOR NODES 180
+ NODE 67 USED FOR NODES 177
+ NODE 79 USED FOR NODES 188
+ NODE 75 USED FOR NODES 185
+ NODE 87 USED FOR NODES 196
+ NODE 83 USED FOR NODES 193
+ NODE 95 USED FOR NODES 204
+ NODE 91 USED FOR NODES 201
+ NODE 103 USED FOR NODES 212
+ NODE 99 USED FOR NODES 209
+ NODE 111 USED FOR NODES 220
+ NODE 107 USED FOR NODES 217
+
+
+ A total of 29 nodes were merged at 29 locations.
+
Apply a displacement boundary condition in the vertical direction (UY) to all nodes. +Couple the axial displacements at the unconstrained Y-dir. Apply internal pressure of +30000 psi is applied on nodes. Also, apply dummy pressure for surface printout. +Then exit prep7 processor.
+mapdl.nsel("S", "LOC", "Y", 0) # Select nodes located on the Y-axis
+# Apply a displacement boundary condition
+mapdl.d("ALL", "UY")
+mapdl.nsel("S", "LOC", "Y", 1) # Select nodes located on the positive Y-axis
+# Couple the axial displacements at the unconstrained Y-dir
+mapdl.cp(1, "UY", "ALL")
+
+mapdl.nsel(
+ "S", "LOC", "X", 4
+) # Select nodes located on the X-axis at a specific coordinate
+# Apply internal pressure on nodes
+mapdl.sf("", "PRES", 30000)
+
+mapdl.nsel(
+ "S", "LOC", "X", 8
+) # Select nodes located on the X-axis at a different coordinate
+# Apply dummy pressure for surface printout
+mapdl.sf("", "PRES", 1e-10)
+
+# Selects all entities
+mapdl.allsel()
+# Element plot
+mapdl.eplot(background="w")
+
+# Finish the pre-processing processor
+mapdl.finish()
+
+# Save the finite element model
+mapdl.save("MODEL")
+
ALL CURRENT MAPDL DATA WRITTEN TO FILE NAME=
+ FOR POSSIBLE RESUME FROM THIS POINT
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Set the analysis type to STATIC
+mapdl.antype("STATIC")
+# Output results for all nodes
+mapdl.outpr("", "ALL")
+# Perform the solution for the load step 1, which is the internal pressure
+mapdl.solve()
+# exists solution processor for load case 1
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute displacement and stress components.
+mapdl.post1()
+
+# Set the load step 1 and substep to 1
+mapdl.set(1, 1)
+
USE LOAD STEP 1 SUBSTEP 1 FOR LOAD CASE 0
+
+ SET COMMAND GOT LOAD STEP= 1 SUBSTEP= 1 CUMULATIVE ITERATION= 1
+ TIME/FREQUENCY= 1.0000
+ TITLE= VM25 Stresses in a Long Cylinder
+
# Retrieves the displacement "DEF_4" of nodes associated to
+# "LFT_NODE" in the X direction
+def_4 = mapdl.get("DEF_4", "NODE", LFT_NODE, "U", "X")
+
+# Retrieves the stress and store it "parm" of nodes associated to a
+# variables 'LFT_NODE','MID_NODE' and 'RT_NODE'
+rst_4_c1 = mapdl.get("RST_4_C1", "NODE", LFT_NODE, "S", "X")
+rst_6_c1 = mapdl.get("RST_6_C1", "NODE", MID_NODE, "S", "X")
+rst_8_c1 = mapdl.get("RST_8_C1", "NODE", RT_NODE, "S", "X")
+tst_4_c1 = mapdl.get("TST_4_C1", "NODE", LFT_NODE, "S", "Z")
+tst_6_c1 = mapdl.get("TST_6_C1", "NODE", MID_NODE, "S", "Z")
+tst_8_c1 = mapdl.get("TST_8_C1", "NODE", RT_NODE, "S", "Z")
+
+# Print the nodal stress solution (COMP means all stress components)
+mapdl.prnsol("S", "COMP")
+
+# Define a path with the name 'STRESS' and ID 2, no limits specified
+mapdl.path("STRESS", 2, "", 48)
+mapdl.ppath(1, LFT_NODE) # Define the path points using the variable 'LFT_NODE'
+mapdl.ppath(2, RT_NODE) # Define the path points using the variable 'RT_NODE'
+mapdl.plsect("S", "Z", -1) # Display the SZ stresses in a sectional plot
+mapdl.plsect("S", "X", -1) # Display the SX stresses in a sectional plot
+mapdl.prsect(-1) # Print linearized stresses
+
'PRINT LINEARIZED STRESS THROUGH A SECTION DEFINED BY PATH= STRESS DSYS= 0\n *****MAPDL VERIFICATION RUN ONLY*****\n DO NOT USE RESULTS FOR PRODUCTION\n\n ***** POST1 LINEARIZED STRESS LISTING *****\n INSIDE NODE = 1 OUTSIDE NODE = 106\n\n LOAD STEP 1 SUBSTEP= 1\n TIME= 1.0000 LOAD CASE= 0\n\n ** AXISYMMETRIC OPTION ** RHO = 0.47392E+12\n THE FOLLOWING X,Y,Z STRESSES ARE IN SECTION COORDINATES. \n\n ** MEMBRANE **\n SX SY SZ SXY SYZ SXZ\n -0.1000E+05 0.1308E-08 0.3000E+05 0.2586E-09 0.000 0.000 \n S1 S2 S3 SINT SEQV\n 0.3000E+05 0.000 -0.1000E+05 0.4000E+05 0.3606E+05\n\n ** BENDING ** I=INSIDE C=CENTER O=OUTSIDE\n SX SY SZ SXY SYZ SXZ\n I -0.1991E+05 0.7579E-09 0.1364E+05 0.000 0.000 0.000 \n C -4948. 0.7579E-10 0.1919E-07 0.000 0.000 0.000 \n O 0.1001E+05 -0.6063E-09 -0.1364E+05 0.000 0.000 0.000 \n S1 S2 S3 SINT SEQV\n I 0.1364E+05 0.000 -0.1991E+05 0.3355E+05 0.2922E+05\n C 0.000 0.000 -4948. 4948. 4948. \n O 0.1001E+05 0.000 -0.1364E+05 0.2365E+05 0.2056E+05\n\n ** MEMBRANE PLUS BENDING ** I=INSIDE C=CENTER O=OUTSIDE\n SX SY SZ SXY SYZ SXZ\n I -0.2991E+05 0.2066E-08 0.4364E+05 0.2586E-09 0.000 0.000 \n C -0.1495E+05 0.1384E-08 0.3000E+05 0.2586E-09 0.000 0.000 \n O 6.734 0.7019E-09 0.1636E+05 0.2586E-09 0.000 0.000 \n S1 S2 S3 SINT SEQV\n I 0.4364E+05 0.000 -0.2991E+05 0.7355E+05 0.6407E+05\n C 0.3000E+05 0.000 -0.1495E+05 0.4495E+05 0.3965E+05\n O 0.1636E+05 6.734 0.000 0.1636E+05 0.1636E+05\n\n ** PEAK ** I=INSIDE C=CENTER O=OUTSIDE\n SX SY SZ SXY SYZ SXZ\n I 0.000 0.5189E-08 6264. 0.1772E-07 0.000 0.000 \n C 7193. -0.1907E-08 -2245. 0.5324E-09 0.000 0.000 \n O 0.7070E-12 0.2806E-08 3632. 0.3818E-09 0.000 0.000 \n S1 S2 S3 SINT SEQV\n I 6264. 0.000 0.000 6264. 6264. \n C 7193. 0.000 -2245. 9438. 8540. \n O 3632. 0.000 0.000 3632. 3632. \n\n ** TOTAL ** I=INSIDE C=CENTER O=OUTSIDE \n SX SY SZ SXY SYZ SXZ\n I -0.2991E+05 0.7255E-08 0.4991E+05 0.1798E-07 0.000 0.000 \n C -7758. -0.5233E-09 0.2776E+05 0.7910E-09 0.000 0.000 \n O 6.734 0.3508E-08 0.1999E+05 0.6404E-09 0.000 0.000 \n S1 S2 S3 SINT SEQV TEMP\n I 0.4991E+05 0.000 -0.2991E+05 0.7982E+05 0.6984E+05 0.000 \n C 0.2776E+05 0.000 -7758. 0.3552E+05 0.3234E+05\n O 0.1999E+05 6.734 0.000 0.1999E+05 0.1999E+05 0.000'
+
# Set target values
+target_def = 0.0078666
+target_strss = [-30000, -7778, 0]
+target_tst_strss = [50000, 27778, 20000]
+
+# Fill result values
+res_def = def_4
+res_strss = [rst_4_c1, rst_6_c1, rst_8_c1]
+res_tst_strss = [tst_4_c1, tst_6_c1, tst_8_c1]
+
+title = f"""
+
+------------------- VM25 RESULTS COMPARISON ---------------------
+
+RESULTS FOR CASE p = 30,000 psi:
+--------------------------------
+
+"""
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+row_headers = ["Displacement, in (r = 4 in)"]
+data = [
+ [target_def, res_def, abs(target_def / res_def)],
+]
+print(title)
+print(pd.DataFrame(data, row_headers, col_headers))
+
+# Radial stress results comparison
+row_headers = [
+ "Stress_r, psi (r = 4 in)",
+ "Stress_r, psi (r = 6 in)",
+ "Stress_r, psi (r = 8 in)",
+]
+
+data = [target_strss, res_strss, np.abs(target_strss) / np.abs(res_strss)]
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
+# Tangential stress results comparison
+row_headers = [
+ "Stress_t, psi (r = 4 in)",
+ "Stress_t, psi (r = 6 in)",
+ "Stress_t, psi (r = 8 in)",
+]
+data = [
+ target_tst_strss,
+ res_tst_strss,
+ np.abs(target_tst_strss) / np.abs(res_tst_strss),
+]
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
------------------- VM25 RESULTS COMPARISON ---------------------
+
+RESULTS FOR CASE p = 30,000 psi:
+--------------------------------
+
+
+ TARGET Mechanical APDL RATIO
+Displacement, in (r = 4 in) 0.007867 0.007867 0.999992
+ TARGET Mechanical APDL RATIO
+Stress_r, psi (r = 4 in) -30000.0 -29908.046900 1.003075
+Stress_r, psi (r = 6 in) -7778.0 -7757.541500 1.002637
+Stress_r, psi (r = 8 in) 0.0 6.734007 0.000000
+ TARGET Mechanical APDL RATIO
+Stress_t, psi (r = 4 in) 50000.0 49908.0469 1.001842
+Stress_t, psi (r = 6 in) 27778.0 27757.5410 1.000737
+Stress_t, psi (r = 8 in) 20000.0 19993.2656 1.000337
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.title("VM25 Stresses in a Long Cylinder - Rotation About Axis")
+
+# Resume the Finite Element (FE) "MODEL" save previously
+mapdl.resume("MODEL")
+
RESUME ANSYS DATA FROM FILE NAME=
+
+ *** MAPDL GLOBAL STATUS ***
+
+ TITLE = VM25 Stresses in a Long Cylinder
+ NUMBER OF ELEMENT TYPES = 1
+ 28 ELEMENTS CURRENTLY SELECTED. MAX ELEMENT NUMBER = 28
+ 117 NODES CURRENTLY SELECTED. MAX NODE NUMBER = 222
+ MAXIMUM LINEAR PROPERTY NUMBER = 1
+ ACTIVE COORDINATE SYSTEM = 0 (CARTESIAN)
+ MAXIMUM COUPLED D.O.F. SET NUMBER = 1
+ NUMBER OF SPECIFIED CONSTRAINTS = 29
+ NUMBER OF SPECIFIED SURFACE LOADS = 4
+
+ INITIAL JOBNAME =
+ CURRENT JOBNAME =
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Print all results
+mapdl.outpr("", "ALL")
+
PRINT BASI ITEMS WITH A FREQUENCY OF ALL
+ FOR ALL APPLICABLE ENTITIES
+
Apply a displacement boundary condition in the vertical direction (UY) to all nodes. +Rotate the cylinder with an angular velocity of 1000 rad/sec. Also, apply dummy +pressure for surface printout. Then exit solution processor.
+mapdl.nsel(
+ "S", "LOC", "Y", 0
+) # Select nodes located at Y=0 to prevent rigid body motion
+mapdl.nsel("R", "LOC", "X", 4) # Select nodes located at X=4
+# Displace all nodes in the Y-direction
+mapdl.d("ALL", "UY")
+
+mapdl.nsel("S", "LOC", "X", 4) # Select nodes located at X=4
+# Apply a small pressure to allow stress printout
+mapdl.sf("", "PRES", 1e-10)
+
+mapdl.nsel("ALL") # Select all nodes
+# Rotate the cylinder with an angular velocity of 1000 RAD/SEC
+mapdl.omega("", 1000)
+
+# Solve the problem in load step 2 - centrifugal loading
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute displacement and stress components.
+mapdl.post1()
+
*****MAPDL VERIFICATION RUN ONLY*****
+ DO NOT USE RESULTS FOR PRODUCTION
+
+ ***** MAPDL RESULTS INTERPRETATION (POST1) *****
+
# Set target values
+target_strss = [0, 4753]
+target_tst_strss = [40588, 29436]
+
+# Fill result values
+res_strss = [rst_4_c2, rst_x_c2]
+res_tst_strss = [tst_4_c2, tst_x_c2]
+
+title = f"""
+
+RESULTS FOR CASE Rotation = 1000 rad/sec:
+-----------------------------------------
+
+"""
+
+col_headers = ["TARGET", "Mechanical APDL", "RATIO"]
+
+# Radial stress results comparison
+row_headers = ["Stress_r, psi (r = 4 in)", "Stress_r, psi (r = 5.43 in)"]
+
+data = [target_strss, res_strss, np.abs(target_strss) / np.abs(res_strss)]
+
+print(title)
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
+# Tangential stress results comparison
+row_headers = ["Stress_t, psi (r = 4 in)", "Stress_t, psi (r = 5.43 in)"]
+
+data = [
+ target_tst_strss,
+ res_tst_strss,
+ np.abs(target_tst_strss) / np.abs(res_tst_strss),
+]
+print(pd.DataFrame(np.transpose(data), row_headers, col_headers))
+
RESULTS FOR CASE Rotation = 1000 rad/sec:
+-----------------------------------------
+
+
+ TARGET Mechanical APDL RATIO
+Stress_r, psi (r = 4 in) 0.0 50.366143 0.000000
+Stress_r, psi (r = 5.43 in) 4753.0 4957.113400 0.958824
+ TARGET Mechanical APDL RATIO
+Stress_t, psi (r = 4 in) 40588.0 41671.1623 0.974007
+Stress_t, psi (r = 5.43 in) 29436.0 29740.9410 0.989747
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 1.313 seconds)
+ + +Note
+Go to the end +to download the full example code
+A point force is applied at the origin of a half-space 2D axisymmetric solid modeled with +far-field domain. Determine the displacement in the Y-direction on nodes along the radial +direction (at location Y = 0) and vertical direction (at location X = 0).
TIMOSHENKO,S.P.,AND J.N.GOODIER,THEORY OF ELASTICITY +MCGRAW-HILL,NEW YORK, PP 398-402, 1970.
Static Analysis ANTYPE=0
Structural Infinite Solid (INFIN257)
2-D 4-Node Structural Solid (PLANE182)
2-D 8-Node Structural Solid (PLANE183)
Youngs modulus, \(E = 1.0\)
Poissons ratio, \(\mu = 0.3\)
Radius of finite mesh \(= 4.0\)
Radius of infinite mesh \(= 4.0\)
Point Load \(= 1.0\)
The problem is solved for two cases: +- Case 1: Using PLANE182 and INFIN257 elements +- Case 2: Using PLANE183 and INFIN257 elements
The problem is composed with 12 axisymmetric finite element mesh +(PLANE182 or PLANE183) with a radius of 4 from the origin, and 4 +infinite element mesh (INFIN257) modeling the far-field domain with +a radius of 4 extending from the finite element domain. The infinite +element mesh is modeled using the EINFIN command. The UX degrees of +freedom are constrained at location X = 0. The UY results are computed +along the radial and vertical direction on the nodes belonging to the +finite element mesh and then compared to the analytical results.
The analytic solution to compute vertical displacement for the problem +of a point load on a half space is: +\(\omega = \frac{P}{2 \pi E} \bigg [ \frac{(1+\nu)z^2}{(r^2+z^2)^{3/2}} + \frac{2(1-\nu ^2)}{(r^2 + z^2)^{1/2}} \bigg]\) +Where \(P\) is the point load, \(E\) is the Young’s modulus, +\(\nu\) is the Poisson’s ratio, and \(r\) and \(z\) are +the radial and vertical distance from the point load. +The above equation clearly shows the \(\frac {1}{r}\) singularity +at the point of application of the load (\(r=0\) and \(z=0\)), +which indicates that the finite element results may not be close to +the analytical solution a points close to the origin.
# sphinx_gallery_thumbnail_path = '_static/vm291_setup1.png'
+
+import math
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+
+# Clear the current database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command for VM291
+mapdl.run("/VERIFY,VM291")
+
+# Set the title of the analysis
+mapdl.title("VM291 FORCE ON BOUNDARY OF A SEMI-INFINITE BODY (BOUSSINESQ PROBLEM)")
+
+# Entering the PREP7 environment in MAPDL
+mapdl.prep7(mute=True)
+
+# Constant value of PI
+pi = math.pi
+
Use 2D 4-Node structural solid element (PLANE182) and set Keyopt(3)=1, Axisymmetric.
+mapdl.et(1, "PLANE182")
+mapdl.keyopt(1, 3, 1)
+
ELEMENT TYPE 1 IS PLANE182 4-NODE AXISYMMETRIC SOLID
+ KEYOPT( 1- 6)= 0 0 1 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY
+ AXISYMMETRIC MODEL
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’S ratio of 0.1 is specified.
+ +MATERIAL 1 PRXY = 0.1000000
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1, 0, 0)
+mapdl.n(2, 1, 0)
+mapdl.n(3, 0.75, -0.75)
+mapdl.n(4, 0, -1)
+mapdl.n(5, 2, 0)
+mapdl.n(6, 1.75, -0.75)
+mapdl.n(7, 1.5, -1.5)
+mapdl.n(8, 0.75, -1.75)
+mapdl.n(9, 0, -2)
+mapdl.n(10, 3, 0)
+mapdl.n(11, 2.5833, -1.0833)
+mapdl.n(12, 2.1667, -2.1667)
+mapdl.n(13, 1.0833, -2.5833)
+mapdl.n(14, 0, -3)
+mapdl.n(15, 4, 0)
+mapdl.n(16, 3.4167, -1.4167)
+mapdl.n(17, 2.8333, -2.8333)
+mapdl.n(18, 1.4167, -3.4167)
+mapdl.n(19, 0, -4)
+
+# Define Mat =1 and Type = 1
+mapdl.mat(1)
+mapdl.type(1)
+
+# FORM 2D 4 NODE STRUCTURAL SOLID ELEMENTS
+mapdl.e(4, 3, 2, 1)
+mapdl.e(6, 5, 2, 3)
+mapdl.e(7, 6, 3, 8)
+mapdl.e(9, 8, 3, 4)
+mapdl.e(11, 10, 5, 6)
+mapdl.e(12, 11, 6, 7)
+mapdl.e(13, 12, 7, 8)
+mapdl.e(14, 13, 8, 9)
+mapdl.e(16, 15, 10, 11)
+mapdl.e(17, 16, 11, 12)
+mapdl.e(18, 17, 12, 13)
+mapdl.e(19, 18, 13, 14)
+
12
+
Select node located at (0,0,0) and assign it to variable “NPOLE”.
+SELECT ALL ENTITIES OF TYPE= ALL AND BELOW
+
Fix UX degrees of freedom at node location X=0. Apply a negative force 1.0 lb +along FY direction at node 1. Then exit prep7 processor.
+Effectiely, this sets: +- \(Point Load = 1.0\)
+# Selects nodes using location x=0
+mapdl.nsel("S", "LOC", "X", 0)
+# CONSTRAINT UX DOF AT LOCATION X=0
+mapdl.d("ALL", "UX", 0)
+
+# Selects all entities
+mapdl.allsel()
+mapdl.eplot()
+
+# FORCE magnitude
+p = -1
+# APPLY FORCE ALONG Y DIRECTION AT NODE1 having magnitude "p"
+mapdl.f(1, "FY", p)
+
+# Finish pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Performing static analysis
+mapdl.antype("STATIC")
+# Controls the solution data written to the database.
+mapdl.outres("ALL", "ALL")
+# Sets the time for a load step, time=1
+mapdl.time(1)
+# SOLVE STATIC ANALYSIS
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflections.
+mapdl.post1()
+
+# Set the current results set to the last set to be read from result file
+mapdl.set("LAST")
+# redirects output to the default system output file
+mapdl.run("/OUT")
+# reactivates suppressed printout
+mapdl.gopr()
+
+# Set constant parameters
+r1 = 1
+z1 = 1
+
+# UY AT NODE (1,0,0)
+uy1 = p * (1 - nuxy**2) / (pi * exx * r1)
+# UY AT NODE (0,1,0)
+up1 = p / (2 * pi * exx * z1) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(1,0,0)
+uya1 = mapdl.get("UYA1", "NODE", 2, "U", "Y")
+# MADPL UY AT NODE(0,1,0)
+upa1 = mapdl.get("UPA1", "NODE", 4, "U", "Y")
+
+# Set constant parameters
+r2 = 2
+z2 = 2
+
+# UY AT NODE (2,0,0)
+uy2 = p * (1 - nuxy**2) / (pi * exx * r2)
+# UY AT NODE (0,2,0)
+up2 = p / (2 * pi * exx * z2) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(2,0,0)
+uya2 = mapdl.get("UYA2", "NODE", 5, "U", "Y")
+# MADPL UY AT NODE(0,2,0)
+upa2 = mapdl.get("UPA2", "NODE", 9, "U", "Y")
+
+# Set constant parameters, R3=3 and Z3=3
+r3 = 3
+z3 = 3
+
+# UY AT NODE (3,0,0)
+uy3 = p * (1 - nuxy**2) / (pi * exx * r3)
+# UY AT NODE (0,3,0)
+up3 = p / (2 * pi * exx * z3) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(3,0,0)
+uya3 = mapdl.get("UYA3", "NODE", 10, "U", "Y")
+# MADPL UY AT NODE(0,3,0)
+upa3 = mapdl.get("UPA3", "NODE", 14, "U", "Y")
+
+# Set constant parameters, R4=4 and Z4=4
+r4 = 4
+z4 = 4
+
+# UY AT NODE (4,0,0)
+uy4 = p * (1 - nuxy**2) / (pi * exx * r4)
+# UY AT NODE (0,4,0)
+up4 = p / (2 * pi * exx * z4) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(4,0,0)
+uya4 = mapdl.get("UYA4", "NODE", 15, "U", "Y")
+# MADPL UY AT NODE(0,4,0)
+upa4 = mapdl.get("UPA4", "NODE", 19, "U", "Y")
+
+# assign labels for nodes
+label1 = np.array(["NODE5", "NODE10", "NODE15"])
+label2 = np.array(["NODE9", "NODE14", "NODE19"])
+
+# create results arrays for printout
+value1 = np.array([uy2, uy3, uy4])
+value_ana1 = np.array([uya2, uya3, uya4])
+value_ratio1 = []
+for i in range(len(value_ana1)):
+ a = value1[i] / value_ana1[i]
+ value_ratio1.append(a)
+
+# create results arrays for printout
+value2 = np.array([up2, up3, up4])
+value_ana2 = np.array([upa2, upa3, upa4])
+value_ratio2 = []
+for i in range(len(value_ana2)):
+ a = value2[i] / value_ana2[i]
+ value_ratio2.append(a)
+
results = f"""
+--------------------------VM291 RESULTS COMPARISON--------------------------
+
+USING PLANE182 AND INFIN257 ELEMENTS
+-------------------------------------
+
+VERTICAL DISPLACEMENT(UY) ON THE SURFACE (Y=0)
+----------------------------------------------
+
+ | NODES | TARGET | Mechanical APDL | RATIO
+
+"""
+print(results)
+
+for i in range(len(value1)):
+ message = f"""
+ {label1[i]} {value1[i]:.5f} {value_ana1[i]:.5f} {value_ratio1[i]:.5f}
+ """
+ print(message)
+
+results = f"""
+
+VERTICAL DISPLACEMENT(UY) BELOW THE POINT LOAD (X=0)
+----------------------------------------------------
+
+"""
+print(results)
+
+for i in range(len(value2)):
+ message = f"""
+ {label2[i]} {value2[i]:.5f} {value_ana2[i]:.5f} {value_ratio2[i]:.5f}
+ """
+ print(message)
+
--------------------------VM291 RESULTS COMPARISON--------------------------
+
+USING PLANE182 AND INFIN257 ELEMENTS
+-------------------------------------
+
+VERTICAL DISPLACEMENT(UY) ON THE SURFACE (Y=0)
+----------------------------------------------
+
+ | NODES | TARGET | Mechanical APDL | RATIO
+
+
+
+ NODE5 -0.15756 -0.15037 1.04786
+
+
+ NODE10 -0.10504 -0.10090 1.04110
+
+
+ NODE15 -0.07878 -0.07714 1.02128
+
+
+
+VERTICAL DISPLACEMENT(UY) BELOW THE POINT LOAD (X=0)
+----------------------------------------------------
+
+
+
+ NODE9 -0.24510 -0.23512 1.04246
+
+
+ NODE14 -0.16340 -0.16882 0.96791
+
+
+ NODE19 -0.12255 -0.12920 0.94855
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Set up the material and its type (a single material), Young’s modulus of 30e6 +and Poisson’S ratio of 0.1 is specified.
+ +MATERIAL 1 PRXY = 0.1000000
+
Use 2D 8-Node structural solid element (PLANE183) and set Keyopt(3)=1, Axisymmetric.
+mapdl.et(1, "PLANE183")
+mapdl.keyopt(1, 3, 1)
+
ELEMENT TYPE 1 IS PLANE183 8-NODE AXISYMMETRIC SOLID
+ KEYOPT( 1- 6)= 0 0 1 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 0
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY
+ AXISYMMETRIC MODEL
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.n(1, 0.0000, -1.0000, 0.0000)
+mapdl.n(2, 0.75000, -0.75000, 0.0000)
+mapdl.n(3, 0.37500, -0.87500, 0.0000)
+mapdl.n(4, 1.0000, 0.0000, 0.0000)
+mapdl.n(5, 0.87500, -0.37500, 0.0000)
+mapdl.n(6, 0.0000, 0.0000, 0.0000)
+mapdl.n(7, 0.50000, 0.0000, 0.0000)
+mapdl.n(8, 0.0000, -0.50000, 0.0000)
+mapdl.n(9, 1.7500, -0.75000, 0.0000)
+mapdl.n(10, 2.0000, 0.0000, 0.0000)
+mapdl.n(11, 1.8750, -0.37500, 0.0000)
+mapdl.n(12, 1.5000, 0.0000, 0.0000)
+mapdl.n(13, 1.2500, -0.75000, 0.0000)
+mapdl.n(14, 1.5000, -1.5000, 0.0000)
+mapdl.n(15, 1.6250, -1.1250, 0.0000)
+mapdl.n(16, 0.75000, -1.7500, 0.0000)
+mapdl.n(17, 0.75000, -1.2500, 0.0000)
+mapdl.n(18, 1.1250, -1.6250, 0.0000)
+mapdl.n(19, 0.0000, -2.0000, 0.0000)
+mapdl.n(20, 0.37500, -1.8750, 0.0000)
+mapdl.n(21, 0.0000, -1.5000, 0.0000)
+mapdl.n(22, 2.5833, -1.0833, 0.0000)
+mapdl.n(23, 3.0000, 0.0000, 0.0000)
+mapdl.n(24, 2.7917, -0.54165, 0.0000)
+mapdl.n(25, 2.5000, 0.0000, 0.0000)
+mapdl.n(26, 2.1667, -0.91665, 0.0000)
+mapdl.n(27, 2.1667, -2.1667, 0.0000)
+mapdl.n(28, 2.3750, -1.6250, 0.0000)
+mapdl.n(29, 1.8334, -1.8334, 0.0000)
+mapdl.n(30, 1.0833, -2.5833, 0.0000)
+mapdl.n(31, 1.6250, -2.3750, 0.0000)
+mapdl.n(32, 0.91665, -2.1667, 0.0000)
+mapdl.n(33, 0.0000, -3.0000, 0.0000)
+mapdl.n(34, 0.54165, -2.7917, 0.0000)
+mapdl.n(35, 0.0000, -2.5000, 0.0000)
+mapdl.n(36, 3.4167, -1.4167, 0.0000)
+mapdl.n(37, 4.0000, 0.0000, 0.0000)
+mapdl.n(38, 3.7083, -0.70835, 0.0000)
+mapdl.n(39, 3.5000, 0.0000, 0.0000)
+mapdl.n(40, 3.0000, -1.2500, 0.0000)
+mapdl.n(41, 2.8333, -2.8333, 0.0000)
+mapdl.n(42, 3.1250, -2.1250, 0.0000)
+mapdl.n(43, 2.5000, -2.5000, 0.0000)
+mapdl.n(44, 1.4167, -3.4167, 0.0000)
+mapdl.n(45, 2.1250, -3.1250, 0.0000)
+mapdl.n(46, 1.2500, -3.0000, 0.0000)
+mapdl.n(47, 0.0000, -4.0000, 0.0000)
+mapdl.n(48, 0.70835, -3.7083, 0.0000)
+mapdl.n(49, 0.0000, -3.5000, 0.0000)
+
+# Define Mat =1 and Type = 1
+mapdl.mat(1)
+mapdl.type(1)
+
+# DEFINE ELEMENTS
+mapdl.e(1, 2, 4, 6, 3, 5, 7, 8)
+mapdl.e(9, 10, 4, 2, 11, 12, 5, 13)
+mapdl.e(14, 9, 2, 16, 15, 13, 17, 18)
+mapdl.e(19, 16, 2, 1, 20, 17, 3, 21)
+mapdl.e(22, 23, 10, 9, 24, 25, 11, 26)
+mapdl.e(27, 22, 9, 14, 28, 26, 15, 29)
+mapdl.e(30, 27, 14, 16, 31, 29, 18, 32)
+mapdl.e(33, 30, 16, 19, 34, 32, 20, 35)
+mapdl.e(36, 37, 23, 22, 38, 39, 24, 40)
+mapdl.e(41, 36, 22, 27, 42, 40, 28, 43)
+mapdl.e(44, 41, 27, 30, 45, 43, 31, 46)
+mapdl.e(47, 44, 30, 33, 48, 46, 34, 49)
+
12
+
Select node located at (0,0,0) and assign it to variable “NPOLE”.
+q = mapdl.queries
+NPOLE = q.node(0, 0, 0)
+
+# select nodes
+mapdl.nsel("S", "NODE", "", 36, 38, 1)
+mapdl.nsel("A", "NODE", "", 41, 42, 1)
+mapdl.nsel("A", "NODE", "", 44, 45, 1)
+mapdl.nsel("A", "NODE", "", 47, 48, 1)
+
+# GENERATE SEMI-INFINITE SOLID ELEMENTS
+mapdl.einfin("", NPOLE)
+
+# Selects all entities
+mapdl.allsel()
+mapdl.eplot()
+
Fix UX degrees of freedom at node location X=0. Apply a negative force 1.0 lb +along FY direction at node 6. Then exit prep7 processor.
+Effectiely, this sets: +- \(Point Load = 1.0\)
+# Selects nodes using location x=0
+mapdl.nsel("S", "LOC", "X", 0)
+# CONSTRAINT UX DOF AT LOCATION X=0
+mapdl.d("ALL", "UX", 0)
+# Selects all entities
+mapdl.allsel()
+
+# FORCE magnitude
+p = -1
+# APPLY FORCE ALONG Y DIRECTION AT NODE6
+mapdl.f(6, "FY", p)
+
+# Finish pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+# Performing static analysis
+mapdl.antype("STATIC")
+# Controls the solution data written to the database.
+mapdl.outres("ALL", "ALL")
+# Sets the time for a load step, time=1
+mapdl.time(1)
+# SOLVE STATIC ANALYSIS
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing. Compute deflections.
+mapdl.post1()
+
+# Set the current results set to the last set to be read from result file
+mapdl.set("LAST")
+# redirects output to the default system output file
+mapdl.run("/OUT")
+# reactivates suppressed printout
+mapdl.gopr()
+
+# Set constant parameters
+r1 = 1
+z1 = 1
+
+# UY AT NODE (1,0,0)
+uy1 = p * (1 - nuxy**2) / (pi * exx * r1)
+# UY AT NODE (0,1,0)
+up1 = p / (2 * pi * exx * z1) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(1,0,0)
+uya1 = mapdl.get("UYA1", "NODE", 4, "U", "Y")
+# MADPL UY AT NODE(0,1,0)
+upa1 = mapdl.get("UPA1", "NODE", 1, "U", "Y")
+
+# Set constant parameters
+r2 = 2
+z2 = 2
+
+# UY AT NODE (2,0,0)
+uy2 = p * (1 - nuxy**2) / (pi * exx * r2)
+# UY AT NODE (0,2,0)
+up2 = p / (2 * pi * exx * z2) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(2,0,0)
+uya2 = mapdl.get("UYA2", "NODE", 10, "U", "Y")
+# MADPL UY AT NODE(0,2,0)
+upa2 = mapdl.get("UPA2", "NODE", 19, "U", "Y")
+
+# Set constant parameters
+r3 = 3
+z3 = 3
+
+# UY AT NODE (3,0,0)
+uy3 = p * (1 - nuxy**2) / (pi * exx * r3)
+# UY AT NODE (0,3,0)
+up3 = p / (2 * pi * exx * z3) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(3,0,0)
+uya3 = mapdl.get("UYA3", "NODE", 23, "U", "Y")
+# MADPL UY AT NODE(0,3,0)
+upa3 = mapdl.get("UPA3", "NODE", 33, "U", "Y")
+
+# Set constant parameters
+r4 = 4
+z4 = 4
+
+# UY AT NODE (4,0,0)
+uy4 = p * (1 - nuxy**2) / (pi * exx * r4)
+# UY AT NODE (0,4,0)
+up4 = p / (2 * pi * exx * z4) * (1 + nuxy + 2 - 2 * nuxy**2)
+# MAPDL UY AT NODE(4,0,0)
+uya4 = mapdl.get("UYA4", "NODE", 37, "U", "Y")
+# MADPL UY AT NODE(0,4,0)
+upa4 = mapdl.get("UPA4", "NODE", 47, "U", "Y")
+
+# assign labels for nodes
+label1 = np.array(["NODE10", "NODE23", "NODE37"])
+label2 = np.array(["NODE19", "NODE33", "NODE47"])
+
+# create results arrays for printout
+value1 = np.array([uy2, uy3, uy4])
+value_ana1 = np.array([uya2, uya3, uya4])
+value_ratio1 = []
+for i in range(len(value_ana1)):
+ a = value1[i] / value_ana1[i]
+ value_ratio1.append(a)
+
+# create results arrays for printout
+value2 = np.array([up2, up3, up4])
+value_ana2 = np.array([upa2, upa3, upa4])
+value_ratio2 = []
+for i in range(len(value_ana2)):
+ a = value2[i] / value_ana2[i]
+ value_ratio2.append(a)
+
+mapdl.gopr()
+results = f"""
+
+USING PLANE183 AND INFIN257 ELEMENTS
+------------------------------------
+
+VERTICAL DISPLACEMENT(UY) ON THE SURFACE (Y=0)
+----------------------------------------------
+
+"""
+print(results)
+
+
+for i in range(len(value1)):
+ message = f"""
+ {label1[i]} {value1[i]:.5f} {value_ana1[i]:.5f} {value_ratio1[i]:.5f}
+ """
+ print(message)
+
+results = f"""
+
+VERTICAL DISPLACEMENT(UY) BELOW THE POINT LOAD (X=0)
+----------------------------------------------------
+
+"""
+print(results)
+
+for i in range(len(value2)):
+ message = f"""
+ {label2[i]} {value2[i]:.5f} {value_ana2[i]:.5f} {value_ratio2[i]:.5f}
+ """
+ print(message)
+
+message = f"""
+-----------------------------------------------------------------
+"""
+print(message)
+
USING PLANE183 AND INFIN257 ELEMENTS
+------------------------------------
+
+VERTICAL DISPLACEMENT(UY) ON THE SURFACE (Y=0)
+----------------------------------------------
+
+
+
+ NODE10 -0.15756 -0.15745 1.00070
+
+
+ NODE23 -0.10504 -0.10582 0.99264
+
+
+ NODE37 -0.07878 -0.07865 1.00162
+
+
+
+VERTICAL DISPLACEMENT(UY) BELOW THE POINT LOAD (X=0)
+----------------------------------------------------
+
+
+
+ NODE19 -0.24510 -0.26633 0.92029
+
+
+ NODE33 -0.16340 -0.16186 1.00952
+
+
+ NODE47 -0.12255 -0.12254 1.00010
+
+
+-----------------------------------------------------------------
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 2.234 seconds)
+ + +Note
+Go to the end +to download the full example code
+The test case is to simulate a one-dimensional Terzaghi’s problem with permeability as a function +of the soil depth. A pressure P is applied on the top surface of the soil with depth H and +width W. The top surface of the soil is fully permeable and the permeability decreases linearly +with depth. The excess pore water pressure for 0.1, 0.2, 0.3, 0.4, and 0.5 day is calculated and +compared against the reference results obtained using the PIM method (Figure 5, pg. 5916).
A POINT INTERPOLATION METHOD FOR SIMULATING DISSIPATION PROCESS +OF CONSOLIDATION, J.G.WANG, G.R.LIU, Y.G.WU, COMPUTER METHODS +IN APPLIED MECHANICS AND ENGINEERING 190 (2001),PG: 5907-5922
Static Analysis ANTYPE=0
2D 4-Node Coupled Pore-Pressure Element (CPT212)
Youngs modulus, \(E = 4 \cdot 10^7 Pa\)
Poissons ratio, \(\mu = 0.3\)
Permeability value at bottom of the soil, \(fpx = 1.728 \cdot 10^-3 m/day\)
Permeability value at the top of the soil = \(100 * fpx\)
Height, \(H = 16 m\)
Width, \(W = 1 m\)
Pressure, \(P = 1 \cdot 10^4 Pa\)
The soil is modeled using 2D CPT212 elements with plane strain element behavior. +The UX degree of freedom for all nodes is constrained and the UY degree of freedom at the bottom +of the soil is constrained. The pressure degree of freedom at the top edge is constrained to +make it fully permeable. Linearly varying permeability of the soil is defined using the TB,PM +material model. Static analysis is performed with an end time of 86400 seconds (1 day) and with +stepped pressure loading P on the top edge of the soil. The excess water pore pressure at depth +H = 6 m is computed for 0.1 (8640 s), 0.2 (17280 s), 0.3 (25920 s), 0.4 (34560 s), and +0.5 days (43200 s) by interpolating the solution obtained at the nearest time points.
# sphinx_gallery_thumbnail_path = '_static/vm295_setup.png'
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+# Clear the current database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command for VM295
+mapdl.run("/VERIFY,VM295")
+
+# Set the title of the analysis
+mapdl.title(
+ "VM295 1D TERZAGHI'S CONSOLIDATION PROBLEM WITH PERMEABILITY AS FUNCTION OF DEPTH"
+)
+
+# Entering the PREP7 environment in MAPDL
+mapdl.prep7(mute=True)
+
+# Set Parameters
+day = 24 * 3600 # SECONDS IN ONE DAY
+h = 16 # TOTAL DEPTH OF SOIL IN METERS
+w = 1 # WIDTH OF SOIL IN METERS
+pres = 1e4 # PRESSURE IN PA
+ex = 4e7 # YOUNG'S MODULUS IN PA
+tt = 1 * day
+
Use 2D 4 NOode Coupled Pore Pressure Element (CPT212) and +set PLANE STRAIN Formulation Keyopt(3)=2.
+mapdl.et(1, "CPT212")
+mapdl.keyopt(1, 12, 1)
+mapdl.keyopt(1, 3, 2)
+
ELEMENT TYPE 1 IS CPT212 2-D 4-NODE PLANE STRN COUPLE
+ KEYOPT( 1- 6)= 0 0 2 0 0 0
+ KEYOPT( 7-12)= 0 0 0 0 0 1
+ KEYOPT(13-18)= 0 0 0 0 0 0
+
+ CURRENT NODAL DOF SET IS UX UY PRES
+ TWO-DIMENSIONAL MODEL
+
Set up the material and its type (a single material), Young’s modulus of 4e7 +and Poisson’s ratio of 0.3 is specified.
+mapdl.mp("EX", 1, ex)
+mapdl.mp("NUXY", 1, 0.3)
+
+# Set parameters
+fpx = 1.728e-3 / day / 1e4 # PERMEABILITY FROM REFERENCE
+one = 1.0
+
+# Define TB material properties
+mapdl.tb("PM", 1, "", "", "PERM") # DEFINING PERMEABILITY FOR THE SOIL
+mapdl.tbfield("YCOR", 0) # LOCATION Y = 0
+mapdl.tbdata(1, fpx, fpx, fpx) # PERMEABILITY VALUES AT LOCATION Y=0
+mapdl.tbfield("YCOR", h) # LOCATION Y=16
+# PERMEABILITY VALUES AT LOCATION Y=16, LINEAR VARIABLE PERMEABILITY
+mapdl.tbdata(1, fpx * 100, fpx * 100, fpx * 100)
+mapdl.tb("PM", 1, "", "", "BIOT") # DEFINING BIOT COEFFICINET FOR SOIL
+mapdl.tbdata(1, one) # BIOT COEFFICIENT
+
DATA FOR PM TABLE FOR MATERIAL 1 AT TEMPERATURE= 16.0000
+ LOC= 1 1.00000e+00
+
Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+mapdl.rectng(0, w, 0, h) # Generate rectangle
+# Specifies the divisions and spacing ratio on unmeshed lines
+mapdl.lesize(4, "", "", 16)
+mapdl.lesize(3, "", "", 1)
+# For elements that support multiple shapes, specifies the element shape, set mshape=2D
+mapdl.mshape(0, "2D")
+mapdl.mshkey(1) # Key(1) = Specifies mapped meshing should be used to mesh
+mapdl.amesh(1) # CREATING CPT212 ELEMENTS
+
GENERATE NODES AND ELEMENTS
+ IN AREAS 1 TO 1 IN STEPS OF 1
+
+ NUMBER OF AREAS MESHED = 1
+ MAXIMUM NODE NUMBER = 34
+ MAXIMUM ELEMENT NUMBER = 16
+
Fix UX degrees of freedom. Constraining UY DOF AT Location Y=0. +Defining the top portion of the soil as permeable. +Then exit prep7 processor.
+mapdl.d("ALL", "UX", 0) # CONSTRAINING ALL UX DOF
+
+mapdl.nsel("S", "LOC", "Y", 0)
+mapdl.d("ALL", "UY", 0) # CONSTRAINING UY DOF AT LOCATION Y=0
+mapdl.nsel("ALL")
+
+mapdl.nsel("S", "LOC", "Y", h)
+mapdl.d("ALL", "PRES", 0) # DEFINING THE TOP PORTION OF SOIL AS PERMEABLE
+# selects all nodes
+mapdl.nsel("ALL")
+# selects all element
+mapdl.esel("ALL")
+mapdl.aplot()
+
+# Finish pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+
+mapdl.antype("STATIC") # Performing static analysis
+mapdl.nropt("UNSYM") # UNSYMMETRIC NEWTON RAPHSON OPTION
+mapdl.time(tt) # END TIME
+
+mapdl.nsel("S", "LOC", "Y", h)
+# APPLYING Surface PRESSURE LOAD AT TOP OF THE SOIL
+mapdl.sf("ALL", "PRES", pres)
+# selects all nodes
+mapdl.nsel("ALL")
+
+# Specify number of SUBSTEPS
+mapdl.nsubst(nsbstp=350, nsbmx=1000, nsbmn=150)
+
+# Controls the solution data written to the database.
+mapdl.outres("ALL", "ALL")
+mapdl.kbc(1) # STEPPED LOADING
+
+# SOLVE STATIC ANALYSIS
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing.
+mapdl.post1()
+# Set the current results set to the last set to be read from result file
+mapdl.set("LAST")
+# redirects output to the default system output file
+mapdl.run("/OUT")
+# reactivates suppressed printout
+mapdl.gopr()
+
PRINTOUT RESUMED BY /GOP
+
mapdl.com("")
+mapdl.com("EXCESS PORE PRESSURE IN KILOPASCALS AT LOCATION X=1,Y=6")
+mapdl.com("FOR 0.1 DAY (8640 SECONDS),0.2 DAY (17280 SECONDS)")
+mapdl.com("0.3 DAY (25920 SECONDS), 0.4 DAY (34560 SECONDS)")
+mapdl.com("AND 0.5 DAY (43200 SECONDS) ARE COMPUTED AND COMPARED")
+mapdl.com("AGAINST REFERENCE SOLUTION")
+mapdl.com("")
+
q = mapdl.queries
+nd1 = q.node(1.0, 6.0, 0.0)
+
redirects solver output to a file named “SCRATCH”
+mapdl.run("/OUT,SCRATCH")
+# Specify load set to read from the result file, load step =1, sub-step=16
+mapdl.set(1, 16)
+p11 = mapdl.get("P11", "NODE", nd1, "PRES")
+t11 = mapdl.get("T11", "ACTIVE", 0, "SET", "TIME")
+# Specify load set to read from the result file, load step =1, sub-step=17
+mapdl.set(1, 17)
+p12 = mapdl.get("P12", "NODE", nd1, "PRES")
+t12 = mapdl.get("T12", "ACTIVE", 0, "SET", "TIME")
+t1 = day * 0.1
+mapdl.com("")
+mapdl.com("INTERPOLATE THE RESULTS AT LOCATION (1,6,0) FOR TIME=0.1DAY")
+mapdl.com("")
+pt1 = (p11 + (t1 - t11) / (t12 - t11) * (p12 - p11)) / 1e3
+# Specify load set to read from the result file, load step =1, sub-step=31
+mapdl.set(1, 31)
+p21 = mapdl.get("P21", "NODE", nd1, "PRES")
+t21 = mapdl.get("T21", "ACTIVE", 0, "SET", "TIME")
+# Specify load set to read from the result file, load step =1, sub-step=32
+mapdl.set(1, 32)
+p22 = mapdl.get("P22", "NODE", nd1, "PRES")
+t22 = mapdl.get("T22", "ACTIVE", 0, "SET", "TIME")
+t2 = day * 0.2
+mapdl.com("")
+mapdl.com("INTERPOLATE THE RESULTS AT LOCATION (1,6,0) FOR TIME=0.2DAY")
+mapdl.com("")
+pt2 = (p21 + (t2 - t21) / (t22 - t21) * (p22 - p21)) / 1e3
+# Specify load set to read from the result file, load step =1, sub-step=46
+mapdl.set(1, 46)
+p31 = mapdl.get("P31", "NODE", nd1, "PRES")
+t31 = mapdl.get("T31", "ACTIVE", 0, "SET", "TIME")
+# Specify load set to read from the result file, load step =1, sub-step=47
+mapdl.set(1, 47)
+p32 = mapdl.get("P32", "NODE", nd1, "PRES")
+t32 = mapdl.get("T32", "ACTIVE", 0, "SET", "TIME")
+t3 = day * 0.3
+mapdl.com("")
+mapdl.com("INTERPOLATE THE RESULTS AT LOCATION (1,6,0) FOR TIME=0.3DAY")
+mapdl.com("")
+pt3 = (p31 + (t3 - t31) / (t32 - t31) * (p32 - p31)) / 1e3
+# Specify load set to read from the result file, load step =1, sub-step=61
+mapdl.set(1, 61)
+p41 = mapdl.get("P41", "NODE", nd1, "PRES")
+t41 = mapdl.get("T41", "ACTIVE", 0, "SET", "TIME")
+# Specify load set to read from the result file, load step =1, sub-step=62
+mapdl.set(1, 62)
+p42 = mapdl.get("P42", "NODE", nd1, "PRES")
+t42 = mapdl.get("T42", "ACTIVE", 0, "SET", "TIME")
+t4 = day * 0.4
+mapdl.com("")
+mapdl.com("INTERPOLATE THE RESULTS AT LOCATION (1,6,0) FOR TIME=0.4DAY")
+mapdl.com("")
+pt4 = (p41 + (t4 - t41) / (t42 - t41) * (p42 - p41)) / 1e3
+# Specify load set to read from the result file, load step =1, sub-step=76
+mapdl.set(1, 76)
+p51 = mapdl.get("P51", "NODE", nd1, "PRES")
+t51 = mapdl.get("T51", "ACTIVE", 0, "SET", "TIME")
+# Specify load set to read from the result file, load step =1, sub-step=77
+mapdl.set(1, 77)
+p52 = mapdl.get("P52", "NODE", nd1, "PRES")
+t52 = mapdl.get("T52", "ACTIVE", 0, "SET", "TIME")
+t5 = day * 0.5
+mapdl.com("")
+mapdl.com("INTERPOLATE THE RESULTS AT LOCATION (1,6,0) FOR TIME=0.5DAY")
+mapdl.com("")
+pt5 = (p51 + (t5 - t51) / (t52 - t51) * (p52 - p51)) / 1e3
+# Store result values in array
+P = np.array([pt1, pt2, pt3, pt4, pt5])
+
+# REFERENCE RESULTS, FIGURE 5, PG 5916
+# Fill the Target Result Values in array
+Target_CP = np.array([5.230, 2.970, 1.769, 1.043, 0.632])
+
+# store ratio
+RT = []
+for i in range(len(Target_CP)):
+ a = P[i] / Target_CP[i]
+ RT.append(a)
+
+# assign labels for days
+label = np.array([0.1, 0.2, 0.3, 0.4, 0.5])
+
message = f"""
+------------------- VM295 RESULTS COMPARISON ---------------------
+ Time (day) | TARGET (kPa) | Mechanical APDL | RATIO
+-----------------------------------------------------------------
+"""
+print(message)
+
+for i in range(len(Target_CP)):
+ message = f"""
+ {label[i]:.5f} {Target_CP[i]:.5f} {P[i]:.5f} {RT[i]:.5f}
+ """
+ print(message)
+
+message = f"""
+-----------------------------------------------------------------
+"""
+print(message)
+
------------------- VM295 RESULTS COMPARISON ---------------------
+ Time (day) | TARGET (kPa) | Mechanical APDL | RATIO
+-----------------------------------------------------------------
+
+
+ 0.10000 5.23000 5.27900 1.00937
+
+
+ 0.20000 2.97000 2.98412 1.00475
+
+
+ 0.30000 1.76900 1.74289 0.98524
+
+
+ 0.40000 1.04300 1.02083 0.97875
+
+
+ 0.50000 0.63200 0.59800 0.94621
+
+
+-----------------------------------------------------------------
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 2.182 seconds)
+ + +Note
+Go to the end +to download the full example code
+Sound diffusion is modeled in a flat room of size 30 x 30 x 3 \(m^3\). A sound source +is placed at (2,2,1) with a sound power level of \(1 \cdot 10^-2 W\). The wall absorption +coefficient is equal to 0.1. The coefficient of atmospheric attenuation is \(0.01 m^-1\).
A.BILLON,J.PICAUT,’INTRODUCING ATMOSPHERIC ATTENUATION +WITHIN A DIFFUSION MODEL FOR ROOM-ACOUSTIC PREDICTIONS MARCH 2008.
Static Analysis ANTYPE=0
3D 20-Node Acoustic Solid (FLUID220)
Speed of sound, \(c_0 = 343 m/s\)
Density, \(\rho = 1.21 kg/m^3\)
Wall absorption coefficient, \(\alpha = 0.1\)
Atmospheric attenuation coefficient attn. = \(0.01 m^-1\)
Room length = \(30 m\)
Room width = \(30 m\)
Room height = \(3 m\)
Sound power source = \(1 \cdot 10^{-2} W\)
Steady analysis is performed to determine the sound pressure level inside the room. +In the post-processing, the sound pressure level (SPL) is listed every 2 m along a line +passing through the room center at 1 m high. The sound pressure level is calculated in +Mechanical APDL as:
+\(SPL = 10 \times \log_{10} \times \frac{\rho \times c_0^2 \times w}{P_{ref}^2}\)
+where w is diffuse sound energy and reference pressure \(P_{ref} = 2 \times 10^{-5}\).
+# sphinx_gallery_thumbnail_path = '_static/vm299_setup.png'
+
+import math
+
+# Importing the `launch_mapdl` function from the `ansys.mapdl.core` module
+from ansys.mapdl.core import launch_mapdl
+import numpy as np
+
+# Launch MAPDL with specified options
+mapdl = launch_mapdl(loglevel="WARNING", print_com=True, remove_temp_dir_on_exit=True)
+# Clear the current database
+mapdl.clear()
+
+# Run the FINISH command to exists normally from a processor
+mapdl.finish()
+
+# Set the ANSYS version
+mapdl.com("ANSYS MEDIA REL. 2022R2 (05/13/2022) REF. VERIF. MANUAL: REL. 2022R2")
+
+# Run the /VERIFY command for VM299
+mapdl.run("/VERIFY,VM299")
+
+# Set the title of the analysis
+mapdl.title("VM299 SOUND PRESSURE LEVEL IN A FLAT ROOM")
+
+# Entering the PREP7 environment in MAPDL
+mapdl.prep7()
+
+# It is not recommended to use '/NOPR' in a normal PyMAPDL session.
+mapdl._run("/NOPR")
+
+# Constant value of PI
+pi = math.pi
+
+# Set parameters for ROOM SIZE
+LX = 30
+LY = 30
+LZ = 3
+VOL = LX * LY * LZ
+SURF = 2 * (LX * LY + LY * LZ + LX * LZ)
+MFP = 4 * VOL / SURF
+
+# set parameters for MATERIAL PROPERTIES
+C0 = 343
+RHO = 1.21
+ROOMD = MFP * C0 / 3
+ATTN_Val = 0.01
+ROOMDP = ROOMD / (1.0 + ATTN_Val * MFP)
+ALPHA = 0.1
+WS = 1.0e-2
+
Set up the material and its type (a single material), density, speed of sound +wall absorption coefficient and Atmospheric attenuation coefficient is specified.
+ +Set up the nodes and elements. This creates a mesh just like in the +problem setup.
+H = 0.5
+a = np.array([0, 2.0, LX])
+b = np.array([0, 2.0, LY])
+c = np.array([0, 2.0, LZ])
+for i in range(2):
+ for j in range(2):
+ for k in range(2):
+ mapdl.block(a[i], a[i + 1], b[j], b[j + 1], c[k], c[k + 1])
+# mapdl.aplot()
+
+# Generates new volumes by “gluing” volumes.
+mapdl.vglue("ALL")
+# Define element, 3-D Acoustic Fluid 20-Node Solid Element
+mapdl.et(1, 220, 3, 4)
+mapdl.type(1) # set element type, Type=1
+mapdl.mat(1) # set material type, MAT=1
+mapdl.esize(H) # Specifies the element size.
+
+# Generates nodes and volume elements within volumes.
+mapdl.vmesh(9, 15, 1)
+
+# For elements that support multiple shapes, specifies the element shape, set mshape=3D
+mapdl.mshape(0, "3D")
+# Generates nodes and volume elements within volumes.
+mapdl.vmesh(1)
+# select nodes of specified location
+mapdl.nsel("S", "LOC", "X", 0)
+mapdl.nsel("A", "LOC", "X", LX)
+mapdl.nsel("A", "LOC", "Y", 0)
+mapdl.nsel("A", "LOC", "Y", LY)
+mapdl.nsel("A", "LOC", "Z", 0)
+mapdl.nsel("A", "LOC", "Z", LZ)
+
array([ 1, 2, 3, ..., 99476, 99477, 99478], dtype=int32)
+
Define Absorption coefficient and transmission loss.Define Mass source; mass +source rate; or power source in an energy diffusion solution for room acoustics. +Then exit prep7 processor.
+Effectiely, this sets: +- Sound power source = \(1 \cdot 10^{-2} W\)
+mapdl.sf("ALL", "ATTN", ALPHA)
+# Selects all entities
+mapdl.allsel()
+# select nodes of specified location
+mapdl.nsel("S", "LOC", "X", a[1])
+mapdl.nsel("R", "LOC", "Y", b[1])
+mapdl.nsel("R", "LOC", "Z", c[1])
+
+mapdl.bf("ALL", "MASS", WS)
+
+# Selects all entities
+mapdl.allsel()
+mapdl.eplot()
+# Finish pre-processing processor
+mapdl.finish()
+
***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter solution mode and solve the system.
+mapdl.slashsolu()
+# SOLVE STATIC ANALYSIS
+mapdl.solve()
+# exists solution processor
+mapdl.finish()
+
FINISH SOLUTION PROCESSING
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
Enter post-processing and read results set
+mapdl.post1()
+# Set the current results set to the last set to be read from result file
+mapdl.set("LAST")
+# Defines a path name and establishes parameters for the path
+mapdl.path("X_SPL", 2, "", 15)
+mapdl.ppath(1, "NODE", 0, 15, 1)
+mapdl.ppath(2, "NODE", 30, 15, 1)
+# Interpolates an item onto a path.
+mapdl.pdef("UX", "U", "X", "NOAV")
+mapdl.pdef("SPLX", "SPL", "", "NOAV")
+
+# redirects output to the default system output file
+mapdl.run("/OUT")
+
+# Prints path items along a geometry path.
+mapdl.prpath("UX", "SPLX")
+
+# redirects solver output to a file named "SCRATCH"
+mapdl.run("/OUT,SCRATCH")
+# Sets various line graph display options
+# DIVX: Determines the number of divisions (grid markers) that will be plotted on the X
+mapdl.gropt("DIVX", 15)
+# Specifies a linear ordinate (Y) scale range.
+mapdl.yrange(71, 82)
+# DIVY: Determines the number of divisions (grid markers) that will be plotted on the Y
+mapdl.gropt("DIVY", 11)
+# Specifies the device and other parameters for graphics displays.
+# Creates PNG (Portable Network Graphics) files that are named Jobnamennn.png
+mapdl.show("PNG", "rev")
+
+mapdl.plpath("UX", "SPLX") # Displays path items on a graph.
+mapdl.show("CLOSE") # This option purges the graphics file buffer.
+
en_1 = mapdl.get("EN_1", "NODE", n1, "ENKE")
+en_2 = mapdl.get("EN_2", "NODE", n2, "ENKE")
+en_3 = mapdl.get("EN_3", "NODE", n3, "ENKE")
+en_4 = mapdl.get("EN_4", "NODE", n4, "ENKE")
+en_5 = mapdl.get("EN_5", "NODE", n5, "ENKE")
+
+PREF = 2e-5
+x1 = (RHO * en_1 * C0**2) / PREF**2
+x2 = (RHO * en_2 * C0**2) / PREF**2
+x3 = (RHO * en_3 * C0**2) / PREF**2
+x4 = (RHO * en_4 * C0**2) / PREF**2
+x5 = (RHO * en_5 * C0**2) / PREF**2
+SPL_1 = 10 * (math.log10(x1))
+SPL_2 = 10 * (math.log10(x2))
+SPL_3 = 10 * (math.log10(x3))
+SPL_4 = 10 * (math.log10(x4))
+SPL_5 = 10 * (math.log10(x5))
+
+# Fill the target tesult values in array
+target_ref = np.array([80.0, 79.0, 77.5, 76.0, 74.5])
+
+# Fill the simulated result values in array
+value = np.array([SPL_1, SPL_2, SPL_3, SPL_4, SPL_5])
+
+# store ratio
+value_ratio = []
+for i in range(len(target_ref)):
+ a = value[i] / target_ref[i]
+ value_ratio.append(a)
+
+# assign labels position in meter
+label = np.array([5, 10, 15, 20, 25])
+
message = f"""
+------------------- VM299 RESULTS COMPARISON ---------------------
+ SPL at Position, X(m) | TARGET | Mechanical APDL | RATIO
+-----------------------------------------------------------------
+"""
+print(message)
+
+for i in range(len(target_ref)):
+ message = f"""
+ {label[i]:.5f} {target_ref[i]:.5f} {value[i]:.5f} {value_ratio[i]:.5f}
+ """
+ print(message)
+
+message = f"""
+-----------------------------------------------------------------
+"""
+print(message)
+
------------------- VM299 RESULTS COMPARISON ---------------------
+ SPL at Position, X(m) | TARGET | Mechanical APDL | RATIO
+-----------------------------------------------------------------
+
+
+ 5.00000 80.00000 80.90616 1.01133
+
+
+ 10.00000 79.00000 79.47874 1.00606
+
+
+ 15.00000 77.50000 77.39411 0.99863
+
+
+ 20.00000 76.00000 75.05736 0.98760
+
+
+ 25.00000 74.50000 72.93575 0.97900
+
+
+-----------------------------------------------------------------
+
mapdl.finish()
+
EXIT THE MAPDL POST1 DATABASE PROCESSOR
+
+
+ ***** ROUTINE COMPLETED ***** CP = 0.000
+
mapdl.exit()
+
Total running time of the script: (0 minutes 12.813 seconds)
+ + +