incomp-flame-post/python/post/index.html
2026-06-05 13:27:38 +00:00

24460 lines
No EOL
1.1 MiB

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="prev" href="../code_gen/">
<link rel="next" href="../../archive/pycompact/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Compiler Stages - HPC DNS Post-Processing Reference Manual</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/_mkdocstrings.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="cyan">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#compiler-stages-postpy" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="HPC DNS Post-Processing Reference Manual" class="md-header__button md-logo" aria-label="HPC DNS Post-Processing Reference Manual" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
HPC DNS Post-Processing Reference Manual
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Compiler Stages
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="cyan" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="cyan" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../code_gen/" class="md-tabs__link">
Python API Reference
</a>
</li>
<li class="md-tabs__item">
<a href="../../archive/pycompact/" class="md-tabs__link">
Archived Components
</a>
</li>
<li class="md-tabs__item">
<a href="../../fortran/" class="md-tabs__link">
Fortran Core Reference
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="HPC DNS Post-Processing Reference Manual" class="md-nav__button md-logo" aria-label="HPC DNS Post-Processing Reference Manual" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
HPC DNS Post-Processing Reference Manual
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-ellipsis">
Python API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Python API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../code_gen/" class="md-nav__link">
<span class="md-ellipsis">
Code Generator
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Compiler Stages
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Compiler Stages
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#post" class="md-nav__link">
<span class="md-ellipsis">
post
</span>
</a>
<nav class="md-nav" aria-label="post">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post--dns-post-processing-code-generator-core-postpy" class="md-nav__link">
<span class="md-ellipsis">
DNS Post-Processing Code Generator Core (post.py)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ArrayFCodePrinter" class="md-nav__link">
<span class="md-ellipsis">
ArrayFCodePrinter
</span>
</a>
<nav class="md-nav" aria-label="ArrayFCodePrinter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ArrayFCodePrinter.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField" class="md-nav__link">
<span class="md-ellipsis">
AveragedField
</span>
</a>
<nav class="md-nav" aria-label="AveragedField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.AveragedField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.id" class="md-nav__link">
<span class="md-ellipsis">
id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.isWeighted" class="md-nav__link">
<span class="md-ellipsis">
isWeighted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.pass1" class="md-nav__link">
<span class="md-ellipsis">
pass1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.pass2" class="md-nav__link">
<span class="md-ellipsis">
pass2
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions" class="md-nav__link">
<span class="md-ellipsis">
CollectDefinitions
</span>
</a>
<nav class="md-nav" aria-label="CollectDefinitions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.CollectDefinitions.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.assign_avg_var" class="md-nav__link">
<span class="md-ellipsis">
assign_avg_var
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.assign_var" class="md-nav__link">
<span class="md-ellipsis">
assign_var
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.varlist" class="md-nav__link">
<span class="md-ellipsis">
varlist
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.CompilationContext" class="md-nav__link">
<span class="md-ellipsis">
CompilationContext
</span>
</a>
<nav class="md-nav" aria-label="CompilationContext">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.CompilationContext.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode" class="md-nav__link">
<span class="md-ellipsis">
DependencyNode
</span>
</a>
<nav class="md-nav" aria-label="DependencyNode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DependencyNode.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.checkFluctuation" class="md-nav__link">
<span class="md-ellipsis">
checkFluctuation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.depClosure" class="md-nav__link">
<span class="md-ellipsis">
depClosure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.depends_on" class="md-nav__link">
<span class="md-ellipsis">
depends_on
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.is_fluctuation" class="md-nav__link">
<span class="md-ellipsis">
is_fluctuation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage" class="md-nav__link">
<span class="md-ellipsis">
DependencyResolutionStage
</span>
</a>
<nav class="md-nav" aria-label="DependencyResolutionStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.calc_size" class="md-nav__link">
<span class="md-ellipsis">
calc_size
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.sort_vars_new" class="md-nav__link">
<span class="md-ellipsis">
sort_vars_new
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DerivativeExpansionStage" class="md-nav__link">
<span class="md-ellipsis">
DerivativeExpansionStage
</span>
</a>
<nav class="md-nav" aria-label="DerivativeExpansionStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DerivativeExpansionStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DerivedField" class="md-nav__link">
<span class="md-ellipsis">
DerivedField
</span>
</a>
<nav class="md-nav" aria-label="DerivedField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DerivedField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry" class="md-nav__link">
<span class="md-ellipsis">
DifferentialOperatorRegistry
</span>
</a>
<nav class="md-nav" aria-label="DifferentialOperatorRegistry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.get_latex_symbol" class="md-nav__link">
<span class="md-ellipsis">
get_latex_symbol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.register" class="md-nav__link">
<span class="md-ellipsis">
register
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector" class="md-nav__link">
<span class="md-ellipsis">
ExpInspector
</span>
</a>
<nav class="md-nav" aria-label="ExpInspector">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpInspector.__call__" class="md-nav__link">
<span class="md-ellipsis">
__call__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.inspect" class="md-nav__link">
<span class="md-ellipsis">
inspect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode" class="md-nav__link">
<span class="md-ellipsis">
ExpToCode
</span>
</a>
<nav class="md-nav" aria-label="ExpToCode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpToCode.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex" class="md-nav__link">
<span class="md-ellipsis">
ExpToLatex
</span>
</a>
<nav class="md-nav" aria-label="ExpToLatex">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpToLatex.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.arithmatic_rooted" class="md-nav__link">
<span class="md-ellipsis">
arithmatic_rooted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.parenthise" class="md-nav__link">
<span class="md-ellipsis">
parenthise
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.Field" class="md-nav__link">
<span class="md-ellipsis">
Field
</span>
</a>
<nav class="md-nav" aria-label="Field">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.Field.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.Field.export_on" class="md-nav__link">
<span class="md-ellipsis">
export_on
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase" class="md-nav__link">
<span class="md-ellipsis">
FieldBase
</span>
</a>
<nav class="md-nav" aria-label="FieldBase">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FieldBase.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase.__repr__" class="md-nav__link">
<span class="md-ellipsis">
__repr__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase.export_on" class="md-nav__link">
<span class="md-ellipsis">
export_on
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FieldExporter" class="md-nav__link">
<span class="md-ellipsis">
FieldExporter
</span>
</a>
<nav class="md-nav" aria-label="FieldExporter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FieldExporter.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FluctuationField" class="md-nav__link">
<span class="md-ellipsis">
FluctuationField
</span>
</a>
<nav class="md-nav" aria-label="FluctuationField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FluctuationField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FluctuationField.id" class="md-nav__link">
<span class="md-ellipsis">
id
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator" class="md-nav__link">
<span class="md-ellipsis">
FortranCodeGenerator
</span>
</a>
<nav class="md-nav" aria-label="FortranCodeGenerator">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_alloc" class="md-nav__link">
<span class="md-ellipsis">
generate_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_avg" class="md-nav__link">
<span class="md-ellipsis">
generate_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_code" class="md-nav__link">
<span class="md-ellipsis">
generate_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_decl" class="md-nav__link">
<span class="md-ellipsis">
generate_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_free" class="md-nav__link">
<span class="md-ellipsis">
generate_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_write_avg" class="md-nav__link">
<span class="md-ellipsis">
generate_write_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_alloc" class="md-nav__link">
<span class="md-ellipsis">
generic_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_avg" class="md-nav__link">
<span class="md-ellipsis">
generic_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_code" class="md-nav__link">
<span class="md-ellipsis">
generic_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_decl" class="md-nav__link">
<span class="md-ellipsis">
generic_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_free" class="md-nav__link">
<span class="md-ellipsis">
generic_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_AveragedField_avg" class="md-nav__link">
<span class="md-ellipsis">
visit_AveragedField_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_AveragedField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_AveragedField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_DerivedField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_DerivedField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_alloc" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_code" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_decl" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_free" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_Field_code" class="md-nav__link">
<span class="md-ellipsis">
visit_Field_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FluctuationField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_FluctuationField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_alloc" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_decl" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_free" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_free
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranProgramWriter" class="md-nav__link">
<span class="md-ellipsis">
FortranProgramWriter
</span>
</a>
<nav class="md-nav" aria-label="FortranProgramWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FortranProgramWriter.work_array_codes" class="md-nav__link">
<span class="md-ellipsis">
work_array_codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranProgramWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranTemplateStore" class="md-nav__link">
<span class="md-ellipsis">
FortranTemplateStore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry" class="md-nav__link">
<span class="md-ellipsis">
FunctionRegistry
</span>
</a>
<nav class="md-nav" aria-label="FunctionRegistry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FunctionRegistry.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.register_latex" class="md-nav__link">
<span class="md-ellipsis">
register_latex
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.register_sympy" class="md-nav__link">
<span class="md-ellipsis">
register_sympy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.to_latex" class="md-nav__link">
<span class="md-ellipsis">
to_latex
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.to_sympy" class="md-nav__link">
<span class="md-ellipsis">
to_sympy
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy" class="md-nav__link">
<span class="md-ellipsis">
LarkToSympy
</span>
</a>
<nav class="md-nav" aria-label="LarkToSympy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.LarkToSympy.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.udf" class="md-nav__link">
<span class="md-ellipsis">
udf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.LatexWriter" class="md-nav__link">
<span class="md-ellipsis">
LatexWriter
</span>
</a>
<nav class="md-nav" aria-label="LatexWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.LatexWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ParserStage" class="md-nav__link">
<span class="md-ellipsis">
ParserStage
</span>
</a>
<nav class="md-nav" aria-label="ParserStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ParserStage.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ParserStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.PrimaryField" class="md-nav__link">
<span class="md-ellipsis">
PrimaryField
</span>
</a>
<nav class="md-nav" aria-label="PrimaryField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.PrimaryField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ReportWriter" class="md-nav__link">
<span class="md-ellipsis">
ReportWriter
</span>
</a>
<nav class="md-nav" aria-label="ReportWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ReportWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage" class="md-nav__link">
<span class="md-ellipsis">
SympyOptimizationStage
</span>
</a>
<nav class="md-nav" aria-label="SympyOptimizationStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.allocate_arr" class="md-nav__link">
<span class="md-ellipsis">
allocate_arr
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.liveness" class="md-nav__link">
<span class="md-ellipsis">
liveness
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer" class="md-nav__link">
<span class="md-ellipsis">
SympyOptimizer
</span>
</a>
<nav class="md-nav" aria-label="SympyOptimizer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympyOptimizer.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.calculate_flops_and_heavy" class="md-nav__link">
<span class="md-ellipsis">
calculate_flops_and_heavy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.count_3d_loads" class="md-nav__link">
<span class="md-ellipsis">
count_3d_loads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.get_instance" class="md-nav__link">
<span class="md-ellipsis">
get_instance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.get_sympy_expr" class="md-nav__link">
<span class="md-ellipsis">
get_sympy_expr
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.optimize_field" class="md-nav__link">
<span class="md-ellipsis">
optimize_field
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.set_averaged" class="md-nav__link">
<span class="md-ellipsis">
set_averaged
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympySimplificationStage" class="md-nav__link">
<span class="md-ellipsis">
SympySimplificationStage
</span>
</a>
<nav class="md-nav" aria-label="SympySimplificationStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympySimplificationStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.make_allocate" class="md-nav__link">
<span class="md-ellipsis">
make_allocate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_bool" class="md-nav__link">
<span class="md-ellipsis">
tok_to_bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_int" class="md-nav__link">
<span class="md-ellipsis">
tok_to_int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_str" class="md-nav__link">
<span class="md-ellipsis">
tok_to_str
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Archived Components
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Archived Components
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../archive/pycompact/" class="md-nav__link">
<span class="md-ellipsis">
Python Bindings
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Fortran Core Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Fortran Core Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../fortran/" class="md-nav__link">
<span class="md-ellipsis">
Modules & Procedures
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#post" class="md-nav__link">
<span class="md-ellipsis">
post
</span>
</a>
<nav class="md-nav" aria-label="post">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post--dns-post-processing-code-generator-core-postpy" class="md-nav__link">
<span class="md-ellipsis">
DNS Post-Processing Code Generator Core (post.py)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ArrayFCodePrinter" class="md-nav__link">
<span class="md-ellipsis">
ArrayFCodePrinter
</span>
</a>
<nav class="md-nav" aria-label="ArrayFCodePrinter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ArrayFCodePrinter.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField" class="md-nav__link">
<span class="md-ellipsis">
AveragedField
</span>
</a>
<nav class="md-nav" aria-label="AveragedField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.AveragedField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.id" class="md-nav__link">
<span class="md-ellipsis">
id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.isWeighted" class="md-nav__link">
<span class="md-ellipsis">
isWeighted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.pass1" class="md-nav__link">
<span class="md-ellipsis">
pass1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.AveragedField.pass2" class="md-nav__link">
<span class="md-ellipsis">
pass2
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions" class="md-nav__link">
<span class="md-ellipsis">
CollectDefinitions
</span>
</a>
<nav class="md-nav" aria-label="CollectDefinitions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.CollectDefinitions.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.assign_avg_var" class="md-nav__link">
<span class="md-ellipsis">
assign_avg_var
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.assign_var" class="md-nav__link">
<span class="md-ellipsis">
assign_var
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.CollectDefinitions.varlist" class="md-nav__link">
<span class="md-ellipsis">
varlist
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.CompilationContext" class="md-nav__link">
<span class="md-ellipsis">
CompilationContext
</span>
</a>
<nav class="md-nav" aria-label="CompilationContext">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.CompilationContext.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode" class="md-nav__link">
<span class="md-ellipsis">
DependencyNode
</span>
</a>
<nav class="md-nav" aria-label="DependencyNode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DependencyNode.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.checkFluctuation" class="md-nav__link">
<span class="md-ellipsis">
checkFluctuation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.depClosure" class="md-nav__link">
<span class="md-ellipsis">
depClosure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.depends_on" class="md-nav__link">
<span class="md-ellipsis">
depends_on
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyNode.is_fluctuation" class="md-nav__link">
<span class="md-ellipsis">
is_fluctuation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage" class="md-nav__link">
<span class="md-ellipsis">
DependencyResolutionStage
</span>
</a>
<nav class="md-nav" aria-label="DependencyResolutionStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.calc_size" class="md-nav__link">
<span class="md-ellipsis">
calc_size
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DependencyResolutionStage.sort_vars_new" class="md-nav__link">
<span class="md-ellipsis">
sort_vars_new
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DerivativeExpansionStage" class="md-nav__link">
<span class="md-ellipsis">
DerivativeExpansionStage
</span>
</a>
<nav class="md-nav" aria-label="DerivativeExpansionStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DerivativeExpansionStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DerivedField" class="md-nav__link">
<span class="md-ellipsis">
DerivedField
</span>
</a>
<nav class="md-nav" aria-label="DerivedField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DerivedField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry" class="md-nav__link">
<span class="md-ellipsis">
DifferentialOperatorRegistry
</span>
</a>
<nav class="md-nav" aria-label="DifferentialOperatorRegistry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.get_latex_symbol" class="md-nav__link">
<span class="md-ellipsis">
get_latex_symbol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.DifferentialOperatorRegistry.register" class="md-nav__link">
<span class="md-ellipsis">
register
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector" class="md-nav__link">
<span class="md-ellipsis">
ExpInspector
</span>
</a>
<nav class="md-nav" aria-label="ExpInspector">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpInspector.__call__" class="md-nav__link">
<span class="md-ellipsis">
__call__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.inspect" class="md-nav__link">
<span class="md-ellipsis">
inspect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpInspector.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode" class="md-nav__link">
<span class="md-ellipsis">
ExpToCode
</span>
</a>
<nav class="md-nav" aria-label="ExpToCode">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpToCode.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToCode.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex" class="md-nav__link">
<span class="md-ellipsis">
ExpToLatex
</span>
</a>
<nav class="md-nav" aria-label="ExpToLatex">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ExpToLatex.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.arithmatic_rooted" class="md-nav__link">
<span class="md-ellipsis">
arithmatic_rooted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.parenthise" class="md-nav__link">
<span class="md-ellipsis">
parenthise
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ExpToLatex.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.Field" class="md-nav__link">
<span class="md-ellipsis">
Field
</span>
</a>
<nav class="md-nav" aria-label="Field">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.Field.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.Field.export_on" class="md-nav__link">
<span class="md-ellipsis">
export_on
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase" class="md-nav__link">
<span class="md-ellipsis">
FieldBase
</span>
</a>
<nav class="md-nav" aria-label="FieldBase">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FieldBase.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase.__repr__" class="md-nav__link">
<span class="md-ellipsis">
__repr__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FieldBase.export_on" class="md-nav__link">
<span class="md-ellipsis">
export_on
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FieldExporter" class="md-nav__link">
<span class="md-ellipsis">
FieldExporter
</span>
</a>
<nav class="md-nav" aria-label="FieldExporter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FieldExporter.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FluctuationField" class="md-nav__link">
<span class="md-ellipsis">
FluctuationField
</span>
</a>
<nav class="md-nav" aria-label="FluctuationField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FluctuationField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FluctuationField.id" class="md-nav__link">
<span class="md-ellipsis">
id
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator" class="md-nav__link">
<span class="md-ellipsis">
FortranCodeGenerator
</span>
</a>
<nav class="md-nav" aria-label="FortranCodeGenerator">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_alloc" class="md-nav__link">
<span class="md-ellipsis">
generate_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_avg" class="md-nav__link">
<span class="md-ellipsis">
generate_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_code" class="md-nav__link">
<span class="md-ellipsis">
generate_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_decl" class="md-nav__link">
<span class="md-ellipsis">
generate_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_free" class="md-nav__link">
<span class="md-ellipsis">
generate_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generate_write_avg" class="md-nav__link">
<span class="md-ellipsis">
generate_write_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_alloc" class="md-nav__link">
<span class="md-ellipsis">
generic_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_avg" class="md-nav__link">
<span class="md-ellipsis">
generic_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_code" class="md-nav__link">
<span class="md-ellipsis">
generic_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_decl" class="md-nav__link">
<span class="md-ellipsis">
generic_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.generic_free" class="md-nav__link">
<span class="md-ellipsis">
generic_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_AveragedField_avg" class="md-nav__link">
<span class="md-ellipsis">
visit_AveragedField_avg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_AveragedField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_AveragedField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_DerivedField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_DerivedField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_alloc" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_code" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_decl" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FieldExporter_free" class="md-nav__link">
<span class="md-ellipsis">
visit_FieldExporter_free
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_Field_code" class="md-nav__link">
<span class="md-ellipsis">
visit_Field_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_FluctuationField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_FluctuationField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_alloc" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_alloc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_code" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_code
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_decl" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_decl
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranCodeGenerator.visit_PrimaryField_free" class="md-nav__link">
<span class="md-ellipsis">
visit_PrimaryField_free
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranProgramWriter" class="md-nav__link">
<span class="md-ellipsis">
FortranProgramWriter
</span>
</a>
<nav class="md-nav" aria-label="FortranProgramWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FortranProgramWriter.work_array_codes" class="md-nav__link">
<span class="md-ellipsis">
work_array_codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FortranProgramWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.FortranTemplateStore" class="md-nav__link">
<span class="md-ellipsis">
FortranTemplateStore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry" class="md-nav__link">
<span class="md-ellipsis">
FunctionRegistry
</span>
</a>
<nav class="md-nav" aria-label="FunctionRegistry">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.FunctionRegistry.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.register_latex" class="md-nav__link">
<span class="md-ellipsis">
register_latex
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.register_sympy" class="md-nav__link">
<span class="md-ellipsis">
register_sympy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.to_latex" class="md-nav__link">
<span class="md-ellipsis">
to_latex
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.FunctionRegistry.to_sympy" class="md-nav__link">
<span class="md-ellipsis">
to_sympy
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy" class="md-nav__link">
<span class="md-ellipsis">
LarkToSympy
</span>
</a>
<nav class="md-nav" aria-label="LarkToSympy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.LarkToSympy.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.add" class="md-nav__link">
<span class="md-ellipsis">
add
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.div" class="md-nav__link">
<span class="md-ellipsis">
div
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.dnx" class="md-nav__link">
<span class="md-ellipsis">
dnx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.env" class="md-nav__link">
<span class="md-ellipsis">
env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.fcall" class="md-nav__link">
<span class="md-ellipsis">
fcall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.fluc" class="md-nav__link">
<span class="md-ellipsis">
fluc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.icall" class="md-nav__link">
<span class="md-ellipsis">
icall
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.mul" class="md-nav__link">
<span class="md-ellipsis">
mul
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.neg" class="md-nav__link">
<span class="md-ellipsis">
neg
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.number" class="md-nav__link">
<span class="md-ellipsis">
number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.paren" class="md-nav__link">
<span class="md-ellipsis">
paren
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.sub" class="md-nav__link">
<span class="md-ellipsis">
sub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.udf" class="md-nav__link">
<span class="md-ellipsis">
udf
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.LarkToSympy.var" class="md-nav__link">
<span class="md-ellipsis">
var
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.LatexWriter" class="md-nav__link">
<span class="md-ellipsis">
LatexWriter
</span>
</a>
<nav class="md-nav" aria-label="LatexWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.LatexWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ParserStage" class="md-nav__link">
<span class="md-ellipsis">
ParserStage
</span>
</a>
<nav class="md-nav" aria-label="ParserStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ParserStage.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.ParserStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.PrimaryField" class="md-nav__link">
<span class="md-ellipsis">
PrimaryField
</span>
</a>
<nav class="md-nav" aria-label="PrimaryField">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.PrimaryField.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.ReportWriter" class="md-nav__link">
<span class="md-ellipsis">
ReportWriter
</span>
</a>
<nav class="md-nav" aria-label="ReportWriter">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.ReportWriter.write" class="md-nav__link">
<span class="md-ellipsis">
write
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage" class="md-nav__link">
<span class="md-ellipsis">
SympyOptimizationStage
</span>
</a>
<nav class="md-nav" aria-label="SympyOptimizationStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.allocate_arr" class="md-nav__link">
<span class="md-ellipsis">
allocate_arr
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizationStage.liveness" class="md-nav__link">
<span class="md-ellipsis">
liveness
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer" class="md-nav__link">
<span class="md-ellipsis">
SympyOptimizer
</span>
</a>
<nav class="md-nav" aria-label="SympyOptimizer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympyOptimizer.__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.calculate_flops_and_heavy" class="md-nav__link">
<span class="md-ellipsis">
calculate_flops_and_heavy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.count_3d_loads" class="md-nav__link">
<span class="md-ellipsis">
count_3d_loads
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.get_instance" class="md-nav__link">
<span class="md-ellipsis">
get_instance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.get_sympy_expr" class="md-nav__link">
<span class="md-ellipsis">
get_sympy_expr
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.optimize_field" class="md-nav__link">
<span class="md-ellipsis">
optimize_field
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.SympyOptimizer.set_averaged" class="md-nav__link">
<span class="md-ellipsis">
set_averaged
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.SympySimplificationStage" class="md-nav__link">
<span class="md-ellipsis">
SympySimplificationStage
</span>
</a>
<nav class="md-nav" aria-label="SympySimplificationStage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#post.SympySimplificationStage.execute" class="md-nav__link">
<span class="md-ellipsis">
execute
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#post.make_allocate" class="md-nav__link">
<span class="md-ellipsis">
make_allocate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_bool" class="md-nav__link">
<span class="md-ellipsis">
tok_to_bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_int" class="md-nav__link">
<span class="md-ellipsis">
tok_to_int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#post.tok_to_str" class="md-nav__link">
<span class="md-ellipsis">
tok_to_str
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="compiler-stages-postpy">Compiler Stages (<code>post.py</code>)</h1>
<div class="doc doc-object doc-module">
<h2 id="post" class="doc doc-heading">
<code>post</code>
</h2>
<div class="doc doc-contents first">
<h3 id="post--dns-post-processing-code-generator-core-postpy">DNS Post-Processing Code Generator Core (post.py)</h3>
<p>이 모듈은 난류 및 연소 DNS(Direct Numerical Simulation) 데이터의 후처리를 위한 고성능 Fortran 코드를 생성하는 컴파일러의 코어입니다.
사용자가 정의한 DSL(Domain Specific Language) 입력 식을 읽어 파싱한 후, 다음과 같은 4단계 최적화 컴파일 과정을 거쳐 극도로 최적화된 3차원 루프 Fortran 모듈 코드를 자동 생성합니다.</p>
<p>[컴파일러 파이프라인 4단계 개요]
1. Stage 1 (AST 수집 및 변수 정의):
- Lark 파서가 생성한 AST(Abstract Syntax Tree)를 순회하며 기본 입력 변수(Primary), 계산이 필요한 대입식(Derived),
그리고 통계 물리량 계산을 위한 평균화 변수(Averaged)를 추출하고 필드 메타데이터 객체를 구성합니다.
2. Stage 2 (수치 미분 및 변동량 확장):
- 수식 내에 수치 미분자(ddx, d2dy 등)나 변동량(fluctuation, u')이 존재하면, 이를 물리적으로 차분 연산할 중간
미분 필드(DerivedField) 및 변동량 필드(FluctuationField)로 자동 변환하고 변수 테이블에 등록하여 확장합니다.
3. Stage 3 (의존성 분석 및 위상 정렬):
- 필드 간의 선후 연산 관계를 분석하여 유향 의존성 그래프(Directed Dependency Graph)를 생성합니다.
- 난류 통계의 특성상 평균 연산을 기준으로 "평균치 계산 전의 루프(Pass 1)"와 "평균치를 구한 후 변동량을 계산하는 루프(Pass 2)"로
전체 연산 블록을 논리적으로 분할하고, 각각의 블록 내에서 올바른 순서로 계산되도록 위상 정렬(Topological Sort)을 수행합니다.
4. Stage 4 (수식 기호 최적화, Liveness 분석 및 Buffer Array Pooling):
- SymPy 기호 수학 라이브러리를 이용하여 복잡한 3차원 수식을 대수적으로 간소화하고, 공통 부분 식 제거(CSE)를 적용하여 연산 비용(Flops)을 최적화합니다.
- 격자 데이터가 거대하므로 모든 변수에 개별 3D 배열을 할당하면 메모리가 고갈됩니다. 이를 방지하기 위해 변수들의
생명 주기(Liveness Window)를 수학적으로 추적하고, 동적 메모리 풀을 구축하여 동시에 활성화되지 않는 임시 변수들이
공통의 제한된 버퍼 배열(xyzbuffer0, xyzbuffer1, ...)을 나누어 사용(Array Pooling)하도록 할당하여 메모리 사용량을 최소화합니다.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h3 id="post.ArrayFCodePrinter" class="doc doc-heading">
<code>ArrayFCodePrinter</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="sympy.printing.fortran.FCodePrinter">FCodePrinter</span></code></p>
<p>Custom SymPy printer that formats symbols as Fortran multidimensional array accesses.</p>
<p>Transforms plain SymPy symbols into:
- 3D grid accesses (e.g., var(i,j,k)) for spatial fields.
- 1D array accesses (e.g., var(i)) for spatial averages.
- Subtraction expressions (e.g., (u(i,j,k) - avg_u(i))) for fluctuation variables.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">898</span>
<span class="normal">899</span>
<span class="normal">900</span>
<span class="normal">901</span>
<span class="normal">902</span>
<span class="normal">903</span>
<span class="normal">904</span>
<span class="normal">905</span>
<span class="normal">906</span>
<span class="normal">907</span>
<span class="normal">908</span>
<span class="normal">909</span>
<span class="normal">910</span>
<span class="normal">911</span>
<span class="normal">912</span>
<span class="normal">913</span>
<span class="normal">914</span>
<span class="normal">915</span>
<span class="normal">916</span>
<span class="normal">917</span>
<span class="normal">918</span>
<span class="normal">919</span>
<span class="normal">920</span>
<span class="normal">921</span>
<span class="normal">922</span>
<span class="normal">923</span>
<span class="normal">924</span>
<span class="normal">925</span>
<span class="normal">926</span>
<span class="normal">927</span>
<span class="normal">928</span>
<span class="normal">929</span>
<span class="normal">930</span>
<span class="normal">931</span>
<span class="normal">932</span>
<span class="normal">933</span>
<span class="normal">934</span>
<span class="normal">935</span>
<span class="normal">936</span>
<span class="normal">937</span>
<span class="normal">938</span>
<span class="normal">939</span>
<span class="normal">940</span>
<span class="normal">941</span>
<span class="normal">942</span>
<span class="normal">943</span>
<span class="normal">944</span>
<span class="normal">945</span>
<span class="normal">946</span>
<span class="normal">947</span>
<span class="normal">948</span>
<span class="normal">949</span>
<span class="normal">950</span>
<span class="normal">951</span>
<span class="normal">952</span>
<span class="normal">953</span>
<span class="normal">954</span>
<span class="normal">955</span>
<span class="normal">956</span>
<span class="normal">957</span>
<span class="normal">958</span>
<span class="normal">959</span>
<span class="normal">960</span>
<span class="normal">961</span>
<span class="normal">962</span>
<span class="normal">963</span>
<span class="normal">964</span>
<span class="normal">965</span>
<span class="normal">966</span>
<span class="normal">967</span>
<span class="normal">968</span>
<span class="normal">969</span>
<span class="normal">970</span>
<span class="normal">971</span>
<span class="normal">972</span>
<span class="normal">973</span>
<span class="normal">974</span>
<span class="normal">975</span>
<span class="normal">976</span>
<span class="normal">977</span>
<span class="normal">978</span>
<span class="normal">979</span>
<span class="normal">980</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">ArrayFCodePrinter</span><span class="p">(</span><span class="n">FCodePrinter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Custom SymPy printer that formats symbols as Fortran multidimensional array accesses.</span>
<span class="sd"> Transforms plain SymPy symbols into:</span>
<span class="sd"> - 3D grid accesses (e.g., var(i,j,k)) for spatial fields.</span>
<span class="sd"> - 1D array accesses (e.g., var(i)) for spatial averages.</span>
<span class="sd"> - Subtraction expressions (e.g., (u(i,j,k) - avg_u(i))) for fluctuation variables.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">array_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">avg_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ArrayFCodePrinter with array settings and symbol catalogs.</span>
<span class="sd"> Args:</span>
<span class="sd"> settings (dict, optional): Printer settings configuration. Defaults to None.</span>
<span class="sd"> array_symbols (dict, optional): Maps 3D fields to their buffer array names. Defaults to None.</span>
<span class="sd"> avg_symbols (dict, optional): Maps averaged fields to their 1D arrays. Defaults to None.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">settings</span> <span class="o">=</span> <span class="n">settings</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;source_format&#39;</span><span class="p">,</span> <span class="s1">&#39;free&#39;</span><span class="p">)</span> <span class="c1"># Default to free-form Fortran 95</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;standard&#39;</span><span class="p">,</span> <span class="mi">95</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">settings</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array_symbols</span> <span class="o">=</span> <span class="n">array_symbols</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_symbols</span> <span class="o">=</span> <span class="n">avg_symbols</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">_print_Float</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Prints Float constants with double precision (d0) suffix.</span>
<span class="sd"> Ensures precision is not degraded during Fortran compilation.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Float): SymPy float node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Double precision literal string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;e&#39;</span> <span class="ow">in</span> <span class="n">val</span> <span class="ow">or</span> <span class="s1">&#39;E&#39;</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;E&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span> <span class="o">+</span> <span class="s2">&quot;.0d0&quot;</span>
<span class="k">return</span> <span class="n">val</span> <span class="o">+</span> <span class="s2">&quot;d0&quot;</span>
<span class="k">def</span> <span class="nf">_print_Symbol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps a SymPy Symbol to a Fortran array expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Symbol): SymPy Symbol to print.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Formatted Fortran variable access or inline fluctuation calculation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">expr</span><span class="o">.</span><span class="n">name</span>
<span class="c1"># 1. 3D grid array</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">array_symbols</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">array_symbols</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="si">}</span><span class="s2">(i,j,k)&quot;</span>
<span class="c1"># 2. 1D averaged array</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">avg_symbols</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">avg_symbols</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="si">}</span><span class="s2">(i)&quot;</span>
<span class="c1"># 3. Fluctuation substitution (e.g. u&#39; -&gt; u - &lt;u_w&gt;)</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;__prime&quot;</span><span class="p">):</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">7</span><span class="p">]</span>
<span class="n">arr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">array_symbols</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">base</span><span class="p">)</span>
<span class="n">avg_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;avg_</span><span class="si">{</span><span class="n">base</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">printed_avg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">avg_symbols</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">avg_name</span><span class="p">,</span><span class="w"> </span><span class="n">avg_name</span><span class="p">)</span><span class="si">}</span><span class="s2">(i)&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">arr</span><span class="si">}</span><span class="s2">(i,j,k) - </span><span class="si">{</span><span class="n">printed_avg</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="n">name</span>
<span class="k">def</span> <span class="nf">_print_Function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Prints custom non-standard functions securely in Fortran output.</span>
<span class="sd"> Fallback logic for rxn_rate, udf, etc.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Function): SymPy Function node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Standard Fortran call syntax for the function.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_print_Function</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">doprint</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">expr</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="n">args</span><span class="si">}</span><span class="s2">)&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ArrayFCodePrinter.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">array_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">avg_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes ArrayFCodePrinter with array settings and symbol catalogs.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>settings</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Printer settings configuration. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td><code>array_symbols</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Maps 3D fields to their buffer array names. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td><code>avg_symbols</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Maps averaged fields to their 1D arrays. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">907</span>
<span class="normal">908</span>
<span class="normal">909</span>
<span class="normal">910</span>
<span class="normal">911</span>
<span class="normal">912</span>
<span class="normal">913</span>
<span class="normal">914</span>
<span class="normal">915</span>
<span class="normal">916</span>
<span class="normal">917</span>
<span class="normal">918</span>
<span class="normal">919</span>
<span class="normal">920</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">array_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">avg_symbols</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ArrayFCodePrinter with array settings and symbol catalogs.</span>
<span class="sd"> Args:</span>
<span class="sd"> settings (dict, optional): Printer settings configuration. Defaults to None.</span>
<span class="sd"> array_symbols (dict, optional): Maps 3D fields to their buffer array names. Defaults to None.</span>
<span class="sd"> avg_symbols (dict, optional): Maps averaged fields to their 1D arrays. Defaults to None.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">settings</span> <span class="o">=</span> <span class="n">settings</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;source_format&#39;</span><span class="p">,</span> <span class="s1">&#39;free&#39;</span><span class="p">)</span> <span class="c1"># Default to free-form Fortran 95</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;standard&#39;</span><span class="p">,</span> <span class="mi">95</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">settings</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array_symbols</span> <span class="o">=</span> <span class="n">array_symbols</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_symbols</span> <span class="o">=</span> <span class="n">avg_symbols</span> <span class="ow">or</span> <span class="p">{}</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.AveragedField" class="doc doc-heading">
<code>AveragedField</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code></p>
<p>특정 물리 필드를 격자의 동질 차원(예: X 방향 1D선상 평균)에 대해
공간 통계 평균(Average) 연산을 수행하는 1차원 필드 클래스입니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2149</span>
<span class="normal">2150</span>
<span class="normal">2151</span>
<span class="normal">2152</span>
<span class="normal">2153</span>
<span class="normal">2154</span>
<span class="normal">2155</span>
<span class="normal">2156</span>
<span class="normal">2157</span>
<span class="normal">2158</span>
<span class="normal">2159</span>
<span class="normal">2160</span>
<span class="normal">2161</span>
<span class="normal">2162</span>
<span class="normal">2163</span>
<span class="normal">2164</span>
<span class="normal">2165</span>
<span class="normal">2166</span>
<span class="normal">2167</span>
<span class="normal">2168</span>
<span class="normal">2169</span>
<span class="normal">2170</span>
<span class="normal">2171</span>
<span class="normal">2172</span>
<span class="normal">2173</span>
<span class="normal">2174</span>
<span class="normal">2175</span>
<span class="normal">2176</span>
<span class="normal">2177</span>
<span class="normal">2178</span>
<span class="normal">2179</span>
<span class="normal">2180</span>
<span class="normal">2181</span>
<span class="normal">2182</span>
<span class="normal">2183</span>
<span class="normal">2184</span>
<span class="normal">2185</span>
<span class="normal">2186</span>
<span class="normal">2187</span>
<span class="normal">2188</span>
<span class="normal">2189</span>
<span class="normal">2190</span>
<span class="normal">2191</span>
<span class="normal">2192</span>
<span class="normal">2193</span>
<span class="normal">2194</span>
<span class="normal">2195</span>
<span class="normal">2196</span>
<span class="normal">2197</span>
<span class="normal">2198</span>
<span class="normal">2199</span>
<span class="normal">2200</span>
<span class="normal">2201</span>
<span class="normal">2202</span>
<span class="normal">2203</span>
<span class="normal">2204</span>
<span class="normal">2205</span>
<span class="normal">2206</span>
<span class="normal">2207</span>
<span class="normal">2208</span>
<span class="normal">2209</span>
<span class="normal">2210</span>
<span class="normal">2211</span>
<span class="normal">2212</span>
<span class="normal">2213</span>
<span class="normal">2214</span>
<span class="normal">2215</span>
<span class="normal">2216</span>
<span class="normal">2217</span>
<span class="normal">2218</span>
<span class="normal">2219</span>
<span class="normal">2220</span>
<span class="normal">2221</span>
<span class="normal">2222</span>
<span class="normal">2223</span>
<span class="normal">2224</span>
<span class="normal">2225</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">AveragedField</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;특정 물리 필드를 격자의 동질 차원(예: X 방향 1D선상 평균)에 대해 </span>
<span class="sd"> 공간 통계 평균(Average) 연산을 수행하는 1차원 필드 클래스입니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates average field naming key.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Weight parameter.</span>
<span class="sd"> tgt (str): Target field variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated averaged variable key name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_avg_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;avg_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tgt</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes AveragedField and populates dependency closure.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Average weights.</span>
<span class="sd"> tgt (str): Target variable to average.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">AveragedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shape</span> <span class="o">=</span> <span class="s2">&quot;nxp&quot;</span> <span class="c1"># Y, Z dimensions averaged out, leaving X-dimension array of size nxp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dim</span> <span class="o">=</span> <span class="s2">&quot;:&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">tgt</span>
<span class="n">tfield</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">tgt</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fset</span> <span class="o">=</span> <span class="n">tfield</span><span class="o">.</span><span class="n">checkFluctuation</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\left\langle </span><span class="si">{}</span><span class="s2"> \right\rangle&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tfield</span><span class="o">.</span><span class="n">latex</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">fset</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tgt</span> <span class="o">=</span> <span class="n">tgt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tgt</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ftgt</span> <span class="o">=</span> <span class="n">FluctuationField</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tgt</span> <span class="o">=</span> <span class="n">ftgt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ftgt</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">weighted</span> <span class="o">=</span> <span class="n">w</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">w</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">w</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">isWeighted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average has a weighted density variable.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if weighted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">weighted</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">pass1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average variable can be computed in loop Pass 1.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if Pass 1 average.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pass2</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">pass2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average variable requires Pass 2 (dependent on fluctuation).</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if Pass 2 average.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fset</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.AveragedField.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes AveragedField and populates dependency closure.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>w</code></td>
<td>
<code>str / None</code>
</td>
<td>
<div class="doc-md-description">
<p>Average weights.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>tgt</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Target variable to average.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2170</span>
<span class="normal">2171</span>
<span class="normal">2172</span>
<span class="normal">2173</span>
<span class="normal">2174</span>
<span class="normal">2175</span>
<span class="normal">2176</span>
<span class="normal">2177</span>
<span class="normal">2178</span>
<span class="normal">2179</span>
<span class="normal">2180</span>
<span class="normal">2181</span>
<span class="normal">2182</span>
<span class="normal">2183</span>
<span class="normal">2184</span>
<span class="normal">2185</span>
<span class="normal">2186</span>
<span class="normal">2187</span>
<span class="normal">2188</span>
<span class="normal">2189</span>
<span class="normal">2190</span>
<span class="normal">2191</span>
<span class="normal">2192</span>
<span class="normal">2193</span>
<span class="normal">2194</span>
<span class="normal">2195</span>
<span class="normal">2196</span>
<span class="normal">2197</span>
<span class="normal">2198</span>
<span class="normal">2199</span>
<span class="normal">2200</span>
<span class="normal">2201</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes AveragedField and populates dependency closure.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Average weights.</span>
<span class="sd"> tgt (str): Target variable to average.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">AveragedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shape</span> <span class="o">=</span> <span class="s2">&quot;nxp&quot;</span> <span class="c1"># Y, Z dimensions averaged out, leaving X-dimension array of size nxp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dim</span> <span class="o">=</span> <span class="s2">&quot;:&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">tgt</span>
<span class="n">tfield</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">tgt</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fset</span> <span class="o">=</span> <span class="n">tfield</span><span class="o">.</span><span class="n">checkFluctuation</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\left\langle </span><span class="si">{}</span><span class="s2"> \right\rangle&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tfield</span><span class="o">.</span><span class="n">latex</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">fset</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tgt</span> <span class="o">=</span> <span class="n">tgt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tgt</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ftgt</span> <span class="o">=</span> <span class="n">FluctuationField</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tgt</span> <span class="o">=</span> <span class="n">ftgt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ftgt</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">weighted</span> <span class="o">=</span> <span class="n">w</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">w</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">w</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.AveragedField.id" class="doc doc-heading">
<code class="highlight language-python"><span class="nb">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="doc doc-contents ">
<p>Generates average field naming key.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>w</code></td>
<td>
<code>str / None</code>
</td>
<td>
<div class="doc-md-description">
<p>Weight parameter.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>tgt</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Target field variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Generated averaged variable key name.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2154</span>
<span class="normal">2155</span>
<span class="normal">2156</span>
<span class="normal">2157</span>
<span class="normal">2158</span>
<span class="normal">2159</span>
<span class="normal">2160</span>
<span class="normal">2161</span>
<span class="normal">2162</span>
<span class="normal">2163</span>
<span class="normal">2164</span>
<span class="normal">2165</span>
<span class="normal">2166</span>
<span class="normal">2167</span>
<span class="normal">2168</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates average field naming key.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Weight parameter.</span>
<span class="sd"> tgt (str): Target field variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated averaged variable key name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_avg_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">tgt</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;avg_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tgt</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.AveragedField.isWeighted" class="doc doc-heading">
<code class="highlight language-python"><span class="n">isWeighted</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if average has a weighted density variable.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if weighted.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2203</span>
<span class="normal">2204</span>
<span class="normal">2205</span>
<span class="normal">2206</span>
<span class="normal">2207</span>
<span class="normal">2208</span>
<span class="normal">2209</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">isWeighted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average has a weighted density variable.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if weighted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">weighted</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.AveragedField.pass1" class="doc doc-heading">
<code class="highlight language-python"><span class="n">pass1</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if average variable can be computed in loop Pass 1.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if Pass 1 average.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2211</span>
<span class="normal">2212</span>
<span class="normal">2213</span>
<span class="normal">2214</span>
<span class="normal">2215</span>
<span class="normal">2216</span>
<span class="normal">2217</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">pass1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average variable can be computed in loop Pass 1.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if Pass 1 average.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pass2</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.AveragedField.pass2" class="doc doc-heading">
<code class="highlight language-python"><span class="n">pass2</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if average variable requires Pass 2 (dependent on fluctuation).</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if Pass 2 average.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2219</span>
<span class="normal">2220</span>
<span class="normal">2221</span>
<span class="normal">2222</span>
<span class="normal">2223</span>
<span class="normal">2224</span>
<span class="normal">2225</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">pass2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if average variable requires Pass 2 (dependent on fluctuation).</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if Pass 2 average.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fset</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.CollectDefinitions" class="doc doc-heading">
<code>CollectDefinitions</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="lark.Visitor">Visitor</span></code></p>
<p>Visitor that walks the Lark AST to collect variable and assignment declarations.</p>
<p>Gathers the primary fields (direct file inputs), derived calculation definitions,
and average directives (statistical averages) to build the compiler's initial model.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1262</span>
<span class="normal">1263</span>
<span class="normal">1264</span>
<span class="normal">1265</span>
<span class="normal">1266</span>
<span class="normal">1267</span>
<span class="normal">1268</span>
<span class="normal">1269</span>
<span class="normal">1270</span>
<span class="normal">1271</span>
<span class="normal">1272</span>
<span class="normal">1273</span>
<span class="normal">1274</span>
<span class="normal">1275</span>
<span class="normal">1276</span>
<span class="normal">1277</span>
<span class="normal">1278</span>
<span class="normal">1279</span>
<span class="normal">1280</span>
<span class="normal">1281</span>
<span class="normal">1282</span>
<span class="normal">1283</span>
<span class="normal">1284</span>
<span class="normal">1285</span>
<span class="normal">1286</span>
<span class="normal">1287</span>
<span class="normal">1288</span>
<span class="normal">1289</span>
<span class="normal">1290</span>
<span class="normal">1291</span>
<span class="normal">1292</span>
<span class="normal">1293</span>
<span class="normal">1294</span>
<span class="normal">1295</span>
<span class="normal">1296</span>
<span class="normal">1297</span>
<span class="normal">1298</span>
<span class="normal">1299</span>
<span class="normal">1300</span>
<span class="normal">1301</span>
<span class="normal">1302</span>
<span class="normal">1303</span>
<span class="normal">1304</span>
<span class="normal">1305</span>
<span class="normal">1306</span>
<span class="normal">1307</span>
<span class="normal">1308</span>
<span class="normal">1309</span>
<span class="normal">1310</span>
<span class="normal">1311</span>
<span class="normal">1312</span>
<span class="normal">1313</span>
<span class="normal">1314</span>
<span class="normal">1315</span>
<span class="normal">1316</span>
<span class="normal">1317</span>
<span class="normal">1318</span>
<span class="normal">1319</span>
<span class="normal">1320</span>
<span class="normal">1321</span>
<span class="normal">1322</span>
<span class="normal">1323</span>
<span class="normal">1324</span>
<span class="normal">1325</span>
<span class="normal">1326</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">CollectDefinitions</span><span class="p">(</span><span class="n">Visitor</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Visitor that walks the Lark AST to collect variable and assignment declarations.</span>
<span class="sd"> Gathers the primary fields (direct file inputs), derived calculation definitions,</span>
<span class="sd"> and average directives (statistical averages) to build the compiler&#39;s initial model.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">primary</span><span class="p">,</span> <span class="n">derived</span><span class="p">,</span> <span class="n">averaged</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes CollectDefinitions visitor.</span>
<span class="sd"> Args:</span>
<span class="sd"> primary (set): Set to accumulate primary input field names.</span>
<span class="sd"> derived (dict): Dictionary to accumulate derived Field objects.</span>
<span class="sd"> averaged (dict): Dictionary to accumulate average variable targets.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span> <span class="o">=</span> <span class="n">primary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span> <span class="o">=</span> <span class="n">derived</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="n">averaged</span>
<span class="k">def</span> <span class="nf">varlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses list of primary inputs declared in bracket syntax (e.g. [u, v, w]).</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for varlist.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">PrimaryField</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">assign_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses variable assignment statements and registers corresponding Field objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for assignment.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">lval</span><span class="p">,</span> <span class="n">lattr</span><span class="p">,</span> <span class="n">rval</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lval</span><span class="p">,</span> <span class="n">rval</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="n">lattr</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">attr_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">lattr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">lattr</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
<span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">children</span>
<span class="n">attr_dict</span><span class="p">[</span><span class="n">k</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span>
<span class="k">if</span> <span class="n">lval</span><span class="o">.</span><span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;duplicate definition of &quot;</span> <span class="o">+</span> <span class="n">lval</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">lval</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">lval</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">attr_dict</span><span class="p">,</span> <span class="n">rval</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">assign_avg_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses average directives and registers target variables for spatial averaging.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for average declaration.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">targets</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">])</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.CollectDefinitions.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">primary</span><span class="p">,</span> <span class="n">derived</span><span class="p">,</span> <span class="n">averaged</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes CollectDefinitions visitor.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>primary</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Set to accumulate primary input field names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>derived</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary to accumulate derived Field objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>averaged</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary to accumulate average variable targets.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1269</span>
<span class="normal">1270</span>
<span class="normal">1271</span>
<span class="normal">1272</span>
<span class="normal">1273</span>
<span class="normal">1274</span>
<span class="normal">1275</span>
<span class="normal">1276</span>
<span class="normal">1277</span>
<span class="normal">1278</span>
<span class="normal">1279</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">primary</span><span class="p">,</span> <span class="n">derived</span><span class="p">,</span> <span class="n">averaged</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes CollectDefinitions visitor.</span>
<span class="sd"> Args:</span>
<span class="sd"> primary (set): Set to accumulate primary input field names.</span>
<span class="sd"> derived (dict): Dictionary to accumulate derived Field objects.</span>
<span class="sd"> averaged (dict): Dictionary to accumulate average variable targets.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span> <span class="o">=</span> <span class="n">primary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span> <span class="o">=</span> <span class="n">derived</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="n">averaged</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.CollectDefinitions.assign_avg_var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">assign_avg_var</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Parses average directives and registers target variables for spatial averaging.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Lark AST node for average declaration.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1314</span>
<span class="normal">1315</span>
<span class="normal">1316</span>
<span class="normal">1317</span>
<span class="normal">1318</span>
<span class="normal">1319</span>
<span class="normal">1320</span>
<span class="normal">1321</span>
<span class="normal">1322</span>
<span class="normal">1323</span>
<span class="normal">1324</span>
<span class="normal">1325</span>
<span class="normal">1326</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">assign_avg_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses average directives and registers target variables for spatial averaging.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for average declaration.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">targets</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">w</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">])</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.CollectDefinitions.assign_var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">assign_var</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Parses variable assignment statements and registers corresponding Field objects.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Lark AST node for assignment.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1291</span>
<span class="normal">1292</span>
<span class="normal">1293</span>
<span class="normal">1294</span>
<span class="normal">1295</span>
<span class="normal">1296</span>
<span class="normal">1297</span>
<span class="normal">1298</span>
<span class="normal">1299</span>
<span class="normal">1300</span>
<span class="normal">1301</span>
<span class="normal">1302</span>
<span class="normal">1303</span>
<span class="normal">1304</span>
<span class="normal">1305</span>
<span class="normal">1306</span>
<span class="normal">1307</span>
<span class="normal">1308</span>
<span class="normal">1309</span>
<span class="normal">1310</span>
<span class="normal">1311</span>
<span class="normal">1312</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">assign_var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses variable assignment statements and registers corresponding Field objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for assignment.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">lval</span><span class="p">,</span> <span class="n">lattr</span><span class="p">,</span> <span class="n">rval</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lval</span><span class="p">,</span> <span class="n">rval</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="n">lattr</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">attr_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">lattr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">lattr</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
<span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">children</span>
<span class="n">attr_dict</span><span class="p">[</span><span class="n">k</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span>
<span class="k">if</span> <span class="n">lval</span><span class="o">.</span><span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;duplicate definition of &quot;</span> <span class="o">+</span> <span class="n">lval</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">lval</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">lval</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">attr_dict</span><span class="p">,</span> <span class="n">rval</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.CollectDefinitions.varlist" class="doc doc-heading">
<code class="highlight language-python"><span class="n">varlist</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Parses list of primary inputs declared in bracket syntax (e.g. [u, v, w]).</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Lark AST node for varlist.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1281</span>
<span class="normal">1282</span>
<span class="normal">1283</span>
<span class="normal">1284</span>
<span class="normal">1285</span>
<span class="normal">1286</span>
<span class="normal">1287</span>
<span class="normal">1288</span>
<span class="normal">1289</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">varlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Parses list of primary inputs declared in bracket syntax (e.g. [u, v, w]).</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST node for varlist.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">PrimaryField</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.CompilationContext" class="doc doc-heading">
<code>CompilationContext</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Holds compilation pipeline state across parsing, resolution, and optimization stages.</p>
<p><span class="doc-section-title">Attributes:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.primary">primary</span></code></td>
<td>
<code>set of str</code>
</td>
<td>
<div class="doc-md-description">
<p>Names of primary input fields.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.derived">derived</span></code></td>
<td>
<code>dict of str -&gt; FieldBase</code>
</td>
<td>
<div class="doc-md-description">
<p>Calculated, derivative, and fluctuation fields.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.averaged">averaged</span></code></td>
<td>
<code>dict of str -&gt; AveragedField</code>
</td>
<td>
<div class="doc-md-description">
<p>Spatial averaged variables.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.dependency">dependency</span></code></td>
<td>
<code>dict of str -&gt; set of str</code>
</td>
<td>
<div class="doc-md-description">
<p>DAG representing direct dependencies.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.pass1">pass1</span></code></td>
<td>
<code>list of str</code>
</td>
<td>
<div class="doc-md-description">
<p>Topologically sorted variables for average-precursor calculation.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.pass2">pass2</span></code></td>
<td>
<code>list of str</code>
</td>
<td>
<div class="doc-md-description">
<p>Topologically sorted variables for post-average calculations.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.avg1">avg1</span></code></td>
<td>
<code>set of AveragedField</code>
</td>
<td>
<div class="doc-md-description">
<p>Averaged variables calculated in Pass 1.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.avg2">avg2</span></code></td>
<td>
<code>set of AveragedField</code>
</td>
<td>
<div class="doc-md-description">
<p>Averaged variables calculated in Pass 2.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.alloc1">alloc1</span></code></td>
<td>
<code>dict of str -&gt; str</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer pooling maps for Pass 1.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.alloc2">alloc2</span></code></td>
<td>
<code>dict of str -&gt; str</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer pooling maps for Pass 2.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.CompilationContext.narr">narr</span></code></td>
<td>
<code>int</code>
</td>
<td>
<div class="doc-md-description">
<p>Maximum number of shared XYZ buffer arrays needed.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2228</span>
<span class="normal">2229</span>
<span class="normal">2230</span>
<span class="normal">2231</span>
<span class="normal">2232</span>
<span class="normal">2233</span>
<span class="normal">2234</span>
<span class="normal">2235</span>
<span class="normal">2236</span>
<span class="normal">2237</span>
<span class="normal">2238</span>
<span class="normal">2239</span>
<span class="normal">2240</span>
<span class="normal">2241</span>
<span class="normal">2242</span>
<span class="normal">2243</span>
<span class="normal">2244</span>
<span class="normal">2245</span>
<span class="normal">2246</span>
<span class="normal">2247</span>
<span class="normal">2248</span>
<span class="normal">2249</span>
<span class="normal">2250</span>
<span class="normal">2251</span>
<span class="normal">2252</span>
<span class="normal">2253</span>
<span class="normal">2254</span>
<span class="normal">2255</span>
<span class="normal">2256</span>
<span class="normal">2257</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">CompilationContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Holds compilation pipeline state across parsing, resolution, and optimization stages.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> primary (set of str): Names of primary input fields.</span>
<span class="sd"> derived (dict of str -&gt; FieldBase): Calculated, derivative, and fluctuation fields.</span>
<span class="sd"> averaged (dict of str -&gt; AveragedField): Spatial averaged variables.</span>
<span class="sd"> dependency (dict of str -&gt; set of str): DAG representing direct dependencies.</span>
<span class="sd"> pass1 (list of str): Topologically sorted variables for average-precursor calculation.</span>
<span class="sd"> pass2 (list of str): Topologically sorted variables for post-average calculations.</span>
<span class="sd"> avg1 (set of AveragedField): Averaged variables calculated in Pass 1.</span>
<span class="sd"> avg2 (set of AveragedField): Averaged variables calculated in Pass 2.</span>
<span class="sd"> alloc1 (dict of str -&gt; str): Buffer pooling maps for Pass 1.</span>
<span class="sd"> alloc2 (dict of str -&gt; str): Buffer pooling maps for Pass 2.</span>
<span class="sd"> narr (int): Maximum number of shared XYZ buffer arrays needed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes an empty CompilationContext.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pass1</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pass2</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg1</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alloc1</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alloc2</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">narr</span> <span class="o">=</span> <span class="mi">0</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.CompilationContext.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes an empty CompilationContext.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2245</span>
<span class="normal">2246</span>
<span class="normal">2247</span>
<span class="normal">2248</span>
<span class="normal">2249</span>
<span class="normal">2250</span>
<span class="normal">2251</span>
<span class="normal">2252</span>
<span class="normal">2253</span>
<span class="normal">2254</span>
<span class="normal">2255</span>
<span class="normal">2256</span>
<span class="normal">2257</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes an empty CompilationContext.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derived</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pass1</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pass2</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg1</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alloc1</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alloc2</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">narr</span> <span class="o">=</span> <span class="mi">0</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.DependencyNode" class="doc doc-heading">
<code>DependencyNode</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>의존성 관계 분석을 담당하는 추상 인터페이스 및 노드 클래스입니다.</p>
<p>Compiler pipeline stages use this graph to resolve topological sort order.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1862</span>
<span class="normal">1863</span>
<span class="normal">1864</span>
<span class="normal">1865</span>
<span class="normal">1866</span>
<span class="normal">1867</span>
<span class="normal">1868</span>
<span class="normal">1869</span>
<span class="normal">1870</span>
<span class="normal">1871</span>
<span class="normal">1872</span>
<span class="normal">1873</span>
<span class="normal">1874</span>
<span class="normal">1875</span>
<span class="normal">1876</span>
<span class="normal">1877</span>
<span class="normal">1878</span>
<span class="normal">1879</span>
<span class="normal">1880</span>
<span class="normal">1881</span>
<span class="normal">1882</span>
<span class="normal">1883</span>
<span class="normal">1884</span>
<span class="normal">1885</span>
<span class="normal">1886</span>
<span class="normal">1887</span>
<span class="normal">1888</span>
<span class="normal">1889</span>
<span class="normal">1890</span>
<span class="normal">1891</span>
<span class="normal">1892</span>
<span class="normal">1893</span>
<span class="normal">1894</span>
<span class="normal">1895</span>
<span class="normal">1896</span>
<span class="normal">1897</span>
<span class="normal">1898</span>
<span class="normal">1899</span>
<span class="normal">1900</span>
<span class="normal">1901</span>
<span class="normal">1902</span>
<span class="normal">1903</span>
<span class="normal">1904</span>
<span class="normal">1905</span>
<span class="normal">1906</span>
<span class="normal">1907</span>
<span class="normal">1908</span>
<span class="normal">1909</span>
<span class="normal">1910</span>
<span class="normal">1911</span>
<span class="normal">1912</span>
<span class="normal">1913</span>
<span class="normal">1914</span>
<span class="normal">1915</span>
<span class="normal">1916</span>
<span class="normal">1917</span>
<span class="normal">1918</span>
<span class="normal">1919</span>
<span class="normal">1920</span>
<span class="normal">1921</span>
<span class="normal">1922</span>
<span class="normal">1923</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">DependencyNode</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;의존성 관계 분석을 담당하는 추상 인터페이스 및 노드 클래스입니다.</span>
<span class="sd"> Compiler pipeline stages use this graph to resolve topological sort order.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DependencyNode.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluc</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">depends_on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if this node depends directly on the given variable.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Target variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if directly dependent.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span>
<span class="k">def</span> <span class="nf">is_fluctuation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if this node is a fluctuation variable.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if fluctuation variable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fluc</span>
<span class="k">def</span> <span class="nf">checkFluctuation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;본 변수 혹은 의존하고 있는 하위 기호들 중에 변동량(Fluctuation) 관련 계산이 개입되어 있는지</span>
<span class="sd"> 상향식으로 전파 추적하는 재귀 메서드입니다.</span>
<span class="sd"> Returns:</span>
<span class="sd"> set: Set of variable names that require fluctuation calculations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">get</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">):</span>
<span class="n">fset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">checkFluctuation</span><span class="p">())</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">()</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">fset</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">fset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fset</span>
<span class="k">def</span> <span class="nf">depClosure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;해당 변수를 계산하기 위해 선행 계산되어야 하는 모든 하위 변수 노드들을 </span>
<span class="sd"> 재귀적으로 타고 내려가 총합 폐쇄 집합(Closure Set)으로 묶어 반환합니다.</span>
<span class="sd"> Returns:</span>
<span class="sd"> set: Complete transitive dependency set.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">)</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">:</span>
<span class="n">fset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">d</span><span class="p">]</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="k">return</span> <span class="n">fset</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.DependencyNode.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes DependencyNode.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1868</span>
<span class="normal">1869</span>
<span class="normal">1870</span>
<span class="normal">1871</span>
<span class="normal">1872</span>
<span class="normal">1873</span>
<span class="normal">1874</span>
<span class="normal">1875</span>
<span class="normal">1876</span>
<span class="normal">1877</span>
<span class="normal">1878</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DependencyNode.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluc</span> <span class="o">=</span> <span class="kc">False</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyNode.checkFluctuation" class="doc doc-heading">
<code class="highlight language-python"><span class="n">checkFluctuation</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>본 변수 혹은 의존하고 있는 하위 기호들 중에 변동량(Fluctuation) 관련 계산이 개입되어 있는지
상향식으로 전파 추적하는 재귀 메서드입니다.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>set</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Set of variable names that require fluctuation calculations.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1899</span>
<span class="normal">1900</span>
<span class="normal">1901</span>
<span class="normal">1902</span>
<span class="normal">1903</span>
<span class="normal">1904</span>
<span class="normal">1905</span>
<span class="normal">1906</span>
<span class="normal">1907</span>
<span class="normal">1908</span>
<span class="normal">1909</span>
<span class="normal">1910</span>
<span class="normal">1911</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">checkFluctuation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;본 변수 혹은 의존하고 있는 하위 기호들 중에 변동량(Fluctuation) 관련 계산이 개입되어 있는지</span>
<span class="sd"> 상향식으로 전파 추적하는 재귀 메서드입니다.</span>
<span class="sd"> Returns:</span>
<span class="sd"> set: Set of variable names that require fluctuation calculations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">get</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">):</span>
<span class="n">fset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">checkFluctuation</span><span class="p">())</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">()</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">fset</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">fset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fset</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyNode.depClosure" class="doc doc-heading">
<code class="highlight language-python"><span class="n">depClosure</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>해당 변수를 계산하기 위해 선행 계산되어야 하는 모든 하위 변수 노드들을
재귀적으로 타고 내려가 총합 폐쇄 집합(Closure Set)으로 묶어 반환합니다.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>set</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Complete transitive dependency set.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1913</span>
<span class="normal">1914</span>
<span class="normal">1915</span>
<span class="normal">1916</span>
<span class="normal">1917</span>
<span class="normal">1918</span>
<span class="normal">1919</span>
<span class="normal">1920</span>
<span class="normal">1921</span>
<span class="normal">1922</span>
<span class="normal">1923</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">depClosure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;해당 변수를 계산하기 위해 선행 계산되어야 하는 모든 하위 변수 노드들을 </span>
<span class="sd"> 재귀적으로 타고 내려가 총합 폐쇄 집합(Closure Set)으로 묶어 반환합니다.</span>
<span class="sd"> Returns:</span>
<span class="sd"> set: Complete transitive dependency set.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">)</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">:</span>
<span class="n">fset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">d</span><span class="p">]</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="k">return</span> <span class="n">fset</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyNode.depends_on" class="doc doc-heading">
<code class="highlight language-python"><span class="n">depends_on</span><span class="p">(</span><span class="n">a</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if this node depends directly on the given variable.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Target variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if directly dependent.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1880</span>
<span class="normal">1881</span>
<span class="normal">1882</span>
<span class="normal">1883</span>
<span class="normal">1884</span>
<span class="normal">1885</span>
<span class="normal">1886</span>
<span class="normal">1887</span>
<span class="normal">1888</span>
<span class="normal">1889</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">depends_on</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if this node depends directly on the given variable.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Target variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if directly dependent.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyNode.is_fluctuation" class="doc doc-heading">
<code class="highlight language-python"><span class="n">is_fluctuation</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if this node is a fluctuation variable.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if fluctuation variable.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1891</span>
<span class="normal">1892</span>
<span class="normal">1893</span>
<span class="normal">1894</span>
<span class="normal">1895</span>
<span class="normal">1896</span>
<span class="normal">1897</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_fluctuation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if this node is a fluctuation variable.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if fluctuation variable.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fluc</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.DependencyResolutionStage" class="doc doc-heading">
<code>DependencyResolutionStage</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Compiler pipeline Stage 3: Resolves data dependencies and orders calculations.</p>
<p>Splits loops into:
- Pass 1 (calculating variables required prior to averages).
- Pass 2 (calculating fluctuations and statistics after averages are resolved).
Performs topological sorting to ensure correctness.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2411</span>
<span class="normal">2412</span>
<span class="normal">2413</span>
<span class="normal">2414</span>
<span class="normal">2415</span>
<span class="normal">2416</span>
<span class="normal">2417</span>
<span class="normal">2418</span>
<span class="normal">2419</span>
<span class="normal">2420</span>
<span class="normal">2421</span>
<span class="normal">2422</span>
<span class="normal">2423</span>
<span class="normal">2424</span>
<span class="normal">2425</span>
<span class="normal">2426</span>
<span class="normal">2427</span>
<span class="normal">2428</span>
<span class="normal">2429</span>
<span class="normal">2430</span>
<span class="normal">2431</span>
<span class="normal">2432</span>
<span class="normal">2433</span>
<span class="normal">2434</span>
<span class="normal">2435</span>
<span class="normal">2436</span>
<span class="normal">2437</span>
<span class="normal">2438</span>
<span class="normal">2439</span>
<span class="normal">2440</span>
<span class="normal">2441</span>
<span class="normal">2442</span>
<span class="normal">2443</span>
<span class="normal">2444</span>
<span class="normal">2445</span>
<span class="normal">2446</span>
<span class="normal">2447</span>
<span class="normal">2448</span>
<span class="normal">2449</span>
<span class="normal">2450</span>
<span class="normal">2451</span>
<span class="normal">2452</span>
<span class="normal">2453</span>
<span class="normal">2454</span>
<span class="normal">2455</span>
<span class="normal">2456</span>
<span class="normal">2457</span>
<span class="normal">2458</span>
<span class="normal">2459</span>
<span class="normal">2460</span>
<span class="normal">2461</span>
<span class="normal">2462</span>
<span class="normal">2463</span>
<span class="normal">2464</span>
<span class="normal">2465</span>
<span class="normal">2466</span>
<span class="normal">2467</span>
<span class="normal">2468</span>
<span class="normal">2469</span>
<span class="normal">2470</span>
<span class="normal">2471</span>
<span class="normal">2472</span>
<span class="normal">2473</span>
<span class="normal">2474</span>
<span class="normal">2475</span>
<span class="normal">2476</span>
<span class="normal">2477</span>
<span class="normal">2478</span>
<span class="normal">2479</span>
<span class="normal">2480</span>
<span class="normal">2481</span>
<span class="normal">2482</span>
<span class="normal">2483</span>
<span class="normal">2484</span>
<span class="normal">2485</span>
<span class="normal">2486</span>
<span class="normal">2487</span>
<span class="normal">2488</span>
<span class="normal">2489</span>
<span class="normal">2490</span>
<span class="normal">2491</span>
<span class="normal">2492</span>
<span class="normal">2493</span>
<span class="normal">2494</span>
<span class="normal">2495</span>
<span class="normal">2496</span>
<span class="normal">2497</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">DependencyResolutionStage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compiler pipeline Stage 3: Resolves data dependencies and orders calculations.</span>
<span class="sd"> Splits loops into:</span>
<span class="sd"> - Pass 1 (calculating variables required prior to averages).</span>
<span class="sd"> - Pass 2 (calculating fluctuations and statistics after averages are resolved).</span>
<span class="sd"> Performs topological sorting to ensure correctness.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 3 dependency resolution and topological sort.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 이름 충돌 방지 검증</span>
<span class="k">assert</span> <span class="nb">set</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="c1"># Pass 1과 Pass 2 대상 평균화 변수 논리 분할</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="c1"># Pass 1 위상 정렬: Pass 1 평균 변수들의 연산에 관여하는 모든 종속 관계를 수집하여 정렬</span>
<span class="n">pass1calc</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">))</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">:</span>
<span class="n">pass1calc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_vars_new</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">,</span> <span class="n">pass1calc</span> <span class="o">-</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">)</span>
<span class="c1"># Pass 2 위상 정렬: Pass 2 평균 변수(변동 연산 연계)들의 연산에 관여하는 종속성을 정렬</span>
<span class="n">pass2calc</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">))</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">:</span>
<span class="n">pass2calc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_vars_new</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">,</span> <span class="n">pass2calc</span> <span class="o">-</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">calc_size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependency</span><span class="p">,</span> <span class="n">ordered</span><span class="p">,</span> <span class="n">remaining</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Calculates topological dependency metrics for ordering weight sorting.</span>
<span class="sd"> Args:</span>
<span class="sd"> dependency (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> ordered (set): Topologically ordered variable names.</span>
<span class="sd"> remaining (set): Unsorted remaining variable names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> int: The degree of active connection impact.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">dep_union</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">remaining</span><span class="p">:</span>
<span class="n">dep_union</span> <span class="o">|=</span> <span class="nb">set</span><span class="p">(</span><span class="n">dependency</span><span class="p">[</span><span class="n">v</span><span class="p">])</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ordered</span><span class="p">:</span>
<span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">dep_union</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">def</span> <span class="nf">sort_vars_new</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependency</span><span class="p">,</span> <span class="n">group</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Performs topological sort using an impact-weight heuristic.</span>
<span class="sd"> Minimizes variable lifetime durations to optimize array reuse.</span>
<span class="sd"> Args:</span>
<span class="sd"> dependency (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> group (set): Set of variable names to sort.</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: Topologically sorted list of variable names.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">order</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">remain</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
<span class="n">remain</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">remain</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">candidate</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">remain</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">set</span><span class="p">(</span><span class="n">dependency</span><span class="p">[</span><span class="n">v</span><span class="p">])</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">remain</span><span class="p">):</span>
<span class="n">candidate</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="n">impact</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">size0</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_size</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">order</span><span class="p">),</span> <span class="nb">set</span><span class="p">(</span><span class="n">remain</span><span class="p">))</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">candidate</span><span class="p">:</span>
<span class="n">impact</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_size</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">order</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">]),</span> <span class="nb">set</span><span class="p">(</span><span class="n">remain</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">]))</span> <span class="o">-</span> <span class="n">size0</span>
<span class="n">candidate</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">impact</span><span class="o">.</span><span class="n">get</span><span class="p">)</span>
<span class="n">order</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">candidate</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">remain</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">candidate</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span> <span class="n">order</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.DependencyResolutionStage.calc_size" class="doc doc-heading">
<code class="highlight language-python"><span class="n">calc_size</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="n">ordered</span><span class="p">,</span> <span class="n">remaining</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Calculates topological dependency metrics for ordering weight sorting.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>dependency</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Graph mapping variable names to dependency sets.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>ordered</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Topologically ordered variable names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>remaining</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Unsorted remaining variable names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>int</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>The degree of active connection impact.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2445</span>
<span class="normal">2446</span>
<span class="normal">2447</span>
<span class="normal">2448</span>
<span class="normal">2449</span>
<span class="normal">2450</span>
<span class="normal">2451</span>
<span class="normal">2452</span>
<span class="normal">2453</span>
<span class="normal">2454</span>
<span class="normal">2455</span>
<span class="normal">2456</span>
<span class="normal">2457</span>
<span class="normal">2458</span>
<span class="normal">2459</span>
<span class="normal">2460</span>
<span class="normal">2461</span>
<span class="normal">2462</span>
<span class="normal">2463</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">calc_size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependency</span><span class="p">,</span> <span class="n">ordered</span><span class="p">,</span> <span class="n">remaining</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Calculates topological dependency metrics for ordering weight sorting.</span>
<span class="sd"> Args:</span>
<span class="sd"> dependency (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> ordered (set): Topologically ordered variable names.</span>
<span class="sd"> remaining (set): Unsorted remaining variable names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> int: The degree of active connection impact.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">dep_union</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">remaining</span><span class="p">:</span>
<span class="n">dep_union</span> <span class="o">|=</span> <span class="nb">set</span><span class="p">(</span><span class="n">dependency</span><span class="p">[</span><span class="n">v</span><span class="p">])</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ordered</span><span class="p">:</span>
<span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">dep_union</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">count</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyResolutionStage.execute" class="doc doc-heading">
<code class="highlight language-python"><span class="n">execute</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes Stage 3 dependency resolution and topological sort.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2420</span>
<span class="normal">2421</span>
<span class="normal">2422</span>
<span class="normal">2423</span>
<span class="normal">2424</span>
<span class="normal">2425</span>
<span class="normal">2426</span>
<span class="normal">2427</span>
<span class="normal">2428</span>
<span class="normal">2429</span>
<span class="normal">2430</span>
<span class="normal">2431</span>
<span class="normal">2432</span>
<span class="normal">2433</span>
<span class="normal">2434</span>
<span class="normal">2435</span>
<span class="normal">2436</span>
<span class="normal">2437</span>
<span class="normal">2438</span>
<span class="normal">2439</span>
<span class="normal">2440</span>
<span class="normal">2441</span>
<span class="normal">2442</span>
<span class="normal">2443</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 3 dependency resolution and topological sort.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 이름 충돌 방지 검증</span>
<span class="k">assert</span> <span class="nb">set</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="c1"># Pass 1과 Pass 2 대상 평균화 변수 논리 분할</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="c1"># Pass 1 위상 정렬: Pass 1 평균 변수들의 연산에 관여하는 모든 종속 관계를 수집하여 정렬</span>
<span class="n">pass1calc</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">))</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">:</span>
<span class="n">pass1calc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_vars_new</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">,</span> <span class="n">pass1calc</span> <span class="o">-</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">)</span>
<span class="c1"># Pass 2 위상 정렬: Pass 2 평균 변수(변동 연산 연계)들의 연산에 관여하는 종속성을 정렬</span>
<span class="n">pass2calc</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">))</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">:</span>
<span class="n">pass2calc</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">depClosure</span><span class="p">())</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_vars_new</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">,</span> <span class="n">pass2calc</span> <span class="o">-</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DependencyResolutionStage.sort_vars_new" class="doc doc-heading">
<code class="highlight language-python"><span class="n">sort_vars_new</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="n">group</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Performs topological sort using an impact-weight heuristic.</p>
<p>Minimizes variable lifetime durations to optimize array reuse.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>dependency</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Graph mapping variable names to dependency sets.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>group</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Set of variable names to sort.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>list</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Topologically sorted list of variable names.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2465</span>
<span class="normal">2466</span>
<span class="normal">2467</span>
<span class="normal">2468</span>
<span class="normal">2469</span>
<span class="normal">2470</span>
<span class="normal">2471</span>
<span class="normal">2472</span>
<span class="normal">2473</span>
<span class="normal">2474</span>
<span class="normal">2475</span>
<span class="normal">2476</span>
<span class="normal">2477</span>
<span class="normal">2478</span>
<span class="normal">2479</span>
<span class="normal">2480</span>
<span class="normal">2481</span>
<span class="normal">2482</span>
<span class="normal">2483</span>
<span class="normal">2484</span>
<span class="normal">2485</span>
<span class="normal">2486</span>
<span class="normal">2487</span>
<span class="normal">2488</span>
<span class="normal">2489</span>
<span class="normal">2490</span>
<span class="normal">2491</span>
<span class="normal">2492</span>
<span class="normal">2493</span>
<span class="normal">2494</span>
<span class="normal">2495</span>
<span class="normal">2496</span>
<span class="normal">2497</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">sort_vars_new</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependency</span><span class="p">,</span> <span class="n">group</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Performs topological sort using an impact-weight heuristic.</span>
<span class="sd"> Minimizes variable lifetime durations to optimize array reuse.</span>
<span class="sd"> Args:</span>
<span class="sd"> dependency (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> group (set): Set of variable names to sort.</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: Topologically sorted list of variable names.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">order</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">remain</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
<span class="n">remain</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">remain</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">candidate</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">remain</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">set</span><span class="p">(</span><span class="n">dependency</span><span class="p">[</span><span class="n">v</span><span class="p">])</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">remain</span><span class="p">):</span>
<span class="n">candidate</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="n">impact</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">size0</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_size</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">order</span><span class="p">),</span> <span class="nb">set</span><span class="p">(</span><span class="n">remain</span><span class="p">))</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">candidate</span><span class="p">:</span>
<span class="n">impact</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_size</span><span class="p">(</span><span class="n">dependency</span><span class="p">,</span> <span class="nb">set</span><span class="p">(</span><span class="n">order</span><span class="p">)</span> <span class="o">|</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">]),</span> <span class="nb">set</span><span class="p">(</span><span class="n">remain</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">]))</span> <span class="o">-</span> <span class="n">size0</span>
<span class="n">candidate</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">impact</span><span class="o">.</span><span class="n">get</span><span class="p">)</span>
<span class="n">order</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">candidate</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">remain</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">candidate</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span> <span class="n">order</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.DerivativeExpansionStage" class="doc doc-heading">
<code>DerivativeExpansionStage</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Compiler pipeline Stage 2: Expands differential operators and fluctuation terms.</p>
<p>Finds derivative expressions (e.g., ddx, d2dy) and fluctuation identifiers (u'),
instantiates DerivedField and FluctuationField objects, registers them in
the variable registry, and builds initial DAG dependencies.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2367</span>
<span class="normal">2368</span>
<span class="normal">2369</span>
<span class="normal">2370</span>
<span class="normal">2371</span>
<span class="normal">2372</span>
<span class="normal">2373</span>
<span class="normal">2374</span>
<span class="normal">2375</span>
<span class="normal">2376</span>
<span class="normal">2377</span>
<span class="normal">2378</span>
<span class="normal">2379</span>
<span class="normal">2380</span>
<span class="normal">2381</span>
<span class="normal">2382</span>
<span class="normal">2383</span>
<span class="normal">2384</span>
<span class="normal">2385</span>
<span class="normal">2386</span>
<span class="normal">2387</span>
<span class="normal">2388</span>
<span class="normal">2389</span>
<span class="normal">2390</span>
<span class="normal">2391</span>
<span class="normal">2392</span>
<span class="normal">2393</span>
<span class="normal">2394</span>
<span class="normal">2395</span>
<span class="normal">2396</span>
<span class="normal">2397</span>
<span class="normal">2398</span>
<span class="normal">2399</span>
<span class="normal">2400</span>
<span class="normal">2401</span>
<span class="normal">2402</span>
<span class="normal">2403</span>
<span class="normal">2404</span>
<span class="normal">2405</span>
<span class="normal">2406</span>
<span class="normal">2407</span>
<span class="normal">2408</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">DerivativeExpansionStage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compiler pipeline Stage 2: Expands differential operators and fluctuation terms.</span>
<span class="sd"> Finds derivative expressions (e.g., ddx, d2dy) and fluctuation identifiers (u&#39;),</span>
<span class="sd"> instantiates DerivedField and FluctuationField objects, registers them in</span>
<span class="sd"> the variable registry, and builds initial DAG dependencies.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 2 derivative and fluctuation expansion.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 1. 계산식 내에 존재하는 고차 차분 미분항(ddx, d2dy 등)을 찾아 중간 DerivedField로 등록</span>
<span class="n">dset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">dset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">derivs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">dset</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">DerivedField</span><span class="p">(</span><span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span>
<span class="c1"># 2. 통계 물리량 평균화 대상 변수들을 AveragedField 구조체로 구성하고, </span>
<span class="c1"># 변동량 계산이 필요한 경우 FluctuationField로 등록</span>
<span class="n">averaged_raw</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgts</span> <span class="ow">in</span> <span class="n">averaged_raw</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tgts</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">AveragedField</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span>
<span class="c1"># 평균 편차가 동반된 항들에 대해 FluctuationField 생성</span>
<span class="k">for</span> <span class="n">ff</span> <span class="ow">in</span> <span class="n">a</span><span class="o">.</span><span class="n">fset</span><span class="p">:</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">FluctuationField</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">ff</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">fset</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span>
<span class="c1"># 3. 프로그램 내 모든 필드 간의 1차 의존 관계 그래프(Dependency Graph) 추출</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">dep</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">dep</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.DerivativeExpansionStage.execute" class="doc doc-heading">
<code class="highlight language-python"><span class="n">execute</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes Stage 2 derivative and fluctuation expansion.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2375</span>
<span class="normal">2376</span>
<span class="normal">2377</span>
<span class="normal">2378</span>
<span class="normal">2379</span>
<span class="normal">2380</span>
<span class="normal">2381</span>
<span class="normal">2382</span>
<span class="normal">2383</span>
<span class="normal">2384</span>
<span class="normal">2385</span>
<span class="normal">2386</span>
<span class="normal">2387</span>
<span class="normal">2388</span>
<span class="normal">2389</span>
<span class="normal">2390</span>
<span class="normal">2391</span>
<span class="normal">2392</span>
<span class="normal">2393</span>
<span class="normal">2394</span>
<span class="normal">2395</span>
<span class="normal">2396</span>
<span class="normal">2397</span>
<span class="normal">2398</span>
<span class="normal">2399</span>
<span class="normal">2400</span>
<span class="normal">2401</span>
<span class="normal">2402</span>
<span class="normal">2403</span>
<span class="normal">2404</span>
<span class="normal">2405</span>
<span class="normal">2406</span>
<span class="normal">2407</span>
<span class="normal">2408</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 2 derivative and fluctuation expansion.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 1. 계산식 내에 존재하는 고차 차분 미분항(ddx, d2dy 등)을 찾아 중간 DerivedField로 등록</span>
<span class="n">dset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">dset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">derivs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">tup</span> <span class="ow">in</span> <span class="n">dset</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">DerivedField</span><span class="p">(</span><span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">tup</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span>
<span class="c1"># 2. 통계 물리량 평균화 대상 변수들을 AveragedField 구조체로 구성하고, </span>
<span class="c1"># 변동량 계산이 필요한 경우 FluctuationField로 등록</span>
<span class="n">averaged_raw</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">w</span><span class="p">,</span> <span class="n">tgts</span> <span class="ow">in</span> <span class="n">averaged_raw</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tgts</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">AveragedField</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span>
<span class="c1"># 평균 편차가 동반된 항들에 대해 FluctuationField 생성</span>
<span class="k">for</span> <span class="n">ff</span> <span class="ow">in</span> <span class="n">a</span><span class="o">.</span><span class="n">fset</span><span class="p">:</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">FluctuationField</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">ff</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">fset</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span>
<span class="c1"># 3. 프로그램 내 모든 필드 간의 1차 의존 관계 그래프(Dependency Graph) 추출</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">dep</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">dep</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.DerivedField" class="doc doc-heading">
<code>DerivedField</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code></p>
<p>수치 공간 미분(ddx, d2dy 등)을 수행하여 계산되는 유도 필드 클래스입니다.
Fortran 수치 차분 패키지 서브루틴(Compact.f90 에 구현된 dfnonp, dfp 등)의
동적 호출 코드를 출력합니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2125</span>
<span class="normal">2126</span>
<span class="normal">2127</span>
<span class="normal">2128</span>
<span class="normal">2129</span>
<span class="normal">2130</span>
<span class="normal">2131</span>
<span class="normal">2132</span>
<span class="normal">2133</span>
<span class="normal">2134</span>
<span class="normal">2135</span>
<span class="normal">2136</span>
<span class="normal">2137</span>
<span class="normal">2138</span>
<span class="normal">2139</span>
<span class="normal">2140</span>
<span class="normal">2141</span>
<span class="normal">2142</span>
<span class="normal">2143</span>
<span class="normal">2144</span>
<span class="normal">2145</span>
<span class="normal">2146</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">DerivedField</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;수치 공간 미분(ddx, d2dy 등)을 수행하여 계산되는 유도 필드 클래스입니다.</span>
<span class="sd"> Fortran 수치 차분 패키지 서브루틴(Compact.f90 에 구현된 dfnonp, dfp 등)의 </span>
<span class="sd"> 동적 호출 코드를 출력합니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DerivedField derivative node.</span>
<span class="sd"> Args:</span>
<span class="sd"> op (str): Differential operator name (e.g. &#39;ddx&#39;).</span>
<span class="sd"> v (str): Variable being differentiated (e.g. &#39;u&#39;).</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">DerivedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span> <span class="o">=</span> <span class="n">v</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">])</span>
<span class="n">partial</span> <span class="o">=</span> <span class="n">differential_operator_registry</span><span class="o">.</span><span class="n">get_latex_symbol</span><span class="p">(</span><span class="n">op</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">partial</span> <span class="o">+</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="n">fdict</span><span class="p">[</span><span class="n">v</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.DerivedField.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes DerivedField derivative node.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>op</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Differential operator name (e.g. 'ddx').</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>v</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable being differentiated (e.g. 'u').</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2131</span>
<span class="normal">2132</span>
<span class="normal">2133</span>
<span class="normal">2134</span>
<span class="normal">2135</span>
<span class="normal">2136</span>
<span class="normal">2137</span>
<span class="normal">2138</span>
<span class="normal">2139</span>
<span class="normal">2140</span>
<span class="normal">2141</span>
<span class="normal">2142</span>
<span class="normal">2143</span>
<span class="normal">2144</span>
<span class="normal">2145</span>
<span class="normal">2146</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DerivedField derivative node.</span>
<span class="sd"> Args:</span>
<span class="sd"> op (str): Differential operator name (e.g. &#39;ddx&#39;).</span>
<span class="sd"> v (str): Variable being differentiated (e.g. &#39;u&#39;).</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">DerivedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span> <span class="o">=</span> <span class="n">v</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">v</span><span class="p">])</span>
<span class="n">partial</span> <span class="o">=</span> <span class="n">differential_operator_registry</span><span class="o">.</span><span class="n">get_latex_symbol</span><span class="p">(</span><span class="n">op</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">partial</span> <span class="o">+</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="n">fdict</span><span class="p">[</span><span class="n">v</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.DifferentialOperatorRegistry" class="doc doc-heading">
<code>DifferentialOperatorRegistry</code>
</h3>
<div class="doc doc-contents ">
<p>Registry for spatial differential operators mapping operators to LaTeX representations.</p>
<p>Handles default and custom differential operators (e.g., ddx, d2dy) used during derivation expansion.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">112</span>
<span class="normal">113</span>
<span class="normal">114</span>
<span class="normal">115</span>
<span class="normal">116</span>
<span class="normal">117</span>
<span class="normal">118</span>
<span class="normal">119</span>
<span class="normal">120</span>
<span class="normal">121</span>
<span class="normal">122</span>
<span class="normal">123</span>
<span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span>
<span class="normal">130</span>
<span class="normal">131</span>
<span class="normal">132</span>
<span class="normal">133</span>
<span class="normal">134</span>
<span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">DifferentialOperatorRegistry</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registry for spatial differential operators mapping operators to LaTeX representations.</span>
<span class="sd"> Handles default and custom differential operators (e.g., ddx, d2dy) used during derivation expansion.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DifferentialOperatorRegistry with empty operator mappings.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_operators</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op_name</span><span class="p">,</span> <span class="n">latex_symbol</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a custom LaTeX representation for a given operator.</span>
<span class="sd"> Args:</span>
<span class="sd"> op_name (str): The differential operator name (e.g., &#39;ddx&#39;).</span>
<span class="sd"> latex_symbol (str): The corresponding LaTeX math symbol.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">[</span><span class="n">op_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">latex_symbol</span>
<span class="k">def</span> <span class="nf">get_latex_symbol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Retrieves the LaTeX representation of a differential operator.</span>
<span class="sd"> Args:</span>
<span class="sd"> op_name (str): The name of the operator.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The LaTeX code for the differential operator (e.g. &#39;\\partial_{x}&#39;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">op_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">[</span><span class="n">op_name</span><span class="p">]</span>
<span class="c1"># Fallback to dynamic parsing matching original code</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\partial_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span>
<span class="n">coord</span> <span class="o">=</span> <span class="n">op_name</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">op_name</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coord</span> <span class="o">+</span> <span class="n">coord</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">op_name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">else</span> <span class="n">coord</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.DifferentialOperatorRegistry.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes DifferentialOperatorRegistry with empty operator mappings.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">118</span>
<span class="normal">119</span>
<span class="normal">120</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes DifferentialOperatorRegistry with empty operator mappings.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_operators</span> <span class="o">=</span> <span class="p">{}</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DifferentialOperatorRegistry.get_latex_symbol" class="doc doc-heading">
<code class="highlight language-python"><span class="n">get_latex_symbol</span><span class="p">(</span><span class="n">op_name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Retrieves the LaTeX representation of a differential operator.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>op_name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the operator.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>The LaTeX code for the differential operator (e.g. '\partial_{x}').</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">131</span>
<span class="normal">132</span>
<span class="normal">133</span>
<span class="normal">134</span>
<span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_latex_symbol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Retrieves the LaTeX representation of a differential operator.</span>
<span class="sd"> Args:</span>
<span class="sd"> op_name (str): The name of the operator.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The LaTeX code for the differential operator (e.g. &#39;\\partial_{x}&#39;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">op_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">[</span><span class="n">op_name</span><span class="p">]</span>
<span class="c1"># Fallback to dynamic parsing matching original code</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\partial_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span>
<span class="n">coord</span> <span class="o">=</span> <span class="n">op_name</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">op_name</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coord</span> <span class="o">+</span> <span class="n">coord</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">op_name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">else</span> <span class="n">coord</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.DifferentialOperatorRegistry.register" class="doc doc-heading">
<code class="highlight language-python"><span class="n">register</span><span class="p">(</span><span class="n">op_name</span><span class="p">,</span> <span class="n">latex_symbol</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Registers a custom LaTeX representation for a given operator.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>op_name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The differential operator name (e.g., 'ddx').</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>latex_symbol</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The corresponding LaTeX math symbol.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">122</span>
<span class="normal">123</span>
<span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op_name</span><span class="p">,</span> <span class="n">latex_symbol</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a custom LaTeX representation for a given operator.</span>
<span class="sd"> Args:</span>
<span class="sd"> op_name (str): The differential operator name (e.g., &#39;ddx&#39;).</span>
<span class="sd"> latex_symbol (str): The corresponding LaTeX math symbol.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_operators</span><span class="p">[</span><span class="n">op_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">latex_symbol</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.ExpInspector" class="doc doc-heading">
<code>ExpInspector</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="lark.Visitor">Visitor</span></code></p>
<p>Visitor to inspect mathematical AST nodes to extract dependencies and attributes.</p>
<p>Finds the list of dependent variables, checks if the expression references
turbulence fluctuation variables (primed variables), and extracts derivative operators
such as spatial first and second order derivatives (e.g. ddx, d2dy).</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1329</span>
<span class="normal">1330</span>
<span class="normal">1331</span>
<span class="normal">1332</span>
<span class="normal">1333</span>
<span class="normal">1334</span>
<span class="normal">1335</span>
<span class="normal">1336</span>
<span class="normal">1337</span>
<span class="normal">1338</span>
<span class="normal">1339</span>
<span class="normal">1340</span>
<span class="normal">1341</span>
<span class="normal">1342</span>
<span class="normal">1343</span>
<span class="normal">1344</span>
<span class="normal">1345</span>
<span class="normal">1346</span>
<span class="normal">1347</span>
<span class="normal">1348</span>
<span class="normal">1349</span>
<span class="normal">1350</span>
<span class="normal">1351</span>
<span class="normal">1352</span>
<span class="normal">1353</span>
<span class="normal">1354</span>
<span class="normal">1355</span>
<span class="normal">1356</span>
<span class="normal">1357</span>
<span class="normal">1358</span>
<span class="normal">1359</span>
<span class="normal">1360</span>
<span class="normal">1361</span>
<span class="normal">1362</span>
<span class="normal">1363</span>
<span class="normal">1364</span>
<span class="normal">1365</span>
<span class="normal">1366</span>
<span class="normal">1367</span>
<span class="normal">1368</span>
<span class="normal">1369</span>
<span class="normal">1370</span>
<span class="normal">1371</span>
<span class="normal">1372</span>
<span class="normal">1373</span>
<span class="normal">1374</span>
<span class="normal">1375</span>
<span class="normal">1376</span>
<span class="normal">1377</span>
<span class="normal">1378</span>
<span class="normal">1379</span>
<span class="normal">1380</span>
<span class="normal">1381</span>
<span class="normal">1382</span>
<span class="normal">1383</span>
<span class="normal">1384</span>
<span class="normal">1385</span>
<span class="normal">1386</span>
<span class="normal">1387</span>
<span class="normal">1388</span>
<span class="normal">1389</span>
<span class="normal">1390</span>
<span class="normal">1391</span>
<span class="normal">1392</span>
<span class="normal">1393</span>
<span class="normal">1394</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">ExpInspector</span><span class="p">(</span><span class="n">Visitor</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Visitor to inspect mathematical AST nodes to extract dependencies and attributes.</span>
<span class="sd"> Finds the list of dependent variables, checks if the expression references</span>
<span class="sd"> turbulence fluctuation variables (primed variables), and extracts derivative operators</span>
<span class="sd"> such as spatial first and second order derivatives (e.g. ddx, d2dy).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpInspector state.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deriv</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">inspect</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Inspects the given AST tree and returns extracted attributes.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST subtree.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (has_fluctuation, dependencies_set, derivatives_set).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes the inspection traversal.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST subtree.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (has_fluctuation, dependencies_set, derivatives_set).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deriv</span>
<span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a fluctuation node.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Fluctuation AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a variable reference node.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Variable reference AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a spatial derivative node, registering intermediate fields.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Derivative operation AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">op</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="n">deriv</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">op</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">deriv</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deriv</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">op</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.__call__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__call__</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes the inspection traversal.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Lark AST subtree.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(has_fluctuation, dependencies_set, derivatives_set).</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1356</span>
<span class="normal">1357</span>
<span class="normal">1358</span>
<span class="normal">1359</span>
<span class="normal">1360</span>
<span class="normal">1361</span>
<span class="normal">1362</span>
<span class="normal">1363</span>
<span class="normal">1364</span>
<span class="normal">1365</span>
<span class="normal">1366</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes the inspection traversal.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST subtree.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (has_fluctuation, dependencies_set, derivatives_set).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deriv</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes ExpInspector state.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1337</span>
<span class="normal">1338</span>
<span class="normal">1339</span>
<span class="normal">1340</span>
<span class="normal">1341</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpInspector state.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deriv</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.dnx" class="doc doc-heading">
<code class="highlight language-python"><span class="n">dnx</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Processes a spatial derivative node, registering intermediate fields.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Derivative operation AST node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1385</span>
<span class="normal">1386</span>
<span class="normal">1387</span>
<span class="normal">1388</span>
<span class="normal">1389</span>
<span class="normal">1390</span>
<span class="normal">1391</span>
<span class="normal">1392</span>
<span class="normal">1393</span>
<span class="normal">1394</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a spatial derivative node, registering intermediate fields.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Derivative operation AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">op</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">children</span>
<span class="n">deriv</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">op</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">deriv</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deriv</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">op</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.fluc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fluc</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Processes a fluctuation node.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Fluctuation AST node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1368</span>
<span class="normal">1369</span>
<span class="normal">1370</span>
<span class="normal">1371</span>
<span class="normal">1372</span>
<span class="normal">1373</span>
<span class="normal">1374</span>
<span class="normal">1375</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a fluctuation node.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Fluctuation AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluctuation</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.inspect" class="doc doc-heading">
<code class="highlight language-python"><span class="n">inspect</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="doc doc-contents ">
<p>Inspects the given AST tree and returns extracted attributes.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Lark AST subtree.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(has_fluctuation, dependencies_set, derivatives_set).</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1343</span>
<span class="normal">1344</span>
<span class="normal">1345</span>
<span class="normal">1346</span>
<span class="normal">1347</span>
<span class="normal">1348</span>
<span class="normal">1349</span>
<span class="normal">1350</span>
<span class="normal">1351</span>
<span class="normal">1352</span>
<span class="normal">1353</span>
<span class="normal">1354</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">inspect</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Inspects the given AST tree and returns extracted attributes.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Lark AST subtree.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (has_fluctuation, dependencies_set, derivatives_set).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpInspector.var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">var</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Processes a variable reference node.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tree</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable reference AST node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1377</span>
<span class="normal">1378</span>
<span class="normal">1379</span>
<span class="normal">1380</span>
<span class="normal">1381</span>
<span class="normal">1382</span>
<span class="normal">1383</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tree</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Processes a variable reference node.</span>
<span class="sd"> Args:</span>
<span class="sd"> tree (Tree): Variable reference AST node.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.ExpToCode" class="doc doc-heading">
<code>ExpToCode</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="lark.Transformer">Transformer</span></code></p>
<p>Transformer to compile the DSL mathematical AST directly into Fortran array expressions.</p>
<p>Formats variable accesses with spatial index wrappers (e.g., <code>(i,j,k)</code> or <code>(i)</code>) and
converts inline functions or standard math calls.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1635</span>
<span class="normal">1636</span>
<span class="normal">1637</span>
<span class="normal">1638</span>
<span class="normal">1639</span>
<span class="normal">1640</span>
<span class="normal">1641</span>
<span class="normal">1642</span>
<span class="normal">1643</span>
<span class="normal">1644</span>
<span class="normal">1645</span>
<span class="normal">1646</span>
<span class="normal">1647</span>
<span class="normal">1648</span>
<span class="normal">1649</span>
<span class="normal">1650</span>
<span class="normal">1651</span>
<span class="normal">1652</span>
<span class="normal">1653</span>
<span class="normal">1654</span>
<span class="normal">1655</span>
<span class="normal">1656</span>
<span class="normal">1657</span>
<span class="normal">1658</span>
<span class="normal">1659</span>
<span class="normal">1660</span>
<span class="normal">1661</span>
<span class="normal">1662</span>
<span class="normal">1663</span>
<span class="normal">1664</span>
<span class="normal">1665</span>
<span class="normal">1666</span>
<span class="normal">1667</span>
<span class="normal">1668</span>
<span class="normal">1669</span>
<span class="normal">1670</span>
<span class="normal">1671</span>
<span class="normal">1672</span>
<span class="normal">1673</span>
<span class="normal">1674</span>
<span class="normal">1675</span>
<span class="normal">1676</span>
<span class="normal">1677</span>
<span class="normal">1678</span>
<span class="normal">1679</span>
<span class="normal">1680</span>
<span class="normal">1681</span>
<span class="normal">1682</span>
<span class="normal">1683</span>
<span class="normal">1684</span>
<span class="normal">1685</span>
<span class="normal">1686</span>
<span class="normal">1687</span>
<span class="normal">1688</span>
<span class="normal">1689</span>
<span class="normal">1690</span>
<span class="normal">1691</span>
<span class="normal">1692</span>
<span class="normal">1693</span>
<span class="normal">1694</span>
<span class="normal">1695</span>
<span class="normal">1696</span>
<span class="normal">1697</span>
<span class="normal">1698</span>
<span class="normal">1699</span>
<span class="normal">1700</span>
<span class="normal">1701</span>
<span class="normal">1702</span>
<span class="normal">1703</span>
<span class="normal">1704</span>
<span class="normal">1705</span>
<span class="normal">1706</span>
<span class="normal">1707</span>
<span class="normal">1708</span>
<span class="normal">1709</span>
<span class="normal">1710</span>
<span class="normal">1711</span>
<span class="normal">1712</span>
<span class="normal">1713</span>
<span class="normal">1714</span>
<span class="normal">1715</span>
<span class="normal">1716</span>
<span class="normal">1717</span>
<span class="normal">1718</span>
<span class="normal">1719</span>
<span class="normal">1720</span>
<span class="normal">1721</span>
<span class="normal">1722</span>
<span class="normal">1723</span>
<span class="normal">1724</span>
<span class="normal">1725</span>
<span class="normal">1726</span>
<span class="normal">1727</span>
<span class="normal">1728</span>
<span class="normal">1729</span>
<span class="normal">1730</span>
<span class="normal">1731</span>
<span class="normal">1732</span>
<span class="normal">1733</span>
<span class="normal">1734</span>
<span class="normal">1735</span>
<span class="normal">1736</span>
<span class="normal">1737</span>
<span class="normal">1738</span>
<span class="normal">1739</span>
<span class="normal">1740</span>
<span class="normal">1741</span>
<span class="normal">1742</span>
<span class="normal">1743</span>
<span class="normal">1744</span>
<span class="normal">1745</span>
<span class="normal">1746</span>
<span class="normal">1747</span>
<span class="normal">1748</span>
<span class="normal">1749</span>
<span class="normal">1750</span>
<span class="normal">1751</span>
<span class="normal">1752</span>
<span class="normal">1753</span>
<span class="normal">1754</span>
<span class="normal">1755</span>
<span class="normal">1756</span>
<span class="normal">1757</span>
<span class="normal">1758</span>
<span class="normal">1759</span>
<span class="normal">1760</span>
<span class="normal">1761</span>
<span class="normal">1762</span>
<span class="normal">1763</span>
<span class="normal">1764</span>
<span class="normal">1765</span>
<span class="normal">1766</span>
<span class="normal">1767</span>
<span class="normal">1768</span>
<span class="normal">1769</span>
<span class="normal">1770</span>
<span class="normal">1771</span>
<span class="normal">1772</span>
<span class="normal">1773</span>
<span class="normal">1774</span>
<span class="normal">1775</span>
<span class="normal">1776</span>
<span class="normal">1777</span>
<span class="normal">1778</span>
<span class="normal">1779</span>
<span class="normal">1780</span>
<span class="normal">1781</span>
<span class="normal">1782</span>
<span class="normal">1783</span>
<span class="normal">1784</span>
<span class="normal">1785</span>
<span class="normal">1786</span>
<span class="normal">1787</span>
<span class="normal">1788</span>
<span class="normal">1789</span>
<span class="normal">1790</span>
<span class="normal">1791</span>
<span class="normal">1792</span>
<span class="normal">1793</span>
<span class="normal">1794</span>
<span class="normal">1795</span>
<span class="normal">1796</span>
<span class="normal">1797</span>
<span class="normal">1798</span>
<span class="normal">1799</span>
<span class="normal">1800</span>
<span class="normal">1801</span>
<span class="normal">1802</span>
<span class="normal">1803</span>
<span class="normal">1804</span>
<span class="normal">1805</span>
<span class="normal">1806</span>
<span class="normal">1807</span>
<span class="normal">1808</span>
<span class="normal">1809</span>
<span class="normal">1810</span>
<span class="normal">1811</span>
<span class="normal">1812</span>
<span class="normal">1813</span>
<span class="normal">1814</span>
<span class="normal">1815</span>
<span class="normal">1816</span>
<span class="normal">1817</span>
<span class="normal">1818</span>
<span class="normal">1819</span>
<span class="normal">1820</span>
<span class="normal">1821</span>
<span class="normal">1822</span>
<span class="normal">1823</span>
<span class="normal">1824</span>
<span class="normal">1825</span>
<span class="normal">1826</span>
<span class="normal">1827</span>
<span class="normal">1828</span>
<span class="normal">1829</span>
<span class="normal">1830</span>
<span class="normal">1831</span>
<span class="normal">1832</span>
<span class="normal">1833</span>
<span class="normal">1834</span>
<span class="normal">1835</span>
<span class="normal">1836</span>
<span class="normal">1837</span>
<span class="normal">1838</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@v_args</span><span class="p">(</span><span class="n">inline</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ExpToCode</span><span class="p">(</span><span class="n">Transformer</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Transformer to compile the DSL mathematical AST directly into Fortran array expressions.</span>
<span class="sd"> Formats variable accesses with spatial index wrappers (e.g., `(i,j,k)` or `(i)`) and</span>
<span class="sd"> converts inline functions or standard math calls.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpToCode transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts float literal numbers.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token): Number token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Floating point string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">numeral</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts environment variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Variable name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
<span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Wraps in parentheses.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Inner expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a variable access with spatial grid index (i,j,k).</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran array access.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
<span class="k">return</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a fluctuation prime variable access.</span>
<span class="sd"> Saves index reference for inline replacement of averages.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Fluctuation variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran inline fluctuation subtraction formula.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">(i,j,k) - {{0}}avg_</span><span class="si">{1}</span><span class="s2">(i))&quot;</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">arrname</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats spatial derivatives as array accesses.</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator.</span>
<span class="sd"> b (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran array access for derivative.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">signature</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">signature</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">signature</span>
<span class="k">return</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats inline functions (sqr, pow3) to Fortran multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Inline function operator.</span>
<span class="sd"> b (str): Argument code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran math expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;((</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">))&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;((</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">))&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats standard math function calls.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length argument list. First argument is the function token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran function call string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">b</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> ( </span><span class="si">{}</span><span class="s2"> ) )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> b (str): Code string to negate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Negated code string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( - </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats addition.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran addition code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> + </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats subtraction.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran subtraction code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> - </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran multiplication code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> * </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats division.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran division code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> / </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="n">log</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;log&quot;</span>
<span class="n">exp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;exp&quot;</span>
<span class="n">sqrt</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;sqrt&quot;</span>
<span class="nb">abs</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;abs&quot;</span>
<span class="n">rxn_rate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;rxn_rate&quot;</span>
<span class="n">udf</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">:</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes ExpToCode transformer.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping variable names to FieldBase objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1643</span>
<span class="normal">1644</span>
<span class="normal">1645</span>
<span class="normal">1646</span>
<span class="normal">1647</span>
<span class="normal">1648</span>
<span class="normal">1649</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpToCode transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.add" class="doc doc-heading">
<code class="highlight language-python"><span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats addition.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran addition code.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1781</span>
<span class="normal">1782</span>
<span class="normal">1783</span>
<span class="normal">1784</span>
<span class="normal">1785</span>
<span class="normal">1786</span>
<span class="normal">1787</span>
<span class="normal">1788</span>
<span class="normal">1789</span>
<span class="normal">1790</span>
<span class="normal">1791</span>
<span class="normal">1792</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats addition.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran addition code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> + </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.div" class="doc doc-heading">
<code class="highlight language-python"><span class="n">div</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats division.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran division code.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1820</span>
<span class="normal">1821</span>
<span class="normal">1822</span>
<span class="normal">1823</span>
<span class="normal">1824</span>
<span class="normal">1825</span>
<span class="normal">1826</span>
<span class="normal">1827</span>
<span class="normal">1828</span>
<span class="normal">1829</span>
<span class="normal">1830</span>
<span class="normal">1831</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats division.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran division code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> / </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.dnx" class="doc doc-heading">
<code class="highlight language-python"><span class="n">dnx</span><span class="p">(</span><span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats spatial derivatives as array accesses.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>partial</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Derivative operator.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran array access for derivative.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1719</span>
<span class="normal">1720</span>
<span class="normal">1721</span>
<span class="normal">1722</span>
<span class="normal">1723</span>
<span class="normal">1724</span>
<span class="normal">1725</span>
<span class="normal">1726</span>
<span class="normal">1727</span>
<span class="normal">1728</span>
<span class="normal">1729</span>
<span class="normal">1730</span>
<span class="normal">1731</span>
<span class="normal">1732</span>
<span class="normal">1733</span>
<span class="normal">1734</span>
<span class="normal">1735</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats spatial derivatives as array accesses.</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator.</span>
<span class="sd"> b (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran array access for derivative.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">signature</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">signature</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">signature</span>
<span class="k">return</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.env" class="doc doc-heading">
<code class="highlight language-python"><span class="n">env</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts environment variables.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Environment variable name token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1662</span>
<span class="normal">1663</span>
<span class="normal">1664</span>
<span class="normal">1665</span>
<span class="normal">1666</span>
<span class="normal">1667</span>
<span class="normal">1668</span>
<span class="normal">1669</span>
<span class="normal">1670</span>
<span class="normal">1671</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts environment variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Variable name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.fcall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fcall</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats standard math function calls.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>*args</code></td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Variable length argument list. First argument is the function token.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran function call string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1755</span>
<span class="normal">1756</span>
<span class="normal">1757</span>
<span class="normal">1758</span>
<span class="normal">1759</span>
<span class="normal">1760</span>
<span class="normal">1761</span>
<span class="normal">1762</span>
<span class="normal">1763</span>
<span class="normal">1764</span>
<span class="normal">1765</span>
<span class="normal">1766</span>
<span class="normal">1767</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats standard math function calls.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length argument list. First argument is the function token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran function call string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">b</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> ( </span><span class="si">{}</span><span class="s2"> ) )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.fluc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fluc</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats a fluctuation prime variable access.</p>
<p>Saves index reference for inline replacement of averages.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Fluctuation variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran inline fluctuation subtraction formula.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1700</span>
<span class="normal">1701</span>
<span class="normal">1702</span>
<span class="normal">1703</span>
<span class="normal">1704</span>
<span class="normal">1705</span>
<span class="normal">1706</span>
<span class="normal">1707</span>
<span class="normal">1708</span>
<span class="normal">1709</span>
<span class="normal">1710</span>
<span class="normal">1711</span>
<span class="normal">1712</span>
<span class="normal">1713</span>
<span class="normal">1714</span>
<span class="normal">1715</span>
<span class="normal">1716</span>
<span class="normal">1717</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a fluctuation prime variable access.</span>
<span class="sd"> Saves index reference for inline replacement of averages.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Fluctuation variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran inline fluctuation subtraction formula.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">(i,j,k) - {{0}}avg_</span><span class="si">{1}</span><span class="s2">(i))&quot;</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">arrname</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.icall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">icall</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats inline functions (sqr, pow3) to Fortran multiplication.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Inline function operator.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Argument code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran math expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1737</span>
<span class="normal">1738</span>
<span class="normal">1739</span>
<span class="normal">1740</span>
<span class="normal">1741</span>
<span class="normal">1742</span>
<span class="normal">1743</span>
<span class="normal">1744</span>
<span class="normal">1745</span>
<span class="normal">1746</span>
<span class="normal">1747</span>
<span class="normal">1748</span>
<span class="normal">1749</span>
<span class="normal">1750</span>
<span class="normal">1751</span>
<span class="normal">1752</span>
<span class="normal">1753</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats inline functions (sqr, pow3) to Fortran multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Inline function operator.</span>
<span class="sd"> b (str): Argument code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran math expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;((</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">))&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;((</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">)*(</span><span class="si">{0}</span><span class="s2">))&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.mul" class="doc doc-heading">
<code class="highlight language-python"><span class="n">mul</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats multiplication.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran multiplication code.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1807</span>
<span class="normal">1808</span>
<span class="normal">1809</span>
<span class="normal">1810</span>
<span class="normal">1811</span>
<span class="normal">1812</span>
<span class="normal">1813</span>
<span class="normal">1814</span>
<span class="normal">1815</span>
<span class="normal">1816</span>
<span class="normal">1817</span>
<span class="normal">1818</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran multiplication code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> * </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.neg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">neg</span><span class="p">(</span><span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats negation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Code string to negate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Negated code string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1769</span>
<span class="normal">1770</span>
<span class="normal">1771</span>
<span class="normal">1772</span>
<span class="normal">1773</span>
<span class="normal">1774</span>
<span class="normal">1775</span>
<span class="normal">1776</span>
<span class="normal">1777</span>
<span class="normal">1778</span>
<span class="normal">1779</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> b (str): Code string to negate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Negated code string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( - </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.number" class="doc doc-heading">
<code class="highlight language-python"><span class="n">number</span><span class="p">(</span><span class="n">numeral</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts float literal numbers.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>numeral</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Number token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Floating point string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1651</span>
<span class="normal">1652</span>
<span class="normal">1653</span>
<span class="normal">1654</span>
<span class="normal">1655</span>
<span class="normal">1656</span>
<span class="normal">1657</span>
<span class="normal">1658</span>
<span class="normal">1659</span>
<span class="normal">1660</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts float literal numbers.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token): Number token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Floating point string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">numeral</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.paren" class="doc doc-heading">
<code class="highlight language-python"><span class="n">paren</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Wraps in parentheses.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Inner expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Parenthesized string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1673</span>
<span class="normal">1674</span>
<span class="normal">1675</span>
<span class="normal">1676</span>
<span class="normal">1677</span>
<span class="normal">1678</span>
<span class="normal">1679</span>
<span class="normal">1680</span>
<span class="normal">1681</span>
<span class="normal">1682</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Wraps in parentheses.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Inner expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.sub" class="doc doc-heading">
<code class="highlight language-python"><span class="n">sub</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats subtraction.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand code.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran subtraction code.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1794</span>
<span class="normal">1795</span>
<span class="normal">1796</span>
<span class="normal">1797</span>
<span class="normal">1798</span>
<span class="normal">1799</span>
<span class="normal">1800</span>
<span class="normal">1801</span>
<span class="normal">1802</span>
<span class="normal">1803</span>
<span class="normal">1804</span>
<span class="normal">1805</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats subtraction.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand code.</span>
<span class="sd"> b (str): Right operand code.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran subtraction code.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;( </span><span class="si">{}</span><span class="s2"> - </span><span class="si">{}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToCode.var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">var</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats a variable access with spatial grid index (i,j,k).</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran array access.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1684</span>
<span class="normal">1685</span>
<span class="normal">1686</span>
<span class="normal">1687</span>
<span class="normal">1688</span>
<span class="normal">1689</span>
<span class="normal">1690</span>
<span class="normal">1691</span>
<span class="normal">1692</span>
<span class="normal">1693</span>
<span class="normal">1694</span>
<span class="normal">1695</span>
<span class="normal">1696</span>
<span class="normal">1697</span>
<span class="normal">1698</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a variable access with spatial grid index (i,j,k).</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran array access.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">]</span><span class="o">.</span><span class="n">array</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">value</span>
<span class="k">return</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.ExpToLatex" class="doc doc-heading">
<code>ExpToLatex</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="lark.Transformer">Transformer</span></code></p>
<p>Transformer to compile the DSL mathematical AST into a LaTeX math string.</p>
<p>Converts operations, variables, derivatives, and functions into LaTeX syntax
(e.g., partial derivative notation, fraction blocks, and bracket sizing)
to generate mathematical report files.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1397</span>
<span class="normal">1398</span>
<span class="normal">1399</span>
<span class="normal">1400</span>
<span class="normal">1401</span>
<span class="normal">1402</span>
<span class="normal">1403</span>
<span class="normal">1404</span>
<span class="normal">1405</span>
<span class="normal">1406</span>
<span class="normal">1407</span>
<span class="normal">1408</span>
<span class="normal">1409</span>
<span class="normal">1410</span>
<span class="normal">1411</span>
<span class="normal">1412</span>
<span class="normal">1413</span>
<span class="normal">1414</span>
<span class="normal">1415</span>
<span class="normal">1416</span>
<span class="normal">1417</span>
<span class="normal">1418</span>
<span class="normal">1419</span>
<span class="normal">1420</span>
<span class="normal">1421</span>
<span class="normal">1422</span>
<span class="normal">1423</span>
<span class="normal">1424</span>
<span class="normal">1425</span>
<span class="normal">1426</span>
<span class="normal">1427</span>
<span class="normal">1428</span>
<span class="normal">1429</span>
<span class="normal">1430</span>
<span class="normal">1431</span>
<span class="normal">1432</span>
<span class="normal">1433</span>
<span class="normal">1434</span>
<span class="normal">1435</span>
<span class="normal">1436</span>
<span class="normal">1437</span>
<span class="normal">1438</span>
<span class="normal">1439</span>
<span class="normal">1440</span>
<span class="normal">1441</span>
<span class="normal">1442</span>
<span class="normal">1443</span>
<span class="normal">1444</span>
<span class="normal">1445</span>
<span class="normal">1446</span>
<span class="normal">1447</span>
<span class="normal">1448</span>
<span class="normal">1449</span>
<span class="normal">1450</span>
<span class="normal">1451</span>
<span class="normal">1452</span>
<span class="normal">1453</span>
<span class="normal">1454</span>
<span class="normal">1455</span>
<span class="normal">1456</span>
<span class="normal">1457</span>
<span class="normal">1458</span>
<span class="normal">1459</span>
<span class="normal">1460</span>
<span class="normal">1461</span>
<span class="normal">1462</span>
<span class="normal">1463</span>
<span class="normal">1464</span>
<span class="normal">1465</span>
<span class="normal">1466</span>
<span class="normal">1467</span>
<span class="normal">1468</span>
<span class="normal">1469</span>
<span class="normal">1470</span>
<span class="normal">1471</span>
<span class="normal">1472</span>
<span class="normal">1473</span>
<span class="normal">1474</span>
<span class="normal">1475</span>
<span class="normal">1476</span>
<span class="normal">1477</span>
<span class="normal">1478</span>
<span class="normal">1479</span>
<span class="normal">1480</span>
<span class="normal">1481</span>
<span class="normal">1482</span>
<span class="normal">1483</span>
<span class="normal">1484</span>
<span class="normal">1485</span>
<span class="normal">1486</span>
<span class="normal">1487</span>
<span class="normal">1488</span>
<span class="normal">1489</span>
<span class="normal">1490</span>
<span class="normal">1491</span>
<span class="normal">1492</span>
<span class="normal">1493</span>
<span class="normal">1494</span>
<span class="normal">1495</span>
<span class="normal">1496</span>
<span class="normal">1497</span>
<span class="normal">1498</span>
<span class="normal">1499</span>
<span class="normal">1500</span>
<span class="normal">1501</span>
<span class="normal">1502</span>
<span class="normal">1503</span>
<span class="normal">1504</span>
<span class="normal">1505</span>
<span class="normal">1506</span>
<span class="normal">1507</span>
<span class="normal">1508</span>
<span class="normal">1509</span>
<span class="normal">1510</span>
<span class="normal">1511</span>
<span class="normal">1512</span>
<span class="normal">1513</span>
<span class="normal">1514</span>
<span class="normal">1515</span>
<span class="normal">1516</span>
<span class="normal">1517</span>
<span class="normal">1518</span>
<span class="normal">1519</span>
<span class="normal">1520</span>
<span class="normal">1521</span>
<span class="normal">1522</span>
<span class="normal">1523</span>
<span class="normal">1524</span>
<span class="normal">1525</span>
<span class="normal">1526</span>
<span class="normal">1527</span>
<span class="normal">1528</span>
<span class="normal">1529</span>
<span class="normal">1530</span>
<span class="normal">1531</span>
<span class="normal">1532</span>
<span class="normal">1533</span>
<span class="normal">1534</span>
<span class="normal">1535</span>
<span class="normal">1536</span>
<span class="normal">1537</span>
<span class="normal">1538</span>
<span class="normal">1539</span>
<span class="normal">1540</span>
<span class="normal">1541</span>
<span class="normal">1542</span>
<span class="normal">1543</span>
<span class="normal">1544</span>
<span class="normal">1545</span>
<span class="normal">1546</span>
<span class="normal">1547</span>
<span class="normal">1548</span>
<span class="normal">1549</span>
<span class="normal">1550</span>
<span class="normal">1551</span>
<span class="normal">1552</span>
<span class="normal">1553</span>
<span class="normal">1554</span>
<span class="normal">1555</span>
<span class="normal">1556</span>
<span class="normal">1557</span>
<span class="normal">1558</span>
<span class="normal">1559</span>
<span class="normal">1560</span>
<span class="normal">1561</span>
<span class="normal">1562</span>
<span class="normal">1563</span>
<span class="normal">1564</span>
<span class="normal">1565</span>
<span class="normal">1566</span>
<span class="normal">1567</span>
<span class="normal">1568</span>
<span class="normal">1569</span>
<span class="normal">1570</span>
<span class="normal">1571</span>
<span class="normal">1572</span>
<span class="normal">1573</span>
<span class="normal">1574</span>
<span class="normal">1575</span>
<span class="normal">1576</span>
<span class="normal">1577</span>
<span class="normal">1578</span>
<span class="normal">1579</span>
<span class="normal">1580</span>
<span class="normal">1581</span>
<span class="normal">1582</span>
<span class="normal">1583</span>
<span class="normal">1584</span>
<span class="normal">1585</span>
<span class="normal">1586</span>
<span class="normal">1587</span>
<span class="normal">1588</span>
<span class="normal">1589</span>
<span class="normal">1590</span>
<span class="normal">1591</span>
<span class="normal">1592</span>
<span class="normal">1593</span>
<span class="normal">1594</span>
<span class="normal">1595</span>
<span class="normal">1596</span>
<span class="normal">1597</span>
<span class="normal">1598</span>
<span class="normal">1599</span>
<span class="normal">1600</span>
<span class="normal">1601</span>
<span class="normal">1602</span>
<span class="normal">1603</span>
<span class="normal">1604</span>
<span class="normal">1605</span>
<span class="normal">1606</span>
<span class="normal">1607</span>
<span class="normal">1608</span>
<span class="normal">1609</span>
<span class="normal">1610</span>
<span class="normal">1611</span>
<span class="normal">1612</span>
<span class="normal">1613</span>
<span class="normal">1614</span>
<span class="normal">1615</span>
<span class="normal">1616</span>
<span class="normal">1617</span>
<span class="normal">1618</span>
<span class="normal">1619</span>
<span class="normal">1620</span>
<span class="normal">1621</span>
<span class="normal">1622</span>
<span class="normal">1623</span>
<span class="normal">1624</span>
<span class="normal">1625</span>
<span class="normal">1626</span>
<span class="normal">1627</span>
<span class="normal">1628</span>
<span class="normal">1629</span>
<span class="normal">1630</span>
<span class="normal">1631</span>
<span class="normal">1632</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@v_args</span><span class="p">(</span><span class="n">inline</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">ExpToLatex</span><span class="p">(</span><span class="n">Transformer</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Transformer to compile the DSL mathematical AST into a LaTeX math string.</span>
<span class="sd"> Converts operations, variables, derivatives, and functions into LaTeX syntax</span>
<span class="sd"> (e.g., partial derivative notation, fraction blocks, and bracket sizing)</span>
<span class="sd"> to generate mathematical report files.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpToLatex transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="k">def</span> <span class="nf">arithmatic_rooted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if a variable&#39;s root operation is arithmetic.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if arithmetic-rooted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">exproot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">exp</span><span class="o">.</span><span class="n">data</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">exproot</span> <span class="o">=</span> <span class="s2">&quot;something_11fasq2afa3rfzsaerqw23&quot;</span>
<span class="k">return</span> <span class="p">((</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;add&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;sub&quot;</span><span class="p">)</span> <span class="ow">or</span>
<span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;mul&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;div&quot;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">parenthise</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a variable name, wrapping it in parentheses if it has lower priority operators.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized LaTeX equation representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">latex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span>
<span class="n">latex_given</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">latex_given</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; is not found&quot;</span><span class="p">)</span>
<span class="n">latex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">latex_given</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arithmatic_rooted</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">latex_given</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">latex</span> <span class="o">=</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="n">latex</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span>
<span class="k">return</span> <span class="n">latex</span>
<span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns LaTeX literal for numbers.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token): Number token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">numeral</span>
<span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns LaTeX literal for environment variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats parentheses.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Inner LaTeX content.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats variables in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX variable representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats fluctuation prime (u&#39;&#39;) variables in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX prime variable string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&#39;&#39;&quot;</span>
<span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats spatial derivatives in LaTeX (e.g. \\partial_x(u)).</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator token.</span>
<span class="sd"> b (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX partial derivative expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\partial_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span>
<span class="n">coord</span> <span class="o">=</span> <span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coord</span> <span class="o">+</span> <span class="n">coord</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">else</span> <span class="n">coord</span><span class="p">)</span>
<span class="n">signature</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">eq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">signature</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">eq</span> <span class="o">=</span> <span class="n">op</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">signature</span> <span class="o">+</span> <span class="s2">&quot; is not found: &quot;</span> <span class="o">+</span> <span class="n">eq</span><span class="p">)</span>
<span class="k">return</span> <span class="n">eq</span>
<span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats inline functions (sqr, pow3) in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Inline function operator.</span>
<span class="sd"> b (str): LaTeX representation of argument.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)^2&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)^3&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats function calls in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length arguments. The first argument is function name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX function representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">return</span> <span class="n">function_registry</span><span class="o">.</span><span class="n">to_latex</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> b (str): Inner LaTeX expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX negated expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(-</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats addition.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX addition expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> + </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats subtraction.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX subtraction expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> - </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX multiplication expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats division.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX division expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> / </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
<span class="n">log</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;\log&quot;</span>
<span class="n">exp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;\exp&quot;</span>
<span class="n">sqrt</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;sqrt&quot;</span>
<span class="nb">abs</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;abs&quot;</span>
<span class="n">rxn_rate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;\omega&quot;</span>
<span class="n">udf</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">:</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes ExpToLatex transformer.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping variable names to FieldBase objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1406</span>
<span class="normal">1407</span>
<span class="normal">1408</span>
<span class="normal">1409</span>
<span class="normal">1410</span>
<span class="normal">1411</span>
<span class="normal">1412</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ExpToLatex transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.add" class="doc doc-heading">
<code class="highlight language-python"><span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats addition.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX addition expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1575</span>
<span class="normal">1576</span>
<span class="normal">1577</span>
<span class="normal">1578</span>
<span class="normal">1579</span>
<span class="normal">1580</span>
<span class="normal">1581</span>
<span class="normal">1582</span>
<span class="normal">1583</span>
<span class="normal">1584</span>
<span class="normal">1585</span>
<span class="normal">1586</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats addition.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX addition expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> + </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.arithmatic_rooted" class="doc doc-heading">
<code class="highlight language-python"><span class="n">arithmatic_rooted</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if a variable's root operation is arithmetic.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if arithmetic-rooted.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1414</span>
<span class="normal">1415</span>
<span class="normal">1416</span>
<span class="normal">1417</span>
<span class="normal">1418</span>
<span class="normal">1419</span>
<span class="normal">1420</span>
<span class="normal">1421</span>
<span class="normal">1422</span>
<span class="normal">1423</span>
<span class="normal">1424</span>
<span class="normal">1425</span>
<span class="normal">1426</span>
<span class="normal">1427</span>
<span class="normal">1428</span>
<span class="normal">1429</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">arithmatic_rooted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if a variable&#39;s root operation is arithmetic.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if arithmetic-rooted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">exproot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">exp</span><span class="o">.</span><span class="n">data</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">exproot</span> <span class="o">=</span> <span class="s2">&quot;something_11fasq2afa3rfzsaerqw23&quot;</span>
<span class="k">return</span> <span class="p">((</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;add&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;sub&quot;</span><span class="p">)</span> <span class="ow">or</span>
<span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;mul&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">exproot</span> <span class="o">==</span> <span class="s2">&quot;div&quot;</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.div" class="doc doc-heading">
<code class="highlight language-python"><span class="n">div</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats division.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX division expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1614</span>
<span class="normal">1615</span>
<span class="normal">1616</span>
<span class="normal">1617</span>
<span class="normal">1618</span>
<span class="normal">1619</span>
<span class="normal">1620</span>
<span class="normal">1621</span>
<span class="normal">1622</span>
<span class="normal">1623</span>
<span class="normal">1624</span>
<span class="normal">1625</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats division.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX division expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> / </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.dnx" class="doc doc-heading">
<code class="highlight language-python"><span class="n">dnx</span><span class="p">(</span><span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats spatial derivatives in LaTeX (e.g. \partial_x(u)).</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>partial</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Derivative operator token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX partial derivative expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1508</span>
<span class="normal">1509</span>
<span class="normal">1510</span>
<span class="normal">1511</span>
<span class="normal">1512</span>
<span class="normal">1513</span>
<span class="normal">1514</span>
<span class="normal">1515</span>
<span class="normal">1516</span>
<span class="normal">1517</span>
<span class="normal">1518</span>
<span class="normal">1519</span>
<span class="normal">1520</span>
<span class="normal">1521</span>
<span class="normal">1522</span>
<span class="normal">1523</span>
<span class="normal">1524</span>
<span class="normal">1525</span>
<span class="normal">1526</span>
<span class="normal">1527</span>
<span class="normal">1528</span>
<span class="normal">1529</span>
<span class="normal">1530</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats spatial derivatives in LaTeX (e.g. \\partial_x(u)).</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator token.</span>
<span class="sd"> b (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX partial derivative expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\partial_{{</span><span class="si">{}</span><span class="s2">}}&quot;</span>
<span class="n">coord</span> <span class="o">=</span> <span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">coord</span> <span class="o">+</span> <span class="n">coord</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="k">else</span> <span class="n">coord</span><span class="p">)</span>
<span class="n">signature</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">_</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">eq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">signature</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">eq</span> <span class="o">=</span> <span class="n">op</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">signature</span> <span class="o">+</span> <span class="s2">&quot; is not found: &quot;</span> <span class="o">+</span> <span class="n">eq</span><span class="p">)</span>
<span class="k">return</span> <span class="n">eq</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.env" class="doc doc-heading">
<code class="highlight language-python"><span class="n">env</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Returns LaTeX literal for environment variables.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Environment variable name token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1464</span>
<span class="normal">1465</span>
<span class="normal">1466</span>
<span class="normal">1467</span>
<span class="normal">1468</span>
<span class="normal">1469</span>
<span class="normal">1470</span>
<span class="normal">1471</span>
<span class="normal">1472</span>
<span class="normal">1473</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns LaTeX literal for environment variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.fcall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fcall</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats function calls in LaTeX.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>*args</code></td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Variable length arguments. The first argument is function name token.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX function representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1550</span>
<span class="normal">1551</span>
<span class="normal">1552</span>
<span class="normal">1553</span>
<span class="normal">1554</span>
<span class="normal">1555</span>
<span class="normal">1556</span>
<span class="normal">1557</span>
<span class="normal">1558</span>
<span class="normal">1559</span>
<span class="normal">1560</span>
<span class="normal">1561</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats function calls in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length arguments. The first argument is function name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX function representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">return</span> <span class="n">function_registry</span><span class="o">.</span><span class="n">to_latex</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.fluc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fluc</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats fluctuation prime (u'') variables in LaTeX.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX prime variable string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1497</span>
<span class="normal">1498</span>
<span class="normal">1499</span>
<span class="normal">1500</span>
<span class="normal">1501</span>
<span class="normal">1502</span>
<span class="normal">1503</span>
<span class="normal">1504</span>
<span class="normal">1505</span>
<span class="normal">1506</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats fluctuation prime (u&#39;&#39;) variables in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX prime variable string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&#39;&#39;&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.icall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">icall</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats inline functions (sqr, pow3) in LaTeX.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Inline function operator.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX representation of argument.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1532</span>
<span class="normal">1533</span>
<span class="normal">1534</span>
<span class="normal">1535</span>
<span class="normal">1536</span>
<span class="normal">1537</span>
<span class="normal">1538</span>
<span class="normal">1539</span>
<span class="normal">1540</span>
<span class="normal">1541</span>
<span class="normal">1542</span>
<span class="normal">1543</span>
<span class="normal">1544</span>
<span class="normal">1545</span>
<span class="normal">1546</span>
<span class="normal">1547</span>
<span class="normal">1548</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats inline functions (sqr, pow3) in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Inline function operator.</span>
<span class="sd"> b (str): LaTeX representation of argument.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)^2&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">a</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)^3&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">{0}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.mul" class="doc doc-heading">
<code class="highlight language-python"><span class="n">mul</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats multiplication.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX multiplication expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1601</span>
<span class="normal">1602</span>
<span class="normal">1603</span>
<span class="normal">1604</span>
<span class="normal">1605</span>
<span class="normal">1606</span>
<span class="normal">1607</span>
<span class="normal">1608</span>
<span class="normal">1609</span>
<span class="normal">1610</span>
<span class="normal">1611</span>
<span class="normal">1612</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats multiplication.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX multiplication expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.neg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">neg</span><span class="p">(</span><span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats negation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Inner LaTeX expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX negated expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1563</span>
<span class="normal">1564</span>
<span class="normal">1565</span>
<span class="normal">1566</span>
<span class="normal">1567</span>
<span class="normal">1568</span>
<span class="normal">1569</span>
<span class="normal">1570</span>
<span class="normal">1571</span>
<span class="normal">1572</span>
<span class="normal">1573</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> b (str): Inner LaTeX expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX negated expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;(-</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.number" class="doc doc-heading">
<code class="highlight language-python"><span class="n">number</span><span class="p">(</span><span class="n">numeral</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Returns LaTeX literal for numbers.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>numeral</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Number token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1453</span>
<span class="normal">1454</span>
<span class="normal">1455</span>
<span class="normal">1456</span>
<span class="normal">1457</span>
<span class="normal">1458</span>
<span class="normal">1459</span>
<span class="normal">1460</span>
<span class="normal">1461</span>
<span class="normal">1462</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns LaTeX literal for numbers.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token): Number token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">numeral</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.paren" class="doc doc-heading">
<code class="highlight language-python"><span class="n">paren</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats parentheses.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Inner LaTeX content.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Parenthesized string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1475</span>
<span class="normal">1476</span>
<span class="normal">1477</span>
<span class="normal">1478</span>
<span class="normal">1479</span>
<span class="normal">1480</span>
<span class="normal">1481</span>
<span class="normal">1482</span>
<span class="normal">1483</span>
<span class="normal">1484</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats parentheses.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Inner LaTeX content.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.parenthise" class="doc doc-heading">
<code class="highlight language-python"><span class="n">parenthise</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats a variable name, wrapping it in parentheses if it has lower priority operators.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Parenthesized LaTeX equation representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1431</span>
<span class="normal">1432</span>
<span class="normal">1433</span>
<span class="normal">1434</span>
<span class="normal">1435</span>
<span class="normal">1436</span>
<span class="normal">1437</span>
<span class="normal">1438</span>
<span class="normal">1439</span>
<span class="normal">1440</span>
<span class="normal">1441</span>
<span class="normal">1442</span>
<span class="normal">1443</span>
<span class="normal">1444</span>
<span class="normal">1445</span>
<span class="normal">1446</span>
<span class="normal">1447</span>
<span class="normal">1448</span>
<span class="normal">1449</span>
<span class="normal">1450</span>
<span class="normal">1451</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">parenthise</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats a variable name, wrapping it in parentheses if it has lower priority operators.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Parenthesized LaTeX equation representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">latex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">latex</span>
<span class="n">latex_given</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">latex_given</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; is not found&quot;</span><span class="p">)</span>
<span class="n">latex</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">latex_given</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arithmatic_rooted</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">latex_given</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">latex</span> <span class="o">=</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="n">latex</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span>
<span class="k">return</span> <span class="n">latex</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.sub" class="doc doc-heading">
<code class="highlight language-python"><span class="n">sub</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats subtraction.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Left operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Right operand.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX subtraction expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1588</span>
<span class="normal">1589</span>
<span class="normal">1590</span>
<span class="normal">1591</span>
<span class="normal">1592</span>
<span class="normal">1593</span>
<span class="normal">1594</span>
<span class="normal">1595</span>
<span class="normal">1596</span>
<span class="normal">1597</span>
<span class="normal">1598</span>
<span class="normal">1599</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats subtraction.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (str): Left operand.</span>
<span class="sd"> b (str): Right operand.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX subtraction expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fcode</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> - </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fcode</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ExpToLatex.var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">var</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Formats variables in LaTeX.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>LaTeX variable representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1486</span>
<span class="normal">1487</span>
<span class="normal">1488</span>
<span class="normal">1489</span>
<span class="normal">1490</span>
<span class="normal">1491</span>
<span class="normal">1492</span>
<span class="normal">1493</span>
<span class="normal">1494</span>
<span class="normal">1495</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formats variables in LaTeX.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: LaTeX variable representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parenthise</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.Field" class="doc doc-heading">
<code>Field</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code></p>
<p>일반 대입 계산 변수를 관리하며, 3차원 격자점 루프 코드 생성을 담당하는 핵심 클래스입니다.
SymPy 최적화 및 CSE 적용 코드를 루프 본문에 결합합니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2012</span>
<span class="normal">2013</span>
<span class="normal">2014</span>
<span class="normal">2015</span>
<span class="normal">2016</span>
<span class="normal">2017</span>
<span class="normal">2018</span>
<span class="normal">2019</span>
<span class="normal">2020</span>
<span class="normal">2021</span>
<span class="normal">2022</span>
<span class="normal">2023</span>
<span class="normal">2024</span>
<span class="normal">2025</span>
<span class="normal">2026</span>
<span class="normal">2027</span>
<span class="normal">2028</span>
<span class="normal">2029</span>
<span class="normal">2030</span>
<span class="normal">2031</span>
<span class="normal">2032</span>
<span class="normal">2033</span>
<span class="normal">2034</span>
<span class="normal">2035</span>
<span class="normal">2036</span>
<span class="normal">2037</span>
<span class="normal">2038</span>
<span class="normal">2039</span>
<span class="normal">2040</span>
<span class="normal">2041</span>
<span class="normal">2042</span>
<span class="normal">2043</span>
<span class="normal">2044</span>
<span class="normal">2045</span>
<span class="normal">2046</span>
<span class="normal">2047</span>
<span class="normal">2048</span>
<span class="normal">2049</span>
<span class="normal">2050</span>
<span class="normal">2051</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">Field</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;일반 대입 계산 변수를 관리하며, 3차원 격자점 루프 코드 생성을 담당하는 핵심 클래스입니다.</span>
<span class="sd"> SymPy 최적화 및 CSE 적용 코드를 루프 본문에 결합합니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">exp</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes Field properties and inspects expression details.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Calculated variable name.</span>
<span class="sd"> attr (dict): Attribute configuration tags.</span>
<span class="sd"> exp (Tree): Mathematical equation AST subtree.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Field</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="n">attr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exp</span> <span class="o">=</span> <span class="n">exp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derivs</span> <span class="o">=</span> <span class="n">ExpInspector</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">exp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; = &quot;</span> <span class="o">+</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;latex&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">ExpToLatex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="p">[</span><span class="s2">&quot;export&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="o">=</span> <span class="n">FieldExporter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">export_on</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if file exporting is enabled.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if an exporter is configured.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.Field.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">exp</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes Field properties and inspects expression details.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Calculated variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>attr</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Attribute configuration tags.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>exp</code></td>
<td>
<code>Tree</code>
</td>
<td>
<div class="doc-md-description">
<p>Mathematical equation AST subtree.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2017</span>
<span class="normal">2018</span>
<span class="normal">2019</span>
<span class="normal">2020</span>
<span class="normal">2021</span>
<span class="normal">2022</span>
<span class="normal">2023</span>
<span class="normal">2024</span>
<span class="normal">2025</span>
<span class="normal">2026</span>
<span class="normal">2027</span>
<span class="normal">2028</span>
<span class="normal">2029</span>
<span class="normal">2030</span>
<span class="normal">2031</span>
<span class="normal">2032</span>
<span class="normal">2033</span>
<span class="normal">2034</span>
<span class="normal">2035</span>
<span class="normal">2036</span>
<span class="normal">2037</span>
<span class="normal">2038</span>
<span class="normal">2039</span>
<span class="normal">2040</span>
<span class="normal">2041</span>
<span class="normal">2042</span>
<span class="normal">2043</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">exp</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes Field properties and inspects expression details.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Calculated variable name.</span>
<span class="sd"> attr (dict): Attribute configuration tags.</span>
<span class="sd"> exp (Tree): Mathematical equation AST subtree.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Field</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="n">attr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exp</span> <span class="o">=</span> <span class="n">exp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fluc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">derivs</span> <span class="o">=</span> <span class="n">ExpInspector</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">exp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; = &quot;</span> <span class="o">+</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;latex&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">ExpToLatex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="p">[</span><span class="s2">&quot;export&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="o">=</span> <span class="n">FieldExporter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">pass</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.Field.export_on" class="doc doc-heading">
<code class="highlight language-python"><span class="n">export_on</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if file exporting is enabled.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>True if an exporter is configured.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2045</span>
<span class="normal">2046</span>
<span class="normal">2047</span>
<span class="normal">2048</span>
<span class="normal">2049</span>
<span class="normal">2050</span>
<span class="normal">2051</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">export_on</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if file exporting is enabled.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True if an exporter is configured.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">exporter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FieldBase" class="doc doc-heading">
<code>FieldBase</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.DependencyNode" href="#post.DependencyNode">DependencyNode</a></code></p>
<p>모든 물리 필드 객체의 최상위 기본 클래스로서 공통 데이터 구조를 정의합니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1926</span>
<span class="normal">1927</span>
<span class="normal">1928</span>
<span class="normal">1929</span>
<span class="normal">1930</span>
<span class="normal">1931</span>
<span class="normal">1932</span>
<span class="normal">1933</span>
<span class="normal">1934</span>
<span class="normal">1935</span>
<span class="normal">1936</span>
<span class="normal">1937</span>
<span class="normal">1938</span>
<span class="normal">1939</span>
<span class="normal">1940</span>
<span class="normal">1941</span>
<span class="normal">1942</span>
<span class="normal">1943</span>
<span class="normal">1944</span>
<span class="normal">1945</span>
<span class="normal">1946</span>
<span class="normal">1947</span>
<span class="normal">1948</span>
<span class="normal">1949</span>
<span class="normal">1950</span>
<span class="normal">1951</span>
<span class="normal">1952</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FieldBase</span><span class="p">(</span><span class="n">DependencyNode</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;모든 물리 필드 객체의 최상위 기본 클래스로서 공통 데이터 구조를 정의합니다.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FieldBase properties.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prime</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shape</span> <span class="o">=</span> <span class="s2">&quot;nxp,nyp,nzp&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dim</span> <span class="o">=</span> <span class="s2">&quot;:,:,:&quot;</span>
<span class="k">def</span> <span class="nf">export_on</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if disk exporting is enabled for this field.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: Always False for the base field class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;String representation of the field (returns variable name).&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FieldBase.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes FieldBase properties.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1929</span>
<span class="normal">1930</span>
<span class="normal">1931</span>
<span class="normal">1932</span>
<span class="normal">1933</span>
<span class="normal">1934</span>
<span class="normal">1935</span>
<span class="normal">1936</span>
<span class="normal">1937</span>
<span class="normal">1938</span>
<span class="normal">1939</span>
<span class="normal">1940</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FieldBase properties.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> fdict (dict): Global variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prime</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shape</span> <span class="o">=</span> <span class="s2">&quot;nxp,nyp,nzp&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dim</span> <span class="o">=</span> <span class="s2">&quot;:,:,:&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FieldBase.__repr__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__repr__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>String representation of the field (returns variable name).</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1950</span>
<span class="normal">1951</span>
<span class="normal">1952</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;String representation of the field (returns variable name).&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FieldBase.export_on" class="doc doc-heading">
<code class="highlight language-python"><span class="n">export_on</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Checks if disk exporting is enabled for this field.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>bool</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Always False for the base field class.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1942</span>
<span class="normal">1943</span>
<span class="normal">1944</span>
<span class="normal">1945</span>
<span class="normal">1946</span>
<span class="normal">1947</span>
<span class="normal">1948</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">export_on</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Checks if disk exporting is enabled for this field.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: Always False for the base field class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">False</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FieldExporter" class="doc doc-heading">
<code>FieldExporter</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>물리 필드 데이터를 병렬 분산 디스크 시스템으로 직접 추출(Export)하는 고성능 MPI-IO 서브루틴 블록을
정의하는 도메인 데이터 클래스입니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1955</span>
<span class="normal">1956</span>
<span class="normal">1957</span>
<span class="normal">1958</span>
<span class="normal">1959</span>
<span class="normal">1960</span>
<span class="normal">1961</span>
<span class="normal">1962</span>
<span class="normal">1963</span>
<span class="normal">1964</span>
<span class="normal">1965</span>
<span class="normal">1966</span>
<span class="normal">1967</span>
<span class="normal">1968</span>
<span class="normal">1969</span>
<span class="normal">1970</span>
<span class="normal">1971</span>
<span class="normal">1972</span>
<span class="normal">1973</span>
<span class="normal">1974</span>
<span class="normal">1975</span>
<span class="normal">1976</span>
<span class="normal">1977</span>
<span class="normal">1978</span>
<span class="normal">1979</span>
<span class="normal">1980</span>
<span class="normal">1981</span>
<span class="normal">1982</span>
<span class="normal">1983</span>
<span class="normal">1984</span>
<span class="normal">1985</span>
<span class="normal">1986</span>
<span class="normal">1987</span>
<span class="normal">1988</span>
<span class="normal">1989</span>
<span class="normal">1990</span>
<span class="normal">1991</span>
<span class="normal">1992</span>
<span class="normal">1993</span>
<span class="normal">1994</span>
<span class="normal">1995</span>
<span class="normal">1996</span>
<span class="normal">1997</span>
<span class="normal">1998</span>
<span class="normal">1999</span>
<span class="normal">2000</span>
<span class="normal">2001</span>
<span class="normal">2002</span>
<span class="normal">2003</span>
<span class="normal">2004</span>
<span class="normal">2005</span>
<span class="normal">2006</span>
<span class="normal">2007</span>
<span class="normal">2008</span>
<span class="normal">2009</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FieldExporter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;물리 필드 데이터를 병렬 분산 디스크 시스템으로 직접 추출(Export)하는 고성능 MPI-IO 서브루틴 블록을 </span>
<span class="sd"> 정의하는 도메인 데이터 클래스입니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">mpi_io_decl</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! field exporter common</span>
<span class="s2">integer(kind=MPI_OFFSET_KIND) :: offset</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FieldExporter with MPI configurations.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Field exporter name.</span>
<span class="sd"> attr (dict): Attributes dictionary containing slice coordinates (e.g. xs, xe).</span>
<span class="sd"> parent (Field): Parent field object owning this exporter.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="n">attr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xs&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xe&quot;</span><span class="p">,</span> <span class="s2">&quot;nxp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ys&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ye&quot;</span><span class="p">,</span> <span class="s2">&quot;nyp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;zs&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ze&quot;</span><span class="p">,</span> <span class="s2">&quot;nzp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;field_name&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;len_xpts&quot;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;xe&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;xs&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> + 1)&quot;</span><span class="p">)</span>
<span class="n">fmt_xpts_init</span> <span class="o">=</span> <span class="s1">&#39;&#39;&#39;</span>
<span class="s1">do i = {{ xs }}, {{ xe }}</span>
<span class="s1">{{ field_name }}_xpts(i-{{ xs }}+1) = i</span>
<span class="s1">end do</span>
<span class="s1">&#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xpts_init&quot;</span><span class="p">,</span> <span class="n">Template</span><span class="p">(</span><span class="n">fmt_xpts_init</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Sampling at listed x coordinates</span>
<span class="n">fmt_xpts_init_list</span> <span class="o">=</span> <span class="s2">&quot;{{ field_name }}_xpts = (/ {{ list_xpts }} /)&quot;</span>
<span class="n">raw_xpts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;xpts&quot;</span><span class="p">]</span>
<span class="n">int_xpts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">raw_xpts</span><span class="o">.</span><span class="n">split</span><span class="p">()))</span>
<span class="n">len_xpts</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">int_xpts</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;len_xpts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">len_xpts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;list_xpts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">int_xpts</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;xpts_init&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">fmt_xpts_init_list</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="bp">self</span><span class="o">.</span><span class="n">use_subarray</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;xpts&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FieldExporter.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes FieldExporter with MPI configurations.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Field exporter name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>attr</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Attributes dictionary containing slice coordinates (e.g. xs, xe).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>parent</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.Field" href="#post.Field">Field</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Parent field object owning this exporter.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1964</span>
<span class="normal">1965</span>
<span class="normal">1966</span>
<span class="normal">1967</span>
<span class="normal">1968</span>
<span class="normal">1969</span>
<span class="normal">1970</span>
<span class="normal">1971</span>
<span class="normal">1972</span>
<span class="normal">1973</span>
<span class="normal">1974</span>
<span class="normal">1975</span>
<span class="normal">1976</span>
<span class="normal">1977</span>
<span class="normal">1978</span>
<span class="normal">1979</span>
<span class="normal">1980</span>
<span class="normal">1981</span>
<span class="normal">1982</span>
<span class="normal">1983</span>
<span class="normal">1984</span>
<span class="normal">1985</span>
<span class="normal">1986</span>
<span class="normal">1987</span>
<span class="normal">1988</span>
<span class="normal">1989</span>
<span class="normal">1990</span>
<span class="normal">1991</span>
<span class="normal">1992</span>
<span class="normal">1993</span>
<span class="normal">1994</span>
<span class="normal">1995</span>
<span class="normal">1996</span>
<span class="normal">1997</span>
<span class="normal">1998</span>
<span class="normal">1999</span>
<span class="normal">2000</span>
<span class="normal">2001</span>
<span class="normal">2002</span>
<span class="normal">2003</span>
<span class="normal">2004</span>
<span class="normal">2005</span>
<span class="normal">2006</span>
<span class="normal">2007</span>
<span class="normal">2008</span>
<span class="normal">2009</span></pre></div></td><td class="code"><div><pre><span></span><code> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FieldExporter with MPI configurations.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Field exporter name.</span>
<span class="sd"> attr (dict): Attributes dictionary containing slice coordinates (e.g. xs, xe).</span>
<span class="sd"> parent (Field): Parent field object owning this exporter.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="n">attr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xs&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xe&quot;</span><span class="p">,</span> <span class="s2">&quot;nxp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ys&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ye&quot;</span><span class="p">,</span> <span class="s2">&quot;nyp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;zs&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;ze&quot;</span><span class="p">,</span> <span class="s2">&quot;nzp&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;field_name&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;len_xpts&quot;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;xe&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">&#39;xs&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> + 1)&quot;</span><span class="p">)</span>
<span class="n">fmt_xpts_init</span> <span class="o">=</span> <span class="s1">&#39;&#39;&#39;</span>
<span class="s1">do i = {{ xs }}, {{ xe }}</span>
<span class="s1">{{ field_name }}_xpts(i-{{ xs }}+1) = i</span>
<span class="s1">end do</span>
<span class="s1">&#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;xpts_init&quot;</span><span class="p">,</span> <span class="n">Template</span><span class="p">(</span><span class="n">fmt_xpts_init</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Sampling at listed x coordinates</span>
<span class="n">fmt_xpts_init_list</span> <span class="o">=</span> <span class="s2">&quot;{{ field_name }}_xpts = (/ {{ list_xpts }} /)&quot;</span>
<span class="n">raw_xpts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;xpts&quot;</span><span class="p">]</span>
<span class="n">int_xpts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">raw_xpts</span><span class="o">.</span><span class="n">split</span><span class="p">()))</span>
<span class="n">len_xpts</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">int_xpts</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;len_xpts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">len_xpts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;list_xpts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">int_xpts</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;xpts_init&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">fmt_xpts_init_list</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="bp">self</span><span class="o">.</span><span class="n">use_subarray</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;xpts&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FluctuationField" class="doc doc-heading">
<code>FluctuationField</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code></p>
<p>물리 필드의 난류 변동 성분(Fluctuation, u' = u - <u_w>)을 계산하기 위한 변수 클래스입니다.
수식 내의 u' 기호를 평균량과의 차이 수식으로 팽창하여 할당합니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2054</span>
<span class="normal">2055</span>
<span class="normal">2056</span>
<span class="normal">2057</span>
<span class="normal">2058</span>
<span class="normal">2059</span>
<span class="normal">2060</span>
<span class="normal">2061</span>
<span class="normal">2062</span>
<span class="normal">2063</span>
<span class="normal">2064</span>
<span class="normal">2065</span>
<span class="normal">2066</span>
<span class="normal">2067</span>
<span class="normal">2068</span>
<span class="normal">2069</span>
<span class="normal">2070</span>
<span class="normal">2071</span>
<span class="normal">2072</span>
<span class="normal">2073</span>
<span class="normal">2074</span>
<span class="normal">2075</span>
<span class="normal">2076</span>
<span class="normal">2077</span>
<span class="normal">2078</span>
<span class="normal">2079</span>
<span class="normal">2080</span>
<span class="normal">2081</span>
<span class="normal">2082</span>
<span class="normal">2083</span>
<span class="normal">2084</span>
<span class="normal">2085</span>
<span class="normal">2086</span>
<span class="normal">2087</span>
<span class="normal">2088</span>
<span class="normal">2089</span>
<span class="normal">2090</span>
<span class="normal">2091</span>
<span class="normal">2092</span>
<span class="normal">2093</span>
<span class="normal">2094</span>
<span class="normal">2095</span>
<span class="normal">2096</span>
<span class="normal">2097</span>
<span class="normal">2098</span>
<span class="normal">2099</span>
<span class="normal">2100</span>
<span class="normal">2101</span>
<span class="normal">2102</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FluctuationField</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;물리 필드의 난류 변동 성분(Fluctuation, u&#39; = u - &lt;u_w&gt;)을 계산하기 위한 변수 클래스입니다.</span>
<span class="sd"> 수식 내의 u&#39; 기호를 평균량과의 차이 수식으로 팽창하여 할당합니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">fset</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FluctuationField.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Weight variable name or average identifier.</span>
<span class="sd"> field (str): Base variable name (e.g. &#39;u&#39;).</span>
<span class="sd"> fset (set): Active fluctuation dependency names.</span>
<span class="sd"> fdict (dict): Global variable registry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FluctuationField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">),</span> <span class="n">fdict</span><span class="p">)</span>
<span class="k">if</span> <span class="n">w</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span> <span class="o">+</span> <span class="s2">&quot;_&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">field</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">dep</span> <span class="o">-</span> <span class="n">fset</span>
<span class="k">for</span> <span class="n">df</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">dep</span> <span class="o">&amp;</span> <span class="n">fset</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">df</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; = &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates dynamic fluctuation field naming key.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Average weight suffix.</span>
<span class="sd"> field (str): Base field name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated composite fluctuation variable name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">____</span><span class="si">{}</span><span class="s2">_avg&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">____avg&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">return</span> <span class="n">name</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FluctuationField.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">fset</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes FluctuationField.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>w</code></td>
<td>
<code>str / None</code>
</td>
<td>
<div class="doc-md-description">
<p>Weight variable name or average identifier.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Base variable name (e.g. 'u').</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fset</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Active fluctuation dependency names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Global variable registry.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2059</span>
<span class="normal">2060</span>
<span class="normal">2061</span>
<span class="normal">2062</span>
<span class="normal">2063</span>
<span class="normal">2064</span>
<span class="normal">2065</span>
<span class="normal">2066</span>
<span class="normal">2067</span>
<span class="normal">2068</span>
<span class="normal">2069</span>
<span class="normal">2070</span>
<span class="normal">2071</span>
<span class="normal">2072</span>
<span class="normal">2073</span>
<span class="normal">2074</span>
<span class="normal">2075</span>
<span class="normal">2076</span>
<span class="normal">2077</span>
<span class="normal">2078</span>
<span class="normal">2079</span>
<span class="normal">2080</span>
<span class="normal">2081</span>
<span class="normal">2082</span>
<span class="normal">2083</span>
<span class="normal">2084</span>
<span class="normal">2085</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">fset</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FluctuationField.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Weight variable name or average identifier.</span>
<span class="sd"> field (str): Base variable name (e.g. &#39;u&#39;).</span>
<span class="sd"> fset (set): Active fluctuation dependency names.</span>
<span class="sd"> fdict (dict): Global variable registry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FluctuationField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">),</span> <span class="n">fdict</span><span class="p">)</span>
<span class="k">if</span> <span class="n">w</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span> <span class="o">+</span> <span class="s2">&quot;_&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">fdict</span><span class="p">[</span><span class="n">field</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">dep</span> <span class="o">-</span> <span class="n">fset</span>
<span class="k">for</span> <span class="n">df</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">dep</span> <span class="o">&amp;</span> <span class="n">fset</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dep</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">df</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; = &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FluctuationField.id" class="doc doc-heading">
<code class="highlight language-python"><span class="nb">id</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="doc doc-contents ">
<p>Generates dynamic fluctuation field naming key.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>w</code></td>
<td>
<code>str / None</code>
</td>
<td>
<div class="doc-md-description">
<p>Average weight suffix.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Base field name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Generated composite fluctuation variable name.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2087</span>
<span class="normal">2088</span>
<span class="normal">2089</span>
<span class="normal">2090</span>
<span class="normal">2091</span>
<span class="normal">2092</span>
<span class="normal">2093</span>
<span class="normal">2094</span>
<span class="normal">2095</span>
<span class="normal">2096</span>
<span class="normal">2097</span>
<span class="normal">2098</span>
<span class="normal">2099</span>
<span class="normal">2100</span>
<span class="normal">2101</span>
<span class="normal">2102</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">id</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates dynamic fluctuation field naming key.</span>
<span class="sd"> Args:</span>
<span class="sd"> w (str/None): Average weight suffix.</span>
<span class="sd"> field (str): Base field name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated composite fluctuation variable name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">w</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">____</span><span class="si">{}</span><span class="s2">_avg&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">____avg&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">return</span> <span class="n">name</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FortranCodeGenerator" class="doc doc-heading">
<code>FortranCodeGenerator</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Visitor implementation that decouples code generation from domain AST node details.</p>
<p>Implements a classic visitor dispatch pattern that matches class names of the Field objects
to their code generation routines (e.g. generate_code, generate_decl, generate_alloc, generate_free).</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">335</span>
<span class="normal">336</span>
<span class="normal">337</span>
<span class="normal">338</span>
<span class="normal">339</span>
<span class="normal">340</span>
<span class="normal">341</span>
<span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span>
<span class="normal">349</span>
<span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span>
<span class="normal">363</span>
<span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span>
<span class="normal">372</span>
<span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span>
<span class="normal">376</span>
<span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span>
<span class="normal">388</span>
<span class="normal">389</span>
<span class="normal">390</span>
<span class="normal">391</span>
<span class="normal">392</span>
<span class="normal">393</span>
<span class="normal">394</span>
<span class="normal">395</span>
<span class="normal">396</span>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span>
<span class="normal">402</span>
<span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span>
<span class="normal">407</span>
<span class="normal">408</span>
<span class="normal">409</span>
<span class="normal">410</span>
<span class="normal">411</span>
<span class="normal">412</span>
<span class="normal">413</span>
<span class="normal">414</span>
<span class="normal">415</span>
<span class="normal">416</span>
<span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span>
<span class="normal">420</span>
<span class="normal">421</span>
<span class="normal">422</span>
<span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span>
<span class="normal">440</span>
<span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span>
<span class="normal">448</span>
<span class="normal">449</span>
<span class="normal">450</span>
<span class="normal">451</span>
<span class="normal">452</span>
<span class="normal">453</span>
<span class="normal">454</span>
<span class="normal">455</span>
<span class="normal">456</span>
<span class="normal">457</span>
<span class="normal">458</span>
<span class="normal">459</span>
<span class="normal">460</span>
<span class="normal">461</span>
<span class="normal">462</span>
<span class="normal">463</span>
<span class="normal">464</span>
<span class="normal">465</span>
<span class="normal">466</span>
<span class="normal">467</span>
<span class="normal">468</span>
<span class="normal">469</span>
<span class="normal">470</span>
<span class="normal">471</span>
<span class="normal">472</span>
<span class="normal">473</span>
<span class="normal">474</span>
<span class="normal">475</span>
<span class="normal">476</span>
<span class="normal">477</span>
<span class="normal">478</span>
<span class="normal">479</span>
<span class="normal">480</span>
<span class="normal">481</span>
<span class="normal">482</span>
<span class="normal">483</span>
<span class="normal">484</span>
<span class="normal">485</span>
<span class="normal">486</span>
<span class="normal">487</span>
<span class="normal">488</span>
<span class="normal">489</span>
<span class="normal">490</span>
<span class="normal">491</span>
<span class="normal">492</span>
<span class="normal">493</span>
<span class="normal">494</span>
<span class="normal">495</span>
<span class="normal">496</span>
<span class="normal">497</span>
<span class="normal">498</span>
<span class="normal">499</span>
<span class="normal">500</span>
<span class="normal">501</span>
<span class="normal">502</span>
<span class="normal">503</span>
<span class="normal">504</span>
<span class="normal">505</span>
<span class="normal">506</span>
<span class="normal">507</span>
<span class="normal">508</span>
<span class="normal">509</span>
<span class="normal">510</span>
<span class="normal">511</span>
<span class="normal">512</span>
<span class="normal">513</span>
<span class="normal">514</span>
<span class="normal">515</span>
<span class="normal">516</span>
<span class="normal">517</span>
<span class="normal">518</span>
<span class="normal">519</span>
<span class="normal">520</span>
<span class="normal">521</span>
<span class="normal">522</span>
<span class="normal">523</span>
<span class="normal">524</span>
<span class="normal">525</span>
<span class="normal">526</span>
<span class="normal">527</span>
<span class="normal">528</span>
<span class="normal">529</span>
<span class="normal">530</span>
<span class="normal">531</span>
<span class="normal">532</span>
<span class="normal">533</span>
<span class="normal">534</span>
<span class="normal">535</span>
<span class="normal">536</span>
<span class="normal">537</span>
<span class="normal">538</span>
<span class="normal">539</span>
<span class="normal">540</span>
<span class="normal">541</span>
<span class="normal">542</span>
<span class="normal">543</span>
<span class="normal">544</span>
<span class="normal">545</span>
<span class="normal">546</span>
<span class="normal">547</span>
<span class="normal">548</span>
<span class="normal">549</span>
<span class="normal">550</span>
<span class="normal">551</span>
<span class="normal">552</span>
<span class="normal">553</span>
<span class="normal">554</span>
<span class="normal">555</span>
<span class="normal">556</span>
<span class="normal">557</span>
<span class="normal">558</span>
<span class="normal">559</span>
<span class="normal">560</span>
<span class="normal">561</span>
<span class="normal">562</span>
<span class="normal">563</span>
<span class="normal">564</span>
<span class="normal">565</span>
<span class="normal">566</span>
<span class="normal">567</span>
<span class="normal">568</span>
<span class="normal">569</span>
<span class="normal">570</span>
<span class="normal">571</span>
<span class="normal">572</span>
<span class="normal">573</span>
<span class="normal">574</span>
<span class="normal">575</span>
<span class="normal">576</span>
<span class="normal">577</span>
<span class="normal">578</span>
<span class="normal">579</span>
<span class="normal">580</span>
<span class="normal">581</span>
<span class="normal">582</span>
<span class="normal">583</span>
<span class="normal">584</span>
<span class="normal">585</span>
<span class="normal">586</span>
<span class="normal">587</span>
<span class="normal">588</span>
<span class="normal">589</span>
<span class="normal">590</span>
<span class="normal">591</span>
<span class="normal">592</span>
<span class="normal">593</span>
<span class="normal">594</span>
<span class="normal">595</span>
<span class="normal">596</span>
<span class="normal">597</span>
<span class="normal">598</span>
<span class="normal">599</span>
<span class="normal">600</span>
<span class="normal">601</span>
<span class="normal">602</span>
<span class="normal">603</span>
<span class="normal">604</span>
<span class="normal">605</span>
<span class="normal">606</span>
<span class="normal">607</span>
<span class="normal">608</span>
<span class="normal">609</span>
<span class="normal">610</span>
<span class="normal">611</span>
<span class="normal">612</span>
<span class="normal">613</span>
<span class="normal">614</span>
<span class="normal">615</span>
<span class="normal">616</span>
<span class="normal">617</span>
<span class="normal">618</span>
<span class="normal">619</span>
<span class="normal">620</span>
<span class="normal">621</span>
<span class="normal">622</span>
<span class="normal">623</span>
<span class="normal">624</span>
<span class="normal">625</span>
<span class="normal">626</span>
<span class="normal">627</span>
<span class="normal">628</span>
<span class="normal">629</span>
<span class="normal">630</span>
<span class="normal">631</span>
<span class="normal">632</span>
<span class="normal">633</span>
<span class="normal">634</span>
<span class="normal">635</span>
<span class="normal">636</span>
<span class="normal">637</span>
<span class="normal">638</span>
<span class="normal">639</span>
<span class="normal">640</span>
<span class="normal">641</span>
<span class="normal">642</span>
<span class="normal">643</span>
<span class="normal">644</span>
<span class="normal">645</span>
<span class="normal">646</span>
<span class="normal">647</span>
<span class="normal">648</span>
<span class="normal">649</span>
<span class="normal">650</span>
<span class="normal">651</span>
<span class="normal">652</span>
<span class="normal">653</span>
<span class="normal">654</span>
<span class="normal">655</span>
<span class="normal">656</span>
<span class="normal">657</span>
<span class="normal">658</span>
<span class="normal">659</span>
<span class="normal">660</span>
<span class="normal">661</span>
<span class="normal">662</span>
<span class="normal">663</span>
<span class="normal">664</span>
<span class="normal">665</span>
<span class="normal">666</span>
<span class="normal">667</span>
<span class="normal">668</span>
<span class="normal">669</span>
<span class="normal">670</span>
<span class="normal">671</span>
<span class="normal">672</span>
<span class="normal">673</span>
<span class="normal">674</span>
<span class="normal">675</span>
<span class="normal">676</span>
<span class="normal">677</span>
<span class="normal">678</span>
<span class="normal">679</span>
<span class="normal">680</span>
<span class="normal">681</span>
<span class="normal">682</span>
<span class="normal">683</span>
<span class="normal">684</span>
<span class="normal">685</span>
<span class="normal">686</span>
<span class="normal">687</span>
<span class="normal">688</span>
<span class="normal">689</span>
<span class="normal">690</span>
<span class="normal">691</span>
<span class="normal">692</span>
<span class="normal">693</span>
<span class="normal">694</span>
<span class="normal">695</span>
<span class="normal">696</span>
<span class="normal">697</span>
<span class="normal">698</span>
<span class="normal">699</span>
<span class="normal">700</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FortranCodeGenerator</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Visitor implementation that decouples code generation from domain AST node details.</span>
<span class="sd"> Implements a classic visitor dispatch pattern that matches class names of the Field objects</span>
<span class="sd"> to their code generation routines (e.g. generate_code, generate_decl, generate_alloc, generate_free).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FortranCodeGenerator with the variable registry dictionary.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to their corresponding FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="k">def</span> <span class="nf">generate_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate actual calculation code for the field.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to generate code for.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map for array pooling. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated Fortran statement(s) inside loop blocks.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_code&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_code</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate variable type declarations.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to generate declaration for.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran variable declaration statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_decl&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_decl</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate dynamic memory allocation statements.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to allocate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran allocate and initialization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_alloc&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_alloc</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate deallocation statements.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to deallocate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran deallocate statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_free&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_free</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate average accumulators.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The averaged field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran summation and normalization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_avg&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_avg</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="c1"># --- Generic Fallbacks ---</span>
<span class="k">def</span> <span class="nf">generic_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Empty string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="k">def</span> <span class="nf">generic_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for declaration code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Standard allocatable real 3D/1D array declaration.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">real_array_decl</span> <span class="o">=</span> <span class="s2">&quot;real(real64), allocatable, dimension(</span><span class="si">{1}</span><span class="s2">) :: </span><span class="si">{0}</span><span class="s2">&quot;</span>
<span class="k">return</span> <span class="n">real_array_decl</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">dim</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generic_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for dynamic allocation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran allocate statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">make_allocate</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generic_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for deallocation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran deallocate statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">real_array_free</span> <span class="o">=</span> <span class="s2">&quot;deallocate(</span><span class="si">{}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="n">real_array_free</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generic_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for average code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Empty string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># --- Visit Methods ---</span>
<span class="k">def</span> <span class="nf">visit_FieldExporter_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates Fortran code for exporting fields using parallel MPI-IO.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: MPI writing code block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;work_array&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">exporter</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">array</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_CALC_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_CALC_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_FieldExporter_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates declarations for MPI-IO handles.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Declarations block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_DECL_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_DECL_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_FieldExporter_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates initialization code for MPI-IO types and file opens.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Initialization block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_INIT_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_INIT_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_FieldExporter_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates finalization code for MPI-IO types and file closes.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: MPI-IO finalization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_FINAL_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_FINAL_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_Field_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates calculation code for normal derived fields with SymPy CSE optimization.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (Field): The calculated field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders optimized 3D loop including CSE declarations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">opt</span> <span class="o">=</span> <span class="n">SympyOptimizer</span><span class="o">.</span><span class="n">get_instance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span>
<span class="n">rhs</span><span class="p">,</span> <span class="n">cse_decls</span><span class="p">,</span> <span class="n">cse_assigns</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">optimize_field</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">alloc</span><span class="p">)</span>
<span class="n">decls_str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cse_decls</span><span class="p">)</span> <span class="k">if</span> <span class="n">cse_decls</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">assigns_str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cse_assigns</span><span class="p">)</span> <span class="k">if</span> <span class="n">cse_assigns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">calculation_code</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">REAL_ARRAY_LOOP</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">comment</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span>
<span class="n">decls_str</span><span class="o">=</span><span class="n">decls_str</span><span class="p">,</span>
<span class="n">assigns_str</span><span class="o">=</span><span class="n">assigns_str</span><span class="p">,</span>
<span class="n">array</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">,</span>
<span class="n">rhs</span><span class="o">=</span><span class="n">rhs</span>
<span class="p">)</span>
<span class="n">export_code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">export_on</span><span class="p">()</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">calculation_code</span> <span class="o">+</span> <span class="n">export_code</span>
<span class="k">def</span> <span class="nf">visit_FluctuationField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates calculation code for turbulence fluctuations.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FluctuationField): The fluctuation field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders 3D loop for calculating u&#39; = u - &lt;u_w&gt;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">():</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">w</span><span class="p">)</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FLUCTUATION_ARRAY_LOOP</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">comment</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span>
<span class="n">array</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">,</span>
<span class="n">rhs</span><span class="o">=</span><span class="n">rhs</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_PrimaryField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No code generation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_PrimaryField_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No declaration needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_PrimaryField_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No allocation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_PrimaryField_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No deallocation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_DerivedField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates derivative calculation statements, calling Compact solver subroutines.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (DerivedField): The derivative field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran subroutine call string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">varray</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">v</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">v</span>
<span class="k">return</span> <span class="s2">&quot;call </span><span class="si">{0}</span><span class="s2"> ( </span><span class="si">{2}</span><span class="s2">, </span><span class="si">{1}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="n">varray</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_AveragedField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates local accumulation summation loop for spatial averaging.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (AveragedField): The averaged variable field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders local sum code block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">tgt</span><span class="p">]</span><span class="o">.</span><span class="n">array</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">weighted</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot; * &quot;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="n">w</span><span class="o">.</span><span class="n">array</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_SUM</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arrname</span><span class="o">=</span><span class="n">arrname</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit_AveragedField_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates normalization and parallel reduction via MPI_ALLREDUCE.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (AveragedField): The averaged variable field.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders global reduce and normalize statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dWeight</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/ avg_</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">weighted</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">weighted</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_DIVIDE</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">dWeight</span><span class="o">=</span><span class="n">dWeight</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_write_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">avglist</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates final module output writers for 1D spatial averages.</span>
<span class="sd"> Also generates first and second derivatives of the averaged data using</span>
<span class="sd"> ddx1d and d2dx1d subroutines.</span>
<span class="sd"> Args:</span>
<span class="sd"> avglist (list): List of averaged field names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Code block to write values to output files.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">avgarr</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">(i)&quot;</span>
<span class="n">deriv1_avgarr</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;call ddx1d ( xbuffer, </span><span class="si">{}</span><span class="s2"> ) ; write (200,*) xbuffer&quot;&quot;&quot;</span>
<span class="n">deriv2_avgarr</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;call d2dx1d ( xbuffer, </span><span class="si">{}</span><span class="s2"> ) ; write (200,*) xbuffer&quot;&quot;&quot;</span>
<span class="n">num_args</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">avglist</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">formatted_avglist</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">deriv1_lines</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">deriv1_avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">deriv2_lines</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">deriv2_avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">write_avg</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_WRITE</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">num_args</span><span class="o">=</span><span class="n">num_args</span><span class="p">,</span>
<span class="n">formatted_avglist</span><span class="o">=</span><span class="n">formatted_avglist</span><span class="p">,</span>
<span class="n">deriv1_lines</span><span class="o">=</span><span class="n">deriv1_lines</span><span class="p">,</span>
<span class="n">deriv2_lines</span><span class="o">=</span><span class="n">deriv2_lines</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">write_avg</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes FortranCodeGenerator with the variable registry dictionary.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping variable names to their corresponding FieldBase objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FortranCodeGenerator with the variable registry dictionary.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to their corresponding FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_alloc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_alloc</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Dispatches visitor to generate dynamic memory allocation statements.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node to allocate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran allocate and initialization statements.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span>
<span class="normal">388</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate dynamic memory allocation statements.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to allocate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran allocate and initialization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_alloc&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_alloc</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_avg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_avg</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Dispatches visitor to generate average accumulators.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The averaged field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran summation and normalization statements.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span>
<span class="normal">407</span>
<span class="normal">408</span>
<span class="normal">409</span>
<span class="normal">410</span>
<span class="normal">411</span>
<span class="normal">412</span>
<span class="normal">413</span>
<span class="normal">414</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate average accumulators.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The averaged field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran summation and normalization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_avg&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_avg</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Dispatches visitor to generate actual calculation code for the field.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node to generate code for.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map for array pooling. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Generated Fortran statement(s) inside loop blocks.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate actual calculation code for the field.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to generate code for.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map for array pooling. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Generated Fortran statement(s) inside loop blocks.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_code&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_code</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_decl" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_decl</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Dispatches visitor to generate variable type declarations.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node to generate declaration for.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran variable declaration statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span>
<span class="normal">372</span>
<span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate variable type declarations.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to generate declaration for.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran variable declaration statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_decl&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_decl</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_free" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_free</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Dispatches visitor to generate deallocation statements.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node to deallocate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran deallocate statements.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">390</span>
<span class="normal">391</span>
<span class="normal">392</span>
<span class="normal">393</span>
<span class="normal">394</span>
<span class="normal">395</span>
<span class="normal">396</span>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Dispatches visitor to generate deallocation statements.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node to deallocate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran deallocate statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">method_name</span> <span class="o">=</span> <span class="s1">&#39;visit_&#39;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span> <span class="o">+</span> <span class="s1">&#39;_free&#39;</span>
<span class="n">visitor</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">generic_free</span><span class="p">)</span>
<span class="k">return</span> <span class="n">visitor</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generate_write_avg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generate_write_avg</span><span class="p">(</span><span class="n">avglist</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates final module output writers for 1D spatial averages.</p>
<p>Also generates first and second derivatives of the averaged data using
ddx1d and d2dx1d subroutines.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>avglist</code></td>
<td>
<code>list</code>
</td>
<td>
<div class="doc-md-description">
<p>List of averaged field names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Code block to write values to output files.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">673</span>
<span class="normal">674</span>
<span class="normal">675</span>
<span class="normal">676</span>
<span class="normal">677</span>
<span class="normal">678</span>
<span class="normal">679</span>
<span class="normal">680</span>
<span class="normal">681</span>
<span class="normal">682</span>
<span class="normal">683</span>
<span class="normal">684</span>
<span class="normal">685</span>
<span class="normal">686</span>
<span class="normal">687</span>
<span class="normal">688</span>
<span class="normal">689</span>
<span class="normal">690</span>
<span class="normal">691</span>
<span class="normal">692</span>
<span class="normal">693</span>
<span class="normal">694</span>
<span class="normal">695</span>
<span class="normal">696</span>
<span class="normal">697</span>
<span class="normal">698</span>
<span class="normal">699</span>
<span class="normal">700</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generate_write_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">avglist</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates final module output writers for 1D spatial averages.</span>
<span class="sd"> Also generates first and second derivatives of the averaged data using</span>
<span class="sd"> ddx1d and d2dx1d subroutines.</span>
<span class="sd"> Args:</span>
<span class="sd"> avglist (list): List of averaged field names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Code block to write values to output files.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">avgarr</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">(i)&quot;</span>
<span class="n">deriv1_avgarr</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;call ddx1d ( xbuffer, </span><span class="si">{}</span><span class="s2"> ) ; write (200,*) xbuffer&quot;&quot;&quot;</span>
<span class="n">deriv2_avgarr</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;call d2dx1d ( xbuffer, </span><span class="si">{}</span><span class="s2"> ) ; write (200,*) xbuffer&quot;&quot;&quot;</span>
<span class="n">num_args</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">avglist</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">formatted_avglist</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">deriv1_lines</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">deriv1_avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">deriv2_lines</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">deriv2_avgarr</span><span class="o">.</span><span class="n">format</span><span class="p">,</span> <span class="n">avglist</span><span class="p">))</span>
<span class="n">write_avg</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_WRITE</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">num_args</span><span class="o">=</span><span class="n">num_args</span><span class="p">,</span>
<span class="n">formatted_avglist</span><span class="o">=</span><span class="n">formatted_avglist</span><span class="p">,</span>
<span class="n">deriv1_lines</span><span class="o">=</span><span class="n">deriv1_lines</span><span class="p">,</span>
<span class="n">deriv2_lines</span><span class="o">=</span><span class="n">deriv2_lines</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">write_avg</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generic_alloc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generic_alloc</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generic fallback for dynamic allocation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran allocate statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span>
<span class="normal">448</span>
<span class="normal">449</span>
<span class="normal">450</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generic_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for dynamic allocation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran allocate statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">make_allocate</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generic_avg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generic_avg</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generic fallback for average code generation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Empty string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">464</span>
<span class="normal">465</span>
<span class="normal">466</span>
<span class="normal">467</span>
<span class="normal">468</span>
<span class="normal">469</span>
<span class="normal">470</span>
<span class="normal">471</span>
<span class="normal">472</span>
<span class="normal">473</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generic_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for average code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Empty string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generic_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generic_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generic fallback for code generation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Empty string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span>
<span class="normal">420</span>
<span class="normal">421</span>
<span class="normal">422</span>
<span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generic_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Empty string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generic_decl" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generic_decl</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generic fallback for declaration code generation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Standard allocatable real 3D/1D array declaration.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generic_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for declaration code generation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Standard allocatable real 3D/1D array declaration.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">real_array_decl</span> <span class="o">=</span> <span class="s2">&quot;real(real64), allocatable, dimension(</span><span class="si">{1}</span><span class="s2">) :: </span><span class="si">{0}</span><span class="s2">&quot;</span>
<span class="k">return</span> <span class="n">real_array_decl</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">dim</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.generic_free" class="doc doc-heading">
<code class="highlight language-python"><span class="n">generic_free</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generic fallback for deallocation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The field node.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran deallocate statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">452</span>
<span class="normal">453</span>
<span class="normal">454</span>
<span class="normal">455</span>
<span class="normal">456</span>
<span class="normal">457</span>
<span class="normal">458</span>
<span class="normal">459</span>
<span class="normal">460</span>
<span class="normal">461</span>
<span class="normal">462</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generic_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic fallback for deallocation.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FieldBase): The field node.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran deallocate statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">real_array_free</span> <span class="o">=</span> <span class="s2">&quot;deallocate(</span><span class="si">{}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="n">real_array_free</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_AveragedField_avg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_AveragedField_avg</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates normalization and parallel reduction via MPI_ALLREDUCE.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.AveragedField" href="#post.AveragedField">AveragedField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The averaged variable field.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Renders global reduce and normalize statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">661</span>
<span class="normal">662</span>
<span class="normal">663</span>
<span class="normal">664</span>
<span class="normal">665</span>
<span class="normal">666</span>
<span class="normal">667</span>
<span class="normal">668</span>
<span class="normal">669</span>
<span class="normal">670</span>
<span class="normal">671</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_AveragedField_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates normalization and parallel reduction via MPI_ALLREDUCE.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (AveragedField): The averaged variable field.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders global reduce and normalize statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dWeight</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/ avg_</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">weighted</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">weighted</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_DIVIDE</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">dWeight</span><span class="o">=</span><span class="n">dWeight</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_AveragedField_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_AveragedField_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates local accumulation summation loop for spatial averaging.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.AveragedField" href="#post.AveragedField">AveragedField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The averaged variable field.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Renders local sum code block.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">645</span>
<span class="normal">646</span>
<span class="normal">647</span>
<span class="normal">648</span>
<span class="normal">649</span>
<span class="normal">650</span>
<span class="normal">651</span>
<span class="normal">652</span>
<span class="normal">653</span>
<span class="normal">654</span>
<span class="normal">655</span>
<span class="normal">656</span>
<span class="normal">657</span>
<span class="normal">658</span>
<span class="normal">659</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_AveragedField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates local accumulation summation loop for spatial averaging.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (AveragedField): The averaged variable field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders local sum code block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">tgt</span><span class="p">]</span><span class="o">.</span><span class="n">array</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">weighted</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">arrname</span> <span class="o">=</span> <span class="n">arrname</span> <span class="o">+</span> <span class="s2">&quot; * &quot;</span> <span class="o">+</span> <span class="n">field</span><span class="o">.</span><span class="n">w</span><span class="o">.</span><span class="n">array</span> <span class="o">+</span> <span class="s2">&quot;(i,j,k)&quot;</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">AVG_ARRAY_SUM</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">arrname</span><span class="o">=</span><span class="n">arrname</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_DerivedField_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_DerivedField_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates derivative calculation statements, calling Compact solver subroutines.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.DerivedField" href="#post.DerivedField">DerivedField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The derivative field.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran subroutine call string.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">631</span>
<span class="normal">632</span>
<span class="normal">633</span>
<span class="normal">634</span>
<span class="normal">635</span>
<span class="normal">636</span>
<span class="normal">637</span>
<span class="normal">638</span>
<span class="normal">639</span>
<span class="normal">640</span>
<span class="normal">641</span>
<span class="normal">642</span>
<span class="normal">643</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_DerivedField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates derivative calculation statements, calling Compact solver subroutines.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (DerivedField): The derivative field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran subroutine call string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">varray</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">v</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">v</span>
<span class="k">return</span> <span class="s2">&quot;call </span><span class="si">{0}</span><span class="s2"> ( </span><span class="si">{2}</span><span class="s2">, </span><span class="si">{1}</span><span class="s2"> )&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="n">varray</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_FieldExporter_alloc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_FieldExporter_alloc</span><span class="p">(</span><span class="n">exporter</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates initialization code for MPI-IO types and file opens.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>exporter</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldExporter" href="#post.FieldExporter">FieldExporter</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Exporter metadata.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Initialization block.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">507</span>
<span class="normal">508</span>
<span class="normal">509</span>
<span class="normal">510</span>
<span class="normal">511</span>
<span class="normal">512</span>
<span class="normal">513</span>
<span class="normal">514</span>
<span class="normal">515</span>
<span class="normal">516</span>
<span class="normal">517</span>
<span class="normal">518</span>
<span class="normal">519</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_FieldExporter_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates initialization code for MPI-IO types and file opens.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Initialization block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_INIT_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_INIT_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_FieldExporter_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_FieldExporter_code</span><span class="p">(</span><span class="n">exporter</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates Fortran code for exporting fields using parallel MPI-IO.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>exporter</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldExporter" href="#post.FieldExporter">FieldExporter</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Exporter metadata.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>MPI writing code block.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">477</span>
<span class="normal">478</span>
<span class="normal">479</span>
<span class="normal">480</span>
<span class="normal">481</span>
<span class="normal">482</span>
<span class="normal">483</span>
<span class="normal">484</span>
<span class="normal">485</span>
<span class="normal">486</span>
<span class="normal">487</span>
<span class="normal">488</span>
<span class="normal">489</span>
<span class="normal">490</span>
<span class="normal">491</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_FieldExporter_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates Fortran code for exporting fields using parallel MPI-IO.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: MPI writing code block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s2">&quot;work_array&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">exporter</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">array</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_CALC_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_CALC_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_FieldExporter_decl" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_FieldExporter_decl</span><span class="p">(</span><span class="n">exporter</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates declarations for MPI-IO handles.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>exporter</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldExporter" href="#post.FieldExporter">FieldExporter</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Exporter metadata.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Declarations block.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">493</span>
<span class="normal">494</span>
<span class="normal">495</span>
<span class="normal">496</span>
<span class="normal">497</span>
<span class="normal">498</span>
<span class="normal">499</span>
<span class="normal">500</span>
<span class="normal">501</span>
<span class="normal">502</span>
<span class="normal">503</span>
<span class="normal">504</span>
<span class="normal">505</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_FieldExporter_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates declarations for MPI-IO handles.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Declarations block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_DECL_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_DECL_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_FieldExporter_free" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_FieldExporter_free</span><span class="p">(</span><span class="n">exporter</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates finalization code for MPI-IO types and file closes.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>exporter</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FieldExporter" href="#post.FieldExporter">FieldExporter</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Exporter metadata.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>MPI-IO finalization statements.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">521</span>
<span class="normal">522</span>
<span class="normal">523</span>
<span class="normal">524</span>
<span class="normal">525</span>
<span class="normal">526</span>
<span class="normal">527</span>
<span class="normal">528</span>
<span class="normal">529</span>
<span class="normal">530</span>
<span class="normal">531</span>
<span class="normal">532</span>
<span class="normal">533</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_FieldExporter_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exporter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates finalization code for MPI-IO types and file closes.</span>
<span class="sd"> Args:</span>
<span class="sd"> exporter (FieldExporter): Exporter metadata.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: MPI-IO finalization statements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exporter</span><span class="o">.</span><span class="n">use_subarray</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_FINAL_SUBARRAY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FMT_FINAL_LEGACY</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">exporter</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_Field_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_Field_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates calculation code for normal derived fields with SymPy CSE optimization.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.Field" href="#post.Field">Field</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The calculated field.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Renders optimized 3D loop including CSE declarations.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">535</span>
<span class="normal">536</span>
<span class="normal">537</span>
<span class="normal">538</span>
<span class="normal">539</span>
<span class="normal">540</span>
<span class="normal">541</span>
<span class="normal">542</span>
<span class="normal">543</span>
<span class="normal">544</span>
<span class="normal">545</span>
<span class="normal">546</span>
<span class="normal">547</span>
<span class="normal">548</span>
<span class="normal">549</span>
<span class="normal">550</span>
<span class="normal">551</span>
<span class="normal">552</span>
<span class="normal">553</span>
<span class="normal">554</span>
<span class="normal">555</span>
<span class="normal">556</span>
<span class="normal">557</span>
<span class="normal">558</span>
<span class="normal">559</span>
<span class="normal">560</span>
<span class="normal">561</span>
<span class="normal">562</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_Field_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates calculation code for normal derived fields with SymPy CSE optimization.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (Field): The calculated field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders optimized 3D loop including CSE declarations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">opt</span> <span class="o">=</span> <span class="n">SympyOptimizer</span><span class="o">.</span><span class="n">get_instance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span>
<span class="n">rhs</span><span class="p">,</span> <span class="n">cse_decls</span><span class="p">,</span> <span class="n">cse_assigns</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">optimize_field</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">alloc</span><span class="p">)</span>
<span class="n">decls_str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cse_decls</span><span class="p">)</span> <span class="k">if</span> <span class="n">cse_decls</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">assigns_str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cse_assigns</span><span class="p">)</span> <span class="k">if</span> <span class="n">cse_assigns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">calculation_code</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">REAL_ARRAY_LOOP</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">comment</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span>
<span class="n">decls_str</span><span class="o">=</span><span class="n">decls_str</span><span class="p">,</span>
<span class="n">assigns_str</span><span class="o">=</span><span class="n">assigns_str</span><span class="p">,</span>
<span class="n">array</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">,</span>
<span class="n">rhs</span><span class="o">=</span><span class="n">rhs</span>
<span class="p">)</span>
<span class="n">export_code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">export_on</span><span class="p">()</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">calculation_code</span> <span class="o">+</span> <span class="n">export_code</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_FluctuationField_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_FluctuationField_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates calculation code for turbulence fluctuations.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.FluctuationField" href="#post.FluctuationField">FluctuationField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The fluctuation field.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Renders 3D loop for calculating u' = u - <u_w>.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">564</span>
<span class="normal">565</span>
<span class="normal">566</span>
<span class="normal">567</span>
<span class="normal">568</span>
<span class="normal">569</span>
<span class="normal">570</span>
<span class="normal">571</span>
<span class="normal">572</span>
<span class="normal">573</span>
<span class="normal">574</span>
<span class="normal">575</span>
<span class="normal">576</span>
<span class="normal">577</span>
<span class="normal">578</span>
<span class="normal">579</span>
<span class="normal">580</span>
<span class="normal">581</span>
<span class="normal">582</span>
<span class="normal">583</span>
<span class="normal">584</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_FluctuationField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates calculation code for turbulence fluctuations.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (FluctuationField): The fluctuation field.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Renders 3D loop for calculating u&#39; = u - &lt;u_w&gt;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">field</span><span class="o">.</span><span class="n">array</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">if</span> <span class="n">alloc</span> <span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">ExpToCode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">is_fluctuation</span><span class="p">():</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">w</span><span class="p">)</span>
<span class="k">return</span> <span class="n">Template</span><span class="p">(</span><span class="n">FortranTemplateStore</span><span class="o">.</span><span class="n">FLUCTUATION_ARRAY_LOOP</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span>
<span class="n">comment</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span>
<span class="n">array</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">array</span><span class="p">,</span>
<span class="n">rhs</span><span class="o">=</span><span class="n">rhs</span>
<span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_PrimaryField_alloc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_PrimaryField_alloc</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>No allocation needed for primary inputs.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.PrimaryField" href="#post.PrimaryField">PrimaryField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The primary input.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Comment statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">609</span>
<span class="normal">610</span>
<span class="normal">611</span>
<span class="normal">612</span>
<span class="normal">613</span>
<span class="normal">614</span>
<span class="normal">615</span>
<span class="normal">616</span>
<span class="normal">617</span>
<span class="normal">618</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_PrimaryField_alloc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No allocation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_PrimaryField_code" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_PrimaryField_code</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>No code generation needed for primary inputs.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.PrimaryField" href="#post.PrimaryField">PrimaryField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The primary input.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation map. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Comment statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">586</span>
<span class="normal">587</span>
<span class="normal">588</span>
<span class="normal">589</span>
<span class="normal">590</span>
<span class="normal">591</span>
<span class="normal">592</span>
<span class="normal">593</span>
<span class="normal">594</span>
<span class="normal">595</span>
<span class="normal">596</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_PrimaryField_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No code generation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation map. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_PrimaryField_decl" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_PrimaryField_decl</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>No declaration needed for primary inputs.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.PrimaryField" href="#post.PrimaryField">PrimaryField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The primary input.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Comment statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">598</span>
<span class="normal">599</span>
<span class="normal">600</span>
<span class="normal">601</span>
<span class="normal">602</span>
<span class="normal">603</span>
<span class="normal">604</span>
<span class="normal">605</span>
<span class="normal">606</span>
<span class="normal">607</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_PrimaryField_decl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No declaration needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranCodeGenerator.visit_PrimaryField_free" class="doc doc-heading">
<code class="highlight language-python"><span class="n">visit_PrimaryField_free</span><span class="p">(</span><span class="n">field</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>No deallocation needed for primary inputs.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>field</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.PrimaryField" href="#post.PrimaryField">PrimaryField</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The primary input.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Comment statement.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">620</span>
<span class="normal">621</span>
<span class="normal">622</span>
<span class="normal">623</span>
<span class="normal">624</span>
<span class="normal">625</span>
<span class="normal">626</span>
<span class="normal">627</span>
<span class="normal">628</span>
<span class="normal">629</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">visit_PrimaryField_free</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;No deallocation needed for primary inputs.</span>
<span class="sd"> Args:</span>
<span class="sd"> field (PrimaryField): The primary input.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Comment statement.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;! </span><span class="si">{}</span><span class="s2"> is read from file&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FortranProgramWriter" class="doc doc-heading">
<code>FortranProgramWriter</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Renders the final, compiled Fortran 95 post-processing modules.</p>
<p>Uses Jinja2 templates to combine calculations, averages, declarations,
reductions, subarray parallel IO writers, and pooled dynamic array buffers.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2614</span>
<span class="normal">2615</span>
<span class="normal">2616</span>
<span class="normal">2617</span>
<span class="normal">2618</span>
<span class="normal">2619</span>
<span class="normal">2620</span>
<span class="normal">2621</span>
<span class="normal">2622</span>
<span class="normal">2623</span>
<span class="normal">2624</span>
<span class="normal">2625</span>
<span class="normal">2626</span>
<span class="normal">2627</span>
<span class="normal">2628</span>
<span class="normal">2629</span>
<span class="normal">2630</span>
<span class="normal">2631</span>
<span class="normal">2632</span>
<span class="normal">2633</span>
<span class="normal">2634</span>
<span class="normal">2635</span>
<span class="normal">2636</span>
<span class="normal">2637</span>
<span class="normal">2638</span>
<span class="normal">2639</span>
<span class="normal">2640</span>
<span class="normal">2641</span>
<span class="normal">2642</span>
<span class="normal">2643</span>
<span class="normal">2644</span>
<span class="normal">2645</span>
<span class="normal">2646</span>
<span class="normal">2647</span>
<span class="normal">2648</span>
<span class="normal">2649</span>
<span class="normal">2650</span>
<span class="normal">2651</span>
<span class="normal">2652</span>
<span class="normal">2653</span>
<span class="normal">2654</span>
<span class="normal">2655</span>
<span class="normal">2656</span>
<span class="normal">2657</span>
<span class="normal">2658</span>
<span class="normal">2659</span>
<span class="normal">2660</span>
<span class="normal">2661</span>
<span class="normal">2662</span>
<span class="normal">2663</span>
<span class="normal">2664</span>
<span class="normal">2665</span>
<span class="normal">2666</span>
<span class="normal">2667</span>
<span class="normal">2668</span>
<span class="normal">2669</span>
<span class="normal">2670</span>
<span class="normal">2671</span>
<span class="normal">2672</span>
<span class="normal">2673</span>
<span class="normal">2674</span>
<span class="normal">2675</span>
<span class="normal">2676</span>
<span class="normal">2677</span>
<span class="normal">2678</span>
<span class="normal">2679</span>
<span class="normal">2680</span>
<span class="normal">2681</span>
<span class="normal">2682</span>
<span class="normal">2683</span>
<span class="normal">2684</span>
<span class="normal">2685</span>
<span class="normal">2686</span>
<span class="normal">2687</span>
<span class="normal">2688</span>
<span class="normal">2689</span>
<span class="normal">2690</span>
<span class="normal">2691</span>
<span class="normal">2692</span>
<span class="normal">2693</span>
<span class="normal">2694</span>
<span class="normal">2695</span>
<span class="normal">2696</span>
<span class="normal">2697</span>
<span class="normal">2698</span>
<span class="normal">2699</span>
<span class="normal">2700</span>
<span class="normal">2701</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FortranProgramWriter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Renders the final, compiled Fortran 95 post-processing modules.</span>
<span class="sd"> Uses Jinja2 templates to combine calculations, averages, declarations,</span>
<span class="sd"> reductions, subarray parallel IO writers, and pooled dynamic array buffers.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates the code module and prints it directly to standard output.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context containing sorted equations and pooling allocations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">resources.m_template</span> <span class="kn">import</span> <span class="n">mod_form</span>
<span class="n">allvar</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">allvar</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span>
<span class="n">generator</span> <span class="o">=</span> <span class="n">FortranCodeGenerator</span><span class="p">(</span><span class="n">allvar</span><span class="p">)</span>
<span class="c1"># 평균 변수들을 순서대로 분배</span>
<span class="n">set1</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">())])</span>
<span class="n">set2</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">())])</span>
<span class="c1"># 외부 디스크 파일 익스포트 활성화 여부 확인</span>
<span class="n">set_export_on</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">export_on</span><span class="p">(),</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="n">ffmt</span> <span class="o">=</span> <span class="s1">&#39;logical, parameter :: pass2_required=</span><span class="si">{}</span><span class="s1">&#39;</span>
<span class="n">declf</span> <span class="o">=</span> <span class="n">ffmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">&#39;.true.&#39;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">set2</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="s1">&#39;.false.&#39;</span><span class="p">)</span>
<span class="n">hfmt</span> <span class="o">=</span> <span class="s1">&#39;character (len = *), parameter :: output_header=&quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span>
<span class="n">declh</span> <span class="o">=</span> <span class="n">hfmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="n">set1</span> <span class="o">+</span> <span class="n">set2</span><span class="p">))</span>
<span class="c1"># 공용 Pooling 3D 버퍼 배열의 선언/할당 코드 생성</span>
<span class="n">declarr</span><span class="p">,</span> <span class="n">allocarr</span><span class="p">,</span> <span class="n">freearr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_array_codes</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">narr</span><span class="p">)</span>
<span class="c1"># 1차원 평균 물리량 배열들의 선언/할당 코드 생성</span>
<span class="n">declavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_decl</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="n">allocavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_alloc</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="n">freeavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_free</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="c1"># 병렬 파일 쓰기(MPI Subarray)를 위한 MPI 리소스 선언/할당 코드 생성</span>
<span class="n">decl_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_decl</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="n">alloc_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_alloc</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="n">free_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_free</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="c1"># Pass 1과 Pass 2 루프 내부 본문 연산 코드들을 생성 (각자 버퍼 맵 alloc1, alloc2 적용)</span>
<span class="n">sub_calc1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="ow">or</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span><span class="p">)</span>
<span class="n">sub_calc2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="ow">or</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span><span class="p">)</span>
<span class="c1"># 평균 누적 연산 코드 생성</span>
<span class="n">sub_avg1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_avg</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set1</span><span class="p">)</span>
<span class="n">sub_avg2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_avg</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set2</span><span class="p">)</span>
<span class="c1"># 파일 쓰기 루틴 코드 생성</span>
<span class="n">sub_write_avg</span> <span class="o">=</span> <span class="n">generator</span><span class="o">.</span><span class="n">generate_write_avg</span><span class="p">(</span><span class="n">set1</span><span class="o">+</span><span class="n">set2</span><span class="p">)</span>
<span class="n">md</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;terms&quot;</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_data&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">declf</span><span class="p">,</span> <span class="n">declh</span><span class="p">,</span> <span class="n">declavg</span><span class="p">,</span> <span class="n">FieldExporter</span><span class="o">.</span><span class="n">mpi_io_decl</span><span class="p">,</span> <span class="n">decl_export</span><span class="p">,</span> <span class="n">declarr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_init&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">allocavg</span><span class="p">,</span> <span class="n">alloc_export</span><span class="p">,</span> <span class="n">allocarr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_finalize&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">freeavg</span><span class="p">,</span> <span class="n">free_export</span><span class="p">,</span> <span class="n">freearr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass1&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_calc1</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass1_avg&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_avg1</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass2&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_calc2</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass2_avg&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_avg2</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_write_result&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_write_avg</span>
<span class="nb">print</span><span class="p">(</span><span class="n">Template</span><span class="p">(</span><span class="n">mod_form</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">md</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">work_array_codes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">narr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates dynamic memory helper statements for shared xyzbuffer buffers.</span>
<span class="sd"> Args:</span>
<span class="sd"> narr (int): Number of buffers needed.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (declarations_string, allocations_string, deallocations_string).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">array_name</span> <span class="o">=</span> <span class="s2">&quot;xyzbuffer</span><span class="si">{}</span><span class="s2">&quot;</span>
<span class="n">array_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">array_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">narr</span><span class="p">)]</span>
<span class="n">real_array_decl</span> <span class="o">=</span> <span class="s2">&quot;real(real64), allocatable, dimension(:,:,:) :: </span><span class="si">{0}</span><span class="s2">&quot;</span>
<span class="n">decl</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">real_array_decl</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="n">alloc</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">make_allocate</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s2">&quot;nxp,nyp,nzp&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="n">free</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;deallocate(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="k">return</span> <span class="n">decl</span><span class="p">,</span> <span class="n">alloc</span><span class="p">,</span> <span class="n">free</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FortranProgramWriter.work_array_codes" class="doc doc-heading">
<code class="highlight language-python"><span class="n">work_array_codes</span><span class="p">(</span><span class="n">narr</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates dynamic memory helper statements for shared xyzbuffer buffers.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>narr</code></td>
<td>
<code>int</code>
</td>
<td>
<div class="doc-md-description">
<p>Number of buffers needed.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(declarations_string, allocations_string, deallocations_string).</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2684</span>
<span class="normal">2685</span>
<span class="normal">2686</span>
<span class="normal">2687</span>
<span class="normal">2688</span>
<span class="normal">2689</span>
<span class="normal">2690</span>
<span class="normal">2691</span>
<span class="normal">2692</span>
<span class="normal">2693</span>
<span class="normal">2694</span>
<span class="normal">2695</span>
<span class="normal">2696</span>
<span class="normal">2697</span>
<span class="normal">2698</span>
<span class="normal">2699</span>
<span class="normal">2700</span>
<span class="normal">2701</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">work_array_codes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">narr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates dynamic memory helper statements for shared xyzbuffer buffers.</span>
<span class="sd"> Args:</span>
<span class="sd"> narr (int): Number of buffers needed.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (declarations_string, allocations_string, deallocations_string).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">array_name</span> <span class="o">=</span> <span class="s2">&quot;xyzbuffer</span><span class="si">{}</span><span class="s2">&quot;</span>
<span class="n">array_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">array_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">narr</span><span class="p">)]</span>
<span class="n">real_array_decl</span> <span class="o">=</span> <span class="s2">&quot;real(real64), allocatable, dimension(:,:,:) :: </span><span class="si">{0}</span><span class="s2">&quot;</span>
<span class="n">decl</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">real_array_decl</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="n">alloc</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">make_allocate</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s2">&quot;nxp,nyp,nzp&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="n">free</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;deallocate(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">array_names</span><span class="p">])</span>
<span class="k">return</span> <span class="n">decl</span><span class="p">,</span> <span class="n">alloc</span><span class="p">,</span> <span class="n">free</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FortranProgramWriter.write" class="doc doc-heading">
<code class="highlight language-python"><span class="n">write</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Generates the code module and prints it directly to standard output.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The compiled context containing sorted equations and pooling allocations.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2621</span>
<span class="normal">2622</span>
<span class="normal">2623</span>
<span class="normal">2624</span>
<span class="normal">2625</span>
<span class="normal">2626</span>
<span class="normal">2627</span>
<span class="normal">2628</span>
<span class="normal">2629</span>
<span class="normal">2630</span>
<span class="normal">2631</span>
<span class="normal">2632</span>
<span class="normal">2633</span>
<span class="normal">2634</span>
<span class="normal">2635</span>
<span class="normal">2636</span>
<span class="normal">2637</span>
<span class="normal">2638</span>
<span class="normal">2639</span>
<span class="normal">2640</span>
<span class="normal">2641</span>
<span class="normal">2642</span>
<span class="normal">2643</span>
<span class="normal">2644</span>
<span class="normal">2645</span>
<span class="normal">2646</span>
<span class="normal">2647</span>
<span class="normal">2648</span>
<span class="normal">2649</span>
<span class="normal">2650</span>
<span class="normal">2651</span>
<span class="normal">2652</span>
<span class="normal">2653</span>
<span class="normal">2654</span>
<span class="normal">2655</span>
<span class="normal">2656</span>
<span class="normal">2657</span>
<span class="normal">2658</span>
<span class="normal">2659</span>
<span class="normal">2660</span>
<span class="normal">2661</span>
<span class="normal">2662</span>
<span class="normal">2663</span>
<span class="normal">2664</span>
<span class="normal">2665</span>
<span class="normal">2666</span>
<span class="normal">2667</span>
<span class="normal">2668</span>
<span class="normal">2669</span>
<span class="normal">2670</span>
<span class="normal">2671</span>
<span class="normal">2672</span>
<span class="normal">2673</span>
<span class="normal">2674</span>
<span class="normal">2675</span>
<span class="normal">2676</span>
<span class="normal">2677</span>
<span class="normal">2678</span>
<span class="normal">2679</span>
<span class="normal">2680</span>
<span class="normal">2681</span>
<span class="normal">2682</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generates the code module and prints it directly to standard output.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context containing sorted equations and pooling allocations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">resources.m_template</span> <span class="kn">import</span> <span class="n">mod_form</span>
<span class="n">allvar</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">allvar</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span>
<span class="n">generator</span> <span class="o">=</span> <span class="n">FortranCodeGenerator</span><span class="p">(</span><span class="n">allvar</span><span class="p">)</span>
<span class="c1"># 평균 변수들을 순서대로 분배</span>
<span class="n">set1</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">())])</span>
<span class="n">set2</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span><span class="n">AveragedField</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">())])</span>
<span class="c1"># 외부 디스크 파일 익스포트 활성화 여부 확인</span>
<span class="n">set_export_on</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">export_on</span><span class="p">(),</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
<span class="n">ffmt</span> <span class="o">=</span> <span class="s1">&#39;logical, parameter :: pass2_required=</span><span class="si">{}</span><span class="s1">&#39;</span>
<span class="n">declf</span> <span class="o">=</span> <span class="n">ffmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s1">&#39;.true.&#39;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">set2</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="s1">&#39;.false.&#39;</span><span class="p">)</span>
<span class="n">hfmt</span> <span class="o">=</span> <span class="s1">&#39;character (len = *), parameter :: output_header=&quot;</span><span class="si">{}</span><span class="s1">&quot;&#39;</span>
<span class="n">declh</span> <span class="o">=</span> <span class="n">hfmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;x&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="n">set1</span> <span class="o">+</span> <span class="n">set2</span><span class="p">))</span>
<span class="c1"># 공용 Pooling 3D 버퍼 배열의 선언/할당 코드 생성</span>
<span class="n">declarr</span><span class="p">,</span> <span class="n">allocarr</span><span class="p">,</span> <span class="n">freearr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_array_codes</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">narr</span><span class="p">)</span>
<span class="c1"># 1차원 평균 물리량 배열들의 선언/할당 코드 생성</span>
<span class="n">declavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_decl</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="n">allocavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_alloc</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="n">freeavg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_free</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">))</span>
<span class="c1"># 병렬 파일 쓰기(MPI Subarray)를 위한 MPI 리소스 선언/할당 코드 생성</span>
<span class="n">decl_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_decl</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="n">alloc_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_alloc</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="n">free_export</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_free</span><span class="p">(</span><span class="n">v</span><span class="o">.</span><span class="n">exporter</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set_export_on</span><span class="p">)</span>
<span class="c1"># Pass 1과 Pass 2 루프 내부 본문 연산 코드들을 생성 (각자 버퍼 맵 alloc1, alloc2 적용)</span>
<span class="n">sub_calc1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="ow">or</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span><span class="p">)</span>
<span class="n">sub_calc2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_code</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span> <span class="ow">or</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span><span class="p">)</span>
<span class="c1"># 평균 누적 연산 코드 생성</span>
<span class="n">sub_avg1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_avg</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set1</span><span class="p">)</span>
<span class="n">sub_avg2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">generator</span><span class="o">.</span><span class="n">generate_avg</span><span class="p">(</span><span class="n">allvar</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">set2</span><span class="p">)</span>
<span class="c1"># 파일 쓰기 루틴 코드 생성</span>
<span class="n">sub_write_avg</span> <span class="o">=</span> <span class="n">generator</span><span class="o">.</span><span class="n">generate_write_avg</span><span class="p">(</span><span class="n">set1</span><span class="o">+</span><span class="n">set2</span><span class="p">)</span>
<span class="n">md</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;terms&quot;</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_data&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">declf</span><span class="p">,</span> <span class="n">declh</span><span class="p">,</span> <span class="n">declavg</span><span class="p">,</span> <span class="n">FieldExporter</span><span class="o">.</span><span class="n">mpi_io_decl</span><span class="p">,</span> <span class="n">decl_export</span><span class="p">,</span> <span class="n">declarr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_init&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">allocavg</span><span class="p">,</span> <span class="n">alloc_export</span><span class="p">,</span> <span class="n">allocarr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_finalize&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">((</span><span class="n">freeavg</span><span class="p">,</span> <span class="n">free_export</span><span class="p">,</span> <span class="n">freearr</span><span class="p">))</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass1&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_calc1</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass1_avg&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_avg1</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass2&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_calc2</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_pass2_avg&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_avg2</span>
<span class="n">md</span><span class="p">[</span><span class="s2">&quot;module_write_result&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sub_write_avg</span>
<span class="nb">print</span><span class="p">(</span><span class="n">Template</span><span class="p">(</span><span class="n">mod_form</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="o">**</span><span class="n">md</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FortranTemplateStore" class="doc doc-heading">
<code>FortranTemplateStore</code>
</h3>
<div class="doc doc-contents ">
<p>Static store containing Jinja2 code templates for generating Fortran source blocks.</p>
<p><span class="doc-section-title">Attributes:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.REAL_ARRAY_LOOP">REAL_ARRAY_LOOP</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Standard 3D loop for calculating derived variables, integrating SymPy CSE blocks.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FLUCTUATION_ARRAY_LOOP">FLUCTUATION_ARRAY_LOOP</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Loop for calculating fluctuation fields (with averages subtracted).</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.AVG_ARRAY_SUM">AVG_ARRAY_SUM</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Accumulator loop to sum grid values for spatial averaging.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.AVG_ARRAY_DIVIDE">AVG_ARRAY_DIVIDE</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Global MPI MPI_ALLREDUCE and divide step to finalize statistics.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_DECL_SUBARRAY">FMT_DECL_SUBARRAY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>MPI subarray-based I/O file handle and type variable declarations.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_INIT_SUBARRAY">FMT_INIT_SUBARRAY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Initialization block for creating MPI file handles and commit subarray types.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_FINAL_SUBARRAY">FMT_FINAL_SUBARRAY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Cleanup code block to close and release MPI types and file handles.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_CALC_SUBARRAY">FMT_CALC_SUBARRAY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Actual high-performance parallel MPI file writing using subarray layout.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_DECL_LEGACY">FMT_DECL_LEGACY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Declarations for legacy, process-local buffer-based MPI exports.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_INIT_LEGACY">FMT_INIT_LEGACY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Allocation and initialization for legacy buffer arrays.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_FINAL_LEGACY">FMT_FINAL_LEGACY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Finalization and deallocation for legacy buffer arrays.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.FMT_CALC_LEGACY">FMT_CALC_LEGACY</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Data slicing and local buffer writing for legacy export routines.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td><code><span title="post.FortranTemplateStore.AVG_ARRAY_WRITE">AVG_ARRAY_WRITE</span></code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Serial file writing structure for exporting 1D averaged data and derivatives.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">159</span>
<span class="normal">160</span>
<span class="normal">161</span>
<span class="normal">162</span>
<span class="normal">163</span>
<span class="normal">164</span>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span>
<span class="normal">169</span>
<span class="normal">170</span>
<span class="normal">171</span>
<span class="normal">172</span>
<span class="normal">173</span>
<span class="normal">174</span>
<span class="normal">175</span>
<span class="normal">176</span>
<span class="normal">177</span>
<span class="normal">178</span>
<span class="normal">179</span>
<span class="normal">180</span>
<span class="normal">181</span>
<span class="normal">182</span>
<span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span>
<span class="normal">186</span>
<span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
<span class="normal">193</span>
<span class="normal">194</span>
<span class="normal">195</span>
<span class="normal">196</span>
<span class="normal">197</span>
<span class="normal">198</span>
<span class="normal">199</span>
<span class="normal">200</span>
<span class="normal">201</span>
<span class="normal">202</span>
<span class="normal">203</span>
<span class="normal">204</span>
<span class="normal">205</span>
<span class="normal">206</span>
<span class="normal">207</span>
<span class="normal">208</span>
<span class="normal">209</span>
<span class="normal">210</span>
<span class="normal">211</span>
<span class="normal">212</span>
<span class="normal">213</span>
<span class="normal">214</span>
<span class="normal">215</span>
<span class="normal">216</span>
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span>
<span class="normal">233</span>
<span class="normal">234</span>
<span class="normal">235</span>
<span class="normal">236</span>
<span class="normal">237</span>
<span class="normal">238</span>
<span class="normal">239</span>
<span class="normal">240</span>
<span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span>
<span class="normal">310</span>
<span class="normal">311</span>
<span class="normal">312</span>
<span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span>
<span class="normal">320</span>
<span class="normal">321</span>
<span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
<span class="normal">326</span>
<span class="normal">327</span>
<span class="normal">328</span>
<span class="normal">329</span>
<span class="normal">330</span>
<span class="normal">331</span>
<span class="normal">332</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FortranTemplateStore</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Static store containing Jinja2 code templates for generating Fortran source blocks.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> REAL_ARRAY_LOOP (str): Standard 3D loop for calculating derived variables, integrating SymPy CSE blocks.</span>
<span class="sd"> FLUCTUATION_ARRAY_LOOP (str): Loop for calculating fluctuation fields (with averages subtracted).</span>
<span class="sd"> AVG_ARRAY_SUM (str): Accumulator loop to sum grid values for spatial averaging.</span>
<span class="sd"> AVG_ARRAY_DIVIDE (str): Global MPI MPI_ALLREDUCE and divide step to finalize statistics.</span>
<span class="sd"> FMT_DECL_SUBARRAY (str): MPI subarray-based I/O file handle and type variable declarations.</span>
<span class="sd"> FMT_INIT_SUBARRAY (str): Initialization block for creating MPI file handles and commit subarray types.</span>
<span class="sd"> FMT_FINAL_SUBARRAY (str): Cleanup code block to close and release MPI types and file handles.</span>
<span class="sd"> FMT_CALC_SUBARRAY (str): Actual high-performance parallel MPI file writing using subarray layout.</span>
<span class="sd"> FMT_DECL_LEGACY (str): Declarations for legacy, process-local buffer-based MPI exports.</span>
<span class="sd"> FMT_INIT_LEGACY (str): Allocation and initialization for legacy buffer arrays.</span>
<span class="sd"> FMT_FINAL_LEGACY (str): Finalization and deallocation for legacy buffer arrays.</span>
<span class="sd"> FMT_CALC_LEGACY (str): Data slicing and local buffer writing for legacy export routines.</span>
<span class="sd"> AVG_ARRAY_WRITE (str): Serial file writing structure for exporting 1D averaged data and derivatives.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">REAL_ARRAY_LOOP</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! {{ comment }}</span>
<span class="s2">{</span><span class="si">% i</span><span class="s2">f decls_str -%}</span>
<span class="s2">block</span>
<span class="s2">{{ decls_str | indent(4, True) }}</span>
<span class="s2">{</span><span class="si">%- e</span><span class="s2">ndif %}</span>
<span class="s2">do k = 1, nzp</span>
<span class="s2">do j = 1, nyp</span>
<span class="s2">do i = 1, nxp</span>
<span class="s2">{</span><span class="si">% i</span><span class="s2">f assigns_str -%}</span>
<span class="s2">{{ assigns_str | indent(4, True) }}</span>
<span class="s2"> {{ array }}(i,j,k) = {{ rhs }}</span>
<span class="s2">{</span><span class="si">%- e</span><span class="s2">lse -%}</span>
<span class="s2"> {{ array }}(i,j,k) = {{ rhs }}</span>
<span class="s2">{</span><span class="si">%- e</span><span class="s2">ndif %}</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">{</span><span class="si">% i</span><span class="s2">f decls_str -%}</span>
<span class="s2">end block</span>
<span class="s2">{</span><span class="si">%- e</span><span class="s2">ndif %}</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FLUCTUATION_ARRAY_LOOP</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! {{ comment }}</span>
<span class="s2">do k = 1, nzp</span>
<span class="s2">do j = 1, nyp</span>
<span class="s2">do i = 1, nxp</span>
<span class="s2">{{ array }}(i,j,k) = {{ rhs }}</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">AVG_ARRAY_SUM</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">do k = 1, nzp</span>
<span class="s2">do j = 1, nyp</span>
<span class="s2">do i = 1, nxp</span>
<span class="s2">{{ name }}(i) = {{ name }}(i) + {{ arrname }}</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">AVG_ARRAY_DIVIDE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">call MPI_ALLREDUCE(MPI_IN_PLACE, {{ name }}, nxp, MPI_REAL8, MPI_SUM, MPI_COMM_TASK, mpi_err)</span>
<span class="s2">{{ name }} = {{ name }} {{ dWeight }} / denum</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_DECL_SUBARRAY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! - file_handles and mpi_infos</span>
<span class="s2">integer(kind=MPI_INTEGER_KIND) :: {{ field_name }}_fh</span>
<span class="s2">integer(kind=MPI_INTEGER_KIND) :: {{ field_name }}_info</span>
<span class="s2">integer(kind=MPI_INTEGER_KIND) :: {{ field_name }}_filetype</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_INIT_SUBARRAY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! init subarray datatype for {{ field_name }}</span>
<span class="s2">block</span>
<span class="s2"> integer(4) :: sizes(3), subsizes(3), starts(3)</span>
<span class="s2"> call MPI_INFO_CREATE({{ field_name }}_info, mpi_err)</span>
<span class="s2"> call MPI_FILE_OPEN(MPI_COMM_TASK,&#39;export-{{ field_name }}.dat&#39;,MPI_MODE_WRONLY+MPI_MODE_CREATE,{{ field_name }}_info,{{ field_name }}_fh,mpi_err)</span>
<span class="s2"> sizes = (/ nxp, nyp, nzp /)</span>
<span class="s2"> subsizes = (/ {{ len_xpts }}, {{ ye }} - {{ ys }} + 1, {{ ze }} - {{ zs }} + 1 /)</span>
<span class="s2"> starts = (/ {{ xs }} - 1, {{ ys }} - 1, {{ zs }} - 1 /)</span>
<span class="s2"> call MPI_TYPE_CREATE_SUBARRAY(3, sizes, subsizes, starts, MPI_ORDER_FORTRAN, MPI_REAL8, {{ field_name }}_filetype, mpi_err)</span>
<span class="s2"> call MPI_TYPE_COMMIT({{ field_name }}_filetype, mpi_err)</span>
<span class="s2">end block</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_FINAL_SUBARRAY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! finalize</span>
<span class="s2">call MPI_FILE_CLOSE({{ field_name }}_fh, mpi_err)</span>
<span class="s2">call MPI_INFO_FREE({{ field_name }}_info, mpi_err)</span>
<span class="s2">call MPI_TYPE_FREE({{ field_name }}_filetype, mpi_err)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_CALC_SUBARRAY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! write to file via MPI Subarray</span>
<span class="s2">count = ({{ len_xpts }}) * ({{ ye }} - {{ ys }} + 1) * ({{ ze }} - {{ zs }} + 1)</span>
<span class="s2">offset = export_offset(fidx) * count * 8</span>
<span class="s2">call MPI_FILE_WRITE_AT({{ field_name }}_fh, offset, {{ work_array }}, 1, {{ field_name }}_filetype, mpi_status, mpi_err)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_DECL_LEGACY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! - file_handles and mpi_infos</span>
<span class="s2">integer(kind=MPI_INTEGER_KIND) :: {{ field_name }}_fh</span>
<span class="s2">integer(kind=MPI_INTEGER_KIND) :: {{ field_name }}_info</span>
<span class="s2">! - buffer</span>
<span class="s2">real(real64), allocatable, dimension(:,:,:) :: {{ field_name }}_export_array</span>
<span class="s2">integer, allocatable, dimension(:) :: {{ field_name }}_xpts</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_INIT_LEGACY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! init</span>
<span class="s2">call MPI_INFO_CREATE({{ field_name }}_info, mpi_err)</span>
<span class="s2">call MPI_FILE_OPEN(MPI_COMM_TASK,&#39;export-{{ field_name }}.dat&#39;,MPI_MODE_WRONLY+MPI_MODE_CREATE,{{ field_name }}_info,{{ field_name }}_fh,mpi_err)</span>
<span class="s2">allocate({{ field_name }}_export_array(1:{{ len_xpts }},{{ ys }}:{{ ye }},{{ zs }}:{{ ze }}), stat=ierr)</span>
<span class="s2">if (ierr /= 0) then</span>
<span class="s2"> write(0,*) &#39;Error: allocation of {{ field_name }}_export_array failed on process&#39;, myid</span>
<span class="s2"> call MPI_ABORT(MPI_COMM_TASK, 1, mpi_err)</span>
<span class="s2">end if</span>
<span class="s2">{{ field_name }}_export_array = 0.</span>
<span class="s2">allocate({{ field_name }}_xpts(1:{{ len_xpts }}), stat=ierr)</span>
<span class="s2">if (ierr /= 0) then</span>
<span class="s2"> write(0,*) &#39;Error: allocation of {{ field_name }}_xpts failed on process&#39;, myid</span>
<span class="s2"> call MPI_ABORT(MPI_COMM_TASK, 1, mpi_err)</span>
<span class="s2">end if</span>
<span class="s2">{{ xpts_init }}</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_FINAL_LEGACY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! finalize</span>
<span class="s2">call MPI_FILE_CLOSE({{ field_name }}_fh, mpi_err)</span>
<span class="s2">call MPI_INFO_FREE({{ field_name }}_info, mpi_err)</span>
<span class="s2">deallocate({{ field_name }}_export_array)</span>
<span class="s2">deallocate({{ field_name }}_xpts)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">FMT_CALC_LEGACY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">! copy to array for export</span>
<span class="s2">do k = {{ zs }}, {{ ze }}</span>
<span class="s2">do j = {{ ys }}, {{ ye }}</span>
<span class="s2">do i = 1, {{ len_xpts }}</span>
<span class="s2">{{ field_name }}_export_array(i,j,k) = {{ work_array }}({{ field_name }}_xpts(i),j,k)</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">end do</span>
<span class="s2">! write to file</span>
<span class="s2">count = ({{ len_xpts }}) * ({{ ye }} - {{ ys }} + 1) * ({{ ze }} - {{ zs }} + 1)</span>
<span class="s2">offset = export_offset(fidx) * count * 8</span>
<span class="s2">call MPI_FILE_WRITE_AT({{ field_name }}_fh, offset, {{ field_name }}_export_array, count, MPI_REAL8, mpi_status, mpi_err)</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">AVG_ARRAY_WRITE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">real(real64), dimension(nxp) :: xbuffer</span>
<span class="s2">integer :: i</span>
<span class="s2">open (200, file=&quot;qEdge_X.dat&quot;)</span>
<span class="s2">write (200,*) output_header</span>
<span class="s2">do i=1,nxp</span>
<span class="s2"> write (200,&#39;({{ num_args }}e20.10)&#39;) real(i)*hxp, {{ formatted_avglist }}</span>
<span class="s2">end do</span>
<span class="s2">close (200)</span>
<span class="s2">open (200, file=&quot;d1.dat&quot;)</span>
<span class="s2">{{ deriv1_lines }}</span>
<span class="s2">close (200)</span>
<span class="s2">open (200, file=&quot;d2.dat&quot;)</span>
<span class="s2">{{ deriv2_lines }}</span>
<span class="s2">close (200)</span>
<span class="s2">&quot;&quot;&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.FunctionRegistry" class="doc doc-heading">
<code>FunctionRegistry</code>
</h3>
<div class="doc doc-contents ">
<p>Registry to map mathematical DSL functions to SymPy constructors and LaTeX representations.</p>
<p>This class enables SOLID Open-Closed Principle (OCP) compliance by decoupling core parsing
logic from mathematical functions, allowing new functions to be added without modifying the parser.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span>
<span class="normal">52</span>
<span class="normal">53</span>
<span class="normal">54</span>
<span class="normal">55</span>
<span class="normal">56</span>
<span class="normal">57</span>
<span class="normal">58</span>
<span class="normal">59</span>
<span class="normal">60</span>
<span class="normal">61</span>
<span class="normal">62</span>
<span class="normal">63</span>
<span class="normal">64</span>
<span class="normal">65</span>
<span class="normal">66</span>
<span class="normal">67</span>
<span class="normal">68</span>
<span class="normal">69</span>
<span class="normal">70</span>
<span class="normal">71</span>
<span class="normal">72</span>
<span class="normal">73</span>
<span class="normal">74</span>
<span class="normal">75</span>
<span class="normal">76</span>
<span class="normal">77</span>
<span class="normal">78</span>
<span class="normal">79</span>
<span class="normal">80</span>
<span class="normal">81</span>
<span class="normal">82</span>
<span class="normal">83</span>
<span class="normal">84</span>
<span class="normal">85</span>
<span class="normal">86</span>
<span class="normal">87</span>
<span class="normal">88</span>
<span class="normal">89</span>
<span class="normal">90</span>
<span class="normal">91</span>
<span class="normal">92</span>
<span class="normal">93</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">FunctionRegistry</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registry to map mathematical DSL functions to SymPy constructors and LaTeX representations.</span>
<span class="sd"> This class enables SOLID Open-Closed Principle (OCP) compliance by decoupling core parsing</span>
<span class="sd"> logic from mathematical functions, allowing new functions to be added without modifying the parser.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FunctionRegistry with empty SymPy and LaTeX mappings.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">register_sympy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sympy_builder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a handler to convert a DSL function to a SymPy representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the DSL function.</span>
<span class="sd"> sympy_builder (callable): A callable mapping function arguments to a SymPy object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">sympy_builder</span>
<span class="k">def</span> <span class="nf">register_latex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">latex_builder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a handler to convert a DSL function to a LaTeX math representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the DSL function.</span>
<span class="sd"> latex_builder (callable): A callable mapping arguments to a LaTeX string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">latex_builder</span>
<span class="k">def</span> <span class="nf">to_sympy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts a function call to its corresponding SymPy expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the function.</span>
<span class="sd"> *args: Arguments to pass to the sympy builder.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy node representation of the function call.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">[</span><span class="n">name</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">to_latex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts a function call to its corresponding LaTeX representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the function.</span>
<span class="sd"> *args (str): Already-formatted LaTeX strings of the arguments.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The LaTeX math representation of the function call.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">[</span><span class="n">name</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2">{{(</span><span class="si">{}</span><span class="s2">)}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.FunctionRegistry.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes FunctionRegistry with empty SymPy and LaTeX mappings.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes FunctionRegistry with empty SymPy and LaTeX mappings.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span> <span class="o">=</span> <span class="p">{}</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FunctionRegistry.register_latex" class="doc doc-heading">
<code class="highlight language-python"><span class="n">register_latex</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">latex_builder</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Registers a handler to convert a DSL function to a LaTeX math representation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the DSL function.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>latex_builder</code></td>
<td>
<code>callable</code>
</td>
<td>
<div class="doc-md-description">
<p>A callable mapping arguments to a LaTeX string.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">55</span>
<span class="normal">56</span>
<span class="normal">57</span>
<span class="normal">58</span>
<span class="normal">59</span>
<span class="normal">60</span>
<span class="normal">61</span>
<span class="normal">62</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">register_latex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">latex_builder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a handler to convert a DSL function to a LaTeX math representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the DSL function.</span>
<span class="sd"> latex_builder (callable): A callable mapping arguments to a LaTeX string.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">latex_builder</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FunctionRegistry.register_sympy" class="doc doc-heading">
<code class="highlight language-python"><span class="n">register_sympy</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">sympy_builder</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Registers a handler to convert a DSL function to a SymPy representation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the DSL function.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>sympy_builder</code></td>
<td>
<code>callable</code>
</td>
<td>
<div class="doc-md-description">
<p>A callable mapping function arguments to a SymPy object.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span>
<span class="normal">52</span>
<span class="normal">53</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">register_sympy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sympy_builder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Registers a handler to convert a DSL function to a SymPy representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the DSL function.</span>
<span class="sd"> sympy_builder (callable): A callable mapping function arguments to a SymPy object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">sympy_builder</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FunctionRegistry.to_latex" class="doc doc-heading">
<code class="highlight language-python"><span class="n">to_latex</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts a function call to its corresponding LaTeX representation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the function.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>*args</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Already-formatted LaTeX strings of the arguments.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>The LaTeX math representation of the function call.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">78</span>
<span class="normal">79</span>
<span class="normal">80</span>
<span class="normal">81</span>
<span class="normal">82</span>
<span class="normal">83</span>
<span class="normal">84</span>
<span class="normal">85</span>
<span class="normal">86</span>
<span class="normal">87</span>
<span class="normal">88</span>
<span class="normal">89</span>
<span class="normal">90</span>
<span class="normal">91</span>
<span class="normal">92</span>
<span class="normal">93</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">to_latex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts a function call to its corresponding LaTeX representation.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the function.</span>
<span class="sd"> *args (str): Already-formatted LaTeX strings of the arguments.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The LaTeX math representation of the function call.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_latex_registry</span><span class="p">[</span><span class="n">name</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2">{{(</span><span class="si">{}</span><span class="s2">)}}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">r</span><span class="s2">&quot;\mathrm{{</span><span class="si">{}</span><span class="s2">}}(</span><span class="si">{}</span><span class="s2">)&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.FunctionRegistry.to_sympy" class="doc doc-heading">
<code class="highlight language-python"><span class="n">to_sympy</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts a function call to its corresponding SymPy expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the function.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>*args</code></td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Arguments to pass to the sympy builder.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy node representation of the function call.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">64</span>
<span class="normal">65</span>
<span class="normal">66</span>
<span class="normal">67</span>
<span class="normal">68</span>
<span class="normal">69</span>
<span class="normal">70</span>
<span class="normal">71</span>
<span class="normal">72</span>
<span class="normal">73</span>
<span class="normal">74</span>
<span class="normal">75</span>
<span class="normal">76</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">to_sympy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts a function call to its corresponding SymPy expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the function.</span>
<span class="sd"> *args: Arguments to pass to the sympy builder.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy node representation of the function call.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sympy_registry</span><span class="p">[</span><span class="n">name</span><span class="p">](</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">name</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.LarkToSympy" class="doc doc-heading">
<code>LarkToSympy</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="lark.Transformer">Transformer</span></code></p>
<p>Transformer to convert Lark AST math nodes to SymPy symbolic expressions.</p>
<p>Maps DSL expression trees into SymPy expressions to allow down-pipeline algebraic
simplification, common subexpression elimination (CSE), and memory optimization.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">703</span>
<span class="normal">704</span>
<span class="normal">705</span>
<span class="normal">706</span>
<span class="normal">707</span>
<span class="normal">708</span>
<span class="normal">709</span>
<span class="normal">710</span>
<span class="normal">711</span>
<span class="normal">712</span>
<span class="normal">713</span>
<span class="normal">714</span>
<span class="normal">715</span>
<span class="normal">716</span>
<span class="normal">717</span>
<span class="normal">718</span>
<span class="normal">719</span>
<span class="normal">720</span>
<span class="normal">721</span>
<span class="normal">722</span>
<span class="normal">723</span>
<span class="normal">724</span>
<span class="normal">725</span>
<span class="normal">726</span>
<span class="normal">727</span>
<span class="normal">728</span>
<span class="normal">729</span>
<span class="normal">730</span>
<span class="normal">731</span>
<span class="normal">732</span>
<span class="normal">733</span>
<span class="normal">734</span>
<span class="normal">735</span>
<span class="normal">736</span>
<span class="normal">737</span>
<span class="normal">738</span>
<span class="normal">739</span>
<span class="normal">740</span>
<span class="normal">741</span>
<span class="normal">742</span>
<span class="normal">743</span>
<span class="normal">744</span>
<span class="normal">745</span>
<span class="normal">746</span>
<span class="normal">747</span>
<span class="normal">748</span>
<span class="normal">749</span>
<span class="normal">750</span>
<span class="normal">751</span>
<span class="normal">752</span>
<span class="normal">753</span>
<span class="normal">754</span>
<span class="normal">755</span>
<span class="normal">756</span>
<span class="normal">757</span>
<span class="normal">758</span>
<span class="normal">759</span>
<span class="normal">760</span>
<span class="normal">761</span>
<span class="normal">762</span>
<span class="normal">763</span>
<span class="normal">764</span>
<span class="normal">765</span>
<span class="normal">766</span>
<span class="normal">767</span>
<span class="normal">768</span>
<span class="normal">769</span>
<span class="normal">770</span>
<span class="normal">771</span>
<span class="normal">772</span>
<span class="normal">773</span>
<span class="normal">774</span>
<span class="normal">775</span>
<span class="normal">776</span>
<span class="normal">777</span>
<span class="normal">778</span>
<span class="normal">779</span>
<span class="normal">780</span>
<span class="normal">781</span>
<span class="normal">782</span>
<span class="normal">783</span>
<span class="normal">784</span>
<span class="normal">785</span>
<span class="normal">786</span>
<span class="normal">787</span>
<span class="normal">788</span>
<span class="normal">789</span>
<span class="normal">790</span>
<span class="normal">791</span>
<span class="normal">792</span>
<span class="normal">793</span>
<span class="normal">794</span>
<span class="normal">795</span>
<span class="normal">796</span>
<span class="normal">797</span>
<span class="normal">798</span>
<span class="normal">799</span>
<span class="normal">800</span>
<span class="normal">801</span>
<span class="normal">802</span>
<span class="normal">803</span>
<span class="normal">804</span>
<span class="normal">805</span>
<span class="normal">806</span>
<span class="normal">807</span>
<span class="normal">808</span>
<span class="normal">809</span>
<span class="normal">810</span>
<span class="normal">811</span>
<span class="normal">812</span>
<span class="normal">813</span>
<span class="normal">814</span>
<span class="normal">815</span>
<span class="normal">816</span>
<span class="normal">817</span>
<span class="normal">818</span>
<span class="normal">819</span>
<span class="normal">820</span>
<span class="normal">821</span>
<span class="normal">822</span>
<span class="normal">823</span>
<span class="normal">824</span>
<span class="normal">825</span>
<span class="normal">826</span>
<span class="normal">827</span>
<span class="normal">828</span>
<span class="normal">829</span>
<span class="normal">830</span>
<span class="normal">831</span>
<span class="normal">832</span>
<span class="normal">833</span>
<span class="normal">834</span>
<span class="normal">835</span>
<span class="normal">836</span>
<span class="normal">837</span>
<span class="normal">838</span>
<span class="normal">839</span>
<span class="normal">840</span>
<span class="normal">841</span>
<span class="normal">842</span>
<span class="normal">843</span>
<span class="normal">844</span>
<span class="normal">845</span>
<span class="normal">846</span>
<span class="normal">847</span>
<span class="normal">848</span>
<span class="normal">849</span>
<span class="normal">850</span>
<span class="normal">851</span>
<span class="normal">852</span>
<span class="normal">853</span>
<span class="normal">854</span>
<span class="normal">855</span>
<span class="normal">856</span>
<span class="normal">857</span>
<span class="normal">858</span>
<span class="normal">859</span>
<span class="normal">860</span>
<span class="normal">861</span>
<span class="normal">862</span>
<span class="normal">863</span>
<span class="normal">864</span>
<span class="normal">865</span>
<span class="normal">866</span>
<span class="normal">867</span>
<span class="normal">868</span>
<span class="normal">869</span>
<span class="normal">870</span>
<span class="normal">871</span>
<span class="normal">872</span>
<span class="normal">873</span>
<span class="normal">874</span>
<span class="normal">875</span>
<span class="normal">876</span>
<span class="normal">877</span>
<span class="normal">878</span>
<span class="normal">879</span>
<span class="normal">880</span>
<span class="normal">881</span>
<span class="normal">882</span>
<span class="normal">883</span>
<span class="normal">884</span>
<span class="normal">885</span>
<span class="normal">886</span>
<span class="normal">887</span>
<span class="normal">888</span>
<span class="normal">889</span>
<span class="normal">890</span>
<span class="normal">891</span>
<span class="normal">892</span>
<span class="normal">893</span>
<span class="normal">894</span>
<span class="normal">895</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@v_args</span><span class="p">(</span><span class="n">inline</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">LarkToSympy</span><span class="p">(</span><span class="n">Transformer</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Transformer to convert Lark AST math nodes to SymPy symbolic expressions.</span>
<span class="sd"> Maps DSL expression trees into SymPy expressions to allow down-pipeline algebraic</span>
<span class="sd"> simplification, common subexpression elimination (CSE), and memory optimization.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes LarkToSympy transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts number strings into SymPy Float objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token/str): Numeric string from the AST.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Float: SymPy floating point object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Float</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">numeral</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts environment variable tokens to SymPy Symbol objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token (prefixed with $).</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Preserves precedence inside parentheses and returns the child expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> val (sympy.Expr): Expression inside parentheses.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: The inner expression unchanged.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps variable name tokens to SymPy Symbol objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps turbulence fluctuation variables (e.g., u&#39;) to a SymPy Symbol with &#39;__prime&#39; suffix.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable name token representing fluctuation.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol with prime suffix identifier.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="s2">&quot;__prime&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps spatial derivative operations (e.g., ddx(u)) to a single composite SymPy Symbol.</span>
<span class="sd"> This treats the derivative term (e.g., ddx_u) as an independent symbol.</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator token.</span>
<span class="sd"> b (Token): Variable name token being differentiated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: Composite derivative symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">signature</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">signature</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts inline functions (e.g., sqr, pow3) to direct SymPy exponent expressions.</span>
<span class="sd"> Args:</span>
<span class="sd"> op (Token): Inline function operator token.</span>
<span class="sd"> val (sympy.Expr): The function argument expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy power expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">op</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">**</span><span class="mi">2</span>
<span class="k">elif</span> <span class="n">op</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">**</span><span class="mi">3</span>
<span class="k">return</span> <span class="n">val</span>
<span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps standard built-in functions or UDFs to their SymPy representations.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length argument list. The first argument is the function name Token,</span>
<span class="sd"> and the subsequent arguments are the function parameter expressions.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy function node or registered mathematical expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">if</span> <span class="n">func_name</span> <span class="o">==</span> <span class="s2">&quot;udf&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">))(</span><span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">return</span> <span class="n">function_registry</span><span class="o">.</span><span class="n">to_sympy</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts negation to SymPy unary negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> val (sympy.Expr): The expression to negate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: Negated SymPy expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="o">-</span><span class="n">val</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts addition to SymPy sum expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy addition expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
<span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts subtraction to SymPy difference expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy subtraction expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span>
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts multiplication to SymPy product expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy product expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>
<span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts division to SymPy division expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy division expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span>
<span class="k">def</span> <span class="nf">udf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps user defined function names to string representations.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Function token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Name of the user defined function.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span>
<span class="n">log</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;log&quot;</span>
<span class="n">exp</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;exp&quot;</span>
<span class="n">sqrt</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;sqrt&quot;</span>
<span class="nb">abs</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;abs&quot;</span>
<span class="n">rxn_rate</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="s2">&quot;rxn_rate&quot;</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes LarkToSympy transformer.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping variable names to FieldBase objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">711</span>
<span class="normal">712</span>
<span class="normal">713</span>
<span class="normal">714</span>
<span class="normal">715</span>
<span class="normal">716</span>
<span class="normal">717</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes LarkToSympy transformer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Dictionary mapping variable names to FieldBase objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.add" class="doc doc-heading">
<code class="highlight language-python"><span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts addition to SymPy sum expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Left expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Right expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy addition expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">832</span>
<span class="normal">833</span>
<span class="normal">834</span>
<span class="normal">835</span>
<span class="normal">836</span>
<span class="normal">837</span>
<span class="normal">838</span>
<span class="normal">839</span>
<span class="normal">840</span>
<span class="normal">841</span>
<span class="normal">842</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts addition to SymPy sum expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy addition expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.div" class="doc doc-heading">
<code class="highlight language-python"><span class="n">div</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts division to SymPy division expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Left expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Right expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy division expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">868</span>
<span class="normal">869</span>
<span class="normal">870</span>
<span class="normal">871</span>
<span class="normal">872</span>
<span class="normal">873</span>
<span class="normal">874</span>
<span class="normal">875</span>
<span class="normal">876</span>
<span class="normal">877</span>
<span class="normal">878</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts division to SymPy division expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy division expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.dnx" class="doc doc-heading">
<code class="highlight language-python"><span class="n">dnx</span><span class="p">(</span><span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Maps spatial derivative operations (e.g., ddx(u)) to a single composite SymPy Symbol.</p>
<p>This treats the derivative term (e.g., ddx_u) as an independent symbol.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>partial</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Derivative operator token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name token being differentiated.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Symbol: Composite derivative symbol representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">774</span>
<span class="normal">775</span>
<span class="normal">776</span>
<span class="normal">777</span>
<span class="normal">778</span>
<span class="normal">779</span>
<span class="normal">780</span>
<span class="normal">781</span>
<span class="normal">782</span>
<span class="normal">783</span>
<span class="normal">784</span>
<span class="normal">785</span>
<span class="normal">786</span>
<span class="normal">787</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dnx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partial</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps spatial derivative operations (e.g., ddx(u)) to a single composite SymPy Symbol.</span>
<span class="sd"> This treats the derivative term (e.g., ddx_u) as an independent symbol.</span>
<span class="sd"> Args:</span>
<span class="sd"> partial (Token): Derivative operator token.</span>
<span class="sd"> b (Token): Variable name token being differentiated.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: Composite derivative symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">signature</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">partial</span><span class="o">.</span><span class="n">data</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">b</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">signature</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.env" class="doc doc-heading">
<code class="highlight language-python"><span class="n">env</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts environment variable tokens to SymPy Symbol objects.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Environment variable name token (prefixed with $).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Symbol: SymPy symbol representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">730</span>
<span class="normal">731</span>
<span class="normal">732</span>
<span class="normal">733</span>
<span class="normal">734</span>
<span class="normal">735</span>
<span class="normal">736</span>
<span class="normal">737</span>
<span class="normal">738</span>
<span class="normal">739</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts environment variable tokens to SymPy Symbol objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Environment variable name token (prefixed with $).</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.fcall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fcall</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Maps standard built-in functions or UDFs to their SymPy representations.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>*args</code></td>
<td>
</td>
<td>
<div class="doc-md-description">
<p>Variable length argument list. The first argument is the function name Token,
and the subsequent arguments are the function parameter expressions.</p>
</div>
</td>
<td>
<code>()</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy function node or registered mathematical expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">805</span>
<span class="normal">806</span>
<span class="normal">807</span>
<span class="normal">808</span>
<span class="normal">809</span>
<span class="normal">810</span>
<span class="normal">811</span>
<span class="normal">812</span>
<span class="normal">813</span>
<span class="normal">814</span>
<span class="normal">815</span>
<span class="normal">816</span>
<span class="normal">817</span>
<span class="normal">818</span>
<span class="normal">819</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fcall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps standard built-in functions or UDFs to their SymPy representations.</span>
<span class="sd"> Args:</span>
<span class="sd"> *args: Variable length argument list. The first argument is the function name Token,</span>
<span class="sd"> and the subsequent arguments are the function parameter expressions.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy function node or registered mathematical expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">if</span> <span class="n">func_name</span> <span class="o">==</span> <span class="s2">&quot;udf&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">))(</span><span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">return</span> <span class="n">function_registry</span><span class="o">.</span><span class="n">to_sympy</span><span class="p">(</span><span class="n">func_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.fluc" class="doc doc-heading">
<code class="highlight language-python"><span class="n">fluc</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Maps turbulence fluctuation variables (e.g., u') to a SymPy Symbol with '__prime' suffix.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name token representing fluctuation.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Symbol: SymPy symbol with prime suffix identifier.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">763</span>
<span class="normal">764</span>
<span class="normal">765</span>
<span class="normal">766</span>
<span class="normal">767</span>
<span class="normal">768</span>
<span class="normal">769</span>
<span class="normal">770</span>
<span class="normal">771</span>
<span class="normal">772</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">fluc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps turbulence fluctuation variables (e.g., u&#39;) to a SymPy Symbol with &#39;__prime&#39; suffix.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable name token representing fluctuation.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol with prime suffix identifier.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="s2">&quot;__prime&quot;</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.icall" class="doc doc-heading">
<code class="highlight language-python"><span class="n">icall</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts inline functions (e.g., sqr, pow3) to direct SymPy exponent expressions.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>op</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Inline function operator token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>val</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The function argument expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy power expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">789</span>
<span class="normal">790</span>
<span class="normal">791</span>
<span class="normal">792</span>
<span class="normal">793</span>
<span class="normal">794</span>
<span class="normal">795</span>
<span class="normal">796</span>
<span class="normal">797</span>
<span class="normal">798</span>
<span class="normal">799</span>
<span class="normal">800</span>
<span class="normal">801</span>
<span class="normal">802</span>
<span class="normal">803</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">icall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts inline functions (e.g., sqr, pow3) to direct SymPy exponent expressions.</span>
<span class="sd"> Args:</span>
<span class="sd"> op (Token): Inline function operator token.</span>
<span class="sd"> val (sympy.Expr): The function argument expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy power expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">op</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;sqr&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">**</span><span class="mi">2</span>
<span class="k">elif</span> <span class="n">op</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="s2">&quot;pow3&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">val</span><span class="o">**</span><span class="mi">3</span>
<span class="k">return</span> <span class="n">val</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.mul" class="doc doc-heading">
<code class="highlight language-python"><span class="n">mul</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts multiplication to SymPy product expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Left expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Right expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy product expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">856</span>
<span class="normal">857</span>
<span class="normal">858</span>
<span class="normal">859</span>
<span class="normal">860</span>
<span class="normal">861</span>
<span class="normal">862</span>
<span class="normal">863</span>
<span class="normal">864</span>
<span class="normal">865</span>
<span class="normal">866</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts multiplication to SymPy product expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy product expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.neg" class="doc doc-heading">
<code class="highlight language-python"><span class="n">neg</span><span class="p">(</span><span class="n">val</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts negation to SymPy unary negation.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>val</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The expression to negate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: Negated SymPy expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">821</span>
<span class="normal">822</span>
<span class="normal">823</span>
<span class="normal">824</span>
<span class="normal">825</span>
<span class="normal">826</span>
<span class="normal">827</span>
<span class="normal">828</span>
<span class="normal">829</span>
<span class="normal">830</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">neg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts negation to SymPy unary negation.</span>
<span class="sd"> Args:</span>
<span class="sd"> val (sympy.Expr): The expression to negate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: Negated SymPy expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="o">-</span><span class="n">val</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.number" class="doc doc-heading">
<code class="highlight language-python"><span class="n">number</span><span class="p">(</span><span class="n">numeral</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts number strings into SymPy Float objects.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>numeral</code></td>
<td>
<code><span title="lark.Token">Token</span> / str</code>
</td>
<td>
<div class="doc-md-description">
<p>Numeric string from the AST.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Float: SymPy floating point object.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">719</span>
<span class="normal">720</span>
<span class="normal">721</span>
<span class="normal">722</span>
<span class="normal">723</span>
<span class="normal">724</span>
<span class="normal">725</span>
<span class="normal">726</span>
<span class="normal">727</span>
<span class="normal">728</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">numeral</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts number strings into SymPy Float objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> numeral (Token/str): Numeric string from the AST.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Float: SymPy floating point object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Float</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">numeral</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.paren" class="doc doc-heading">
<code class="highlight language-python"><span class="n">paren</span><span class="p">(</span><span class="n">val</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Preserves precedence inside parentheses and returns the child expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>val</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Expression inside parentheses.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: The inner expression unchanged.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">741</span>
<span class="normal">742</span>
<span class="normal">743</span>
<span class="normal">744</span>
<span class="normal">745</span>
<span class="normal">746</span>
<span class="normal">747</span>
<span class="normal">748</span>
<span class="normal">749</span>
<span class="normal">750</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">paren</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Preserves precedence inside parentheses and returns the child expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> val (sympy.Expr): Expression inside parentheses.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: The inner expression unchanged.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">val</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.sub" class="doc doc-heading">
<code class="highlight language-python"><span class="n">sub</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Converts subtraction to SymPy difference expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Left expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>b</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Right expression.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy subtraction expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">844</span>
<span class="normal">845</span>
<span class="normal">846</span>
<span class="normal">847</span>
<span class="normal">848</span>
<span class="normal">849</span>
<span class="normal">850</span>
<span class="normal">851</span>
<span class="normal">852</span>
<span class="normal">853</span>
<span class="normal">854</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts subtraction to SymPy difference expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (sympy.Expr): Left expression.</span>
<span class="sd"> b (sympy.Expr): Right expression.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy subtraction expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">-</span> <span class="n">b</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.udf" class="doc doc-heading">
<code class="highlight language-python"><span class="n">udf</span><span class="p">(</span><span class="n">a</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Maps user defined function names to string representations.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>a</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Function token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Name of the user defined function.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">880</span>
<span class="normal">881</span>
<span class="normal">882</span>
<span class="normal">883</span>
<span class="normal">884</span>
<span class="normal">885</span>
<span class="normal">886</span>
<span class="normal">887</span>
<span class="normal">888</span>
<span class="normal">889</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">udf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps user defined function names to string representations.</span>
<span class="sd"> Args:</span>
<span class="sd"> a (Token): Function token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Name of the user defined function.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.LarkToSympy.var" class="doc doc-heading">
<code class="highlight language-python"><span class="n">var</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Maps variable name tokens to SymPy Symbol objects.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code><span title="lark.Token">Token</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name token.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Symbol: SymPy symbol representation.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">752</span>
<span class="normal">753</span>
<span class="normal">754</span>
<span class="normal">755</span>
<span class="normal">756</span>
<span class="normal">757</span>
<span class="normal">758</span>
<span class="normal">759</span>
<span class="normal">760</span>
<span class="normal">761</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">var</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Maps variable name tokens to SymPy Symbol objects.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (Token): Variable name token.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Symbol: SymPy symbol representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.LatexWriter" class="doc doc-heading">
<code>LatexWriter</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Outputs the compiled average physical quantities LaTeX equations as a Python dictionary.</p>
<p>Prints the mapped string representation of the dictionary directly to stdout.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2728</span>
<span class="normal">2729</span>
<span class="normal">2730</span>
<span class="normal">2731</span>
<span class="normal">2732</span>
<span class="normal">2733</span>
<span class="normal">2734</span>
<span class="normal">2735</span>
<span class="normal">2736</span>
<span class="normal">2737</span>
<span class="normal">2738</span>
<span class="normal">2739</span>
<span class="normal">2740</span>
<span class="normal">2741</span>
<span class="normal">2742</span>
<span class="normal">2743</span>
<span class="normal">2744</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">LatexWriter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Outputs the compiled average physical quantities LaTeX equations as a Python dictionary.</span>
<span class="sd"> Prints the mapped string representation of the dictionary directly to stdout.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Writes the LaTeX equation definitions dictionary to standard output.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">latex_lines</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">avg</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">latex_lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39; &quot;</span><span class="si">{}</span><span class="s1">&quot; : r&quot;$</span><span class="si">{}</span><span class="s1">$&quot;,&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">avg</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">avg</span><span class="o">.</span><span class="n">latex</span><span class="p">))</span>
<span class="n">latex_lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;}&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">latex_lines</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.LatexWriter.write" class="doc doc-heading">
<code class="highlight language-python"><span class="n">write</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Writes the LaTeX equation definitions dictionary to standard output.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The compiled context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2734</span>
<span class="normal">2735</span>
<span class="normal">2736</span>
<span class="normal">2737</span>
<span class="normal">2738</span>
<span class="normal">2739</span>
<span class="normal">2740</span>
<span class="normal">2741</span>
<span class="normal">2742</span>
<span class="normal">2743</span>
<span class="normal">2744</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Writes the LaTeX equation definitions dictionary to standard output.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">latex_lines</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">avg</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">latex_lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39; &quot;</span><span class="si">{}</span><span class="s1">&quot; : r&quot;$</span><span class="si">{}</span><span class="s1">$&quot;,&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">avg</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">avg</span><span class="o">.</span><span class="n">latex</span><span class="p">))</span>
<span class="n">latex_lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;}&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">latex_lines</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.ParserStage" class="doc doc-heading">
<code>ParserStage</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Compiler pipeline Stage 1: Parses DSL specifications and extracts initial definitions.</p>
<p>Reads raw DSL specifications and uses Lark parser to build the AST.
Populates primary inputs, derived variables, and averaged variable lists.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2339</span>
<span class="normal">2340</span>
<span class="normal">2341</span>
<span class="normal">2342</span>
<span class="normal">2343</span>
<span class="normal">2344</span>
<span class="normal">2345</span>
<span class="normal">2346</span>
<span class="normal">2347</span>
<span class="normal">2348</span>
<span class="normal">2349</span>
<span class="normal">2350</span>
<span class="normal">2351</span>
<span class="normal">2352</span>
<span class="normal">2353</span>
<span class="normal">2354</span>
<span class="normal">2355</span>
<span class="normal">2356</span>
<span class="normal">2357</span>
<span class="normal">2358</span>
<span class="normal">2359</span>
<span class="normal">2360</span>
<span class="normal">2361</span>
<span class="normal">2362</span>
<span class="normal">2363</span>
<span class="normal">2364</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">ParserStage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compiler pipeline Stage 1: Parses DSL specifications and extracts initial definitions.</span>
<span class="sd"> Reads raw DSL specifications and uses Lark parser to build the AST.</span>
<span class="sd"> Populates primary inputs, derived variables, and averaged variable lists.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ParserStage with calc_grammar.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parser</span> <span class="o">=</span> <span class="n">Lark</span><span class="p">(</span><span class="n">calc_grammar</span><span class="p">,</span>
<span class="n">parser</span><span class="o">=</span><span class="s1">&#39;lalr&#39;</span><span class="p">,</span>
<span class="n">lexer_callbacks</span><span class="o">=</span><span class="p">{</span>
<span class="s1">&#39;ESCAPED_STRING&#39;</span><span class="p">:</span> <span class="n">tok_to_str</span><span class="p">,</span>
<span class="s1">&#39;INT&#39;</span><span class="p">:</span> <span class="n">tok_to_int</span><span class="p">,</span>
<span class="s1">&#39;BOOL&#39;</span><span class="p">:</span> <span class="n">tok_to_bool</span>
<span class="p">})</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">terms_raw</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 1 parser.</span>
<span class="sd"> Args:</span>
<span class="sd"> terms_raw (str): Raw DSL term specification string.</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tree</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">terms_raw</span><span class="p">)</span>
<span class="n">CollectDefinitions</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ParserStage.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">()</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes ParserStage with calc_grammar.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2346</span>
<span class="normal">2347</span>
<span class="normal">2348</span>
<span class="normal">2349</span>
<span class="normal">2350</span>
<span class="normal">2351</span>
<span class="normal">2352</span>
<span class="normal">2353</span>
<span class="normal">2354</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes ParserStage with calc_grammar.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parser</span> <span class="o">=</span> <span class="n">Lark</span><span class="p">(</span><span class="n">calc_grammar</span><span class="p">,</span>
<span class="n">parser</span><span class="o">=</span><span class="s1">&#39;lalr&#39;</span><span class="p">,</span>
<span class="n">lexer_callbacks</span><span class="o">=</span><span class="p">{</span>
<span class="s1">&#39;ESCAPED_STRING&#39;</span><span class="p">:</span> <span class="n">tok_to_str</span><span class="p">,</span>
<span class="s1">&#39;INT&#39;</span><span class="p">:</span> <span class="n">tok_to_int</span><span class="p">,</span>
<span class="s1">&#39;BOOL&#39;</span><span class="p">:</span> <span class="n">tok_to_bool</span>
<span class="p">})</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.ParserStage.execute" class="doc doc-heading">
<code class="highlight language-python"><span class="n">execute</span><span class="p">(</span><span class="n">terms_raw</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes Stage 1 parser.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>terms_raw</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Raw DSL term specification string.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2356</span>
<span class="normal">2357</span>
<span class="normal">2358</span>
<span class="normal">2359</span>
<span class="normal">2360</span>
<span class="normal">2361</span>
<span class="normal">2362</span>
<span class="normal">2363</span>
<span class="normal">2364</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">terms_raw</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 1 parser.</span>
<span class="sd"> Args:</span>
<span class="sd"> terms_raw (str): Raw DSL term specification string.</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tree</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">terms_raw</span><span class="p">)</span>
<span class="n">CollectDefinitions</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span><span class="o">.</span><span class="n">visit</span><span class="p">(</span><span class="n">tree</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.PrimaryField" class="doc doc-heading">
<code>PrimaryField</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="post.FieldBase" href="#post.FieldBase">FieldBase</a></code></p>
<p>격자 정보나 외부 물리계 수치 데이터(u, v, w, T 등) 파일에서 사전에 로드하여
메모리에 상주하는 기본 원본 입력 필드 클래스입니다.
자체 계산 루프나 동적 할당 코드를 직접 생성하지 않습니다.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2105</span>
<span class="normal">2106</span>
<span class="normal">2107</span>
<span class="normal">2108</span>
<span class="normal">2109</span>
<span class="normal">2110</span>
<span class="normal">2111</span>
<span class="normal">2112</span>
<span class="normal">2113</span>
<span class="normal">2114</span>
<span class="normal">2115</span>
<span class="normal">2116</span>
<span class="normal">2117</span>
<span class="normal">2118</span>
<span class="normal">2119</span>
<span class="normal">2120</span>
<span class="normal">2121</span>
<span class="normal">2122</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">PrimaryField</span><span class="p">(</span><span class="n">FieldBase</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;격자 정보나 외부 물리계 수치 데이터(u, v, w, T 등) 파일에서 사전에 로드하여 </span>
<span class="sd"> 메모리에 상주하는 기본 원본 입력 필드 클래스입니다. </span>
<span class="sd"> 자체 계산 루프나 동적 할당 코드를 직접 생성하지 않습니다.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes PrimaryField.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Input field name.</span>
<span class="sd"> fdict (dict): Variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PrimaryField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derivs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prime</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="o">=</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.PrimaryField.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes PrimaryField.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Input field name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable registry dictionary.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2111</span>
<span class="normal">2112</span>
<span class="normal">2113</span>
<span class="normal">2114</span>
<span class="normal">2115</span>
<span class="normal">2116</span>
<span class="normal">2117</span>
<span class="normal">2118</span>
<span class="normal">2119</span>
<span class="normal">2120</span>
<span class="normal">2121</span>
<span class="normal">2122</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes PrimaryField.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Input field name.</span>
<span class="sd"> fdict (dict): Variable registry dictionary.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PrimaryField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fdict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">derivs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prime</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">latex_given</span> <span class="o">=</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.ReportWriter" class="doc doc-heading">
<code>ReportWriter</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Outputs a compilation analysis summary in JSON format.</p>
<p>Creates <code>ir2.py</code> containing topological sort order and graph relationships
to verify pipeline execution properties.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2704</span>
<span class="normal">2705</span>
<span class="normal">2706</span>
<span class="normal">2707</span>
<span class="normal">2708</span>
<span class="normal">2709</span>
<span class="normal">2710</span>
<span class="normal">2711</span>
<span class="normal">2712</span>
<span class="normal">2713</span>
<span class="normal">2714</span>
<span class="normal">2715</span>
<span class="normal">2716</span>
<span class="normal">2717</span>
<span class="normal">2718</span>
<span class="normal">2719</span>
<span class="normal">2720</span>
<span class="normal">2721</span>
<span class="normal">2722</span>
<span class="normal">2723</span>
<span class="normal">2724</span>
<span class="normal">2725</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">ReportWriter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Outputs a compilation analysis summary in JSON format.</span>
<span class="sd"> Creates `ir2.py` containing topological sort order and graph relationships</span>
<span class="sd"> to verify pipeline execution properties.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Writes the IR details to `ir2.py`.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="n">dg</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span><span class="nb">list</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;ir2.py&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">irf</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;g = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dg</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;l1 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;l2 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;avg1 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">)),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;avg2 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">)),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.ReportWriter.write" class="doc doc-heading">
<code class="highlight language-python"><span class="n">write</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Writes the IR details to <code>ir2.py</code>.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>The compiled context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2711</span>
<span class="normal">2712</span>
<span class="normal">2713</span>
<span class="normal">2714</span>
<span class="normal">2715</span>
<span class="normal">2716</span>
<span class="normal">2717</span>
<span class="normal">2718</span>
<span class="normal">2719</span>
<span class="normal">2720</span>
<span class="normal">2721</span>
<span class="normal">2722</span>
<span class="normal">2723</span>
<span class="normal">2724</span>
<span class="normal">2725</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Writes the IR details to `ir2.py`.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): The compiled context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="n">dg</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span><span class="nb">list</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;ir2.py&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">irf</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;g = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dg</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;l1 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;l2 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;avg1 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg1</span><span class="p">)),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;avg2 = &quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">repr</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">avg2</span><span class="p">)),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">irf</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.SympyOptimizationStage" class="doc doc-heading">
<code>SympyOptimizationStage</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Compiler pipeline Stage 5: Performs liveness analysis and memory buffer sharing.</p>
<p>This stage runs liveness window analysis to map multiple non-overlapping temporary
variables to a limited set of shared XYZ buffers (array pooling) to prevent RAM exhaustion.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2533</span>
<span class="normal">2534</span>
<span class="normal">2535</span>
<span class="normal">2536</span>
<span class="normal">2537</span>
<span class="normal">2538</span>
<span class="normal">2539</span>
<span class="normal">2540</span>
<span class="normal">2541</span>
<span class="normal">2542</span>
<span class="normal">2543</span>
<span class="normal">2544</span>
<span class="normal">2545</span>
<span class="normal">2546</span>
<span class="normal">2547</span>
<span class="normal">2548</span>
<span class="normal">2549</span>
<span class="normal">2550</span>
<span class="normal">2551</span>
<span class="normal">2552</span>
<span class="normal">2553</span>
<span class="normal">2554</span>
<span class="normal">2555</span>
<span class="normal">2556</span>
<span class="normal">2557</span>
<span class="normal">2558</span>
<span class="normal">2559</span>
<span class="normal">2560</span>
<span class="normal">2561</span>
<span class="normal">2562</span>
<span class="normal">2563</span>
<span class="normal">2564</span>
<span class="normal">2565</span>
<span class="normal">2566</span>
<span class="normal">2567</span>
<span class="normal">2568</span>
<span class="normal">2569</span>
<span class="normal">2570</span>
<span class="normal">2571</span>
<span class="normal">2572</span>
<span class="normal">2573</span>
<span class="normal">2574</span>
<span class="normal">2575</span>
<span class="normal">2576</span>
<span class="normal">2577</span>
<span class="normal">2578</span>
<span class="normal">2579</span>
<span class="normal">2580</span>
<span class="normal">2581</span>
<span class="normal">2582</span>
<span class="normal">2583</span>
<span class="normal">2584</span>
<span class="normal">2585</span>
<span class="normal">2586</span>
<span class="normal">2587</span>
<span class="normal">2588</span>
<span class="normal">2589</span>
<span class="normal">2590</span>
<span class="normal">2591</span>
<span class="normal">2592</span>
<span class="normal">2593</span>
<span class="normal">2594</span>
<span class="normal">2595</span>
<span class="normal">2596</span>
<span class="normal">2597</span>
<span class="normal">2598</span>
<span class="normal">2599</span>
<span class="normal">2600</span>
<span class="normal">2601</span>
<span class="normal">2602</span>
<span class="normal">2603</span>
<span class="normal">2604</span>
<span class="normal">2605</span>
<span class="normal">2606</span>
<span class="normal">2607</span>
<span class="normal">2608</span>
<span class="normal">2609</span>
<span class="normal">2610</span>
<span class="normal">2611</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">SympyOptimizationStage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compiler pipeline Stage 5: Performs liveness analysis and memory buffer sharing.</span>
<span class="sd"> This stage runs liveness window analysis to map multiple non-overlapping temporary</span>
<span class="sd"> variables to a limited set of shared XYZ buffers (array pooling) to prevent RAM exhaustion.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 5 array buffer sharing based on topologically sorted lists.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array_name</span> <span class="o">=</span> <span class="s2">&quot;xyzbuffer</span><span class="si">{}</span><span class="s2">&quot;</span>
<span class="c1"># 1. Pass 1 및 Pass 2 연산 순서 배열들에 대해 각각 버퍼 공유 매핑(Pooling) 수행</span>
<span class="n">narr1</span><span class="p">,</span> <span class="n">alloc1</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">allocate_arr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span><span class="p">))</span>
<span class="n">narr2</span><span class="p">,</span> <span class="n">alloc2</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">allocate_arr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span><span class="p">))</span>
<span class="c1"># 전체 프로그램에서 필요한 동적 공유 3D 버퍼 배열의 최대 크기 설정</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">narr</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">narr1</span><span class="p">,</span> <span class="n">narr2</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span> <span class="o">=</span> <span class="n">alloc1</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span> <span class="o">=</span> <span class="n">alloc2</span>
<span class="k">def</span> <span class="nf">liveness</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">l1</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Analyzes variable lifetimes to identify overlap intervals.</span>
<span class="sd"> Constructs a liveness matrix where matrix[i, j] is True if variable i</span>
<span class="sd"> is still live (in memory) at step j.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> l1 (list): Topologically sorted variable names.</span>
<span class="sd"> g (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> Returns:</span>
<span class="sd"> np.ndarray: Boolean liveness matrix of shape (len(l1), len(l1)).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">)))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">l1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">)):</span>
<span class="n">img</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">img</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">g</span><span class="p">[</span><span class="n">l1</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">img</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">allocate_arr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">l</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Performs liveness-based memory buffer pooling.</span>
<span class="sd"> Assigns variables with disjoint active lifetimes to share the same</span>
<span class="sd"> allocated `xyzbufferN` 3D arrays.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> l (list): Topologically sorted list of variable names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (max_buffers_needed, var_to_buffer_mapping) where:</span>
<span class="sd"> max_buffers_needed (int): Maximum buffers required concurrently.</span>
<span class="sd"> var_to_buffer_mapping (dict): Map of variable names to their pooled buffer arrays.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="n">dg</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span>
<span class="n">mask</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">liveness</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">dg</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">narr</span> <span class="o">=</span> <span class="n">mask</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">narr</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">array_pool</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">array_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">narr</span><span class="p">)])</span>
<span class="n">livesets</span> <span class="o">=</span> <span class="p">[</span><span class="nb">set</span><span class="p">([])]</span> <span class="o">+</span> <span class="p">[</span><span class="nb">set</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">l</span><span class="p">)[</span><span class="n">row</span><span class="p">])</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">mask</span><span class="o">.</span><span class="n">T</span><span class="p">]</span>
<span class="n">var2arr</span> <span class="o">=</span> <span class="p">{</span> <span class="n">p</span> <span class="p">:</span> <span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span> <span class="p">}</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">s0</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">livesets</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">livesets</span><span class="p">[</span><span class="mi">1</span><span class="p">:])):</span>
<span class="n">array_pool</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">var2arr</span><span class="o">.</span><span class="n">get</span><span class="p">,</span> <span class="n">s0</span> <span class="o">-</span> <span class="n">s1</span><span class="p">))</span>
<span class="k">for</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">s1</span> <span class="o">-</span> <span class="n">s0</span><span class="p">:</span>
<span class="n">var2arr</span><span class="p">[</span><span class="n">new</span><span class="p">]</span> <span class="o">=</span> <span class="n">array_pool</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">return</span> <span class="n">narr</span><span class="p">,</span> <span class="n">var2arr</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizationStage.allocate_arr" class="doc doc-heading">
<code class="highlight language-python"><span class="n">allocate_arr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">l</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Performs liveness-based memory buffer pooling.</p>
<p>Assigns variables with disjoint active lifetimes to share the same
allocated <code>xyzbufferN</code> 3D arrays.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>l</code></td>
<td>
<code>list</code>
</td>
<td>
<div class="doc-md-description">
<p>Topologically sorted list of variable names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(max_buffers_needed, var_to_buffer_mapping) where:
max_buffers_needed (int): Maximum buffers required concurrently.
var_to_buffer_mapping (dict): Map of variable names to their pooled buffer arrays.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2579</span>
<span class="normal">2580</span>
<span class="normal">2581</span>
<span class="normal">2582</span>
<span class="normal">2583</span>
<span class="normal">2584</span>
<span class="normal">2585</span>
<span class="normal">2586</span>
<span class="normal">2587</span>
<span class="normal">2588</span>
<span class="normal">2589</span>
<span class="normal">2590</span>
<span class="normal">2591</span>
<span class="normal">2592</span>
<span class="normal">2593</span>
<span class="normal">2594</span>
<span class="normal">2595</span>
<span class="normal">2596</span>
<span class="normal">2597</span>
<span class="normal">2598</span>
<span class="normal">2599</span>
<span class="normal">2600</span>
<span class="normal">2601</span>
<span class="normal">2602</span>
<span class="normal">2603</span>
<span class="normal">2604</span>
<span class="normal">2605</span>
<span class="normal">2606</span>
<span class="normal">2607</span>
<span class="normal">2608</span>
<span class="normal">2609</span>
<span class="normal">2610</span>
<span class="normal">2611</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">allocate_arr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">l</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Performs liveness-based memory buffer pooling.</span>
<span class="sd"> Assigns variables with disjoint active lifetimes to share the same</span>
<span class="sd"> allocated `xyzbufferN` 3D arrays.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> l (list): Topologically sorted list of variable names.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (max_buffers_needed, var_to_buffer_mapping) where:</span>
<span class="sd"> max_buffers_needed (int): Maximum buffers required concurrently.</span>
<span class="sd"> var_to_buffer_mapping (dict): Map of variable names to their pooled buffer arrays.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="n">dg</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span>
<span class="n">mask</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">liveness</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">dg</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">narr</span> <span class="o">=</span> <span class="n">mask</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">narr</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">array_pool</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">array_name</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">narr</span><span class="p">)])</span>
<span class="n">livesets</span> <span class="o">=</span> <span class="p">[</span><span class="nb">set</span><span class="p">([])]</span> <span class="o">+</span> <span class="p">[</span><span class="nb">set</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">l</span><span class="p">)[</span><span class="n">row</span><span class="p">])</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">mask</span><span class="o">.</span><span class="n">T</span><span class="p">]</span>
<span class="n">var2arr</span> <span class="o">=</span> <span class="p">{</span> <span class="n">p</span> <span class="p">:</span> <span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span> <span class="p">}</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">s0</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">livesets</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">livesets</span><span class="p">[</span><span class="mi">1</span><span class="p">:])):</span>
<span class="n">array_pool</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">var2arr</span><span class="o">.</span><span class="n">get</span><span class="p">,</span> <span class="n">s0</span> <span class="o">-</span> <span class="n">s1</span><span class="p">))</span>
<span class="k">for</span> <span class="n">new</span> <span class="ow">in</span> <span class="n">s1</span> <span class="o">-</span> <span class="n">s0</span><span class="p">:</span>
<span class="n">var2arr</span><span class="p">[</span><span class="n">new</span><span class="p">]</span> <span class="o">=</span> <span class="n">array_pool</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">return</span> <span class="n">narr</span><span class="p">,</span> <span class="n">var2arr</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizationStage.execute" class="doc doc-heading">
<code class="highlight language-python"><span class="n">execute</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes Stage 5 array buffer sharing based on topologically sorted lists.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2540</span>
<span class="normal">2541</span>
<span class="normal">2542</span>
<span class="normal">2543</span>
<span class="normal">2544</span>
<span class="normal">2545</span>
<span class="normal">2546</span>
<span class="normal">2547</span>
<span class="normal">2548</span>
<span class="normal">2549</span>
<span class="normal">2550</span>
<span class="normal">2551</span>
<span class="normal">2552</span>
<span class="normal">2553</span>
<span class="normal">2554</span>
<span class="normal">2555</span>
<span class="normal">2556</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 5 array buffer sharing based on topologically sorted lists.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array_name</span> <span class="o">=</span> <span class="s2">&quot;xyzbuffer</span><span class="si">{}</span><span class="s2">&quot;</span>
<span class="c1"># 1. Pass 1 및 Pass 2 연산 순서 배열들에 대해 각각 버퍼 공유 매핑(Pooling) 수행</span>
<span class="n">narr1</span><span class="p">,</span> <span class="n">alloc1</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">allocate_arr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass1</span><span class="p">))</span>
<span class="n">narr2</span><span class="p">,</span> <span class="n">alloc2</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">allocate_arr</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ctx</span><span class="o">.</span><span class="n">pass2</span><span class="p">))</span>
<span class="c1"># 전체 프로그램에서 필요한 동적 공유 3D 버퍼 배열의 최대 크기 설정</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">narr</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">narr1</span><span class="p">,</span> <span class="n">narr2</span><span class="p">)</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">alloc1</span> <span class="o">=</span> <span class="n">alloc1</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">alloc2</span> <span class="o">=</span> <span class="n">alloc2</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizationStage.liveness" class="doc doc-heading">
<code class="highlight language-python"><span class="n">liveness</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">l1</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Analyzes variable lifetimes to identify overlap intervals.</p>
<p>Constructs a liveness matrix where matrix[i, j] is True if variable i
is still live (in memory) at step j.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>l1</code></td>
<td>
<code>list</code>
</td>
<td>
<div class="doc-md-description">
<p>Topologically sorted variable names.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>g</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Graph mapping variable names to dependency sets.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>np.ndarray: Boolean liveness matrix of shape (len(l1), len(l1)).</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2558</span>
<span class="normal">2559</span>
<span class="normal">2560</span>
<span class="normal">2561</span>
<span class="normal">2562</span>
<span class="normal">2563</span>
<span class="normal">2564</span>
<span class="normal">2565</span>
<span class="normal">2566</span>
<span class="normal">2567</span>
<span class="normal">2568</span>
<span class="normal">2569</span>
<span class="normal">2570</span>
<span class="normal">2571</span>
<span class="normal">2572</span>
<span class="normal">2573</span>
<span class="normal">2574</span>
<span class="normal">2575</span>
<span class="normal">2576</span>
<span class="normal">2577</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">liveness</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">l1</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Analyzes variable lifetimes to identify overlap intervals.</span>
<span class="sd"> Constructs a liveness matrix where matrix[i, j] is True if variable i</span>
<span class="sd"> is still live (in memory) at step j.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context.</span>
<span class="sd"> l1 (list): Topologically sorted variable names.</span>
<span class="sd"> g (dict): Graph mapping variable names to dependency sets.</span>
<span class="sd"> Returns:</span>
<span class="sd"> np.ndarray: Boolean liveness matrix of shape (len(l1), len(l1)).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">)))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">l1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">l1</span><span class="p">)):</span>
<span class="n">img</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">img</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">g</span><span class="p">[</span><span class="n">l1</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="k">else</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="n">img</span> <span class="o">&gt;</span> <span class="mi">0</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.SympyOptimizer" class="doc doc-heading">
<code>SympyOptimizer</code>
</h3>
<div class="doc doc-contents ">
<p>Manages algebra optimization and Common Subexpression Elimination (CSE) via SymPy.</p>
<p>This optimization engine:
1. Expands intermediate temporary variables recursively.
2. Simplifies arithmetic terms (fraction cancellation, trigonometric expansions).
3. Runs CSE to pull duplicate sub-operations out into loop local scalar variables,
significantly reducing FLOPS and memory bandwidth requirements.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 983</span>
<span class="normal"> 984</span>
<span class="normal"> 985</span>
<span class="normal"> 986</span>
<span class="normal"> 987</span>
<span class="normal"> 988</span>
<span class="normal"> 989</span>
<span class="normal"> 990</span>
<span class="normal"> 991</span>
<span class="normal"> 992</span>
<span class="normal"> 993</span>
<span class="normal"> 994</span>
<span class="normal"> 995</span>
<span class="normal"> 996</span>
<span class="normal"> 997</span>
<span class="normal"> 998</span>
<span class="normal"> 999</span>
<span class="normal">1000</span>
<span class="normal">1001</span>
<span class="normal">1002</span>
<span class="normal">1003</span>
<span class="normal">1004</span>
<span class="normal">1005</span>
<span class="normal">1006</span>
<span class="normal">1007</span>
<span class="normal">1008</span>
<span class="normal">1009</span>
<span class="normal">1010</span>
<span class="normal">1011</span>
<span class="normal">1012</span>
<span class="normal">1013</span>
<span class="normal">1014</span>
<span class="normal">1015</span>
<span class="normal">1016</span>
<span class="normal">1017</span>
<span class="normal">1018</span>
<span class="normal">1019</span>
<span class="normal">1020</span>
<span class="normal">1021</span>
<span class="normal">1022</span>
<span class="normal">1023</span>
<span class="normal">1024</span>
<span class="normal">1025</span>
<span class="normal">1026</span>
<span class="normal">1027</span>
<span class="normal">1028</span>
<span class="normal">1029</span>
<span class="normal">1030</span>
<span class="normal">1031</span>
<span class="normal">1032</span>
<span class="normal">1033</span>
<span class="normal">1034</span>
<span class="normal">1035</span>
<span class="normal">1036</span>
<span class="normal">1037</span>
<span class="normal">1038</span>
<span class="normal">1039</span>
<span class="normal">1040</span>
<span class="normal">1041</span>
<span class="normal">1042</span>
<span class="normal">1043</span>
<span class="normal">1044</span>
<span class="normal">1045</span>
<span class="normal">1046</span>
<span class="normal">1047</span>
<span class="normal">1048</span>
<span class="normal">1049</span>
<span class="normal">1050</span>
<span class="normal">1051</span>
<span class="normal">1052</span>
<span class="normal">1053</span>
<span class="normal">1054</span>
<span class="normal">1055</span>
<span class="normal">1056</span>
<span class="normal">1057</span>
<span class="normal">1058</span>
<span class="normal">1059</span>
<span class="normal">1060</span>
<span class="normal">1061</span>
<span class="normal">1062</span>
<span class="normal">1063</span>
<span class="normal">1064</span>
<span class="normal">1065</span>
<span class="normal">1066</span>
<span class="normal">1067</span>
<span class="normal">1068</span>
<span class="normal">1069</span>
<span class="normal">1070</span>
<span class="normal">1071</span>
<span class="normal">1072</span>
<span class="normal">1073</span>
<span class="normal">1074</span>
<span class="normal">1075</span>
<span class="normal">1076</span>
<span class="normal">1077</span>
<span class="normal">1078</span>
<span class="normal">1079</span>
<span class="normal">1080</span>
<span class="normal">1081</span>
<span class="normal">1082</span>
<span class="normal">1083</span>
<span class="normal">1084</span>
<span class="normal">1085</span>
<span class="normal">1086</span>
<span class="normal">1087</span>
<span class="normal">1088</span>
<span class="normal">1089</span>
<span class="normal">1090</span>
<span class="normal">1091</span>
<span class="normal">1092</span>
<span class="normal">1093</span>
<span class="normal">1094</span>
<span class="normal">1095</span>
<span class="normal">1096</span>
<span class="normal">1097</span>
<span class="normal">1098</span>
<span class="normal">1099</span>
<span class="normal">1100</span>
<span class="normal">1101</span>
<span class="normal">1102</span>
<span class="normal">1103</span>
<span class="normal">1104</span>
<span class="normal">1105</span>
<span class="normal">1106</span>
<span class="normal">1107</span>
<span class="normal">1108</span>
<span class="normal">1109</span>
<span class="normal">1110</span>
<span class="normal">1111</span>
<span class="normal">1112</span>
<span class="normal">1113</span>
<span class="normal">1114</span>
<span class="normal">1115</span>
<span class="normal">1116</span>
<span class="normal">1117</span>
<span class="normal">1118</span>
<span class="normal">1119</span>
<span class="normal">1120</span>
<span class="normal">1121</span>
<span class="normal">1122</span>
<span class="normal">1123</span>
<span class="normal">1124</span>
<span class="normal">1125</span>
<span class="normal">1126</span>
<span class="normal">1127</span>
<span class="normal">1128</span>
<span class="normal">1129</span>
<span class="normal">1130</span>
<span class="normal">1131</span>
<span class="normal">1132</span>
<span class="normal">1133</span>
<span class="normal">1134</span>
<span class="normal">1135</span>
<span class="normal">1136</span>
<span class="normal">1137</span>
<span class="normal">1138</span>
<span class="normal">1139</span>
<span class="normal">1140</span>
<span class="normal">1141</span>
<span class="normal">1142</span>
<span class="normal">1143</span>
<span class="normal">1144</span>
<span class="normal">1145</span>
<span class="normal">1146</span>
<span class="normal">1147</span>
<span class="normal">1148</span>
<span class="normal">1149</span>
<span class="normal">1150</span>
<span class="normal">1151</span>
<span class="normal">1152</span>
<span class="normal">1153</span>
<span class="normal">1154</span>
<span class="normal">1155</span>
<span class="normal">1156</span>
<span class="normal">1157</span>
<span class="normal">1158</span>
<span class="normal">1159</span>
<span class="normal">1160</span>
<span class="normal">1161</span>
<span class="normal">1162</span>
<span class="normal">1163</span>
<span class="normal">1164</span>
<span class="normal">1165</span>
<span class="normal">1166</span>
<span class="normal">1167</span>
<span class="normal">1168</span>
<span class="normal">1169</span>
<span class="normal">1170</span>
<span class="normal">1171</span>
<span class="normal">1172</span>
<span class="normal">1173</span>
<span class="normal">1174</span>
<span class="normal">1175</span>
<span class="normal">1176</span>
<span class="normal">1177</span>
<span class="normal">1178</span>
<span class="normal">1179</span>
<span class="normal">1180</span>
<span class="normal">1181</span>
<span class="normal">1182</span>
<span class="normal">1183</span>
<span class="normal">1184</span>
<span class="normal">1185</span>
<span class="normal">1186</span>
<span class="normal">1187</span>
<span class="normal">1188</span>
<span class="normal">1189</span>
<span class="normal">1190</span>
<span class="normal">1191</span>
<span class="normal">1192</span>
<span class="normal">1193</span>
<span class="normal">1194</span>
<span class="normal">1195</span>
<span class="normal">1196</span>
<span class="normal">1197</span>
<span class="normal">1198</span>
<span class="normal">1199</span>
<span class="normal">1200</span>
<span class="normal">1201</span>
<span class="normal">1202</span>
<span class="normal">1203</span>
<span class="normal">1204</span>
<span class="normal">1205</span>
<span class="normal">1206</span>
<span class="normal">1207</span>
<span class="normal">1208</span>
<span class="normal">1209</span>
<span class="normal">1210</span>
<span class="normal">1211</span>
<span class="normal">1212</span>
<span class="normal">1213</span>
<span class="normal">1214</span>
<span class="normal">1215</span>
<span class="normal">1216</span>
<span class="normal">1217</span>
<span class="normal">1218</span>
<span class="normal">1219</span>
<span class="normal">1220</span>
<span class="normal">1221</span>
<span class="normal">1222</span>
<span class="normal">1223</span>
<span class="normal">1224</span>
<span class="normal">1225</span>
<span class="normal">1226</span>
<span class="normal">1227</span>
<span class="normal">1228</span>
<span class="normal">1229</span>
<span class="normal">1230</span>
<span class="normal">1231</span>
<span class="normal">1232</span>
<span class="normal">1233</span>
<span class="normal">1234</span>
<span class="normal">1235</span>
<span class="normal">1236</span>
<span class="normal">1237</span>
<span class="normal">1238</span>
<span class="normal">1239</span>
<span class="normal">1240</span>
<span class="normal">1241</span>
<span class="normal">1242</span>
<span class="normal">1243</span>
<span class="normal">1244</span>
<span class="normal">1245</span>
<span class="normal">1246</span>
<span class="normal">1247</span>
<span class="normal">1248</span>
<span class="normal">1249</span>
<span class="normal">1250</span>
<span class="normal">1251</span>
<span class="normal">1252</span>
<span class="normal">1253</span>
<span class="normal">1254</span>
<span class="normal">1255</span>
<span class="normal">1256</span>
<span class="normal">1257</span>
<span class="normal">1258</span>
<span class="normal">1259</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">SympyOptimizer</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Manages algebra optimization and Common Subexpression Elimination (CSE) via SymPy.</span>
<span class="sd"> This optimization engine:</span>
<span class="sd"> 1. Expands intermediate temporary variables recursively.</span>
<span class="sd"> 2. Simplifies arithmetic terms (fraction cancellation, trigonometric expansions).</span>
<span class="sd"> 3. Runs CSE to pull duplicate sub-operations out into loop local scalar variables,</span>
<span class="sd"> significantly reducing FLOPS and memory bandwidth requirements.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_instance</span> <span class="o">=</span> <span class="kc">None</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">get_instance</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Retrieves or instantiates the singleton optimizer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Current variable field registry mapping name -&gt; FieldBase object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> SympyOptimizer: The active singleton instance.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span><span class="o">.</span><span class="n">fdict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">fdict</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes SympyOptimizer registry caches.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Variable field registry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exported_fields</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
<span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;attr&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">attr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;export&#39;</span><span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">set_averaged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">averaged_dict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Sets the targets and names of averaged variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> averaged_dict (dict): Dictionary mapping average variable names to AveragedField objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="o">.</span><span class="n">target</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">averaged_dict</span><span class="o">.</span><span class="n">values</span><span class="p">()}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">averaged_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">get_sympy_expr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Recursively builds and caches a fully substituted SymPy Expression for a variable.</span>
<span class="sd"> Avoids expanding boundary fields (PrimaryField, DerivedField representing spatial derivatives,</span>
<span class="sd"> AveragedField, and FluctuationField) to preserve the grid boundaries. Expands other temporary variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy node representing the fully-expanded mathematical expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="n">field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;prime&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">prime</span><span class="p">:</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;op&#39;</span><span class="p">):</span> <span class="c1"># DerivedField (ddx, etc.)</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;weighted&#39;</span><span class="p">):</span> <span class="c1"># AveragedField</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;field&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">):</span> <span class="c1"># FluctuationField</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="n">transformer</span> <span class="o">=</span> <span class="n">LarkToSympy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">transformer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="c1"># Recursively substitute intermediate variables</span>
<span class="n">expanded_expr</span> <span class="o">=</span> <span class="n">expr</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">while</span> <span class="n">changed</span><span class="p">:</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">free_syms</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">expanded_expr</span><span class="o">.</span><span class="n">free_symbols</span><span class="p">)</span>
<span class="n">sub_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">free_syms</span><span class="p">:</span>
<span class="n">sym_name</span> <span class="o">=</span> <span class="n">sym</span><span class="o">.</span><span class="n">name</span>
<span class="k">if</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">:</span>
<span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">sym_name</span><span class="p">]</span>
<span class="n">is_derived_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;op&#39;</span><span class="p">)</span>
<span class="n">is_averaged_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;weighted&#39;</span><span class="p">)</span>
<span class="n">is_primary_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;prime&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">prime</span>
<span class="n">is_exported</span> <span class="o">=</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">exported_fields</span>
<span class="n">is_averaged_target</span> <span class="o">=</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_derived_field</span> <span class="ow">or</span> <span class="n">is_averaged_field</span> <span class="ow">or</span> <span class="n">is_primary_field</span> <span class="ow">or</span> <span class="n">is_exported</span> <span class="ow">or</span> <span class="n">is_averaged_target</span><span class="p">):</span>
<span class="n">sub_dict</span><span class="p">[</span><span class="n">sym</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">sym_name</span><span class="p">)</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">sub_dict</span><span class="p">:</span>
<span class="n">expanded_expr</span> <span class="o">=</span> <span class="n">expanded_expr</span><span class="o">.</span><span class="n">subs</span><span class="p">(</span><span class="n">sub_dict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expanded_expr</span>
<span class="k">return</span> <span class="n">expanded_expr</span>
<span class="k">def</span> <span class="nf">calculate_flops_and_heavy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Measures computational cost (FLOPS and heavy operators) for a SymPy expression.</span>
<span class="sd"> Useful for logging optimization statistics.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Expr): The expression to evaluate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (flops_count, heavy_operators_count).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">flops</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">heavy</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">sympy</span><span class="o">.</span><span class="n">preorder_traversal</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Add</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Mul</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Pow</span><span class="p">):</span>
<span class="n">base</span><span class="p">,</span> <span class="n">exp</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">exp</span> <span class="o">==</span> <span class="mf">0.5</span> <span class="ow">or</span> <span class="n">exp</span> <span class="o">==</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span> <span class="c1"># Square root/inv square root weight</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">exp</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">4</span> <span class="c1"># Division weight</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Integer</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">exp</span><span class="p">))</span>
<span class="k">if</span> <span class="n">val</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="n">val</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">sympy</span><span class="o">.</span><span class="n">Derivative</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">)):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;sqrt&#39;</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;exp&#39;</span><span class="p">,</span> <span class="s1">&#39;log&#39;</span><span class="p">,</span> <span class="s1">&#39;sin&#39;</span><span class="p">,</span> <span class="s1">&#39;cos&#39;</span><span class="p">,</span> <span class="s1">&#39;tan&#39;</span><span class="p">,</span> <span class="s1">&#39;rxn_rate&#39;</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;Abs&#39;</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">flops</span><span class="p">,</span> <span class="n">heavy</span>
<span class="k">def</span> <span class="nf">count_3d_loads</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Counts the total 3D array memory read accesses in the expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Expr): The expression to analyze.</span>
<span class="sd"> three_d_arrays (set): Names of active 3D arrays.</span>
<span class="sd"> Returns:</span>
<span class="sd"> int: The memory load count.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">sympy</span><span class="o">.</span><span class="n">preorder_traversal</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">three_d_arrays</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">count</span>
<span class="k">def</span> <span class="nf">optimize_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Optimizes a physical field expression and extracts Common Subexpressions.</span>
<span class="sd"> Applies SymPy simplification and CSE, printing optimization reports to stderr.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the field to optimize.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation mapping. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (rhs_code, cse_declarations, cse_assignments) where:</span>
<span class="sd"> rhs_code (str): The final right hand side Fortran expression.</span>
<span class="sd"> cse_declarations (list of str): Code strings to declare local CSE scalars.</span>
<span class="sd"> cse_assignments (list of str): Code strings to calculate CSE values.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">three_d_arrays</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">&#39;dim&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">dim</span> <span class="o">==</span> <span class="s1">&#39;:,:,:&#39;</span>
<span class="p">}</span>
<span class="c1"># Optimization metrics before</span>
<span class="n">before_flops</span><span class="p">,</span> <span class="n">before_heavy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="n">before_loads</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="c1"># Simplify expression</span>
<span class="n">simplified_expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">simplify</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="n">simplified_expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">cancel</span><span class="p">(</span><span class="n">simplified_expr</span><span class="p">)</span>
<span class="n">array_symbols</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">&#39;array&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">array</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">array</span>
<span class="k">elif</span> <span class="n">alloc</span> <span class="ow">and</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">alloc</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span>
<span class="n">avg_symbols</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;avg_names&#39;</span><span class="p">,</span> <span class="p">[])}</span>
<span class="n">printer</span> <span class="o">=</span> <span class="n">ArrayFCodePrinter</span><span class="p">(</span><span class="n">array_symbols</span><span class="o">=</span><span class="n">array_symbols</span><span class="p">,</span> <span class="n">avg_symbols</span><span class="o">=</span><span class="n">avg_symbols</span><span class="p">)</span>
<span class="c1"># Perform Common Subexpression Elimination</span>
<span class="n">replacements</span><span class="p">,</span> <span class="n">reduced_exprs</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">cse</span><span class="p">(</span><span class="n">simplified_expr</span><span class="p">)</span>
<span class="n">reduced_expr</span> <span class="o">=</span> <span class="n">reduced_exprs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Optimization metrics after</span>
<span class="n">after_flops</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">after_heavy</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">after_loads</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">temp_var</span><span class="p">,</span> <span class="n">temp_expr</span> <span class="ow">in</span> <span class="n">replacements</span><span class="p">:</span>
<span class="n">f_val</span><span class="p">,</span> <span class="n">h_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">)</span>
<span class="n">after_flops</span> <span class="o">+=</span> <span class="n">f_val</span>
<span class="n">after_heavy</span> <span class="o">+=</span> <span class="n">h_val</span>
<span class="n">after_loads</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="n">f_val</span><span class="p">,</span> <span class="n">h_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">)</span>
<span class="n">after_flops</span> <span class="o">+=</span> <span class="n">f_val</span>
<span class="n">after_heavy</span> <span class="o">+=</span> <span class="n">h_val</span>
<span class="n">after_loads</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pct_str</span><span class="p">(</span><span class="n">before</span><span class="p">,</span> <span class="n">after</span><span class="p">):</span>
<span class="k">if</span> <span class="n">before</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;0.0%&quot;</span> <span class="k">if</span> <span class="n">after</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;+inf%&quot;</span>
<span class="n">diff</span> <span class="o">=</span> <span class="n">after</span> <span class="o">-</span> <span class="n">before</span>
<span class="n">pct</span> <span class="o">=</span> <span class="p">(</span><span class="n">diff</span> <span class="o">/</span> <span class="n">before</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">pct</span><span class="si">:</span><span class="s2">+.1f</span><span class="si">}</span><span class="s2">%&quot;</span>
<span class="n">flops_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_flops</span><span class="p">,</span> <span class="n">after_flops</span><span class="p">)</span>
<span class="n">heavy_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_heavy</span><span class="p">,</span> <span class="n">after_heavy</span><span class="p">)</span>
<span class="n">loads_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_loads</span><span class="p">,</span> <span class="n">after_loads</span><span class="p">)</span>
<span class="k">if</span> <span class="n">after_flops</span> <span class="o">&lt;</span> <span class="n">before_flops</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="ow">or</span> <span class="n">after_loads</span> <span class="o">&lt;</span> <span class="n">before_loads</span> <span class="o">*</span> <span class="mf">0.5</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Highly significant&quot;</span>
<span class="k">elif</span> <span class="n">after_flops</span> <span class="o">&lt;</span> <span class="n">before_flops</span> <span class="ow">or</span> <span class="n">after_loads</span> <span class="o">&lt;</span> <span class="n">before_loads</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Moderate&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Minimal / Already optimal&quot;</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">[SymPy Optimizer Report: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- Floating Point Ops : </span><span class="si">{</span><span class="n">before_flops</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_flops</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">flops_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- Heavy Ops (Div/Sqrt): </span><span class="si">{</span><span class="n">before_heavy</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_heavy</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">heavy_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- 3D Array Mem Reads : </span><span class="si">{</span><span class="n">before_loads</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_loads</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">loads_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;=&gt; Estimated Speedup in loop: </span><span class="si">{</span><span class="n">est_speedup</span><span class="si">}</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">cse_decls</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">cse_assigns</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">replacements</span><span class="p">:</span>
<span class="k">for</span> <span class="n">temp_var</span><span class="p">,</span> <span class="n">temp_expr</span> <span class="ow">in</span> <span class="n">replacements</span><span class="p">:</span>
<span class="n">cse_decls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;real(real64) :: </span><span class="si">{</span><span class="n">temp_var</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">cse_assigns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">temp_var</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">printer</span><span class="o">.</span><span class="n">doprint</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">printer</span><span class="o">.</span><span class="n">doprint</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">cse_decls</span><span class="p">,</span> <span class="n">cse_assigns</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.__init__" class="doc doc-heading">
<code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Initializes SympyOptimizer registry caches.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable field registry.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1008</span>
<span class="normal">1009</span>
<span class="normal">1010</span>
<span class="normal">1011</span>
<span class="normal">1012</span>
<span class="normal">1013</span>
<span class="normal">1014</span>
<span class="normal">1015</span>
<span class="normal">1016</span>
<span class="normal">1017</span>
<span class="normal">1018</span>
<span class="normal">1019</span>
<span class="normal">1020</span>
<span class="normal">1021</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Initializes SympyOptimizer registry caches.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Variable field registry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fdict</span> <span class="o">=</span> <span class="n">fdict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exported_fields</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
<span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;attr&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">attr</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;export&#39;</span><span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.calculate_flops_and_heavy" class="doc doc-heading">
<code class="highlight language-python"><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Measures computational cost (FLOPS and heavy operators) for a SymPy expression.</p>
<p>Useful for logging optimization statistics.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>expr</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The expression to evaluate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(flops_count, heavy_operators_count).</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1099</span>
<span class="normal">1100</span>
<span class="normal">1101</span>
<span class="normal">1102</span>
<span class="normal">1103</span>
<span class="normal">1104</span>
<span class="normal">1105</span>
<span class="normal">1106</span>
<span class="normal">1107</span>
<span class="normal">1108</span>
<span class="normal">1109</span>
<span class="normal">1110</span>
<span class="normal">1111</span>
<span class="normal">1112</span>
<span class="normal">1113</span>
<span class="normal">1114</span>
<span class="normal">1115</span>
<span class="normal">1116</span>
<span class="normal">1117</span>
<span class="normal">1118</span>
<span class="normal">1119</span>
<span class="normal">1120</span>
<span class="normal">1121</span>
<span class="normal">1122</span>
<span class="normal">1123</span>
<span class="normal">1124</span>
<span class="normal">1125</span>
<span class="normal">1126</span>
<span class="normal">1127</span>
<span class="normal">1128</span>
<span class="normal">1129</span>
<span class="normal">1130</span>
<span class="normal">1131</span>
<span class="normal">1132</span>
<span class="normal">1133</span>
<span class="normal">1134</span>
<span class="normal">1135</span>
<span class="normal">1136</span>
<span class="normal">1137</span>
<span class="normal">1138</span>
<span class="normal">1139</span>
<span class="normal">1140</span>
<span class="normal">1141</span>
<span class="normal">1142</span>
<span class="normal">1143</span>
<span class="normal">1144</span>
<span class="normal">1145</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">calculate_flops_and_heavy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Measures computational cost (FLOPS and heavy operators) for a SymPy expression.</span>
<span class="sd"> Useful for logging optimization statistics.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Expr): The expression to evaluate.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (flops_count, heavy_operators_count).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">flops</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">heavy</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">sympy</span><span class="o">.</span><span class="n">preorder_traversal</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Add</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Mul</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Pow</span><span class="p">):</span>
<span class="n">base</span><span class="p">,</span> <span class="n">exp</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span>
<span class="k">if</span> <span class="n">exp</span> <span class="o">==</span> <span class="mf">0.5</span> <span class="ow">or</span> <span class="n">exp</span> <span class="o">==</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span> <span class="c1"># Square root/inv square root weight</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">exp</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">4</span> <span class="c1"># Division weight</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Integer</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">exp</span><span class="p">))</span>
<span class="k">if</span> <span class="n">val</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="n">val</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">sympy</span><span class="o">.</span><span class="n">Derivative</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Function</span><span class="p">)):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;sqrt&#39;</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;exp&#39;</span><span class="p">,</span> <span class="s1">&#39;log&#39;</span><span class="p">,</span> <span class="s1">&#39;sin&#39;</span><span class="p">,</span> <span class="s1">&#39;cos&#39;</span><span class="p">,</span> <span class="s1">&#39;tan&#39;</span><span class="p">,</span> <span class="s1">&#39;rxn_rate&#39;</span><span class="p">):</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;Abs&#39;</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">flops</span> <span class="o">+=</span> <span class="mi">10</span>
<span class="n">heavy</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">flops</span><span class="p">,</span> <span class="n">heavy</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.count_3d_loads" class="doc doc-heading">
<code class="highlight language-python"><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Counts the total 3D array memory read accesses in the expression.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>expr</code></td>
<td>
<code><span title="sympy.Expr">Expr</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The expression to analyze.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>three_d_arrays</code></td>
<td>
<code>set</code>
</td>
<td>
<div class="doc-md-description">
<p>Names of active 3D arrays.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>int</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>The memory load count.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1147</span>
<span class="normal">1148</span>
<span class="normal">1149</span>
<span class="normal">1150</span>
<span class="normal">1151</span>
<span class="normal">1152</span>
<span class="normal">1153</span>
<span class="normal">1154</span>
<span class="normal">1155</span>
<span class="normal">1156</span>
<span class="normal">1157</span>
<span class="normal">1158</span>
<span class="normal">1159</span>
<span class="normal">1160</span>
<span class="normal">1161</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">count_3d_loads</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Counts the total 3D array memory read accesses in the expression.</span>
<span class="sd"> Args:</span>
<span class="sd"> expr (sympy.Expr): The expression to analyze.</span>
<span class="sd"> three_d_arrays (set): Names of active 3D arrays.</span>
<span class="sd"> Returns:</span>
<span class="sd"> int: The memory load count.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">sympy</span><span class="o">.</span><span class="n">preorder_traversal</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">three_d_arrays</span><span class="p">:</span>
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">count</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.get_instance" class="doc doc-heading">
<code class="highlight language-python"><span class="n">get_instance</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span></code>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="doc doc-contents ">
<p>Retrieves or instantiates the singleton optimizer.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>fdict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Current variable field registry mapping name -&gt; FieldBase object.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>SympyOptimizer</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>The active singleton instance.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 994</span>
<span class="normal"> 995</span>
<span class="normal"> 996</span>
<span class="normal"> 997</span>
<span class="normal"> 998</span>
<span class="normal"> 999</span>
<span class="normal">1000</span>
<span class="normal">1001</span>
<span class="normal">1002</span>
<span class="normal">1003</span>
<span class="normal">1004</span>
<span class="normal">1005</span>
<span class="normal">1006</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">get_instance</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">fdict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Retrieves or instantiates the singleton optimizer.</span>
<span class="sd"> Args:</span>
<span class="sd"> fdict (dict): Current variable field registry mapping name -&gt; FieldBase object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> SympyOptimizer: The active singleton instance.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span><span class="o">.</span><span class="n">fdict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">fdict</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="n">fdict</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_instance</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.get_sympy_expr" class="doc doc-heading">
<code class="highlight language-python"><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Recursively builds and caches a fully substituted SymPy Expression for a variable.</p>
<p>Avoids expanding boundary fields (PrimaryField, DerivedField representing spatial derivatives,
AveragedField, and FluctuationField) to preserve the grid boundaries. Expands other temporary variables.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>Variable name.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
</td>
<td>
<div class="doc-md-description">
<p>sympy.Expr: SymPy node representing the fully-expanded mathematical expression.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1032</span>
<span class="normal">1033</span>
<span class="normal">1034</span>
<span class="normal">1035</span>
<span class="normal">1036</span>
<span class="normal">1037</span>
<span class="normal">1038</span>
<span class="normal">1039</span>
<span class="normal">1040</span>
<span class="normal">1041</span>
<span class="normal">1042</span>
<span class="normal">1043</span>
<span class="normal">1044</span>
<span class="normal">1045</span>
<span class="normal">1046</span>
<span class="normal">1047</span>
<span class="normal">1048</span>
<span class="normal">1049</span>
<span class="normal">1050</span>
<span class="normal">1051</span>
<span class="normal">1052</span>
<span class="normal">1053</span>
<span class="normal">1054</span>
<span class="normal">1055</span>
<span class="normal">1056</span>
<span class="normal">1057</span>
<span class="normal">1058</span>
<span class="normal">1059</span>
<span class="normal">1060</span>
<span class="normal">1061</span>
<span class="normal">1062</span>
<span class="normal">1063</span>
<span class="normal">1064</span>
<span class="normal">1065</span>
<span class="normal">1066</span>
<span class="normal">1067</span>
<span class="normal">1068</span>
<span class="normal">1069</span>
<span class="normal">1070</span>
<span class="normal">1071</span>
<span class="normal">1072</span>
<span class="normal">1073</span>
<span class="normal">1074</span>
<span class="normal">1075</span>
<span class="normal">1076</span>
<span class="normal">1077</span>
<span class="normal">1078</span>
<span class="normal">1079</span>
<span class="normal">1080</span>
<span class="normal">1081</span>
<span class="normal">1082</span>
<span class="normal">1083</span>
<span class="normal">1084</span>
<span class="normal">1085</span>
<span class="normal">1086</span>
<span class="normal">1087</span>
<span class="normal">1088</span>
<span class="normal">1089</span>
<span class="normal">1090</span>
<span class="normal">1091</span>
<span class="normal">1092</span>
<span class="normal">1093</span>
<span class="normal">1094</span>
<span class="normal">1095</span>
<span class="normal">1096</span>
<span class="normal">1097</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_sympy_expr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Recursively builds and caches a fully substituted SymPy Expression for a variable.</span>
<span class="sd"> Avoids expanding boundary fields (PrimaryField, DerivedField representing spatial derivatives,</span>
<span class="sd"> AveragedField, and FluctuationField) to preserve the grid boundaries. Expands other temporary variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): Variable name.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sympy.Expr: SymPy node representing the fully-expanded mathematical expression.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="n">field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;prime&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">prime</span><span class="p">:</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;op&#39;</span><span class="p">):</span> <span class="c1"># DerivedField (ddx, etc.)</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;weighted&#39;</span><span class="p">):</span> <span class="c1"># AveragedField</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;field&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">):</span> <span class="c1"># FluctuationField</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">Symbol</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expr</span>
<span class="k">return</span> <span class="n">expr</span>
<span class="n">transformer</span> <span class="o">=</span> <span class="n">LarkToSympy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">)</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">transformer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="c1"># Recursively substitute intermediate variables</span>
<span class="n">expanded_expr</span> <span class="o">=</span> <span class="n">expr</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">while</span> <span class="n">changed</span><span class="p">:</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">free_syms</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">expanded_expr</span><span class="o">.</span><span class="n">free_symbols</span><span class="p">)</span>
<span class="n">sub_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">free_syms</span><span class="p">:</span>
<span class="n">sym_name</span> <span class="o">=</span> <span class="n">sym</span><span class="o">.</span><span class="n">name</span>
<span class="k">if</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">:</span>
<span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="p">[</span><span class="n">sym_name</span><span class="p">]</span>
<span class="n">is_derived_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;op&#39;</span><span class="p">)</span>
<span class="n">is_averaged_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;weighted&#39;</span><span class="p">)</span>
<span class="n">is_primary_field</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;prime&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">prime</span>
<span class="n">is_exported</span> <span class="o">=</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">exported_fields</span>
<span class="n">is_averaged_target</span> <span class="o">=</span> <span class="n">sym_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_derived_field</span> <span class="ow">or</span> <span class="n">is_averaged_field</span> <span class="ow">or</span> <span class="n">is_primary_field</span> <span class="ow">or</span> <span class="n">is_exported</span> <span class="ow">or</span> <span class="n">is_averaged_target</span><span class="p">):</span>
<span class="n">sub_dict</span><span class="p">[</span><span class="n">sym</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">sym_name</span><span class="p">)</span>
<span class="n">changed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">sub_dict</span><span class="p">:</span>
<span class="n">expanded_expr</span> <span class="o">=</span> <span class="n">expanded_expr</span><span class="o">.</span><span class="n">subs</span><span class="p">(</span><span class="n">sub_dict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sympy_cache</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expanded_expr</span>
<span class="k">return</span> <span class="n">expanded_expr</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.optimize_field" class="doc doc-heading">
<code class="highlight language-python"><span class="n">optimize_field</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Optimizes a physical field expression and extracts Common Subexpressions.</p>
<p>Applies SymPy simplification and CSE, printing optimization reports to stderr.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>The name of the field to optimize.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>alloc</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Buffer allocation mapping. Defaults to None.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>tuple</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>(rhs_code, cse_declarations, cse_assignments) where:
rhs_code (str): The final right hand side Fortran expression.
cse_declarations (list of str): Code strings to declare local CSE scalars.
cse_assignments (list of str): Code strings to calculate CSE values.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1163</span>
<span class="normal">1164</span>
<span class="normal">1165</span>
<span class="normal">1166</span>
<span class="normal">1167</span>
<span class="normal">1168</span>
<span class="normal">1169</span>
<span class="normal">1170</span>
<span class="normal">1171</span>
<span class="normal">1172</span>
<span class="normal">1173</span>
<span class="normal">1174</span>
<span class="normal">1175</span>
<span class="normal">1176</span>
<span class="normal">1177</span>
<span class="normal">1178</span>
<span class="normal">1179</span>
<span class="normal">1180</span>
<span class="normal">1181</span>
<span class="normal">1182</span>
<span class="normal">1183</span>
<span class="normal">1184</span>
<span class="normal">1185</span>
<span class="normal">1186</span>
<span class="normal">1187</span>
<span class="normal">1188</span>
<span class="normal">1189</span>
<span class="normal">1190</span>
<span class="normal">1191</span>
<span class="normal">1192</span>
<span class="normal">1193</span>
<span class="normal">1194</span>
<span class="normal">1195</span>
<span class="normal">1196</span>
<span class="normal">1197</span>
<span class="normal">1198</span>
<span class="normal">1199</span>
<span class="normal">1200</span>
<span class="normal">1201</span>
<span class="normal">1202</span>
<span class="normal">1203</span>
<span class="normal">1204</span>
<span class="normal">1205</span>
<span class="normal">1206</span>
<span class="normal">1207</span>
<span class="normal">1208</span>
<span class="normal">1209</span>
<span class="normal">1210</span>
<span class="normal">1211</span>
<span class="normal">1212</span>
<span class="normal">1213</span>
<span class="normal">1214</span>
<span class="normal">1215</span>
<span class="normal">1216</span>
<span class="normal">1217</span>
<span class="normal">1218</span>
<span class="normal">1219</span>
<span class="normal">1220</span>
<span class="normal">1221</span>
<span class="normal">1222</span>
<span class="normal">1223</span>
<span class="normal">1224</span>
<span class="normal">1225</span>
<span class="normal">1226</span>
<span class="normal">1227</span>
<span class="normal">1228</span>
<span class="normal">1229</span>
<span class="normal">1230</span>
<span class="normal">1231</span>
<span class="normal">1232</span>
<span class="normal">1233</span>
<span class="normal">1234</span>
<span class="normal">1235</span>
<span class="normal">1236</span>
<span class="normal">1237</span>
<span class="normal">1238</span>
<span class="normal">1239</span>
<span class="normal">1240</span>
<span class="normal">1241</span>
<span class="normal">1242</span>
<span class="normal">1243</span>
<span class="normal">1244</span>
<span class="normal">1245</span>
<span class="normal">1246</span>
<span class="normal">1247</span>
<span class="normal">1248</span>
<span class="normal">1249</span>
<span class="normal">1250</span>
<span class="normal">1251</span>
<span class="normal">1252</span>
<span class="normal">1253</span>
<span class="normal">1254</span>
<span class="normal">1255</span>
<span class="normal">1256</span>
<span class="normal">1257</span>
<span class="normal">1258</span>
<span class="normal">1259</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">optimize_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">alloc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Optimizes a physical field expression and extracts Common Subexpressions.</span>
<span class="sd"> Applies SymPy simplification and CSE, printing optimization reports to stderr.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): The name of the field to optimize.</span>
<span class="sd"> alloc (dict, optional): Buffer allocation mapping. Defaults to None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: (rhs_code, cse_declarations, cse_assignments) where:</span>
<span class="sd"> rhs_code (str): The final right hand side Fortran expression.</span>
<span class="sd"> cse_declarations (list of str): Code strings to declare local CSE scalars.</span>
<span class="sd"> cse_assignments (list of str): Code strings to calculate CSE values.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">three_d_arrays</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">&#39;dim&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">dim</span> <span class="o">==</span> <span class="s1">&#39;:,:,:&#39;</span>
<span class="p">}</span>
<span class="c1"># Optimization metrics before</span>
<span class="n">before_flops</span><span class="p">,</span> <span class="n">before_heavy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="n">before_loads</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="c1"># Simplify expression</span>
<span class="n">simplified_expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">simplify</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<span class="n">simplified_expr</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">cancel</span><span class="p">(</span><span class="n">simplified_expr</span><span class="p">)</span>
<span class="n">array_symbols</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">&#39;array&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span><span class="o">.</span><span class="n">array</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">array</span>
<span class="k">elif</span> <span class="n">alloc</span> <span class="ow">and</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">alloc</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">alloc</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">array_symbols</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span>
<span class="n">avg_symbols</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;avg_names&#39;</span><span class="p">,</span> <span class="p">[])}</span>
<span class="n">printer</span> <span class="o">=</span> <span class="n">ArrayFCodePrinter</span><span class="p">(</span><span class="n">array_symbols</span><span class="o">=</span><span class="n">array_symbols</span><span class="p">,</span> <span class="n">avg_symbols</span><span class="o">=</span><span class="n">avg_symbols</span><span class="p">)</span>
<span class="c1"># Perform Common Subexpression Elimination</span>
<span class="n">replacements</span><span class="p">,</span> <span class="n">reduced_exprs</span> <span class="o">=</span> <span class="n">sympy</span><span class="o">.</span><span class="n">cse</span><span class="p">(</span><span class="n">simplified_expr</span><span class="p">)</span>
<span class="n">reduced_expr</span> <span class="o">=</span> <span class="n">reduced_exprs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Optimization metrics after</span>
<span class="n">after_flops</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">after_heavy</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">after_loads</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">temp_var</span><span class="p">,</span> <span class="n">temp_expr</span> <span class="ow">in</span> <span class="n">replacements</span><span class="p">:</span>
<span class="n">f_val</span><span class="p">,</span> <span class="n">h_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">)</span>
<span class="n">after_flops</span> <span class="o">+=</span> <span class="n">f_val</span>
<span class="n">after_heavy</span> <span class="o">+=</span> <span class="n">h_val</span>
<span class="n">after_loads</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="n">f_val</span><span class="p">,</span> <span class="n">h_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calculate_flops_and_heavy</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">)</span>
<span class="n">after_flops</span> <span class="o">+=</span> <span class="n">f_val</span>
<span class="n">after_heavy</span> <span class="o">+=</span> <span class="n">h_val</span>
<span class="n">after_loads</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_3d_loads</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">,</span> <span class="n">three_d_arrays</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pct_str</span><span class="p">(</span><span class="n">before</span><span class="p">,</span> <span class="n">after</span><span class="p">):</span>
<span class="k">if</span> <span class="n">before</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;0.0%&quot;</span> <span class="k">if</span> <span class="n">after</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;+inf%&quot;</span>
<span class="n">diff</span> <span class="o">=</span> <span class="n">after</span> <span class="o">-</span> <span class="n">before</span>
<span class="n">pct</span> <span class="o">=</span> <span class="p">(</span><span class="n">diff</span> <span class="o">/</span> <span class="n">before</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">pct</span><span class="si">:</span><span class="s2">+.1f</span><span class="si">}</span><span class="s2">%&quot;</span>
<span class="n">flops_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_flops</span><span class="p">,</span> <span class="n">after_flops</span><span class="p">)</span>
<span class="n">heavy_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_heavy</span><span class="p">,</span> <span class="n">after_heavy</span><span class="p">)</span>
<span class="n">loads_pct</span> <span class="o">=</span> <span class="n">pct_str</span><span class="p">(</span><span class="n">before_loads</span><span class="p">,</span> <span class="n">after_loads</span><span class="p">)</span>
<span class="k">if</span> <span class="n">after_flops</span> <span class="o">&lt;</span> <span class="n">before_flops</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="ow">or</span> <span class="n">after_loads</span> <span class="o">&lt;</span> <span class="n">before_loads</span> <span class="o">*</span> <span class="mf">0.5</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Highly significant&quot;</span>
<span class="k">elif</span> <span class="n">after_flops</span> <span class="o">&lt;</span> <span class="n">before_flops</span> <span class="ow">or</span> <span class="n">after_loads</span> <span class="o">&lt;</span> <span class="n">before_loads</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Moderate&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">est_speedup</span> <span class="o">=</span> <span class="s2">&quot;Minimal / Already optimal&quot;</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">[SymPy Optimizer Report: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- Floating Point Ops : </span><span class="si">{</span><span class="n">before_flops</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_flops</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">flops_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- Heavy Ops (Div/Sqrt): </span><span class="si">{</span><span class="n">before_heavy</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_heavy</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">heavy_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;- 3D Array Mem Reads : </span><span class="si">{</span><span class="n">before_loads</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">after_loads</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">loads_pct</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;=&gt; Estimated Speedup in loop: </span><span class="si">{</span><span class="n">est_speedup</span><span class="si">}</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">cse_decls</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">cse_assigns</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">replacements</span><span class="p">:</span>
<span class="k">for</span> <span class="n">temp_var</span><span class="p">,</span> <span class="n">temp_expr</span> <span class="ow">in</span> <span class="n">replacements</span><span class="p">:</span>
<span class="n">cse_decls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;real(real64) :: </span><span class="si">{</span><span class="n">temp_var</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">cse_assigns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">temp_var</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">printer</span><span class="o">.</span><span class="n">doprint</span><span class="p">(</span><span class="n">temp_expr</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">rhs</span> <span class="o">=</span> <span class="n">printer</span><span class="o">.</span><span class="n">doprint</span><span class="p">(</span><span class="n">reduced_expr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">cse_decls</span><span class="p">,</span> <span class="n">cse_assigns</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="post.SympyOptimizer.set_averaged" class="doc doc-heading">
<code class="highlight language-python"><span class="n">set_averaged</span><span class="p">(</span><span class="n">averaged_dict</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Sets the targets and names of averaged variables.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>averaged_dict</code></td>
<td>
<code>dict</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping average variable names to AveragedField objects.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1023</span>
<span class="normal">1024</span>
<span class="normal">1025</span>
<span class="normal">1026</span>
<span class="normal">1027</span>
<span class="normal">1028</span>
<span class="normal">1029</span>
<span class="normal">1030</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_averaged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">averaged_dict</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Sets the targets and names of averaged variables.</span>
<span class="sd"> Args:</span>
<span class="sd"> averaged_dict (dict): Dictionary mapping average variable names to AveragedField objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">averaged_targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="o">.</span><span class="n">target</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">averaged_dict</span><span class="o">.</span><span class="n">values</span><span class="p">()}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">avg_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">averaged_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="post.SympySimplificationStage" class="doc doc-heading">
<code>SympySimplificationStage</code>
</h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code>object</code></p>
<p>Compiler pipeline Stage 3: Expands, simplifies equations and prunes dependencies.</p>
<p>This stage:
1. Invokes the SympyOptimizer to substitute and simplify equations.
2. Updates variable dependencies in CompilationContext to reflect optimized equations.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2500</span>
<span class="normal">2501</span>
<span class="normal">2502</span>
<span class="normal">2503</span>
<span class="normal">2504</span>
<span class="normal">2505</span>
<span class="normal">2506</span>
<span class="normal">2507</span>
<span class="normal">2508</span>
<span class="normal">2509</span>
<span class="normal">2510</span>
<span class="normal">2511</span>
<span class="normal">2512</span>
<span class="normal">2513</span>
<span class="normal">2514</span>
<span class="normal">2515</span>
<span class="normal">2516</span>
<span class="normal">2517</span>
<span class="normal">2518</span>
<span class="normal">2519</span>
<span class="normal">2520</span>
<span class="normal">2521</span>
<span class="normal">2522</span>
<span class="normal">2523</span>
<span class="normal">2524</span>
<span class="normal">2525</span>
<span class="normal">2526</span>
<span class="normal">2527</span>
<span class="normal">2528</span>
<span class="normal">2529</span>
<span class="normal">2530</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">SympySimplificationStage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compiler pipeline Stage 3: Expands, simplifies equations and prunes dependencies.</span>
<span class="sd"> This stage:</span>
<span class="sd"> 1. Invokes the SympyOptimizer to substitute and simplify equations.</span>
<span class="sd"> 2. Updates variable dependencies in CompilationContext to reflect optimized equations.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 3 mathematical expression expansion and dependency pruning.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context to update.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 1. SymPy 수식 최적화 엔진 초기화</span>
<span class="n">opt</span> <span class="o">=</span> <span class="n">SympyOptimizer</span><span class="o">.</span><span class="n">get_instance</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">opt</span><span class="o">.</span><span class="n">set_averaged</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span>
<span class="c1"># 2. SymPy가 대입식 치환(Substitution) 과정에서 제거한 불필요한 의존성 관계를 </span>
<span class="c1"># 의존성 그래프에 즉각 반영하여 실제 계산을 위한 의존성 체인을 슬림하게 정리합니다.</span>
<span class="n">updated_dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">dep_set</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="n">Field</span><span class="p">):</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># 실제 정리된 SymPy 식에 잔존하는 자유 기호 명칭들만 추출</span>
<span class="n">free_sym_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">sym</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">free_symbols</span><span class="p">}</span>
<span class="n">valid_deps</span> <span class="o">=</span> <span class="p">{</span><span class="n">dep</span> <span class="k">for</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">free_sym_names</span> <span class="k">if</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span> <span class="ow">or</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">}</span>
<span class="n">updated_dependency</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">valid_deps</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">updated_dependency</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">dep_set</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="n">updated_dependency</span>
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="post.SympySimplificationStage.execute" class="doc doc-heading">
<code class="highlight language-python"><span class="n">execute</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span></code>
</h4>
<div class="doc doc-contents ">
<p>Executes Stage 3 mathematical expression expansion and dependency pruning.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>ctx</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="post.CompilationContext" href="#post.CompilationContext">CompilationContext</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Active compilation context to update.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2508</span>
<span class="normal">2509</span>
<span class="normal">2510</span>
<span class="normal">2511</span>
<span class="normal">2512</span>
<span class="normal">2513</span>
<span class="normal">2514</span>
<span class="normal">2515</span>
<span class="normal">2516</span>
<span class="normal">2517</span>
<span class="normal">2518</span>
<span class="normal">2519</span>
<span class="normal">2520</span>
<span class="normal">2521</span>
<span class="normal">2522</span>
<span class="normal">2523</span>
<span class="normal">2524</span>
<span class="normal">2525</span>
<span class="normal">2526</span>
<span class="normal">2527</span>
<span class="normal">2528</span>
<span class="normal">2529</span>
<span class="normal">2530</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Executes Stage 3 mathematical expression expansion and dependency pruning.</span>
<span class="sd"> Args:</span>
<span class="sd"> ctx (CompilationContext): Active compilation context to update.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># 1. SymPy 수식 최적화 엔진 초기화</span>
<span class="n">opt</span> <span class="o">=</span> <span class="n">SympyOptimizer</span><span class="o">.</span><span class="n">get_instance</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">)</span>
<span class="n">opt</span><span class="o">.</span><span class="n">set_averaged</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">averaged</span><span class="p">)</span>
<span class="c1"># 2. SymPy가 대입식 치환(Substitution) 과정에서 제거한 불필요한 의존성 관계를 </span>
<span class="c1"># 의존성 그래프에 즉각 반영하여 실제 계산을 위한 의존성 체인을 슬림하게 정리합니다.</span>
<span class="n">updated_dependency</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">dep_set</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">derived</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="n">Field</span><span class="p">):</span>
<span class="n">expr</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">get_sympy_expr</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># 실제 정리된 SymPy 식에 잔존하는 자유 기호 명칭들만 추출</span>
<span class="n">free_sym_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">sym</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">free_symbols</span><span class="p">}</span>
<span class="n">valid_deps</span> <span class="o">=</span> <span class="p">{</span><span class="n">dep</span> <span class="k">for</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">free_sym_names</span> <span class="k">if</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">derived</span> <span class="ow">or</span> <span class="n">dep</span> <span class="ow">in</span> <span class="n">ctx</span><span class="o">.</span><span class="n">primary</span><span class="p">}</span>
<span class="n">updated_dependency</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">valid_deps</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">updated_dependency</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">dep_set</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">dependency</span> <span class="o">=</span> <span class="n">updated_dependency</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="post.make_allocate" class="doc doc-heading">
<code class="highlight language-python"><span class="n">make_allocate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">shape</span><span class="p">,</span> <span class="n">init_zero</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></code>
</h3>
<div class="doc doc-contents ">
<p>Fortran 배열을 동적 할당하고 예외 발생 시 프로세스를 안전하게 폭파시키는 할당 코드를 작성해 줍니다.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>name</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>할당할 배열의 이름.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>shape</code></td>
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>할당 크기 형태 (예: 'nxp,nyp,nzp').</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td><code>init_zero</code></td>
<td>
<code>bool</code>
</td>
<td>
<div class="doc-md-description">
<p>True인 경우 0.0d0으로 초기화 구문을 덧붙입니다. Defaults to True.</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td><code>str</code></td> <td>
</td>
<td>
<div class="doc-md-description">
<p>Fortran dynamic allocation code block.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1841</span>
<span class="normal">1842</span>
<span class="normal">1843</span>
<span class="normal">1844</span>
<span class="normal">1845</span>
<span class="normal">1846</span>
<span class="normal">1847</span>
<span class="normal">1848</span>
<span class="normal">1849</span>
<span class="normal">1850</span>
<span class="normal">1851</span>
<span class="normal">1852</span>
<span class="normal">1853</span>
<span class="normal">1854</span>
<span class="normal">1855</span>
<span class="normal">1856</span>
<span class="normal">1857</span>
<span class="normal">1858</span>
<span class="normal">1859</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">make_allocate</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">shape</span><span class="p">,</span> <span class="n">init_zero</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Fortran 배열을 동적 할당하고 예외 발생 시 프로세스를 안전하게 폭파시키는 할당 코드를 작성해 줍니다.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str): 할당할 배열의 이름.</span>
<span class="sd"> shape (str): 할당 크기 형태 (예: &#39;nxp,nyp,nzp&#39;).</span>
<span class="sd"> init_zero (bool, optional): True인 경우 0.0d0으로 초기화 구문을 덧붙입니다. Defaults to True.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Fortran dynamic allocation code block.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">alloc_str</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;allocate(</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="n">shape</span><span class="si">}</span><span class="s2">), stat=ierr)</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">alloc_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;if (ierr /= 0) then</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">alloc_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; write(0,*) &#39;Error: allocation of </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2"> failed on process&#39;, myid</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">alloc_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; call MPI_ABORT(MPI_COMM_TASK, 1, mpi_err)</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">alloc_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;end if&quot;</span>
<span class="k">if</span> <span class="n">init_zero</span><span class="p">:</span>
<span class="n">alloc_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2"> = 0.&quot;</span>
<span class="k">return</span> <span class="n">alloc_str</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="post.tok_to_bool" class="doc doc-heading">
<code class="highlight language-python"><span class="n">tok_to_bool</span><span class="p">(</span><span class="n">tok</span><span class="p">)</span></code>
</h3>
<div class="doc doc-contents ">
<p>Convert the value of <code>tok</code> from string to bool, while maintaining line number &amp; column.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2326</span>
<span class="normal">2327</span>
<span class="normal">2328</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">tok_to_bool</span><span class="p">(</span><span class="n">tok</span><span class="p">):</span>
<span class="s2">&quot;Convert the value of `tok` from string to bool, while maintaining line number &amp; column.&quot;</span>
<span class="k">return</span> <span class="n">Token</span><span class="o">.</span><span class="n">new_borrow_pos</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">tok</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="s2">&quot;true&quot;</span><span class="p">,</span> <span class="n">tok</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="post.tok_to_int" class="doc doc-heading">
<code class="highlight language-python"><span class="n">tok_to_int</span><span class="p">(</span><span class="n">tok</span><span class="p">)</span></code>
</h3>
<div class="doc doc-contents ">
<p>Convert the value of <code>tok</code> from string to int, while maintaining line number &amp; column.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2330</span>
<span class="normal">2331</span>
<span class="normal">2332</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">tok_to_int</span><span class="p">(</span><span class="n">tok</span><span class="p">):</span>
<span class="s2">&quot;Convert the value of `tok` from string to int, while maintaining line number &amp; column.&quot;</span>
<span class="k">return</span> <span class="n">Token</span><span class="o">.</span><span class="n">new_borrow_pos</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">tok</span><span class="p">),</span> <span class="n">tok</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="post.tok_to_str" class="doc doc-heading">
<code class="highlight language-python"><span class="n">tok_to_str</span><span class="p">(</span><span class="n">tok</span><span class="p">)</span></code>
</h3>
<div class="doc doc-contents ">
<p>Convert the value of <code>tok</code> from string to string, while maintaining line number &amp; column.</p>
<details class="quote">
<summary>Source code in <code>code/code_gen/post.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">2334</span>
<span class="normal">2335</span>
<span class="normal">2336</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">tok_to_str</span><span class="p">(</span><span class="n">tok</span><span class="p">):</span>
<span class="s2">&quot;Convert the value of `tok` from string to string, while maintaining line number &amp; column.&quot;</span>
<span class="k">return</span> <span class="n">Token</span><span class="o">.</span><span class="n">new_borrow_pos</span><span class="p">(</span><span class="n">tok</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">tok</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">),</span> <span class="n">tok</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>