feat(meshIO): LinearRescale method added
Rescaling a mesh by a linear transformation is a useful option so that we can start with a single "base" mesh and then rescale it to the dimensions needed for our problem. This commit adds the LinearRescale option too meshIO so that a unit sphere can be turned into a sphere of arbitrary radius (as an example).
This commit is contained in:
@@ -2,11 +2,12 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
#include "meshIO.h"
|
#include "meshIO.h"
|
||||||
|
|
||||||
|
|
||||||
MeshIO::MeshIO(const std::string &mesh_file)
|
MeshIO::MeshIO(const std::string &mesh_file, double scale_factor)
|
||||||
{
|
{
|
||||||
mesh_file_ = mesh_file;
|
mesh_file_ = mesh_file;
|
||||||
std::ifstream mesh_stream(mesh_file);
|
std::ifstream mesh_stream(mesh_file);
|
||||||
@@ -19,6 +20,7 @@ MeshIO::MeshIO(const std::string &mesh_file)
|
|||||||
{
|
{
|
||||||
mesh_ = mfem::Mesh(mesh_stream, 1, 10);
|
mesh_ = mfem::Mesh(mesh_stream, 1, 10);
|
||||||
loaded_ = true;
|
loaded_ = true;
|
||||||
|
if (scale_factor != 1.0) { LinearRescale(scale_factor); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,6 +28,32 @@ MeshIO::~MeshIO()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MeshIO::LinearRescale(double scale_factor) {
|
||||||
|
if (!loaded_) {
|
||||||
|
throw std::runtime_error("Mesh not loaded before rescaling.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scale_factor <= 0.0) {
|
||||||
|
throw std::invalid_argument("Scale factor must be positive.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure there are nodes even for linear order meshes
|
||||||
|
mesh_.EnsureNodes();
|
||||||
|
const mfem::GridFunction *nodes = mesh_.GetNodes();
|
||||||
|
double *node_data = nodes->GetData(); // THIS IS KEY
|
||||||
|
|
||||||
|
int data_size = nodes->Size();
|
||||||
|
|
||||||
|
for (int i = 0; i < data_size; ++i) {
|
||||||
|
node_data[i] *= scale_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// nodes->Update(); /updates the fespace
|
||||||
|
mesh_.NodesUpdated();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool MeshIO::IsLoaded() const
|
bool MeshIO::IsLoaded() const
|
||||||
{
|
{
|
||||||
return loaded_;
|
return loaded_;
|
||||||
|
|||||||
@@ -19,13 +19,19 @@ public:
|
|||||||
* @brief Constructor that initializes the MeshIO object with a mesh file.
|
* @brief Constructor that initializes the MeshIO object with a mesh file.
|
||||||
* @param mesh_file The name of the mesh file.
|
* @param mesh_file The name of the mesh file.
|
||||||
*/
|
*/
|
||||||
MeshIO(const std::string &mesh_file);
|
MeshIO(const std::string &mesh_file, double scale_factor = 1.0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Destructor for the MeshIO class.
|
* @brief Destructor for the MeshIO class.
|
||||||
*/
|
*/
|
||||||
~MeshIO();
|
~MeshIO();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Rescale the mesh by a linear factor.
|
||||||
|
* @param scale_factor The factor by which to scale the mesh.
|
||||||
|
*/
|
||||||
|
void LinearRescale(double scale_factor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the mesh object.
|
* @brief Get the mesh object.
|
||||||
* @return Reference to the mesh object.
|
* @return Reference to the mesh object.
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const std::string SPHERICAL_MESH = std::string(getenv("MESON_SOURCE_ROOT")) + "/
|
|||||||
PolySolver::PolySolver(double n, double order)
|
PolySolver::PolySolver(double n, double order)
|
||||||
: n(n),
|
: n(n),
|
||||||
order(order),
|
order(order),
|
||||||
meshIO(SPHERICAL_MESH),
|
meshIO(SPHERICAL_MESH, 5),
|
||||||
mesh(meshIO.GetMesh()),
|
mesh(meshIO.GetMesh()),
|
||||||
feCollection(std::make_unique<mfem::H1_FECollection>(order, mesh.SpaceDimension())),
|
feCollection(std::make_unique<mfem::H1_FECollection>(order, mesh.SpaceDimension())),
|
||||||
feSpace(std::make_unique<mfem::FiniteElementSpace>(&mesh, feCollection.get())),
|
feSpace(std::make_unique<mfem::FiniteElementSpace>(&mesh, feCollection.get())),
|
||||||
@@ -33,6 +33,7 @@ PolySolver::PolySolver(double n, double order)
|
|||||||
}())),
|
}())),
|
||||||
nonLinearSourceCoeff(std::make_unique<mfem::ConstantCoefficient>(1.0)),
|
nonLinearSourceCoeff(std::make_unique<mfem::ConstantCoefficient>(1.0)),
|
||||||
gaussianCoeff(std::make_unique<polyMFEMUtils::GaussianCoefficient>(0.1)) {
|
gaussianCoeff(std::make_unique<polyMFEMUtils::GaussianCoefficient>(0.1)) {
|
||||||
|
|
||||||
assembleNonlinearForm();
|
assembleNonlinearForm();
|
||||||
assembleConstraintForm();
|
assembleConstraintForm();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user