public double GetAtmosphericViscosity(double altitude) { return(_proxy.GetAtmosphericViscosity(altitude)); }
public void ResolveAtmopsherics(IMassiveBody body) { // Don't resolve drag for children if (Parent != null) { return; } DVector2 difference = body.Position - Position; double distance = difference.Length(); difference.Normalize(); double altitude = distance - body.SurfaceRadius; // The spacecraft is in the bodies atmopshere if (altitude < body.AtmosphereHeight) { var surfaceNormal = new DVector2(-difference.Y, difference.X); double altitudeFromCenter = altitude + body.SurfaceRadius; // Distance of circumference at this altitude ( c= 2r * pi ) double pathCirumference = 2 * Math.PI * altitudeFromCenter; double rotationalSpeed = pathCirumference / body.RotationPeriod; // Simple collision detection if (altitude <= 0) { var normal = new DVector2(-difference.X, -difference.Y); Position = body.Position + normal * (body.SurfaceRadius); Velocity = (body.Velocity + surfaceNormal * rotationalSpeed); Rotation = normal.Angle(); AccelerationN.X = -AccelerationG.X; AccelerationN.Y = -AccelerationG.Y; } double atmosphericDensity = body.GetAtmosphericDensity(altitude); DVector2 relativeVelocity = (body.Velocity + surfaceNormal * rotationalSpeed) - Velocity; double velocity = relativeVelocity.Length(); double velocitySquared = relativeVelocity.LengthSquared(); if (velocitySquared > 0) { double speed = relativeVelocity.Length(); // Heating HeatingRate = 1.83e-4 * Math.Pow(speed, 3) * Math.Sqrt(atmosphericDensity / (Width * 0.5)); relativeVelocity.Normalize(); double dragTerm = TotalDragCoefficient() * TotalDragArea(); // Drag ( Fd = 0.5pv^2dA ) DVector2 dragForce = relativeVelocity * (0.5 * atmosphericDensity * velocitySquared * dragTerm); AccelerationD += dragForce / Mass; double reynoldsNumber = (velocity * Height) / body.GetAtmosphericViscosity(altitude); double frictionCoefficient = 0.455 / Math.Pow(Math.Log10(reynoldsNumber), 2.58); double frictionTerm = frictionCoefficient * TotalSurfaceArea(); // Skin friction ( Fs = 0.5CfpV^2S ) DVector2 skinFriction = relativeVelocity * (0.5 * atmosphericDensity * velocitySquared * frictionTerm); AccelerationD += skinFriction / Mass; } } else { HeatingRate = 0; } }