using static System.Math; namespace InnovEnergy.Lib.Units.Composite; public record AcPower { protected AcPower(){} public ApparentPower Apparent { get; protected init; } public ActivePower Active { get; protected init; } public ReactivePower Reactive { get; protected init; } public Angle Phi { get; protected init; } public Double CosPhi { get; protected init; } public static AcPower FromActiveReactiveApparent(ActivePower activePower, ReactivePower reactivePower, ApparentPower apparentPower) { var q = reactivePower.Value; var p = activePower.Value; var s = apparentPower.Value; var phi = Atan2(q, p); return new AcPower { Active = p, Reactive = q, Apparent = s, Phi = phi, CosPhi = Cos(phi), }; } public static AcPower FromActiveReactive(ActivePower activePower, ReactivePower reactivePower) { var q = reactivePower.Value; var p = activePower.Value; var s = Sqrt(p * p + q * q); var phi = Atan2(q, p); return new AcPower { Active = p, Reactive = q, Apparent = s, Phi = phi, CosPhi = p/s, }; } public static AcPower FromVoltageCurrentPhi(Voltage voltageRms, Current currentRms, Angle phi) { if (voltageRms < 0) throw new ArgumentException("RMS value cannot be negative", nameof(voltageRms)); if (currentRms < 0) throw new ArgumentException("RMS value cannot be negative", nameof(currentRms)); var cosPhi = Cos(phi.Value); var apparent = voltageRms.Value * currentRms.Value; return new AcPower { Apparent = apparent, Active = apparent * cosPhi, Reactive = apparent * Sin(phi.Value), Phi = phi, CosPhi = cosPhi }; } public static AcPower SumOf(params AcPower[] phases) { var p = phases.Sum(l => l.Active.Value); var q = phases.Sum(l => l.Reactive.Value); var s = Sqrt(p * p + q * q); Angle phi = Atan2(q, p); return new AcPower { Apparent = s, Active = p, Reactive = q, Phi = phi, CosPhi = Cos(phi.Value) }; } }