45 lines
1.8 KiB
Swift
45 lines
1.8 KiB
Swift
import Dependencies
|
|
import Foundation
|
|
import ManualDCore
|
|
|
|
extension ManualDClient: DependencyKey {
|
|
public static let liveValue: Self = .init(
|
|
ductSize: { request in
|
|
guard request.designCFM > 0 else {
|
|
throw ManualDError(message: "Design CFM should be greater than 0.")
|
|
}
|
|
let fr = pow(request.frictionRate, 0.5)
|
|
let ductulatorSize = pow(Double(request.designCFM) / (3.12 * fr), 0.38)
|
|
let finalSize = try roundSize(ductulatorSize)
|
|
let flexSize = try flexSize(request)
|
|
return .init(
|
|
calculatedSize: ductulatorSize,
|
|
finalSize: finalSize,
|
|
flexSize: flexSize,
|
|
velocity: velocity(cfm: request.designCFM, roundSize: finalSize)
|
|
)
|
|
},
|
|
frictionRate: { request in
|
|
// Ensure the total effective length is greater than 0.
|
|
guard request.totalEffectiveLength > 0 else {
|
|
throw ManualDError(message: "Total Effective Length should be greater than 0.")
|
|
}
|
|
|
|
let totalComponentLosses = request.componentPressureLosses.total
|
|
let availableStaticPressure = request.externalStaticPressure - totalComponentLosses
|
|
let frictionRate = availableStaticPressure * 100.0 / Double(request.totalEffectiveLength)
|
|
return .init(availableStaticPressure: availableStaticPressure, value: frictionRate)
|
|
},
|
|
totalEquivalentLength: { request in
|
|
let trunkLengths = request.trunkLengths.reduce(0) { $0 + $1 }
|
|
let runoutLengths = request.runoutLengths.reduce(0) { $0 + $1 }
|
|
let groupLengths = request.effectiveLengthGroups.totalEffectiveLength
|
|
return trunkLengths + runoutLengths + groupLengths
|
|
},
|
|
rectangularSize: { request in
|
|
let width = (Double.pi * (pow(Double(request.roundSize) / 2.0, 2.0))) / Double(request.height)
|
|
return .init(height: request.height, width: Int(width.rounded(.toNearestOrEven)))
|
|
}
|
|
)
|
|
}
|