/// <summary> /// Calls the calculation of the hydrodynamics /// </summary> /// <param name="U"></param> /// <param name="P"></param> /// <param name="levelSetTracker"></param> /// <param name="muA"></param> public override void UpdateForcesAndTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, bool firstIteration, double dt = 0) { double[] tempForces = new double[m_Dim]; double tempTorque = CalculateHydrodynamicTorque(hydrodynamicsIntegration); HydrodynamicsPostprocessing(tempTorque); }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="hydrodynamicsIntegration"></param> /// <param name="fluidDensity"></param> public override Vector CalculateHydrodynamicForces(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, CellMask cutCells, double dt) { Vector tempForces = new Vector(SpatialDim); tempForces = CalculateGravitationalForces(fluidDensity, tempForces); return(tempForces); }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="U"></param> /// <param name="P"></param> /// <param name="levelSetTracker"></param> /// <param name="fluidViscosity"></param> /// <param name="cutCells"></param> /// <param name="dt"></param> public virtual double CalculateHydrodynamicTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, CellMask cutCells, double dt = 0) { double tempTorque = hydrodynamicsIntegration.Torque(Position[0], cutCells); Aux.TestArithmeticException(tempTorque, "temporal torque during calculation of hydrodynamics"); TorqueMPISum(ref tempTorque); return(tempTorque); }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="U"></param> /// <param name="P"></param> /// <param name="levelSetTracker"></param> /// <param name="fluidViscosity"></param> /// <param name="cutCells"></param> /// <param name="dt"></param> public override double CalculateHydrodynamicTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, CellMask cutCells, double dt) { double tempTorque = hydrodynamicsIntegration.Torque(GetPosition(0), cutCells); Aux.TestArithmeticException(tempTorque, "temporal torque during calculation of hydrodynamics"); TorqueMPISum(ref tempTorque); TorqueAddedDamping(ref tempTorque, dt); return(tempTorque); }
/// <summary> /// ... /// </summary> /// <param name="AllParticles"></param> /// <param name="hydrodynamicsIntegration"></param> /// <param name="fluidDensity"></param> /// <param name="underrelax"></param> internal void CalculateHydrodynamics(List <Particle> AllParticles, ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, bool underrelax) { double[] hydrodynamics = new double[m_Dim * AllParticles.Count() + AllParticles.Count()]; for (int p = 0; p < AllParticles.Count(); p++) { Particle currentParticle = AllParticles[p]; CellMask cutCells = currentParticle.CutCells_P(m_LsTrk); int offset = p * (m_Dim + 1); double[] tempForces = currentParticle.Motion.CalculateHydrodynamicForces(hydrodynamicsIntegration, fluidDensity, cutCells); double tempTorque = currentParticle.Motion.CalculateHydrodynamicTorque(hydrodynamicsIntegration, cutCells); for (int d = 0; d < m_Dim; d++) { hydrodynamics[offset + d] = tempForces[d]; } hydrodynamics[offset + m_Dim] = tempTorque; } for (int p = 0; p < AllParticles.Count(); p++) { Particle currentParticle = AllParticles[p]; int offset = p * (m_Dim + 1); if (!currentParticle.IsMaster) { continue; } if (!currentParticle.MasterGhostIDs.IsNullOrEmpty()) { for (int g = 1; g < currentParticle.MasterGhostIDs.Length; g++) { int ghostOffset = (currentParticle.MasterGhostIDs[g] - 1) * (m_Dim + 1); if (currentParticle.MasterGhostIDs[g] < 1) { continue; } for (int d = 0; d < m_Dim; d++) { hydrodynamics[offset + d] += hydrodynamics[ghostOffset + d]; hydrodynamics[ghostOffset + d] = 0; } hydrodynamics[offset + m_Dim] += hydrodynamics[ghostOffset + m_Dim]; hydrodynamics[ghostOffset + m_Dim] = 0; } } } double[] relaxatedHydrodynamics = hydrodynamics.CloneAs(); double omega = AllParticles[0].Motion.omega; if (underrelax) { relaxatedHydrodynamics = HydrodynamicsPostprocessing(hydrodynamics, ref omega); } AllParticles[0].Motion.omega = omega; for (int p = 0; p < AllParticles.Count(); p++) { Particle currentParticle = AllParticles[p]; currentParticle.Motion.UpdateForcesAndTorque(p, relaxatedHydrodynamics); } }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="hydrodynamicsIntegration"></param> /// <param name="fluidDensity"></param> public override Vector CalculateHydrodynamicForces(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, CellMask cutCells, double dt) { Vector tempForces = new Vector(hydrodynamicsIntegration.Forces(out List <double[]>[] stressToPrintOut, cutCells)); currentStress = TransformStressToPrint(stressToPrintOut); Aux.TestArithmeticException(tempForces, "temporal forces during calculation of hydrodynamics"); tempForces = ForcesMPISum(tempForces); tempForces = CalculateGravitationalForces(fluidDensity, tempForces); return(tempForces); }
/// <summary> /// Overrides the calculation of hydrodynamics for fixed particles, so that nothing happens. /// </summary> public override void UpdateForcesAndTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration = null, double fluidDensity = 0, bool firstIteration = false, double dt = 0) { double[] tempForces = new double[m_Dim]; for (int d = 0; d < m_Dim; d++) { tempForces[d] = Gravity[d] * Density * ParticleArea; } double tempTorque = 0; HydrodynamicsPostprocessing(tempForces, tempTorque); }
/// <summary> /// Calls the calculation of the hydrodynamics /// </summary> /// <param name="U"></param> /// <param name="P"></param> /// <param name="levelSetTracker"></param> /// <param name="fluidViscosity"></param> public override void UpdateForcesAndTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, bool firstIteration, double dt = 0) { double[] tempForces = CalculateHydrodynamicForces(hydrodynamicsIntegration, fluidDensity); HydrodynamicsPostprocessing(tempForces); }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="U"></param> /// <param name="P"></param> /// <param name="levelSetTracker"></param> /// <param name="fluidViscosity"></param> /// <param name="cutCells"></param> /// <param name="dt"></param> public override double CalculateHydrodynamicTorque(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, CellMask cutCells, double dt) { return(0); }
/// <summary> /// Update Forces and Torque acting from fluid onto the particle /// </summary> /// <param name="hydrodynamicsIntegration"></param> /// <param name="fluidDensity"></param> public override Vector CalculateHydrodynamicForces(ParticleHydrodynamicsIntegration hydrodynamicsIntegration, double fluidDensity, CellMask cutCells, double dt) { return(new Vector(SpatialDim)); }