118 lines
5.9 KiB
Markdown
118 lines
5.9 KiB
Markdown
# Physical slices of the deformed FEM model
|
||
|
||
This optional experiment displays the independent density, enthalpy and actual
|
||
material boundary of a prepared state. It changes no solver equations, fields,
|
||
orders, positivity handling or public library API.
|
||
|
||
## Use
|
||
|
||
Add `--model-slices` to a normal `plateau_diagnostic` invocation. It writes
|
||
`initial_slices` and `final_slices`, each with `xz` and `xy` subdirectories.
|
||
|
||
Optional settings:
|
||
|
||
- `--slice-plane both|xz|xy|yz` (default `both`, meaning xz and xy).
|
||
- `--slice-offset VALUE` (default zero). This is the physical coordinate normal
|
||
to the plane: y for xz, z for xy, x for yz. `both` applies the same offset to
|
||
both planes.
|
||
- `--slice-subdivisions N` (default 6, allowed 2–32). Begin with 4–8 and compare
|
||
two resolutions for a plot whose small features matter. Work grows with the
|
||
number of reference subcells; 32 is an explicit upper bound, not a suggested
|
||
default.
|
||
|
||
Existing harmonic snapshots can be observed through the checked density replay
|
||
path, using the matching binary, mesh and physical specifications:
|
||
|
||
```sh
|
||
plateau_diagnostic --index 3 --angular-momentum 0 \
|
||
--surface-prescription harmonics --surface-degree 4 \
|
||
--mesh /absolute/path/to/saved/input.smesh \
|
||
--density-snapshot /absolute/path/to/saved \
|
||
--model-slices-only --max-newton 0 --slice-subdivisions 6 \
|
||
--output /absolute/path/to/new_observation
|
||
```
|
||
|
||
`--model-slices-only` writes `frozen_slices` and the replay's normal physical
|
||
metrics/provenance, skipping the expensive density-region observations. It does
|
||
not perform Newton iterations. `--model-slices` can also accompany an existing
|
||
frozen density diagnostic. Replay checks still apply; a size match alone does
|
||
not establish compatibility of a saved state.
|
||
|
||
Render one plane with Python, NumPy and Matplotlib:
|
||
|
||
```sh
|
||
python experiments/plot_model_slices.py /absolute/path/to/new_observation/frozen_slices/xz \
|
||
--reference-outline --title 'n=3 rotating trial; unconverged' \
|
||
--output /absolute/path/to/new_figures/n3_trial_xz
|
||
```
|
||
|
||
The helper writes PNG and PDF and refuses to overwrite either. Both axes use
|
||
the same physical length scale. The solid curve is the deformed material
|
||
boundary; the optional dashed curve is the undeformed boundary intersected
|
||
with the same plane. No deformation magnification is applied. A two-sided
|
||
color scale centered at zero retains the sign when a field has both signs;
|
||
the displayed ticks are the actual values, and each color half may have a
|
||
different range. All-positive or all-negative data use a linear color scale.
|
||
No density or enthalpy values are clipped, replaced by an EOS evaluation, or
|
||
logged. Extrema in panel titles are sampled extrema.
|
||
|
||
Final-state plots use the surrounding run's convergence flag when available;
|
||
replayed or initial states are labeled as not assessed by the image. Give a
|
||
descriptive title, including the physical parameters and any known failure,
|
||
when plotting a stalled or otherwise unconverged state. A plausible picture
|
||
does not establish virial balance or an unbordered equilibrium.
|
||
|
||
## Geometry and field contract
|
||
|
||
Only stellar hexahedra are visited. Each is split into a configurable reference
|
||
lattice and consistent tetrahedra within that element. Intersections solve
|
||
`mapped_position[normal] = offset` on the actual curved map along each crossed
|
||
edge, using a safeguarded bracketed root calculation. This is a physical-plane
|
||
cut, not a deformed image of a reference-plane selection. The mapped Jacobian
|
||
must remain valid at every evaluation. Exterior compactification is not used.
|
||
|
||
Density and enthalpy are evaluated directly from their existing FEM fields at
|
||
the resolved reference coordinates. Output triangles keep their owning element
|
||
and separate vertex records. The plotter uses this supplied connectivity and
|
||
never triangulates a global point cloud; consequently it does not connect
|
||
disconnected material across vacuum or average the two DG traces on an
|
||
interface. A plane exactly coincident with an internal element face uses the
|
||
trace from its positive-normal side.
|
||
|
||
The material boundary is found from stellar/nonstellar faces and evaluated from
|
||
the stellar side. Its curve is computed separately from the volume coloring.
|
||
The undeformed outline is independently intersected with the physical plane;
|
||
projecting reference positions of the deformed cut would be a different curve.
|
||
An exactly coplanar surface patch is reported as unsupported instead of being
|
||
silently drawn as a unique intersection curve.
|
||
|
||
Curved cuts are displayed using straight triangles and boundary chords. Field
|
||
colors are piecewise linear on those triangles, not exact values throughout
|
||
their interiors. Root tolerances, maximum physical-plane residuals, sampled
|
||
centroid/midpoint chord errors, counts, bounds and time are recorded in each
|
||
plane's `metadata.csv`. The chord errors and bounds are sampled diagnostics,
|
||
not rigorous global enclosures. Tangencies or multiple crossings contained
|
||
between subdivision vertices can be missed; compare subdivisions for image
|
||
stability. This visualization does not certify pointwise positivity or exclude
|
||
small unsampled features.
|
||
|
||
## Checks
|
||
|
||
Every export runs pure geometric controls: unit-cube section area, integration
|
||
of a signed affine field, a curved shear for which the reference-plane cut is
|
||
wrong, surface segment intersection, and deterministic one-sided treatment of
|
||
a coincident internal face. The same controls can run without FEM:
|
||
|
||
```sh
|
||
c++ -std=c++20 -O0 experiments/model_slice_geometry_tests.cpp -o /tmp/model_slice_checks
|
||
/tmp/model_slice_checks
|
||
python -m unittest discover -s experiments -p test_plot_model_slices.py -v
|
||
```
|
||
|
||
The Python controls cover signed independent fields, supplied connectivity for
|
||
disconnected material, equal axes, PNG/PDF rendering, and rejection of a
|
||
cross-element triangle, an off-plane field/outline, and shape exaggeration.
|
||
They are geometry and plotting controls, not a substitute for a coupled-model
|
||
validation run. The exporter checks that its density, enthalpy and displacement
|
||
source buffers remain bitwise unchanged.
|