feat(surface): surface deformation prescriptions

restricted the unknown state vector to surface deformation and implemented one prescription, NodalRadialSurface, while the full volumetric displacment field is reconstructed analytically from that. This reduced the number of degrees of freedom in the system by a factor of 80 while also removing many null vectors from the system.
This commit is contained in:
2026-09-01 11:50:13 -04:00
parent 0a7f18c5c7
commit 85500fef3b
40 changed files with 8924 additions and 1164 deletions

View File

@@ -28,6 +28,7 @@ export namespace mean_field::fem {
stroid::StroidMesh smesh;
std::unique_ptr<mfem::ParMesh> mesh;
std::unique_ptr<mfem::ParMesh> logicalReferenceMesh;
// =====================================================================
// Compile-time field descriptors
@@ -63,6 +64,14 @@ export namespace mean_field::fem {
std::unique_ptr<mfem::ParGridFunction> displacement;
/*
* Scalar companion of the vector displacement space. Only its
* StellarSurface true DOFs become surface-deformation coordinates.
* Sharing displacementFec guarantees identical scalar basis
* functions without duplicating the finite-element collection.
*/
std::unique_ptr<mfem::ParFiniteElementSpace> surfaceDeformationFes;
// =====================================================================
// Density field
// =====================================================================
@@ -115,12 +124,13 @@ export namespace mean_field::fem {
// =====================================================================
[[nodiscard]] bool okay() const {
return mesh != nullptr &&
return mesh != nullptr && logicalReferenceMesh != nullptr &&
gravityPotentialFec != nullptr && gravityPotentialFes != nullptr && gravityFluxFec != nullptr &&
gravityFluxFes != nullptr &&
displacementFec != nullptr && displacementFes != nullptr && displacement != nullptr &&
surfaceDeformationFes != nullptr &&
densityFec != nullptr && densityFes != nullptr &&