commit
00b22cd138
8 changed files with 235 additions and 0 deletions
@ -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) |
|||
|
|||
|
|||
|
@ -0,0 +1,37 @@ |
|||
#pragma once |
|||
|
|||
#include <Eigen/Eigen> |
|||
#include <vector> |
|||
|
|||
namespace ImplictSIM { |
|||
|
|||
template <size_t dim> |
|||
class BgMeshData { |
|||
public: |
|||
Eigen::Vector<double, dim> leftDownPnt; |
|||
Eigen::Vector<double, dim> centerPnt; |
|||
Eigen::Vector<double, dim> rightUpPnt; |
|||
|
|||
public: |
|||
BgMeshData(Eigen::Vector<double, dim> leftDownPnt_, Eigen::Vector<double, dim> rightUpPnt_) |
|||
{ |
|||
leftDownPnt = leftDownPnt_; |
|||
rightUpPnt = rightUpPnt_; |
|||
centerPnt = (leftDownPnt + rightUpPnt) / 2.0; |
|||
} |
|||
}; |
|||
|
|||
template <size_t dim> |
|||
class BgMesh { |
|||
public: |
|||
int leafNum; |
|||
Eigen::Vector<double, dim> leftDownPnt; |
|||
Eigen::Vector<double, dim> rightUpPnt; |
|||
std::vector<BgMeshData<dim>> meshData; |
|||
|
|||
public: |
|||
BgMesh(Eigen::Vector<double, dim> leftDownPnt_, Eigen::Vector<double, dim> rightUpPnt_) |
|||
{ |
|||
} |
|||
}; |
|||
}; |
@ -0,0 +1,47 @@ |
|||
#pragma once |
|||
|
|||
#include <Eigen/Eigen> |
|||
|
|||
namespace ImplictSIM { |
|||
|
|||
template <size_t dim> |
|||
class ImplictModel { |
|||
public: |
|||
typedef double (*disCalculationPtr)(const Eigen::Vector<double, dim>& point); |
|||
typedef double (*gradientDirXPtr)(const Eigen::Vector<double, dim>& point); |
|||
typedef double (*gradientDirYPtr)(const Eigen::Vector<double, dim>& point); |
|||
typedef double (*gradientDirZPtr)(const Eigen::Vector<double, dim>& point); |
|||
ImplictModel(disCalculationPtr disFunc_, gradientDirXPtr gradOnX_, |
|||
gradientDirYPtr gradOnY_, gradientDirZPtr gradOnZ_) |
|||
: disFunc(disFunc_) |
|||
, gradOnX(gradOnX_) |
|||
, gradOnY(gradOnY_) |
|||
, gradOnZ(gradOnZ_) |
|||
{ |
|||
} |
|||
|
|||
double getSignedDis(const Eigen::Vector<double, dim>& point) |
|||
{ |
|||
return disFunc(point); |
|||
} |
|||
double getGradOnX(const Eigen::Vector<double, dim>& point) |
|||
{ |
|||
return gradOnX(point); |
|||
} |
|||
double getGradOnY(const Eigen::Vector<double, dim>& point) |
|||
{ |
|||
return gradOnY(point); |
|||
} |
|||
double getGradOnZ(const Eigen::Vector<double, dim>& point) |
|||
{ |
|||
return gradOnZ(point); |
|||
} |
|||
|
|||
private: |
|||
disCalculationPtr disFunc; |
|||
gradientDirXPtr gradOnX; |
|||
gradientDirXPtr gradOnY; |
|||
gradientDirXPtr gradOnZ; |
|||
}; |
|||
|
|||
}; // namespace ImplictSIM
|
@ -0,0 +1,49 @@ |
|||
#pragma once |
|||
#include "BgMesh/BgMesh.hpp" |
|||
#include "Implict/ImplictModel.hpp" |
|||
#include <algorithm> |
|||
#include <Eigen/Eigen> |
|||
#include <iostream> |
|||
|
|||
namespace ImplictSIM { |
|||
|
|||
enum class HeightDir { X = 0, |
|||
Y = 1, |
|||
Z = 2 }; |
|||
typedef std::pair<double, double> Interval; |
|||
|
|||
template <size_t dim> |
|||
class VolumeIntegral { |
|||
public: |
|||
typedef double (*integrandFunc)(const Eigen::Vector<double, dim>& point); |
|||
int dimension; |
|||
std::vector<ImplictModel<dim>> phiFuncs; |
|||
std::vector<int> si; |
|||
BgMesh<dim> meshU; |
|||
integrandFunc f; |
|||
bool flagS; |
|||
int GaussOrderQ; |
|||
|
|||
public: |
|||
VolumeIntegral(int dimension_, std::vector<ImplictModel<dim>>& phiFuncs_, const std::vector<int>& si_, const BgMesh<dim>& 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<dim> phiFunc,int si, HeightDir k, |
|||
Interval interval, Eigen::Vector<double, dim > x, std::vector<double> roots,double eps); |
|||
|
|||
void getOneIntegrationOnInterval(ImplictModel<dim> phiFunc, int si, |
|||
HeightDir k, Interval interval, Eigen::Vector<double, dim> x, std::vector<double>& hDirPoints); |
|||
|
|||
void getIntegration(); |
|||
}; |
|||
|
|||
}; // namespace ImplictSIM
|
@ -0,0 +1,71 @@ |
|||
#include "Quadrature/Quadrature.hpp" |
|||
|
|||
namespace ImplictSIM { |
|||
template <size_t dim> |
|||
void VolumeIntegral<dim>::findRoots(ImplictModel<dim> phiFunc, int si, HeightDir k, |
|||
Interval interval, Eigen::Vector<double, dim> x, std::vector<double> roots, double eps) |
|||
{ |
|||
Eigen::Vector<double, dim> ek = Eigen::Vector<double, dim>::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 <size_t dim> |
|||
void VolumeIntegral<dim>::getOneIntegrationOnInterval(ImplictModel<dim> phiFunc, int si, |
|||
HeightDir k, Interval interval, Eigen::Vector<double, dim> x, std::vector<double>& hDirPoints) |
|||
{ |
|||
Eigen::Vector<double, dim> ek = Eigen::Vector<double, dim>::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<double> roots; |
|||
findRoots(phiFunc, si, k, interval, x, root, 1e-8); |
|||
Eigen::Vector<double, dim> 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 <size_t dim> |
|||
void VolumeIntegral<dim>::getIntegration() |
|||
{ |
|||
for (int curDim = dim; curDim >= 1; curDim--) { |
|||
if (curDim == 1) { |
|||
} |
|||
} |
|||
} |
|||
|
|||
}; // namespace ImplictSIM
|
@ -0,0 +1,7 @@ |
|||
#include <iostream> |
|||
|
|||
int main() |
|||
{ |
|||
|
|||
return 0; |
|||
} |
Loading…
Reference in new issue