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