Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .lychee.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ exclude = [
"https://mflowcode\\.github\\.io/sitemap\\.xml", # Only exists after deployment
"https://cpe\\.ext\\.hpe\\.com", # HPE Cray docs have broken SSL cert
"https://sc22\\.supercomputing\\.org", # Returns 415 to automated requests
"https://strawberryperl\\.com", # Frequently times out
]
32 changes: 32 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,38 @@ if (MFC_DOCUMENTATION)
GEN_DOCS(post_process "MFC: Post-Process")
GEN_DOCS(documentation "MFC")

# Generate API landing pages for pre_process, simulation, post_process.
# Scans src/{target}/*.fpp to produce module lists in docs/{target}/readme.md.
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gen-api-landing.stamp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/gen_api_landing.py"
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Extend the gen_api_landing custom command dependencies to also include the Fortran template sources it scans, so API landing pages regenerate when those .fpp files change. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/gen_api_landing.py"
${pre_process_FPPs}
${simulation_FPPs}
${post_process_FPPs}
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** CMakeLists.txt
**Line:** 815:815
**Comment:**
	*Custom Rule: Extend the `gen_api_landing` custom command dependencies to also include the Fortran template sources it scans, so API landing pages regenerate when those `.fpp` files change.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/docs/gen_api_landing.py"
"${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND "${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/gen-api-landing.stamp"
COMMENT "Generating API landing pages"
VERBATIM
)
add_custom_target(gen_api_landing DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/gen-api-landing.stamp")
add_dependencies(pre_process_doxygen gen_api_landing)
add_dependencies(simulation_doxygen gen_api_landing)
add_dependencies(post_process_doxygen gen_api_landing)

# Fix @file/@brief headers to match actual module/program declarations.
# Handles mixed-case Fortran names and catches stale module renames.
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/fix-file-briefs.stamp"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/fix_file_briefs.py"
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/docs/fix_file_briefs.py"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Extend the fix_file_briefs custom command dependencies to include the Fortran template sources whose module and program declarations it inspects, so header fixes rerun when those sources change. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/docs/fix_file_briefs.py"
${pre_process_FPPs}
${simulation_FPPs}
${post_process_FPPs}
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** CMakeLists.txt
**Line:** 832:832
**Comment:**
	*Custom Rule: Extend the `fix_file_briefs` custom command dependencies to include the Fortran template sources whose module and program declarations it inspects, so header fixes rerun when those sources change.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

"${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND "${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/fix-file-briefs.stamp"
COMMENT "Fixing @file brief headers"
VERBATIM
)
add_custom_target(fix_file_briefs DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/fix-file-briefs.stamp")
Comment thread
coderabbitai[bot] marked this conversation as resolved.
add_dependencies(pre_process_doxygen fix_file_briefs)
add_dependencies(simulation_doxygen fix_file_briefs)
add_dependencies(post_process_doxygen fix_file_briefs)

# Inject per-page last-updated dates into documentation markdown files.
# Runs after auto-generated .md files exist, before Doxygen processes them.
# Uses a stamp file so it only runs once per build.
Expand Down
2 changes: 1 addition & 1 deletion docs/Doxyfile.in
Original file line number Diff line number Diff line change
Expand Up @@ -983,7 +983,7 @@ USE_MDFILE_AS_MAINPAGE =
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.

SOURCE_BROWSER = NO
SOURCE_BROWSER = YES

# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
Expand Down
3 changes: 3 additions & 0 deletions docs/documentation/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ Welcome to the Multi-component Flow Code (MFC) documentation.
## Development

- @ref contributing "Contributing" - Developer guide and coding standards
- [Pre-Process API](../pre_process/index.html) - Source code reference for mesh generation and initial conditions
- [Simulation API](../simulation/index.html) - Source code reference for the flow solver
- [Post-Process API](../post_process/index.html) - Source code reference for data extraction and visualization

## About

Expand Down
103 changes: 103 additions & 0 deletions docs/fix_file_briefs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""Ensure @file/@brief headers match actual module/program declarations.

Usage: python3 fix_file_briefs.py [source_dir]
source_dir defaults to current directory.

For each .fpp/.f90 in src/{pre_process,simulation,post_process,common}:
1. Parses the first `module <name>` or `program <name>` declaration.
2. If no @file directive exists in the first 15 lines, prepends a header.
3. If a "Contains module/program ..." @brief exists, rewrites the name
to match the source, using @ref for mixed-case Fortran identifiers
(Doxygen lowercases Fortran namespaces).
"""

import re
import sys
from pathlib import Path

src_dir = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(".")

DIRS = [
src_dir / "src" / "pre_process",
src_dir / "src" / "simulation",
src_dir / "src" / "post_process",
src_dir / "src" / "common",
]

# First `module X` or `program X` that isn't `end module/program`.
DECL_RE = re.compile(
r"^\s*(module|program)\s+(\w+)\s*$", re.MULTILINE | re.IGNORECASE
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Refine the declaration regex so it does not treat module procedure lines or similar constructs as top-level modules. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
r"^\s*(module|program)\s+(\w+)\s*$", re.MULTILINE | re.IGNORECASE
r"^\s*(module(?!\s+procedure)\b|program)\s+(\w+)\s*$",
re.MULTILINE | re.IGNORECASE,
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** docs/fix_file_briefs.py
**Line:** 30:30
**Comment:**
	*Custom Rule: Refine the declaration regex so it does not treat `module procedure` lines or similar constructs as top-level modules.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

)

# Any "Contains module/program <name>" in a Doxygen comment line.
# Matches both `!! @brief Contains ...` and `!> @brief Contains ...`.
BRIEF_CONTAINS_RE = re.compile(
r"^(!!|!>)\s*@brief\s+(Contains (?:module|program) )(.*)",
re.MULTILINE,
)


def find_entity(text: str) -> tuple[str, str] | None:
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"""Return (kind, name) of the first module/program declaration."""
for m in DECL_RE.finditer(text):
line_start = text.rfind("\n", 0, m.start()) + 1
line = text[line_start : m.end()].strip()
if line.lower().startswith("end"):
continue
return m.group(1).lower(), m.group(2)
return None


def make_ref(name: str) -> str:
"""Return @ref for mixed-case names, plain name for lowercase."""
lower = name.lower()
return f'@ref {lower} "{name}"' if lower != name else name


def has_file_directive(text: str) -> bool:
"""Check if @file appears in the first 15 lines."""
head = "\n".join(text.splitlines()[:15])
return bool(re.search(r"@file", head))


fixed = 0
for d in DIRS:
if not d.exists():
continue
for f in sorted(list(d.glob("*.fpp")) + list(d.glob("*.f90"))):
text = f.read_text()
entity = find_entity(text)
if entity is None:
continue
kind, name = entity
ref = make_ref(name)

if not has_file_directive(text):
# No @file at all — prepend a complete header.
header = f"!>\n!! @file\n!! @brief Contains {kind} {ref}\n\n"
text = header + text
f.write_text(text)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
fixed += 1
print(f"Added {f.relative_to(src_dir)}")
continue

# Has @file — check if there's a "Contains module/program" brief to fix.
m = BRIEF_CONTAINS_RE.search(text)
if m is None:
continue # Has @file but no "Contains ..." brief — leave it alone

current_name = m.group(3).strip()
if current_name == ref:
continue # Already correct

# Replace the name portion of the brief line.
new_line = f"{m.group(1)} @brief {m.group(2)}{ref}"
new_text = text[: m.start()] + new_line + text[m.end() :]

if new_text != text:
f.write_text(new_text)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Read and write Fortran sources using an explicit UTF-8 encoding to avoid locale-dependent behavior on different systems. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
text = f.read_text()
entity = find_entity(text)
if entity is None:
continue
kind, name = entity
ref = make_ref(name)
if not has_file_directive(text):
# No @file at all — prepend a complete header.
header = f"!>\n!! @file\n!! @brief Contains {kind} {ref}\n\n"
text = header + text
f.write_text(text)
fixed += 1
print(f"Added {f.relative_to(src_dir)}")
continue
# Has @file — check if there's a "Contains module/program" brief to fix.
m = BRIEF_CONTAINS_RE.search(text)
if m is None:
continue # Has @file but no "Contains ..." brief — leave it alone
current_name = m.group(3).strip()
if current_name == ref:
continue # Already correct
# Replace the name portion of the brief line.
new_line = f"{m.group(1)} @brief {m.group(2)}{ref}"
new_text = text[: m.start()] + new_line + text[m.end() :]
if new_text != text:
f.write_text(new_text)
text = f.read_text(encoding="utf-8")
entity = find_entity(text)
if entity is None:
continue
kind, name = entity
ref = make_ref(name)
if not has_file_directive(text):
# No @file at all — prepend a complete header.
header = f"!>\n!! @file\n!! @brief Contains {kind} {ref}\n\n"
text = header + text
f.write_text(text, encoding="utf-8")
fixed += 1
print(f"Added {f.relative_to(src_dir)}")
continue
# Has @file — check if there's a "Contains module/program" brief to fix.
m = BRIEF_CONTAINS_RE.search(text)
if m is None:
continue # Has @file but no "Contains ..." brief — leave it alone
current_name = m.group(3).strip()
if current_name == ref:
continue # Already correct
# Replace the name portion of the brief line.
new_line = f"{m.group(1)} @brief {m.group(2)}{ref}"
new_text = text[: m.start()] + new_line + text[m.end() :]
if new_text != text:
f.write_text(new_text, encoding="utf-8")
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** docs/fix_file_briefs.py
**Line:** 69:99
**Comment:**
	*Custom Rule: Read and write Fortran sources using an explicit UTF-8 encoding to avoid locale-dependent behavior on different systems.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

fixed += 1
print(f"Fixed {f.relative_to(src_dir)}: {current_name} -> {ref}")

print(f"Done — {fixed} file(s) updated.")
92 changes: 92 additions & 0 deletions docs/gen_api_landing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
#!/usr/bin/env python3
"""Generate API landing pages for pre_process, simulation, and post_process.

Usage: python3 gen_api_landing.py [source_dir]
source_dir defaults to current directory.

Scans src/{target}/*.fpp and src/common/*.fpp to produce module tables
in docs/{target}/readme.md. Intro text is defined below per target.
"""

import sys
from pathlib import Path

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Import the generic type from the typing module to support the updated type annotation without causing a NameError. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
from typing import List
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** docs/gen_api_landing.py
**Line:** 13:13
**Comment:**
	*Custom Rule: Import the generic type from the typing module to support the updated type annotation without causing a NameError.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

src_dir = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(".")

TARGETS = {
"pre_process": {
"title": "MFC Pre-Process",
"intro": (
"The pre-process component generates initial conditions and "
"computational meshes for MFC simulations. It supports patch-based "
"geometry construction, multi-component material initialization, "
"and immersed boundary geometry."
),
"siblings": [("Simulation", "simulation"), ("Post-Process", "post_process")],
},
"simulation": {
"title": "MFC Simulation",
"intro": (
"The simulation component is the core flow solver. It advances the "
"governing equations in time using high-order finite-volume methods "
"on structured grids with GPU acceleration via OpenACC/OpenMP offloading."
),
"siblings": [("Pre-Process", "pre_process"), ("Post-Process", "post_process")],
},
"post_process": {
"title": "MFC Post-Process",
"intro": (
"The post-process component reads raw simulation output and computes "
"derived quantities for visualization. It produces silo/HDF5 files "
"compatible with VisIt, ParaView, and other visualization tools."
),
"siblings": [("Pre-Process", "pre_process"), ("Simulation", "simulation")],
},
}


def get_modules(directory: Path) -> list[str]:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Replace the built-in generic type annotation with the typing module equivalent for better compatibility with older Python versions commonly found on HPC systems. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
def get_modules(directory: Path) -> list[str]:
def get_modules(directory: Path) -> List[str]:
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** docs/gen_api_landing.py
**Line:** 48:48
**Comment:**
	*Custom Rule: Replace the built-in generic type annotation with the typing module equivalent for better compatibility with older Python versions commonly found on HPC systems.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

"""Return sorted list of module names (m_*) from .fpp files."""
return sorted(
f.stem for f in directory.glob("m_*.fpp")
)
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The get_modules function only scans for .fpp files but misses .f90 files that contain modules. This excludes several modules from the generated API landing pages, including m_nvtx, m_compile_specific, m_delay_file_access from common/, m_grid from pre_process/, and m_data_input from post_process/. The function should use glob patterns for both *.fpp and *.f90 files, similar to how fix_file_briefs.py handles both file extensions on line 68.

Suggested change
"""Return sorted list of module names (m_*) from .fpp files."""
return sorted(
f.stem for f in directory.glob("m_*.fpp")
)
"""Return sorted list of module names (m_*) from .fpp and .f90 files."""
modules: set[str] = set()
for pattern in ("m_*.fpp", "m_*.f90"):
for f in directory.glob(pattern):
modules.add(f.stem)
return sorted(modules)

Copilot uses AI. Check for mistakes.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated


for target, info in TARGETS.items():
target_modules = get_modules(src_dir / "src" / target)
common_modules = get_modules(src_dir / "src" / "common")

out = src_dir / "docs" / target / "readme.md"

lines = [
f"@mainpage {info['title']}",
"",
info["intro"],
"",
"## Modules",
"",
]

if target_modules:
lines.append(f"### {info['title'].split()[-1]}")
lines.append("")
for m in target_modules:
lines.append(f"- @ref {m.lower()} \"{m}\"")
lines.append("")

if common_modules:
lines.append("### Common (shared)")
lines.append("")
for m in common_modules:
lines.append(f"- @ref {m.lower()} \"{m}\"")
lines.append("")

lines.append("## See Also")
lines.append("")
lines.append("- [Home & User Guide](../documentation/index.html)")
for label, sib in info["siblings"]:
lines.append(f"- [{label} API](../{sib}/index.html)")
lines.append("")

out.write_text("\n".join(lines))
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Ensure the target documentation directory exists before writing the generated README files so the script does not fail when the docs subtree is missing. [custom_rule]

Severity Level: Minor ⚠️

Suggested change
out.write_text("\n".join(lines))
out.parent.mkdir(parents=True, exist_ok=True)
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** docs/gen_api_landing.py
**Line:** 91:91
**Comment:**
	*Custom Rule: Ensure the target documentation directory exists before writing the generated README files so the script does not fail when the docs subtree is missing.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
👍 | 👎

print(f"Generated {out}")
6 changes: 5 additions & 1 deletion docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@
</div>
</div>
<div class="flex mx-auto">
<div class="justify-center grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-x-4 md:gap-x-8 text-md md:text-xl text-center text-white font-medium">
<div class="justify-center grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-7 gap-x-4 md:gap-x-8 text-md md:text-xl text-center text-white font-medium">
<a class="px-4 flex flex-row items-center py-4 border-b-2 hover:border-amber-400" href="https://github.com/MFlowCode/MFC">
<i class="pr-4 fa-brands fa-github"></i>
<span class="flex-1">GitHub</span>
Expand All @@ -192,6 +192,10 @@
<i class="pr-4 fa-solid fa-book"></i>
<span class="flex-1">Documentation</span>
</a>
<a class="px-4 flex flex-row items-center py-4 border-b-2 hover:border-amber-400" href="simulation/index.html">
<i class="pr-4 fa-solid fa-code"></i>
<span class="flex-1">API</span>
</a>
<a class="px-4 flex flex-row items-center py-4 border-b-2 hover:border-amber-400" href="documentation/papers.html">
<i class="pr-4 fa-solid fa-newspaper"></i>
<span class="flex-1">Papers</span>
Expand Down
39 changes: 33 additions & 6 deletions docs/post_process/readme.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
# MFC Post-Process
@mainpage MFC Post-Process

This documentation page is for MFC Post-Process. You can also visit:
- [Home & User Guide](../documentation/)
- [Pre Process](../pre_process/)
- [Simulation](../simulation/)
The post-process component reads raw simulation output and computes derived quantities for visualization. It produces silo/HDF5 files compatible with VisIt, ParaView, and other visualization tools.

If you are viewing this page Github, please visit [our website](https://mflowcode.github.io/post_process) for the doxygen-generated documentation of this code.
## Modules

### Post-Process

- @ref m_checker "m_checker"
- @ref m_data_output "m_data_output"
- @ref m_derived_variables "m_derived_variables"
- @ref m_global_parameters "m_global_parameters"
- @ref m_mpi_proxy "m_mpi_proxy"
- @ref m_start_up "m_start_up"

### Common (shared)

- @ref m_boundary_common "m_boundary_common"
- @ref m_checker_common "m_checker_common"
- @ref m_chemistry "m_chemistry"
- @ref m_constants "m_constants"
- @ref m_derived_types "m_derived_types"
- @ref m_finite_differences "m_finite_differences"
- @ref m_helper "m_helper"
- @ref m_helper_basic "m_helper_basic"
- @ref m_model "m_model"
- @ref m_mpi_common "m_mpi_common"
- @ref m_phase_change "m_phase_change"
- @ref m_variables_conversion "m_variables_conversion"

## See Also

- [Home & User Guide](../documentation/index.html)
- [Pre-Process API](../pre_process/index.html)
- [Simulation API](../simulation/index.html)
46 changes: 40 additions & 6 deletions docs/pre_process/readme.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,42 @@
# MFC Pre-Process
@mainpage MFC Pre-Process

This documentation page is for MFC Pre-Process. You can also visit:
- [Home & User Guide](../documentation/)
- [Simulation](../simulation/)
- [Post Process](../post_process/)
The pre-process component generates initial conditions and computational meshes for MFC simulations. It supports patch-based geometry construction, multi-component material initialization, and immersed boundary geometry.

If you are viewing this page Github, please visit [our website](https://mflowcode.github.io/pre_process) for the doxygen-generated documentation of this code.
## Modules

### Pre-Process

- @ref m_assign_variables "m_assign_variables"
- @ref m_boundary_conditions "m_boundary_conditions"
- @ref m_check_ib_patches "m_check_ib_patches"
- @ref m_check_patches "m_check_patches"
- @ref m_checker "m_checker"
- @ref m_data_output "m_data_output"
- @ref m_global_parameters "m_global_parameters"
- @ref m_icpp_patches "m_icpp_patches"
- @ref m_initial_condition "m_initial_condition"
- @ref m_mpi_proxy "m_mpi_proxy"
- @ref m_perturbation "m_perturbation"
- @ref m_simplex_noise "m_simplex_noise"
- @ref m_start_up "m_start_up"

### Common (shared)

- @ref m_boundary_common "m_boundary_common"
- @ref m_checker_common "m_checker_common"
- @ref m_chemistry "m_chemistry"
- @ref m_constants "m_constants"
- @ref m_derived_types "m_derived_types"
- @ref m_finite_differences "m_finite_differences"
- @ref m_helper "m_helper"
- @ref m_helper_basic "m_helper_basic"
- @ref m_model "m_model"
- @ref m_mpi_common "m_mpi_common"
- @ref m_phase_change "m_phase_change"
- @ref m_variables_conversion "m_variables_conversion"

## See Also

- [Home & User Guide](../documentation/index.html)
- [Simulation API](../simulation/index.html)
- [Post-Process API](../post_process/index.html)
Loading
Loading