85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
/* ***********************************************************************
|
|
//
|
|
// Copyright (C) 2025 -- The 4D-STAR Collaboration
|
|
// File Author: Emily Boudreaux
|
|
// Last Modified: February 16, 2025
|
|
//
|
|
// 4DSSE is free software; you can use it and/or modify
|
|
// it under the terms and restrictions the GNU General Library Public
|
|
// License version 3 (GPLv3) as published by the Free Software Foundation.
|
|
//
|
|
// 4DSSE is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
// See the GNU Library General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Library General Public License
|
|
// along with this software; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
// *********************************************************************** */
|
|
#include "mfem.hpp"
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <stdexcept>
|
|
|
|
#include "meshIO.h"
|
|
|
|
|
|
MeshIO::MeshIO(const std::string &mesh_file, double scale_factor)
|
|
{
|
|
mesh_file_ = mesh_file;
|
|
std::ifstream mesh_stream(mesh_file);
|
|
if (!mesh_stream)
|
|
{
|
|
throw std::runtime_error("Mesh file not found: " + mesh_file);
|
|
loaded_ = false;
|
|
}
|
|
else
|
|
{
|
|
mesh_ = mfem::Mesh(mesh_stream, 1, 10);
|
|
loaded_ = true;
|
|
if (scale_factor != 1.0) { LinearRescale(scale_factor); }
|
|
}
|
|
}
|
|
|
|
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
|
|
{
|
|
return loaded_;
|
|
}
|
|
|
|
mfem::Mesh& MeshIO::GetMesh()
|
|
{
|
|
return mesh_;
|
|
} |