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