// attempt to calculate extra damping to provide 30% critical damping var targetDampingPct = 30; // target value (% critical damping) var tolerance = 0.01; // tolerance (stop when within this value of target) // iterate up to 10 times to attempt to converge on target % critical for(int n = 0; n < 10; ++n) { // run with current inputs and get vessel results var results = RunAnalysis(InteractiveSpread, InteractiveConfig, new NoFailure()); var vessel = results.Vessel; // calculate current differences from target % critical var errx = Math.Abs(vessel.CriticalX - targetDampingPct); var erry = Math.Abs(vessel.CriticalY - targetDampingPct); var errn = Math.Abs(vessel.CriticalN - targetDampingPct); // stop iterating if within tolerance if(errx < tolerance && erry < tolerance && errn < tolerance) break; // calculate expected extra damping values var factor = 25.0 / Math.PI; var xdamp = targetDampingPct * vessel.MassX.Tonnes / (factor * vessel.NaturalPeriodX.Seconds) - (vessel.LinearDampingX - vessel.LinearExtraDampingX).KilonewtonsPerMetrePerSecond; var ydamp = targetDampingPct * vessel.MassY.Tonnes / (factor * vessel.NaturalPeriodY.Seconds) - (vessel.LinearDampingY - vessel.LinearExtraDampingY).KilonewtonsPerMetrePerSecond; var ndamp = targetDampingPct * vessel.MassN.TonneMetresSquared / (factor * vessel.NaturalPeriodN.Seconds) - (vessel.LinearDampingN - vessel.LinearExtraDampingN).KilonewtonMetresPerRadianPerSecond; // set new extra damping for next iteration InteractiveConfig.Settings.ExtraDampingSway = LinearDamping.FromKilonewtonsPerMetrePerSecond(xdamp); InteractiveConfig.Settings.ExtraDampingSurge = LinearDamping.FromKilonewtonsPerMetrePerSecond(ydamp); InteractiveConfig.Settings.ExtraDampingYaw = RotationalLinearDamping.FromKilonewtonMetresPerRadianPerSecond(ndamp); }