Dimensional Analysis#
Overview#
The AnalysisEngine class provides high-level interface to dimensional analysis workflows in PyDASA, abstracting matrix operations with customization and data integration. Orchestrates dimensional analysis from schema configuration through coefficient generation with serialization for pipeline integration.
The AnalysisEngine simplifies dimensional analysis through three core features:
Defines Frameworks: Configures dimensional domains with custom FDUs for specific problem contexts.
Automates Workflows: Handles matrix creation, solving, and coefficient generation via method calls.
Serializes Data: Built-in dictionary serialization (
to_dict(),from_dict()) for JSON export/import and data persistence.
Reynolds Number (\(Re\)) Dimensional Analysis Example#
This example demonstrates deducing the Reynolds number using a custom framework with selective variable relevance and data export capabilities:
from pydasa import Variable, Schema, AnalysisEngine
from pydasa.dimensional.fundamental import Dimension
import json
import os
# Define custom framework (T, M, L only - typical for fluid mechanics)
custom_fdus = [
Dimension(_idx=0, _sym="T", _unit="s", _name="Time"),
Dimension(_idx=1, _sym="M", _unit="kg", _name="Mass"),
Dimension(_idx=2, _sym="L", _unit="m", _name="Length")
]
schema = Schema(_fwk="CUSTOM", _fdu_lt=custom_fdus)
# Define variables (only 4 relevant for Reynolds number)
variables = {
"\\rho": Variable(_name="Density",
_sym="\\rho",
_cat="IN",
_dims="M*L^-3",
_units="kg/m³",
relevant=True,
_schema=schema),
"v": Variable(_name="Velocity",
_sym="v",
_cat="OUT",
_dims="L*T^-1",
_units="m/s",
relevant=True,
_schema=schema),
"D": Variable(_name="Diameter",
_sym="D",
_cat="IN",
_dims="L",
_units="m",
relevant=True,
_schema=schema),
"\\mu": Variable(_name="Viscosity",
_sym="\\mu",
_cat="IN",
_dims="M*L^-1*T^-1",
_units="Pa·s",
relevant=True,
_schema=schema),
"g": Variable(_name="Gravity",
_sym="g",
_cat="CTRL",
_dims="L*T^-2",
_units="m/s²",
relevant=False,
_schema=schema) # Irrelevant for Reynolds
}
# Create analysis engine and run workflow
engine = AnalysisEngine(_name="Reynolds Number Analysis",
_fwk="CUSTOM",
_schema=schema,
_variables=variables)
# Execute dimensional analysis workflow
engine.create_matrix() # Constructs dimensional matrix
coefficients = engine.solve() # Generates π coefficients
# Access Reynolds number coefficient
reynolds = coefficients["\\Pi_{0}"]
print(f"Reynolds Formula: {reynolds.pi_expr}")
print(f"Variables: {list(reynolds.variables.keys())}")
# Export complete analysis to dictionary (now properly serializes nested objects)
analysis_data = engine.to_dict()
# Create data directory if it doesn't exist
os.makedirs("data", exist_ok=True)
# Save to JSON file for integration with other systems
with open("data/reynolds_da.json", "w") as f:
json.dump(analysis_data, f, indent=4)
print("Analysis exported to data/reynolds_da.json")
# Later: Reload analysis from JSON
with open("data/reynolds_da.json", "r") as f:
loaded_data = json.load(f)
# Reconstruct engine from dictionary
engine_restored = AnalysisEngine.from_dict(loaded_data)
print(f"Restored coefficients: {list(engine_restored.coefficients.keys())}")
Displayed Capabilities#
In the example we appreciate the following PyDASA capabilities:
Restricts Framework: Limits dimensional domain to T, M, L only, excluding A, K, mol, cd from full PHYSICAL framework.
Filters Variables: Excludes
relevant=Falsevariables (gravityg) from dimensional matrix while retaining them in the model.Encapsulates Operations: Handles matrix operations internally without requiring direct
Matrixclass access.Exports State: Serializes complete analysis state (variables, schema, coefficients) to dictionary for JSON export.
Restores Analysis: Reconstructs complete
AnalysisEnginefrom dictionary for reproducibility.
This serialization ensures dimensional analysis results integrate seamlessly with data pipelines, web services, and file-based workflows.