diff options
Diffstat (limited to 'extern/mantaflow/preprocessed/vortexsheet.cpp')
-rw-r--r-- | extern/mantaflow/preprocessed/vortexsheet.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/extern/mantaflow/preprocessed/vortexsheet.cpp b/extern/mantaflow/preprocessed/vortexsheet.cpp new file mode 100644 index 00000000000..695b881006d --- /dev/null +++ b/extern/mantaflow/preprocessed/vortexsheet.cpp @@ -0,0 +1,116 @@ + + +// DO NOT EDIT ! +// This file is generated using the MantaFlow preprocessor (prep generate). + +/****************************************************************************** + * + * MantaFlow fluid solver framework + * Copyright 2011 Tobias Pfaff, Nils Thuerey + * + * This program is free software, distributed under the terms of the + * Apache License, Version 2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Vortex sheets + * (warning, the vortex methods are currently experimental, and not fully supported!) + * + ******************************************************************************/ + +#include "vortexsheet.h" +#include "solvana.h" + +using namespace std; +namespace Manta { + +// ***************************************************************************** +// VorticityChannel class members + +// ***************************************************************************** +// VortexSheet Mesh class members + +VortexSheetMesh::VortexSheetMesh(FluidSolver *parent) : Mesh(parent), mTexOffset(0.0f) +{ + addTriChannel(&mVorticity); + addNodeChannel(&mTex1); + addNodeChannel(&mTex2); + addNodeChannel(&mTurb); +} + +Mesh *VortexSheetMesh::clone() +{ + VortexSheetMesh *nm = new VortexSheetMesh(mParent); + *nm = *this; + nm->setName(getName()); + return nm; +} + +void VortexSheetMesh::calcVorticity() +{ + for (size_t tri = 0; tri < mTris.size(); tri++) { + VortexSheetInfo &v = mVorticity.data[tri]; + Vec3 e0 = getEdge(tri, 0), e1 = getEdge(tri, 1), e2 = getEdge(tri, 2); + Real area = getFaceArea(tri); + + if (area < 1e-10) { + v.smokeAmount = 0; + v.vorticity = 0; + } + else { + v.smokeAmount = 0; + v.vorticity = (v.circulation[0] * e0 + v.circulation[1] * e1 + v.circulation[2] * e2) / area; + } + } +} + +void VortexSheetMesh::calcCirculation() +{ + for (size_t tri = 0; tri < mTris.size(); tri++) { + VortexSheetInfo &v = mVorticity.data[tri]; + Vec3 e0 = getEdge(tri, 0), e1 = getEdge(tri, 1), e2 = getEdge(tri, 2); + Real area = getFaceArea(tri); + + if (area < 1e-10 || normSquare(v.vorticity) < 1e-10) { + v.circulation = 0; + continue; + } + + float cx, cy, cz; + SolveOverconstraint34(e0.x, + e0.y, + e0.z, + e1.x, + e1.y, + e1.z, + e2.x, + e2.y, + e2.z, + v.vorticity.x, + v.vorticity.y, + v.vorticity.z, + cx, + cy, + cz); + v.circulation = Vec3(cx, cy, cz) * area; + } +} + +void VortexSheetMesh::resetTex1() +{ + for (size_t i = 0; i < mNodes.size(); i++) + mTex1.data[i] = mNodes[i].pos + mTexOffset; +} + +void VortexSheetMesh::resetTex2() +{ + for (size_t i = 0; i < mNodes.size(); i++) + mTex2.data[i] = mNodes[i].pos + mTexOffset; +} + +void VortexSheetMesh::reinitTexCoords() +{ + resetTex1(); + resetTex2(); +} + +}; // namespace Manta |