Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Code.v05-00/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ option(DEBUG "Enable debug mode" OFF)
SET(RINGS 0)
SET(OMP 1)
option(BUILD_TEST ON)
option(ENABLE_PROFILING "Enable perf-friendly build (-g -O2)" OFF)

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
include(CheckCXXCompilerFlag)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall -Wextra -Wconversion")
#add_compile_options(-fno-omit-frame-pointer -fsanitize=bounds -fsanitize=address -fsanitize=undefined)
#add_link_options(-fsanitize=bounds -fsanitize=address -fsanitize=undefined)
#add_link_options(-fsanitize=bounds -fsanitize=address -fsanitize=undefined)s
add_compile_options(-fno-omit-frame-pointer -fsanitize=bounds -fsanitize=undefined)
add_link_options(-fsanitize=bounds -fsanitize=undefined)
elseif (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
Expand All @@ -34,6 +35,10 @@ elseif (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
#-Michael
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math -fno-trapping-math -funsafe-math-optimizations")
endif()
if(ENABLE_PROFILING)
message(STATUS "Profiling enabled: adding debug symbols and frame pointers")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -fno-omit-frame-pointer")
endif()
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

execute_process(COMMAND git rev-parse --short HEAD
Expand Down Expand Up @@ -131,4 +136,4 @@ add_subdirectory(tests)

if (DEBUG)
message(STATUS "DEBUG mode is enabled")
endif()
endif()
26 changes: 23 additions & 3 deletions Code.v05-00/include/Core/LAGRIDPlumeModel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,31 @@ class LAGRIDPlumeModel {
void updateDiffVecs();
void runTransport(double timestep);
void remapAllVars(double remapTimestep, const std::vector<std::vector<int>>& mask, const VectorUtils::MaskInfo& maskInfo);
std::pair<LAGRID::twoDGridVariable,LAGRID::twoDGridVariable> remapVariable(const VectorUtils::MaskInfo& maskInfo, const BufferInfo& buffers, const Vector_2D& phi, const std::vector<std::vector<int>>& mask);
std::pair<LAGRID::twoDGridVariable,LAGRID::twoDGridVariable> remapVariable(
const VectorUtils::MaskInfo& maskInfo,
const BufferInfo& buffers,
const Vector_2D& phi,
const std::vector<std::vector<int>>& mask
);
double totalAirMass();

Eigen::SparseMatrix<double> createRegriddingWeightsSparse(const VectorUtils::MaskInfo& maskInfo, const BufferInfo& buffers, const std::vector<std::vector<int>>& mask, Vector_1D& xEdgesNew, Vector_1D& yEdgesNew, Vector_1D& xCoordsNew, Vector_1D& yCoordsNew);
Vector_2D applyWeights(const Eigen::SparseMatrix<double>& weights, int nx_old, int ny_old, int nx_new, int ny_new, const Vector_2D& dataIn);
Eigen::SparseMatrix<double> createRegriddingWeightsSparse(
const VectorUtils::MaskInfo& maskInfo,
const BufferInfo& buffers,
const std::vector<std::vector<int>>& mask,
Vector_1D& xEdgesNew,
Vector_1D& yEdgesNew,
Vector_1D& xCoordsNew,
Vector_1D& yCoordsNew
);
Vector_2D applyWeights(
const Eigen::SparseMatrix<double>& weights,
int nx_old,
int ny_old,
int nx_new,
int ny_new,
const Vector_2D& dataIn
);

void printVector2D(const std::string fieldName, const Vector_2D& dataIn);

Expand Down
33 changes: 25 additions & 8 deletions Code.v05-00/include/FVM_ANDS/AdvDiffSystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
#include "FVM_ANDS/BoundaryCondition.hpp"
#include "FVM_ANDS_HelperFunctions.hpp"
#include <memory>
#include <variant>

namespace FVM_ANDS{
using PointVariant = std::variant<IntBoundPoint, GhostPoint>;

// Separate the SOR solver for testing without having to build an AdvDiffSystem object
void sor_solve(const Eigen::SparseMatrix<double, Eigen::RowMajor> &A, const Eigen::VectorXd &rhs, Eigen::VectorXd &phi, double omega = 1.0, double threshold = 1e-3, int n_iters = 3);
Expand Down Expand Up @@ -41,7 +43,12 @@ namespace FVM_ANDS{
void sor_solve(double omega = 1.0, double threshold = 1e-3, int n_iters = 3){ FVM_ANDS::sor_solve(totalCoefMatrix_, rhs_, phi_, omega, threshold, n_iters); };
inline const Eigen::VectorXd& getRHS() const { return rhs_; }
inline const Eigen::VectorXd& phi() const { return phi_; }
inline const std::vector<std::unique_ptr<Point>>& points() const { return points_; }
inline const std::vector<Point>& points() const { return points_; }
inline const std::vector<BoundaryConditionFlag>& bcCache() const { return bcCache_; }
inline const std::vector<FaceDirection>& directionCache() const { return directionCache_; }
inline const std::vector<std::optional<BoundaryCondDescription>>& secondBoundaryCache() const { return secondBoundaryCache_; };
inline const std::vector<int>& corrCache() const { return corrCache_; }

inline const Eigen::SparseMatrix<double, Eigen::RowMajor>& getCoefMatrix() const { return totalCoefMatrix_; }
inline void updatePhi(const Eigen::VectorXd& phi_new){
//Need to resize to account for grid changing in size.
Expand Down Expand Up @@ -140,7 +147,11 @@ namespace FVM_ANDS{
Vector_1D bcVals_left_;
Vector_1D bcVals_right_;
Vector_1D bcVals_bot_;
std::vector<std::unique_ptr<Point>> points_;
std::vector<Point> points_;
std::vector<BoundaryConditionFlag> bcCache_; // Cache bcType()
std::vector<FaceDirection> directionCache_; // Cache bcDirection()
std::vector<std::optional<BoundaryCondDescription>> secondBoundaryCache_; // Cache secondBoundaryConds()
std::vector<int> corrCache_; // Cache corrPoint()
Eigen::SparseMatrix<double, Eigen::RowMajor> totalCoefMatrix_;
Eigen::VectorXd rhs_;
Eigen::VectorXd phi_;
Expand All @@ -151,6 +162,12 @@ namespace FVM_ANDS{
void buildPointList();
void buildAdvectionCoeffs(int i, double& coeff_C, double& coeff_N, double& coeff_S, double& coeff_E, double& coeff_W);
void updateGhostNodes();

// Helper to create points
template<typename T, typename... Args>
void addPoint(int idx, Args&&... args) {
points_[idx] = T{std::forward<Args>(args)...};
}

inline bool isValidPointID(int idx) const {
return (idx >= 0 && idx < phi_.rows());
Expand Down Expand Up @@ -306,14 +323,14 @@ namespace FVM_ANDS{
return std::max(0.0, std::min(r, 1.0));
}
inline int neighbor_point(FaceDirection direction, int pointID) const noexcept{
Point* point = points_[pointID].get();
if(point->bcType() == BoundaryConditionFlag::INTERIOR) return neighbor_point_interior(direction, pointID);
Point point = points_[pointID];
if(point.bcType() == BoundaryConditionFlag::INTERIOR) return neighbor_point_interior(direction, pointID);

if(point->bcDirection() == direction){
return point->corrPoint();
if(point.bcDirection() == direction){
return point.corrPoint();
}
else if (point->secondBoundaryConds() && point->secondBoundaryConds().value().direction == direction){
return point->secondBoundaryConds().value().corrPoint;
else if (point.secondBoundaryConds() && point.secondBoundaryConds().value().direction == direction){
return point.secondBoundaryConds().value().corrPoint;
}
return neighbor_point_interior(direction, pointID);
}
Expand Down
4 changes: 2 additions & 2 deletions Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ namespace FVM_ANDS{
inline virtual void setBCType(BoundaryConditionFlag bcType){
bc_.bcType = bcType;
}
constexpr virtual bool isGhost(){
constexpr virtual bool isGhost() const {
return false;
}
inline virtual void setSecondaryBC(BoundaryCondDescription bc) {
Expand All @@ -60,7 +60,7 @@ namespace FVM_ANDS{
public:
GhostPoint() = delete;
GhostPoint(BoundaryCondDescription bc);
constexpr bool isGhost() override {
constexpr bool isGhost() const override {
return true;
}
inline void setBCType(BoundaryConditionFlag bcType) override {
Expand Down
2 changes: 1 addition & 1 deletion Code.v05-00/include/FVM_ANDS/FVM_Solver.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ namespace FVM_ANDS{
inline const Eigen::SparseMatrix<double, Eigen::RowMajor>& coefMatrix(){
return advDiffSys_.getCoefMatrix();
}
inline const std::vector<std::unique_ptr<Point>>& points(){
inline const std::vector<Point>& points(){
return advDiffSys_.points();
}
const Eigen::VectorXd& calcRHS(){
Expand Down
Loading