Skip to content

Commit 17165f0

Browse files
author
bender
committed
- added density constraint (position based fluids)
- added fluid demo
1 parent 7417d58 commit 17165f0

31 files changed

+44400
-86
lines changed

CMake/Common.cmake

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@ set(CMAKE_DEBUG_POSTFIX "d")
55
if (WIN32)
66
set(CMAKE_USE_RELATIVE_PATHS "1")
77
# Set compiler flags for "release"
8-
set(CMAKE_CXX_FLAGS_RELEASE "/MD /Ox /Ob2 /Oi /Ot /GL /D NDEBUG")
8+
set(CMAKE_CXX_FLAGS_RELEASE "/MD /Ox /Ob2 /Oi /Ot /GL /D NDEBUG /openmp")
99
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
10-
set(IBDS_STATIC_LIBRARY_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
10+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
11+
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
1112
endif (WIN32)
1213

1314
if (UNIX)
1415
set(CMAKE_USE_RELATIVE_PATHS "1")
1516
# Set compiler flags for "release"
16-
set(CMAKE_CXX_FLAGS_RELEASE "/MD /Ox /Ob2 /Oi /Ot /GL /D NDEBUG")
17-
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
18-
set(IBDS_STATIC_LIBRARY_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
17+
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -fopenmp")
1918
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/${CMAKE_BUILD_TYPE})
2019
endif (UNIX)
2120

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
1010
include(${PROJECT_PATH}/CMake/Common.cmake)
1111

1212
if (WIN32)
13-
subdirs(extern/freeglut extern/AntTweakBar Demos PositionBasedDynamics)
13+
subdirs(extern/freeglut extern/AntTweakBar extern/glew Demos PositionBasedDynamics)
1414
else()
15-
subdirs(extern/AntTweakBar Demos PositionBasedDynamics)
15+
subdirs(extern/AntTweakBar extern/glew Demos PositionBasedDynamics)
1616
endif()
1717

1818

Changelog.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
1.1.0
2+
3+
- added second order velocity update
4+
- fixed build for Linux
5+
- added AntTweakBar sources
6+
- added second order velocity update
7+
- added density constraint (position based fluids)
8+
- added fluid demo
9+
10+
1.0.0
11+
12+
- Initial release

Demos/BarDemo/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
set(SIMULATION_LINK_LIBRARIES AntTweakBar PositionBasedDynamics)
2-
set(SIMULATION_DEPENDENCIES AntTweakBar PositionBasedDynamics)
1+
set(SIMULATION_LINK_LIBRARIES AntTweakBar glew PositionBasedDynamics)
2+
set(SIMULATION_DEPENDENCIES AntTweakBar glew PositionBasedDynamics)
33

44
if(WIN32)
55
set(SIMULATION_LINK_LIBRARIES freeglut opengl32.lib glu32.lib ${SIMULATION_LINK_LIBRARIES})
@@ -39,6 +39,7 @@ add_definitions(-DTW_NO_LIB_PRAGMA -DTW_STATIC)
3939
find_package( Eigen3 REQUIRED )
4040
include_directories( ${EIGEN3_INCLUDE_DIR} )
4141
include_directories(${PROJECT_PATH}/extern/freeglut/include)
42+
include_directories(${PROJECT_PATH}/extern/glew/include)
4243

4344
add_dependencies(BarDemo ${SIMULATION_DEPENDENCIES})
4445
target_link_libraries(BarDemo ${SIMULATION_LINK_LIBRARIES})

Demos/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
include(Visualization/CMakeLists.txt)
22

3-
subdirs(BarDemo ClothDemo)
3+
subdirs(BarDemo ClothDemo FluidDemo)

Demos/ClothDemo/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
set(SIMULATION_LINK_LIBRARIES AntTweakBar PositionBasedDynamics)
2-
set(SIMULATION_DEPENDENCIES AntTweakBar PositionBasedDynamics)
1+
set(SIMULATION_LINK_LIBRARIES AntTweakBar glew PositionBasedDynamics)
2+
set(SIMULATION_DEPENDENCIES AntTweakBar glew PositionBasedDynamics)
33

44
if(WIN32)
55
set(SIMULATION_LINK_LIBRARIES freeglut opengl32.lib glu32.lib ${SIMULATION_LINK_LIBRARIES})
@@ -38,6 +38,7 @@ add_definitions(-DTW_NO_LIB_PRAGMA -DTW_STATIC)
3838
find_package( Eigen3 REQUIRED )
3939
include_directories( ${EIGEN3_INCLUDE_DIR} )
4040
include_directories(${PROJECT_PATH}/extern/freeglut/include)
41+
include_directories(${PROJECT_PATH}/extern/glew/include)
4142

4243
add_dependencies(ClothDemo ${SIMULATION_DEPENDENCIES})
4344
target_link_libraries(ClothDemo ${SIMULATION_LINK_LIBRARIES})

Demos/FluidDemo/CMakeLists.txt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
set(SIMULATION_LINK_LIBRARIES AntTweakBar glew PositionBasedDynamics)
2+
set(SIMULATION_DEPENDENCIES AntTweakBar glew PositionBasedDynamics)
3+
4+
if(WIN32)
5+
set(SIMULATION_LINK_LIBRARIES freeglut opengl32.lib glu32.lib ${SIMULATION_LINK_LIBRARIES})
6+
set(SIMULATION_DEPENDENCIES freeglut ${SIMULATION_DEPENDENCIES})
7+
else()
8+
find_package(GLUT REQUIRED)
9+
find_package(OpenGL REQUIRED)
10+
11+
set(SIMULATION_LINK_LIBRARIES
12+
${GLUT_LIBRARIES}
13+
${OPENGL_LIBRARIES}
14+
${SIMULATION_LINK_LIBRARIES}
15+
)
16+
endif()
17+
18+
add_executable(FluidDemo
19+
main.cpp
20+
21+
TimeStepFluidModel.cpp
22+
TimeStepFluidModel.h
23+
FluidModel.cpp
24+
FluidModel.h
25+
26+
${VIS_FILES}
27+
${PROJECT_PATH}/Demos/Utils/Config.h
28+
${PROJECT_PATH}/Demos/Utils/TimeManager.cpp
29+
${PROJECT_PATH}/Demos/Utils/TimeManager.h
30+
${PROJECT_PATH}/Demos/Utils/ParticleData.h
31+
${PROJECT_PATH}/Demos/Utils/NeighborhoodSearchSpatialHashing.cpp
32+
${PROJECT_PATH}/Demos/Utils/NeighborhoodSearchSpatialHashing.h
33+
34+
CMakeLists.txt
35+
)
36+
37+
add_definitions(-DTW_NO_LIB_PRAGMA -DTW_STATIC)
38+
39+
find_package( Eigen3 REQUIRED )
40+
include_directories( ${EIGEN3_INCLUDE_DIR} )
41+
include_directories(${PROJECT_PATH}/extern/freeglut/include)
42+
include_directories(${PROJECT_PATH}/extern/glew/include)
43+
44+
add_dependencies(FluidDemo ${SIMULATION_DEPENDENCIES})
45+
target_link_libraries(FluidDemo ${SIMULATION_LINK_LIBRARIES})
46+
VIS_SOURCE_GROUPS()

Demos/FluidDemo/FluidModel.cpp

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#include "FluidModel.h"
2+
#include "PositionBasedDynamics/PositionBasedDynamics.h"
3+
#include "PositionBasedDynamics/SPHKernels.h"
4+
5+
using namespace PBD;
6+
7+
FluidModel::FluidModel() :
8+
m_particles()
9+
{
10+
m_density0 = 1000.0f;
11+
m_particleRadius = 0.025f;
12+
viscosity = 0.02f;
13+
m_neighborhoodSearch = NULL;
14+
}
15+
16+
FluidModel::~FluidModel(void)
17+
{
18+
cleanupModel();
19+
}
20+
21+
void FluidModel::cleanupModel()
22+
{
23+
m_particles.release();
24+
m_lambda.clear();
25+
m_density.clear();
26+
m_deltaX.clear();
27+
delete m_neighborhoodSearch;
28+
}
29+
30+
void FluidModel::reset()
31+
{
32+
const unsigned int nPoints = m_particles.size();
33+
34+
for(unsigned int i=0; i < nPoints; i++)
35+
{
36+
const Eigen::Vector3f& x0 = m_particles.getPosition0(i);
37+
m_particles.getPosition(i) = x0;
38+
m_particles.getLastPosition(i) = m_particles.getPosition(i);
39+
m_particles.getOldPosition(i) = m_particles.getPosition(i);
40+
m_particles.getVelocity(i).setZero();
41+
m_particles.getAcceleration(i).setZero();
42+
m_deltaX[i].setZero();
43+
m_lambda[i] = 0.0f;
44+
m_density[i] = 0.0f;
45+
}
46+
}
47+
48+
ParticleData & PBD::FluidModel::getParticles()
49+
{
50+
return m_particles;
51+
}
52+
53+
void FluidModel::initMasses()
54+
{
55+
const int nParticles = (int) m_particles.size();
56+
const float diam = 2.0f*m_particleRadius;
57+
58+
#pragma omp parallel default(shared)
59+
{
60+
#pragma omp for schedule(static)
61+
for (int i = 0; i < nParticles; i++)
62+
{
63+
m_particles.setMass(i, 0.8f * diam*diam*diam * m_density0); // each particle represents a cube with a side length of r
64+
// mass is slightly reduced to prevent pressure at the beginning of the simulation
65+
}
66+
}
67+
}
68+
69+
70+
/** Resize the arrays containing the particle data.
71+
*/
72+
void FluidModel::resizeFluidParticles(const unsigned int newSize)
73+
{
74+
m_particles.resize(newSize);
75+
m_lambda.resize(newSize);
76+
m_density.resize(newSize);
77+
m_deltaX.resize(newSize);
78+
}
79+
80+
81+
/** Release the arrays containing the particle data.
82+
*/
83+
void FluidModel::releaseFluidParticles()
84+
{
85+
m_particles.release();
86+
m_lambda.clear();
87+
m_density.clear();
88+
m_deltaX.clear();
89+
}
90+
91+
void FluidModel::initModel(const unsigned int nFluidParticles, Eigen::Vector3f* fluidParticles, const unsigned int nBoundaryParticles, Eigen::Vector3f* boundaryParticles)
92+
{
93+
releaseFluidParticles();
94+
resizeFluidParticles(nFluidParticles);
95+
96+
// init kernel
97+
CubicKernel::setRadius(m_supportRadius);
98+
99+
// copy fluid positions
100+
#pragma omp parallel default(shared)
101+
{
102+
#pragma omp for schedule(static)
103+
for (int i = 0; i < (int)nFluidParticles; i++)
104+
{
105+
m_particles.getPosition0(i) = fluidParticles[i];
106+
}
107+
}
108+
109+
m_boundaryX.resize(nBoundaryParticles);
110+
m_boundaryPsi.resize(nBoundaryParticles);
111+
112+
// copy boundary positions
113+
#pragma omp parallel default(shared)
114+
{
115+
#pragma omp for schedule(static)
116+
for (int i = 0; i < (int)nBoundaryParticles; i++)
117+
{
118+
m_boundaryX[i] = boundaryParticles[i];
119+
}
120+
}
121+
122+
// initialize masses
123+
initMasses();
124+
125+
//////////////////////////////////////////////////////////////////////////
126+
// Compute value psi for boundary particles (boundary handling)
127+
// (see Akinci et al. "Versatile rigid - fluid coupling for incompressible SPH", Siggraph 2012
128+
//////////////////////////////////////////////////////////////////////////
129+
130+
// Search boundary neighborhood
131+
NeighborhoodSearchSpatialHashing neighborhoodSearchSH(nBoundaryParticles, m_supportRadius);
132+
neighborhoodSearchSH.neighborhoodSearch(&m_boundaryX[0]);
133+
134+
unsigned int **neighbors = neighborhoodSearchSH.getNeighbors();
135+
unsigned int *numNeighbors = neighborhoodSearchSH.getNumNeighbors();
136+
137+
#pragma omp parallel default(shared)
138+
{
139+
#pragma omp for schedule(static)
140+
for (int i = 0; i < (int) nBoundaryParticles; i++)
141+
{
142+
float delta = CubicKernel::W_zero();
143+
for (unsigned int j = 0; j < numNeighbors[i]; j++)
144+
{
145+
const unsigned int neighborIndex = neighbors[i][j];
146+
delta += CubicKernel::W(m_boundaryX[i] - m_boundaryX[neighborIndex]);
147+
}
148+
const float volume = 1.0f / delta;
149+
m_boundaryPsi[i] = m_density0 * volume;
150+
}
151+
}
152+
153+
154+
// Initialize neighborhood search
155+
if (m_neighborhoodSearch == NULL)
156+
m_neighborhoodSearch = new NeighborhoodSearchSpatialHashing(m_particles.size(), m_supportRadius);
157+
m_neighborhoodSearch->setRadius(m_supportRadius);
158+
159+
reset();
160+
}

0 commit comments

Comments
 (0)