// // Created by Wei Chen on 22-10-31. // #ifndef BOUNDARYCONDITIONS_HPP #define BOUNDARYCONDITIONS_HPP #include #include #include #include #include "Utils.hpp" namespace ssim { struct DirichletBC { DirichletBC(Eigen::Vector3d p_relMinBBox, Eigen::Vector3d p_relMaxBBox, const std::array &p_timeRange = {0.0, std::numeric_limits::infinity()}) : relMinBBox(std::move(p_relMinBBox)), relMaxBBox(std::move(p_relMaxBBox)), timeRange(p_timeRange) {} void calcAbsBBox(const Eigen::Vector3d &modelMinBBox, const Eigen::Vector3d &modelMaxBBox) { Eigen::Vector3d modelLength = modelMaxBBox - modelMinBBox; absMinBBox = modelMinBBox + (modelLength.array() * relMinBBox.array()).matrix(); absMaxBBox = modelMinBBox + (modelLength.array() * relMaxBBox.array()).matrix(); } bool inDBC(const Eigen::Vector3d &p) { return (p.array() >= absMinBBox.array()).all() && (p.array() <= absMaxBBox.array()).all(); } bool isActive(double stepStartTime) const { return stepStartTime >= timeRange[0] && stepStartTime < timeRange[1]; } std::array timeRange = {0.0, std::numeric_limits::infinity()}; Eigen::Vector3d relMinBBox; Eigen::Vector3d relMaxBBox; Eigen::Vector3d absMinBBox; Eigen::Vector3d absMaxBBox; }; struct NeumannBC { NeumannBC(Eigen::Vector3d p_relMinBBox, Eigen::Vector3d p_relMaxBBox, Eigen::Vector3d p_force, const std::array &p_timeRange = {0.0, std::numeric_limits::infinity()}) : relMinBBox(std::move(p_relMinBBox)), relMaxBBox(std::move(p_relMaxBBox)), force(std::move(p_force)), timeRange(p_timeRange) {} void calcAbsBBox(const Eigen::Vector3d &modelMinBBox, const Eigen::Vector3d &modelMaxBBox) { Eigen::Vector3d modelLength = modelMaxBBox - modelMinBBox; absMinBBox = modelMinBBox + (modelLength.array() * relMinBBox.array()).matrix(); absMaxBBox = modelMinBBox + (modelLength.array() * relMaxBBox.array()).matrix(); } bool inNBC(const Eigen::Vector3d &p) { return (p.array() >= absMinBBox.array()).all() && (p.array() <= absMaxBBox.array()).all(); } bool isActive(double stepStartTime) const { return stepStartTime >= timeRange[0] && stepStartTime < timeRange[1]; } std::array timeRange = {0.0, std::numeric_limits::infinity()}; Eigen::Vector3d relMinBBox; Eigen::Vector3d relMaxBBox; Eigen::Vector3d absMinBBox; Eigen::Vector3d absMaxBBox; Eigen::Vector3d force; }; } // SIM #endif // BOUNDARYCONDITIONS_HPP