def create_equations(self): sy11_equations = [ Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])], real=False), Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), SY11ColorGradient(dest='fluid', sources=['fluid']) ], real=False), Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor1) ], real=False, update_nnps=True), Group(equations=[SY11DiracDelta(dest='fluid', sources=['fluid'])], real=False), Group(equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), ], real=False), Group( equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor2) ], real=False, update_nnps=True, ), Group(equations=[ MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=0.0), MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), ], ) ] adami_equations = [ Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])], real=False), Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), ], real=False), Group(equations=[ AdamiColorGradient(dest='fluid', sources=['fluid']), ], real=False), Group(equations=[ AdamiReproducingDivergence(dest='fluid', sources=['fluid'], dim=2), ], real=False), Group(equations=[ MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), MomentumEquationViscosityAdami(dest='fluid', sources=['fluid']), CSFSurfaceTensionForceAdami( dest='fluid', sources=None, ) ], ) ] adami_stress_equations = [ Group(equations=[ SummationDensity(dest='fluid', sources=['fluid']), ], real=False), Group(equations=[ TaitEOS(dest='fluid', sources=None, rho0=rho0, c0=c0, gamma=7, p0=p0), ], real=False), Group(equations=[ ColorGradientAdami(dest='fluid', sources=['fluid']), ], real=False), Group(equations=[ ConstructStressMatrix(dest='fluid', sources=None, sigma=sigma, d=2) ], real=False), Group(equations=[ MomentumEquationPressureGradientAdami(dest='fluid', sources=['fluid']), MomentumEquationViscosityAdami(dest='fluid', sources=['fluid' ]), SurfaceForceAdami(dest='fluid', sources=['fluid']), ]), ] tvf_equations = [ Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])], real=False), Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), SmoothedColor(dest='fluid', sources=['fluid']), ], real=False), Group(equations=[ MorrisColorGradient(dest='fluid', sources=['fluid'], epsilon=epsilon), ], real=False), Group(equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), ], real=False), Group(equations=[ MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), CSFSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] morris_equations = [ Group(equations=[ SummationDensitySourceMass(dest='fluid', sources=['fluid']), ], real=False, update_nnps=False), Group(equations=[ TaitEOS(dest='fluid', sources=None, rho0=rho0, c0=c0, gamma=1.0), SmoothedColor(dest='fluid', sources=[ 'fluid', ]), ScaleSmoothingLength(dest='fluid', sources=None, factor=2.0 / 3.0), ], real=False, update_nnps=False), Group(equations=[ MorrisColorGradient(dest='fluid', sources=[ 'fluid', ], epsilon=epsilon), ], real=False, update_nnps=False), Group(equations=[ InterfaceCurvatureFromDensity(dest='fluid', sources=['fluid'], with_morris_correction=True), ScaleSmoothingLength(dest='fluid', sources=None, factor=1.5), ], real=False, update_nnps=False), Group(equations=[ MomentumEquationPressureGradientMorris(dest='fluid', sources=['fluid']), MomentumEquationViscosityMorris(dest='fluid', sources=['fluid']), CSFSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), ], update_nnps=False) ] if self.options.scheme == 'tvf': return tvf_equations elif self.options.scheme == 'adami_stress': return adami_stress_equations elif self.options.scheme == 'adami': return adami_equations elif self.options.scheme == 'shadloo': return sy11_equations else: return morris_equations
def create_equations(self): tvf_equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group(equations=[ SummationDensity(dest='fluid', sources=['fluid', 'wall']) ]), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we can extrapolate the fluid # velocity to the wall for the no-slip boundary # condition. Also compute the smoothed color based on the color # index for a particle. Group(equations=[ StateEquation( dest='fluid', sources=None, rho0=rho0, p0=p0, b=1.0), SetWallVelocity(dest='wall', sources=['fluid']), SmoothedColor(dest='fluid', sources=['fluid']), ]), ################################################################# # Begin Surface tension formulation ################################################################# # Scale the smoothing lengths to determine the interface # quantities. The NNPS need not be updated since the smoothing # length is decreased. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=0.8) ], update_nnps=False), # Compute the gradient of the color function with respect to the # new smoothing length. At the end of this Group, we will have the # interface normals and the discretized dirac delta function for # the fluid-fluid interface. Group(equations=[ ColorGradientUsingNumberDensity(dest='fluid', sources=['fluid', 'wall'], epsilon=0.01 / h0), ], ), # Compute the interface curvature using the modified smoothing # length and interface normals computed in the previous Group. Group(equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), ], ), # Now rescale the smoothing length to the original value for the # rest of the computations. Group( equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=1.25) ], update_nnps=False, ), ################################################################# # End Surface tension formulation ################################################################# # Once the pressure for the fluid phase has been updated via the # state-equation, we can extrapolate the pressure to the wall # ghost particles. After this group, the density and pressure of # the boundary particles has been updated and can be used in the # integration equations. Group(equations=[ SolidWallPressureBC(dest='wall', sources=['fluid'], p0=p0, rho0=rho0, gy=gy), ], ), # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase using the # number density formulation. No penetration boundary # condition using Adami et al's generalized wall boundary # condition. The extrapolated pressure and density on the # wall particles is used in the gradient of pressure to # simulate a repulsive force. MomentumEquationPressureGradient(dest='fluid', sources=['fluid', 'wall'], pb=p0, gy=gy), # Artificial viscosity for the fluid phase. MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), # No-slip boundary condition using Adami et al's # generalized wall boundary condition. This equation # basically computes the viscous contribution on the fluid # from the wall particles. SolidWallNoSlipBC(dest='fluid', sources=['wall'], nu=nu), # Surface tension force for the SY11 formulation ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # Artificial stress for the fluid phase MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] return tvf_equations
def get_equations(self): from pysph.sph.equation import Group from pysph.sph.gas_dynamics.basic import ( ScaleSmoothingLength, UpdateSmoothingLengthFromVolume, SummationDensity, IdealGasEOS, MPMAccelerations) equations = [] # Find the optimal 'h' if self.adaptive_h_scheme == 'mpm': g1 = [] for fluid in self.fluids: g1.append( SummationDensity(dest=fluid, sources=self.fluids, k=self.kernel_factor, density_iterations=True, dim=self.dim, htol=1e-3)) equations.append( Group(equations=g1, update_nnps=True, iterate=True, max_iterations=50)) elif self.adaptive_h_scheme == 'gsph': group = [] for fluid in self.fluids: group.append( ScaleSmoothingLength(dest=fluid, sources=None, factor=2.0)) equations.append(Group(equations=group, update_nnps=True)) group = [] for fluid in self.fluids: group.append( SummationDensity(dest=fluid, sources=self.fluids, dim=self.dim)) equations.append(Group(equations=group, update_nnps=False)) group = [] for fluid in self.fluids: group.append( UpdateSmoothingLengthFromVolume(dest=fluid, sources=None, k=self.kernel_factor, dim=self.dim)) equations.append(Group(equations=group, update_nnps=True)) group = [] for fluid in self.fluids: group.append( SummationDensity(dest=fluid, sources=self.fluids, dim=self.dim)) equations.append(Group(equations=group, update_nnps=False)) # Done with finding the optimal 'h' g2 = [] for fluid in self.fluids: g2.append(IdealGasEOS(dest=fluid, sources=None, gamma=self.gamma)) equations.append(Group(equations=g2)) g3 = [] for fluid in self.fluids: g3.append( MPMAccelerations(dest=fluid, sources=self.fluids, alpha1_min=self.alpha1, alpha2_min=self.alpha2, beta=self.beta, update_alpha1=self.update_alpha1, update_alpha2=self.update_alpha2)) equations.append(Group(equations=g3)) return equations
def get_surface_tension_equations(fluids, solids, scheme, rho0, p0, c0, b, factor1, factor2, nu, sigma, d, epsilon, gamma, real=False): """ This function returns the required equations for the multiphase formulation taking inputs of the fluid particles array, solid particles array, the scheme to be used and other physical parameters Parameters ------------------ fluids: list List of names of fluid particle arrays solids: list List of names of solid particle arrays scheme: string The scheme with which the equations are to be setup. Supported Schemes: 1. TVF scheme with Morris' surface tension. String to be used: "tvf" 2. Adami's surface tension implementation which doesn't involve calculation of curvature. String to be used: "adami_stress" 3. Adami's surface tension implementation which involves calculation of curvature. String to be used: "adami" 4. Shadloo Yildiz surface tension formulation. String to be used: "shadloo" 5. Morris' surface tension formulation. This is the default scheme which will be used if none of the above strings are input as scheme. rho0 : float The reference density of the medium (Currently multiple reference densities for different particles is not supported) p0 : float The background pressure of the medium(Currently multiple background pressures for different particles is not supported) c0 : float The speed of sound of the medium(Currently multiple speeds of sounds for different particles is not supported) b : float The b parameter of the generalized Tait Equation of State. Refer to the Tait Equation's documentation for reference factor1 : float The factor for scaling of smoothing length for calculation of interface curvature number for shadloo's scheme factor2 : float The factor for scaling back of smoothing length for calculation of forces after calculating the interface curvature number in shadloo's scheme nu : float The kinematic viscosity of the medium sigma : float The surface tension of the system d : int The number of dimensions of the problem in the cartesian space epsilon: float Put this option false if the equations are supposed to be evaluated for the ghost particles, else keep it True """ if scheme == 'tvf': result = [] equations = [] for i in fluids+solids: equations.append(SummationDensity(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(StateEquation(dest=i, sources=None, rho0=rho0, p0=p0)) equations.append(SmoothedColor(dest=i, sources=fluids+solids)) for i in solids: equations.append(SolidWallPressureBCnoDensity(dest=i, sources=fluids)) equations.append(SmoothedColor(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MorrisColorGradient(dest=i, sources=fluids+solids, epsilon=epsilon)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(InterfaceCurvatureFromNumberDensity( dest=i, sources=fluids+solids, with_morris_correction=True)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MomentumEquationPressureGradient(dest=i, sources=fluids+solids, pb=p0)) equations.append(MomentumEquationViscosity(dest=i, sources=fluids, nu=nu)) equations.append(CSFSurfaceTensionForce(dest=i, sources=None, sigma=sigma)) equations.append(MomentumEquationArtificialStress(dest=i, sources=fluids)) if len(solids) != 0: equations.append(SolidWallNoSlipBC(dest=i, sources=solids, nu=nu)) result.append(Group(equations)) elif scheme == 'adami_stress': result = [] equations = [] for i in fluids+solids: equations.append(SummationDensity(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(TaitEOS(dest=i, sources=None, rho0=rho0, c0=c0, gamma=gamma, p0=p0)) for i in solids: equations.append(SolidWallPressureBCnoDensity(dest=i, sources=fluids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(ColorGradientAdami(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(ConstructStressMatrix(dest=i, sources=None, sigma=sigma, d=d)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MomentumEquationPressureGradientAdami(dest=i, sources=fluids+solids)) equations.append(MomentumEquationViscosityAdami(dest=i, sources=fluids)) equations.append(SurfaceForceAdami(dest=i, sources=fluids+solids)) if len(solids) != 0: equations.append(SolidWallNoSlipBC(dest=i, sources=solids, nu=nu)) result.append(Group(equations)) elif scheme == 'adami': result = [] equations = [] for i in fluids+solids: equations.append(SummationDensity(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(StateEquation(dest=i, sources=None, rho0=rho0, p0=p0, b=b)) for i in solids: equations.append(SolidWallPressureBCnoDensity(dest=i, sources=fluids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(AdamiColorGradient(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(AdamiReproducingDivergence(dest=i, sources=fluids+solids, dim=d)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MomentumEquationPressureGradient( dest=i, sources=fluids+solids, pb=0.0)) equations.append(MomentumEquationViscosityAdami(dest=i, sources=fluids)) equations.append(CSFSurfaceTensionForceAdami(dest=i, sources=None)) if len(solids) != 0: equations.append(SolidWallNoSlipBC(dest=i, sources=solids, nu=nu)) result.append(Group(equations)) elif scheme == 'shadloo': result = [] equations = [] for i in fluids+solids: equations.append(SummationDensity(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(StateEquation(dest=i, sources=None, rho0=rho0, p0=p0, b=b)) equations.append(SY11ColorGradient(dest=i, sources=fluids+solids)) for i in solids: equations.append(SolidWallPressureBCnoDensity(dest=i, sources=fluids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(ScaleSmoothingLength(dest=i, sources=None, factor=factor1)) result.append(Group(equations, real=real, update_nnps=True)) equations = [] for i in fluids: equations.append(SY11DiracDelta(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(InterfaceCurvatureFromNumberDensity( dest=i, sources=fluids+solids, with_morris_correction=True)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(ScaleSmoothingLength(dest=i, sources=None, factor=factor2)) result.append(Group(equations, real=real, update_nnps=True)) equations = [] for i in fluids: equations.append(MomentumEquationPressureGradient( dest=i, sources=fluids+solids, pb=0.0)) equations.append(MomentumEquationViscosity(dest=i, sources=fluids, nu=nu)) equations.append(ShadlooYildizSurfaceTensionForce(dest=i, sources=None, sigma=sigma)) if len(solids) != 0: equations.append(SolidWallNoSlipBC(dest=i, sources=solids, nu=nu)) result.append(Group(equations)) else: result = [] equations = [] for i in fluids+solids: equations.append(SummationDensitySourceMass(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(TaitEOS(dest=i, sources=None, rho0=rho0, c0=c0, gamma=gamma, p0=0.0)) equations.append(SmoothedColor(dest=i, sources=fluids+solids)) for i in solids: equations.append(SolidWallPressureBCnoDensity(dest=i, sources=fluids)) equations.append(SmoothedColor(dest=i, sources=fluids+solids)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MorrisColorGradient(dest=i, sources=fluids+solids, epsilon=epsilon)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(InterfaceCurvatureFromDensity( dest=i, sources=fluids+solids, with_morris_correction=True)) result.append(Group(equations, real=real)) equations = [] for i in fluids: equations.append(MomentumEquationPressureGradientMorris(dest=i, sources=fluids+solids)) equations.append(MomentumEquationViscosityMorris(dest=i, sources=fluids)) equations.append(CSFSurfaceTensionForce(dest=i, sources=None, sigma=sigma)) if len(solids) != 0: equations.append(SolidWallNoSlipBC(dest=i, sources=solids, nu=nu)) result.append(Group(equations)) return result
def create_equations(self): equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group(equations=[ SummationDensity(dest='fluid', sources=['fluid']), ]), # Given the updated number density for the fluid, we can update # the fluid pressure. Also compute the smoothed color based on the # color index for a particle. Group(equations=[ StateEquation( dest='fluid', sources=None, rho0=rho0, p0=p0, b=1.0), SmoothedColor(dest='fluid', sources=['fluid']), ]), ################################################################# # Begin Surface tension formulation ################################################################# # Scale the smoothing lengths to determine the interface # quantities. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor1) ], update_nnps=False), # Compute the gradient of the color function with respect to the # new smoothing length. At the end of this Group, we will have the # interface normals and the discretized dirac delta function for # the fluid-fluid interface. Group( equations=[ MorrisColorGradient(dest='fluid', sources=['fluid'], epsilon=0.01 / h0), # ColorGradientUsingNumberDensity(dest='fluid',sources=['fluid'], # epsilon=epsilon), # AdamiColorGradient(dest='fluid', sources=['fluid']), ], ), # Compute the interface curvature using the modified smoothing # length and interface normals computed in the previous Group. Group( equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), # AdamiReproducingDivergence(dest='fluid',sources=['fluid'], # dim=2), ], ), # Now rescale the smoothing length to the original value for the # rest of the computations. Group( equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor2) ], update_nnps=False, ), ################################################################# # End Surface tension formulation ################################################################# # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase using the # number density formulation. MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), # Artificial viscosity for the fluid phase. MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), # Surface tension force for the SY11 formulation ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # Artificial stress for the fluid phase MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] return equations
def create_equations(self): equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group(equations=[ SummationDensity(dest='fluid', sources=['fluid', 'wall']) ]), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we compute the gradient of the # color function with respect to the original smoothing # length. This will compute the interface normals. Also compute # the smoothed color based on the color index for a particle. Group(equations=[ IsothermalEOS( dest='fluid', sources=None, rho0=rho0, c0=c0, p0=p0), SmoothedColor(dest='fluid', sources=['fluid']), ]), ################################################################# # Begin Surface tension formulation ################################################################# # Scale the smoothing lengths to determine the interface # quantities. The NNPS need not be updated since the smoothing # length is decreased. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=0.8) ], update_nnps=False), # Compute the gradient of the color function with respect to the # new smoothing length. At the end of this Group, we will have the # interface normals and the discretized dirac delta function for # the fluid-fluid interface. Group(equations=[ ColorGradientUsingNumberDensity(dest='fluid', sources=['fluid', 'wall']), ], ), # Compute the interface curvature using the modified smoothing # length and interface normals computed in the previous Group. Group(equations=[ InterfaceCurvatureFromNumberDensity(dest='fluid', sources=['fluid']), ], ), # Now rescale the smoothing length to the original value for the # rest of the computations. Group( equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=1.25) ], update_nnps=False, ), ################################################################# # End Surface tension formulation ################################################################# # Once the pressure for the fluid phase has been updated via the # state-equation, we can extrapolate the pressure to the wall # ghost particles. After this group, the density and pressure of # the boundary particles has been updated and can be used in the # integration equations. Group(equations=[ SolidWallPressureBC(dest='wall', sources=['fluid'], p0=p0, rho0=rho0, gy=gy, b=1.0), ], ), # The main acceleration block Group( equations=[ # Body force due to gravity BodyForce(dest='fluid', sources=None, fy=gy), # Gradient of pressure for the fluid phase using the # number density formulation. The no-penetration boundary # condition is taken care of by using the boundary # pressure and density. PressureGradientUsingNumberDensity( dest='fluid', sources=['fluid', 'wall']), # Artificial viscosity for the fluid phase. ClearyArtificialViscosity(dest='fluid', sources=['fluid', 'wall'], dim=dim, alpha=alpha), # Surface tension force for the SY11 formulation ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # XSPH Correction XSPHCorrection(dest='fluid', sources=['fluid'], eps=0.1), ], ) ] return equations
def create_equations(self): sy11_equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])]), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we can compute the Shepard # Filtered velocity required for the no-penetration boundary # condition. Also compute the gradient of the color function to # compute the normal at the interface. Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), SY11ColorGradient(dest='fluid', sources=['fluid']) ]), ################################################################# # Begin Surface tension formulation ################################################################# # Scale the smoothing lengths to determine the interface # quantities. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor1) ], update_nnps=False), # Compute the discretized dirac delta with respect to the new # smoothing length. Group(equations=[SY11DiracDelta(dest='fluid', sources=['fluid'])], ), # Compute the interface curvature using the modified smoothing # length and interface normals computed in the previous Group. Group(equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), ], ), # Now rescale the smoothing length to the original value for the # rest of the computations. Group( equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor2) ], update_nnps=False, ), ################################################################# # End Surface tension formulation ################################################################# # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase using the # number density formulation. No penetration boundary # condition using Adami et al's generalized wall boundary # condition. The extrapolated pressure and density on the # wall particles is used in the gradient of pressure to # simulate a repulsive force. MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), # Artificial viscosity for the fluid phase. MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), # Surface tension force for the SY11 formulation ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # Artificial stress for the fluid phase MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] morris_equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])]), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we can compute the Shepard # Filtered velocity required for the no-penetration boundary # condition. Also compute the smoothed color based on the color # index for a particle. Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), SmoothedColor(dest='fluid', sources=['fluid'], smooth=True), ]), ################################################################# # Begin Surface tension formulation ################################################################# # Compute the gradient of the smoothed color field. At the end of # this Group, we will have the interface normals and the # discretized dirac delta function for the fluid-fluid interface. Group(equations=[ MorrisColorGradient(dest='fluid', sources=['fluid'], epsilon=epsilon), ], ), # Compute the interface curvature computed in the previous Group. Group(equations=[ InterfaceCurvatureFromNumberDensity( dest='fluid', sources=['fluid'], with_morris_correction=True), ], ), ################################################################# # End Surface tension formulation ################################################################# # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), # Artificial viscosity for the fluid phase. MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), # Surface tension force for the Morris formulation CSFSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # Artificial stress for the fluid phase MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] adami_equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group( equations=[SummationDensity(dest='fluid', sources=['fluid'])]), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we can compute the Shepard # Filtered velocity required for the no-penetration boundary # condition. Group(equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, p0=p0), ]), ################################################################# # Begin Surface tension formulation ################################################################# # Compute the gradient of the color field. Group(equations=[ AdamiColorGradient(dest='fluid', sources=['fluid']), ], ), # Compute the interface curvature using the color gradients # computed in the previous Group. Group(equations=[ AdamiReproducingDivergence(dest='fluid', sources=['fluid'], dim=2), ], ), ################################################################# # End Surface tension formulation ################################################################# # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase MomentumEquationPressureGradient(dest='fluid', sources=['fluid'], pb=p0), # Artificial viscosity for the fluid phase. MomentumEquationViscosity(dest='fluid', sources=['fluid'], nu=nu), # Surface tension force for the CSF formulation CSFSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), # Artificial stress for the fluid phase MomentumEquationArtificialStress(dest='fluid', sources=['fluid']), ], ) ] if self.options.scheme == 'morris': return morris_equations elif self.options.scheme == 'adami': return adami_equations else: return sy11_equations
def create_equations(self): sy11_equations = [ # We first compute the mass and number density of the fluid # phase. This is used in all force computations henceforth. The # number density (1/volume) is explicitly set for the solid phase # and this isn't modified for the simulation. Group( equations=[ SummationDensity(dest='fluid', sources=['fluid', 'wall']), # SummationDensity(dest='wall', sources=['fluid', 'wall']) ], real=False), # Given the updated number density for the fluid, we can update # the fluid pressure. Additionally, we can compute the Shepard # Filtered velocity required for the no-penetration boundary # condition. Also compute the gradient of the color function to # compute the normal at the interface. Group( equations=[ StateEquation(dest='fluid', sources=None, rho0=rho0, b=0.0, p0=p0), SetWallVelocity(dest='wall', sources=['fluid']), # SmoothedColor(dest='fluid', sources=['fluid']), ], real=False), Group(equations=[ SolidWallPressureBC(dest='wall', sources=['fluid'], p0=p0, rho0=rho0, gy=gy, b=1.0), ], real=False), ################################################################# # Begin Surface tension formulation ################################################################# # Scale the smoothing lengths to determine the interface # quantities. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor1) ], update_nnps=True), # Compute the discretized dirac delta with respect to the new # smoothing length. Group(equations=[ SY11DiracDelta(dest='fluid', sources=['fluid', 'wall']) ], real=False), # Compute the interface curvature using the modified smoothing # length and interface normals computed in the previous Group. Group(equations=[ InterfaceCurvatureFromNumberDensity(dest='fluid', sources=['fluid']), ], real=False), # Now rescale the smoothing length to the original value for the # rest of the computations. Group(equations=[ ScaleSmoothingLength(dest='fluid', sources=None, factor=factor2) ], update_nnps=True), ################################################################# # End Surface tension formulation ################################################################# # The main acceleration block Group( equations=[ # Gradient of pressure for the fluid phase using the # number density formulation. No penetration boundary # condition using Adami et al's generalized wall boundary # condition. The extrapolated pressure and density on the # wall particles is used in the gradient of pressure to # simulate a repulsive force. BodyForce(dest='fluid', sources=None, fy=gy), MomentumEquationPressureGradient(dest='fluid', sources=['fluid', 'wall']), # Artificial viscosity for the fluid phase. ShadlooArtificialViscosity(dest='fluid', sources=['fluid', 'wall']), # Surface tension force for the SY11 formulation ShadlooYildizSurfaceTensionForce(dest='fluid', sources=None, sigma=sigma), ], ) ] return sy11_equations