commit 00b22cd138b7f4c9468836cd884b0687d9e23d1a Author: forty-twoo <1013417276@qq.com> Date: Sun Jan 21 01:29:08 2024 +0800 add code diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..7987ab6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.16) +project(ImplictSim LANGUAGES CXX) + + + +file(GLOB SRC_FILES + src/BgMesh/*.cpp + src/Geometry/Implict/*.cpp + src/Quadrature/*.cpp + ) + +add_library(${PROJECT_NAME}_dev ${SRC_FILES}) + +target_include_directories(${PROJECT_NAME}_dev PUBLIC /usr/local/include) +target_include_directories(${PROJECT_NAME}_dev PUBLIC include) +target_include_directories(${PROJECT_NAME}_dev PUBLIC include/BgMesh) +target_include_directories(${PROJECT_NAME}_dev PUBLIC include/Geometry) +target_include_directories(${PROJECT_NAME}_dev PUBLIC include/Utils) + +add_executable(${PROJECT_NAME}_bin src/main.cpp) +target_link_libraries(${PROJECT_NAME}_bin PUBLIC ${PROJECT_NAME}_dev) + + + diff --git a/include/BgMesh/BgMesh.hpp b/include/BgMesh/BgMesh.hpp new file mode 100644 index 0000000..ef68c7b --- /dev/null +++ b/include/BgMesh/BgMesh.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +namespace ImplictSIM { + +template +class BgMeshData { +public: + Eigen::Vector leftDownPnt; + Eigen::Vector centerPnt; + Eigen::Vector rightUpPnt; + +public: + BgMeshData(Eigen::Vector leftDownPnt_, Eigen::Vector rightUpPnt_) + { + leftDownPnt = leftDownPnt_; + rightUpPnt = rightUpPnt_; + centerPnt = (leftDownPnt + rightUpPnt) / 2.0; + } +}; + +template +class BgMesh { +public: + int leafNum; + Eigen::Vector leftDownPnt; + Eigen::Vector rightUpPnt; + std::vector> meshData; + +public: + BgMesh(Eigen::Vector leftDownPnt_, Eigen::Vector rightUpPnt_) + { + } +}; +}; \ No newline at end of file diff --git a/include/Geometry/Implict/ImplictModel.hpp b/include/Geometry/Implict/ImplictModel.hpp new file mode 100644 index 0000000..bee20fd --- /dev/null +++ b/include/Geometry/Implict/ImplictModel.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include + +namespace ImplictSIM { + +template +class ImplictModel { +public: + typedef double (*disCalculationPtr)(const Eigen::Vector& point); + typedef double (*gradientDirXPtr)(const Eigen::Vector& point); + typedef double (*gradientDirYPtr)(const Eigen::Vector& point); + typedef double (*gradientDirZPtr)(const Eigen::Vector& point); + ImplictModel(disCalculationPtr disFunc_, gradientDirXPtr gradOnX_, + gradientDirYPtr gradOnY_, gradientDirZPtr gradOnZ_) + : disFunc(disFunc_) + , gradOnX(gradOnX_) + , gradOnY(gradOnY_) + , gradOnZ(gradOnZ_) + { + } + + double getSignedDis(const Eigen::Vector& point) + { + return disFunc(point); + } + double getGradOnX(const Eigen::Vector& point) + { + return gradOnX(point); + } + double getGradOnY(const Eigen::Vector& point) + { + return gradOnY(point); + } + double getGradOnZ(const Eigen::Vector& point) + { + return gradOnZ(point); + } + +private: + disCalculationPtr disFunc; + gradientDirXPtr gradOnX; + gradientDirXPtr gradOnY; + gradientDirXPtr gradOnZ; +}; + +}; // namespace ImplictSIM diff --git a/include/Quadrature/Quadrature.hpp b/include/Quadrature/Quadrature.hpp new file mode 100644 index 0000000..30ecd98 --- /dev/null +++ b/include/Quadrature/Quadrature.hpp @@ -0,0 +1,49 @@ +#pragma once +#include "BgMesh/BgMesh.hpp" +#include "Implict/ImplictModel.hpp" +#include +#include +#include + +namespace ImplictSIM { + +enum class HeightDir { X = 0, + Y = 1, + Z = 2 }; +typedef std::pair Interval; + +template +class VolumeIntegral { +public: + typedef double (*integrandFunc)(const Eigen::Vector& point); + int dimension; + std::vector> phiFuncs; + std::vector si; + BgMesh meshU; + integrandFunc f; + bool flagS; + int GaussOrderQ; + +public: + VolumeIntegral(int dimension_, std::vector>& phiFuncs_, const std::vector& si_, const BgMesh& meshU_, + const integrandFunc f_, bool flagS_, int GaussOrderQ_) + : dimension(dimension_) + , phiFuncs(phiFuncs_) + , si(si_) + , meshU(meshU_) + , f(f_) + , flagS(flagS_) + , GaussOrderQ(GaussOrderQ_) + { + } + + void findRoots(ImplictModel phiFunc,int si, HeightDir k, + Interval interval, Eigen::Vector x, std::vector roots,double eps); + + void getOneIntegrationOnInterval(ImplictModel phiFunc, int si, + HeightDir k, Interval interval, Eigen::Vector x, std::vector& hDirPoints); + + void getIntegration(); +}; + +}; // namespace ImplictSIM diff --git a/src/BgMesh/BgMesh.cpp b/src/BgMesh/BgMesh.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Geometry/ImplictModel.cpp b/src/Geometry/ImplictModel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Quadrature/Quadrature.cpp b/src/Quadrature/Quadrature.cpp new file mode 100644 index 0000000..255dc55 --- /dev/null +++ b/src/Quadrature/Quadrature.cpp @@ -0,0 +1,71 @@ +#include "Quadrature/Quadrature.hpp" + +namespace ImplictSIM { +template +void VolumeIntegral::findRoots(ImplictModel phiFunc, int si, HeightDir k, + Interval interval, Eigen::Vector x, std::vector roots, double eps) +{ + Eigen::Vector ek = Eigen::Vector::Zero(); + if (k == HeightDir::X) { + ek(0) = 1.0; + } else if (K == HeightDir::Y) { + ek(1) = 1.0; + } else if (K == HeightDir::Z) { + ek(2) = 1.0; + } + // just binary search + double leftBound = interval.first, rightBound = interval.second; + double y; + roots.clear(); + bool flag = false; + while (leftBound <= rightBound) { + y = (leftBound + rightBound) / 2.0; + if (phiFunc(x + y * ek) < -eps) { + leftBound = y; + } else if (phiFunc(x + y * ek) > eps) { + rightBound = y; + } else { + flag = true; + roots.push_back(y); + break; + } + } + roots.push_back(interval.first); + roots.push_back(interval.second); + sort(roots.begin(), root.end()); + return; +} + +template +void VolumeIntegral::getOneIntegrationOnInterval(ImplictModel phiFunc, int si, + HeightDir k, Interval interval, Eigen::Vector x, std::vector& hDirPoints) +{ + Eigen::Vector ek = Eigen::Vector::Zero(); + if (k == HeightDir::X) { + ek(0) = 1.0; + } else if (K == HeightDir::Y) { + ek(1) = 1.0; + } else if (K == HeightDir::Z) { + ek(2) = 1.0; + } + std::vector roots; + findRoots(phiFunc, si, k, interval, x, root, 1e-8); + Eigen::Vector xc; + for (int i = 1) + for (int i = 1; i < roots.size(); i++) { + double len = roots[i] - root[i - 1]; + xc = x + 0.5 * (root[i - 1] + root[i]) * ek; + if() + } +} + +template +void VolumeIntegral::getIntegration() +{ + for (int curDim = dim; curDim >= 1; curDim--) { + if (curDim == 1) { + } + } +} + +}; // namespace ImplictSIM diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..93b5172 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + + return 0; +} \ No newline at end of file