Lagrangian Liquid Simulation
Master Thesis project on simulation of liquids using Lagrangian approach and SPH
|
00001 00002 00003 00004 #include "FluidParticle.h" 00005 00006 FluidParticle::FluidParticle() : Particle() 00007 { 00008 FluidParticle(0); 00009 } 00010 00011 FluidParticle::FluidParticle 00012 ( 00013 const FluidParticle& _particle 00014 ) : 00015 Particle 00016 ( 00017 _particle.getId(), 00018 _particle.getMass(), 00019 _particle.getPosition(), 00020 _particle.getColour(), 00021 _particle.getRadius(), 00022 _particle.getMoveable(), 00023 _particle.getVelocity(), 00024 _particle.getAcceleration(), 00025 _particle.getNetForce() 00026 ) 00027 { 00028 m_name = _particle.getName(); 00029 00030 m_density = _particle.getDensity(); 00031 m_materialRestDensity =_particle.getMaterialRestDensity(); 00032 00033 m_pressure = _particle.getPressure(); 00034 00035 m_viscosityConstant = _particle.getViscosityConstant(); 00036 m_gasConstant = _particle.getGasConstant(); 00037 00038 m_surfaceTensionCoefficient = _particle.getSurfaceTensionCoefficient(); 00039 m_surfaceTensionThreshold = _particle.getSurfaceTensionThreshold(); 00040 m_surfaceColorCoefficient = _particle.getSurfaceColorCoefficient(); 00041 00042 m_interfaceTensionCoefficient = _particle.getInterfaceTensionCoefficient(); 00043 m_interfaceTensionThreshold = _particle.getInterfaceTensionThreshold(); 00044 m_interfaceColorCoefficient = _particle.getInterfaceColorCoefficient(); 00045 00046 m_hasHitEnvironmentYet = _particle.m_hasHitEnvironmentYet; 00047 m_waitUntilFirstHitBoundary = _particle.m_waitUntilFirstHitBoundary; 00048 m_waitUntilFirstHitRBD = _particle.m_waitUntilFirstHitRBD; 00049 } 00050 00051 FluidParticle::FluidParticle 00052 ( 00053 const int _id, 00054 const ngl::Real _mass, 00055 const ngl::Real _density, 00056 const ngl::Vector _position, 00057 const ngl::Vector _velocity, 00058 const ngl::Real _viscosityConstant, 00059 const ngl::Real _gasConstant, 00060 const ngl::Real _surfaceTensionCoefficient, 00061 const ngl::Real _surfaceTensionThreshold, 00062 const ngl::Real _surfaceColorCoefficient, 00063 const ngl::Real _interfaceTensionCoefficient, 00064 const ngl::Real _interfaceTensionThreshold, 00065 const ngl::Real _interfaceColorCoefficient, 00066 const ngl::Colour _colour, 00067 const ngl::Real _radius, 00068 const std::string _name, 00069 const bool _waitUntilFirstHitBoundary, 00070 const bool _waitUntilFirstHitRBD 00071 ) : 00072 Particle(_id, _mass, _position, _colour, _radius, true, _velocity) 00073 { 00074 //init params 00075 m_name = _name; 00076 00077 m_density = _density; 00078 m_materialRestDensity = _density; 00079 00080 m_pressure = 0; 00081 00082 m_viscosityConstant = _viscosityConstant; 00083 m_gasConstant = _gasConstant; 00084 00085 m_surfaceTensionCoefficient = _surfaceTensionCoefficient; 00086 m_surfaceTensionThreshold = _surfaceTensionThreshold; 00087 m_surfaceColorCoefficient = _surfaceColorCoefficient; 00088 00089 m_interfaceTensionCoefficient = _interfaceTensionCoefficient; 00090 m_interfaceTensionThreshold = _interfaceTensionThreshold; 00091 m_interfaceColorCoefficient = _interfaceColorCoefficient; 00092 00093 m_hasHitEnvironmentYet = false; 00094 m_waitUntilFirstHitBoundary = _waitUntilFirstHitBoundary; 00095 m_waitUntilFirstHitRBD = _waitUntilFirstHitRBD; 00096 } 00097 00098 FluidParticle::~FluidParticle() 00099 { 00100 } 00101 00102 void FluidParticle::calculatePressure() 00103 { 00104 //modified ideal gas state equation 00105 m_pressure = m_gasConstant * (m_density - m_materialRestDensity); 00106 } 00107 00108 void FluidParticle::resetForce() 00109 { 00110 Particle::resetForce(); 00111 00112 m_pressureForce = 0; 00113 m_viscosityForce = 0; 00114 m_surfaceTensionForce = 0; 00115 m_gravityForce = 0; 00116 } 00117 00118 void FluidParticle::updateHitForTheFirstTime 00119 ( 00120 const bool _hitBoundary, 00121 const bool _hitRBD 00122 ) 00123 { 00124 //assume no hit for the first time 00125 bool hit1 = false; 00126 bool hit2 = false; 00127 00128 //access hit status for both boundary and rbd 00129 if (m_waitUntilFirstHitBoundary && _hitBoundary )hit1 = true; 00130 if (m_waitUntilFirstHitRBD && _hitRBD )hit2 = true; 00131 00132 //either boundary hit or rbd hit implies hit for the first time has occured 00133 m_hasHitEnvironmentYet = hit1 || hit2; 00134 }