5 #include "fans/Planar.h" 6 #include "fans/Fan203.h" 7 #include "fans/FanShaftPower.h" 8 #include "fans/FanCurve.h" 9 #include "fans/FanEnergyIndex.h" 10 #include "results/Results.h" 11 #include "results/InputData.h" 12 #include "fans/CompressibilityFactor.h" 13 #include "calculator/util/Conversion.h" 15 #include "calculator/pump/OptimalPumpShaftPower.h" 16 #include "calculator/motor/OptimalMotorShaftPower.h" 17 #include "calculator/motor/OptimalMotorPower.h" 26 double Get(std::string
const &key, Local<Object> obj)
28 v8::Isolate *isolate = v8::Isolate::GetCurrent();
29 v8::Local<v8::Context> context = isolate->GetCurrentContext();
30 Local<String> getName = Nan::New<String>(key).ToLocalChecked();
31 Local<Value> rObj = Nan::To<Object>(obj).ToLocalChecked()->Get(context, getName).ToLocalChecked();
32 if (rObj->IsUndefined())
34 ThrowTypeError(std::string(
"Get method in fan.h: " + key +
" not present in object").c_str());
36 return Nan::To<double>(rObj).FromJust();
41 T GetEnumVal(std::string
const &key, Local<Object> obj)
43 Local<String> getName = Nan::New<String>(key).ToLocalChecked();
44 v8::Isolate *isolate = v8::Isolate::GetCurrent();
45 v8::Local<v8::Context> context = isolate->GetCurrentContext();
46 Local<Value> rObj = Nan::To<Object>(obj).ToLocalChecked()->Get(context, getName).ToLocalChecked();
47 if (rObj->IsUndefined())
49 ThrowTypeError(std::string(
"GetEnumVal method in fan.h: " + key +
" not present in object").c_str());
51 return static_cast<T
>(Nan::To<int32_t>(rObj).FromJust());
55 bool GetBool(std::string
const &key, Local<Object> obj)
57 Local<String> getName = Nan::New<String>(key).ToLocalChecked();
58 v8::Isolate *isolate = v8::Isolate::GetCurrent();
59 v8::Local<v8::Context> context = isolate->GetCurrentContext();
60 Local<Value> rObj = Nan::To<Object>(obj).ToLocalChecked()->Get(context, getName).ToLocalChecked();
61 if (rObj->IsUndefined())
63 ThrowTypeError(std::string(
"GetBool method in fan.h: Boolean value " + key +
" not present in object").c_str());
65 return Nan::To<bool>(rObj).FromJust();
69 std::string GetStr(std::string
const &key, Local<Object> obj)
71 Local<String> getName = Nan::New<String>(key).ToLocalChecked();
72 v8::Isolate *isolate = v8::Isolate::GetCurrent();
73 v8::Local<v8::Context> context = isolate->GetCurrentContext();
74 Local<Value> rObj = Nan::To<Object>(obj).ToLocalChecked()->Get(context, getName).ToLocalChecked();
75 if (rObj->IsUndefined())
77 ThrowTypeError(std::string(
"GetStr method in fan.h: String " + key +
" not present in object").c_str());
79 v8::String::Utf8Value s(isolate, rObj);
80 return std::string(*s);
84 bool isDefined(Local<Object> obj, std::string
const &key)
86 Local<String> getName = Nan::New<String>(key).ToLocalChecked();
87 v8::Isolate *isolate = v8::Isolate::GetCurrent();
88 v8::Local<v8::Context> context = isolate->GetCurrentContext();
89 Local<Value> rObj = Nan::To<Object>(obj).ToLocalChecked()->Get(context, getName).ToLocalChecked();
90 return !rObj->IsUndefined();
94 inline void SetR(
const std::string &key,
double val)
96 Nan::Set(r, Nan::New<String>(key).ToLocalChecked(), Nan::New<Number>(val));
100 std::vector<std::vector<double>> getTraverseInputData(Local<Object> obj)
102 v8::Isolate *isolate = v8::Isolate::GetCurrent();
103 v8::Local<v8::Context> context = isolate->GetCurrentContext();
105 v8::Local<v8::Value> arrayTmp = Nan::Get(Nan::To<v8::Object>(obj).ToLocalChecked(), Nan::New<String>(
"traverseData").ToLocalChecked()).ToLocalChecked();
106 Local<Array> array = v8::Local<v8::Array>::Cast(arrayTmp);
107 std::vector<std::vector<double>> traverseData(array->Length());
109 for (std::size_t i = 0; i < array->Length(); i++)
111 Local<Array>
const innerArray = v8::Local<v8::Array>::Cast(Nan::To<Object>(array->Get(context, i).ToLocalChecked()).ToLocalChecked());
112 traverseData.at(i).resize(innerArray->Length());
113 for (std::size_t j = 0; j < innerArray->Length(); j++)
115 traverseData.at(i).at(j) = Nan::To<double>(innerArray->Get(context, j).ToLocalChecked()).FromJust();
124 const double area = Get(
"area", obj);
125 const double dryBulbTemp = Get(
"dryBulbTemp", obj);
126 const double barometricPressure = Get(
"barometricPressure", obj);
129 FlangePlane flangePlane(area, dryBulbTemp, barometricPressure);
133 MstPlane constructMst(Local<Object> obj)
136 const double area = Get(
"area", obj);
137 const double dryBulbTemp = Get(
"dryBulbTemp", obj);
138 const double barometricPressure = Get(
"barometricPressure", obj);
139 const double staticPressure = Get(
"staticPressure", obj);
142 MstPlane mstPlane(area, dryBulbTemp, barometricPressure, staticPressure);
149 const double area = Get(
"area", obj);
150 const double dryBulbTemp = Get(
"dryBulbTemp", obj);
151 const double barometricPressure = Get(
"barometricPressure", obj);
152 const double staticPressure = Get(
"staticPressure", obj);
153 const double pitotTubeCoefficient = Get(
"pitotTubeCoefficient", obj);
154 const std::vector<std::vector<double>> traverseInputData = getTraverseInputData(obj);
157 TraversePlane traversePlane(area, dryBulbTemp, barometricPressure, staticPressure, pitotTubeCoefficient, traverseInputData);
158 return traversePlane;
164 v8::Isolate *isolate = v8::Isolate::GetCurrent();
165 v8::Local<v8::Context> context = isolate->GetCurrentContext();
166 Local<String> fanRatedInfoStringV8 = Nan::New<String>(
"FanRatedInfo").ToLocalChecked();
167 Local<Object> fanRatedInfoV8 = Nan::To<Object>(Nan::To<Object>(inp).ToLocalChecked()->Get(context, fanRatedInfoStringV8).ToLocalChecked()).ToLocalChecked();
169 const double fanSpeed = Get(
"fanSpeed", fanRatedInfoV8);
170 const double motorSpeed = Get(
"motorSpeed", fanRatedInfoV8);
171 const double fanSpeedCorrected = Get(
"fanSpeedCorrected", fanRatedInfoV8);
172 const double densityCorrected = Get(
"densityCorrected", fanRatedInfoV8);
173 const double pressureBarometricCorrected = Get(
"pressureBarometricCorrected", fanRatedInfoV8);
176 FanRatedInfo fanRatedInfo(fanSpeed, motorSpeed, fanSpeedCorrected, densityCorrected, pressureBarometricCorrected);
183 v8::Isolate *isolate = v8::Isolate::GetCurrent();
184 v8::Local<v8::Context> context = isolate->GetCurrentContext();
185 Local<String> planeDataStringV8 = Nan::New<String>(
"PlaneData").ToLocalChecked();
186 Local<Object> planeDataV8 = Nan::To<Object>(Nan::To<Object>(inp).ToLocalChecked()->Get(context, planeDataStringV8).ToLocalChecked()).ToLocalChecked();
189 Local<Value>
const &addlTravTmp = Nan::Get(planeDataV8, Nan::New<String>(
"AddlTraversePlanes").ToLocalChecked()).ToLocalChecked();
190 Local<Array>
const &addlTravArray = v8::Local<v8::Array>::Cast(addlTravTmp);
191 std::vector<TraversePlane> addlTravPlanes;
193 for (std::size_t i = 0; i < addlTravArray->Length(); i++)
195 addlTravPlanes.emplace_back(constructTraverse(Nan::To<Object>(addlTravArray->Get(context, i).ToLocalChecked()).ToLocalChecked()));
197 FlangePlane fanInletFlange = constructFlange(Nan::To<Object>(planeDataV8->Get(context, Nan::New<String>(
"FanInletFlange").ToLocalChecked()).ToLocalChecked()).ToLocalChecked());
198 FlangePlane fanEvaseOrOutletFlange = constructFlange(Nan::To<Object>(planeDataV8->Get(context, Nan::New<String>(
"FanEvaseOrOutletFlange").ToLocalChecked()).ToLocalChecked()).ToLocalChecked());
199 TraversePlane flowTraverse = constructTraverse(Nan::To<Object>(planeDataV8->Get(context, Nan::New<String>(
"FlowTraverse").ToLocalChecked()).ToLocalChecked()).ToLocalChecked());
200 MstPlane inletMstPlane = constructMst(Nan::To<Object>(planeDataV8->Get(context, Nan::New<String>(
"InletMstPlane").ToLocalChecked()).ToLocalChecked()).ToLocalChecked());
201 MstPlane outletMstPlane = constructMst(Nan::To<Object>(planeDataV8->Get(context, Nan::New<String>(
"OutletMstPlane").ToLocalChecked()).ToLocalChecked()).ToLocalChecked());
202 const double totalPressureLossBtwnPlanes1and4 = Get(
"totalPressureLossBtwnPlanes1and4", planeDataV8);
203 const double totalPressureLossBtwnPlanes2and5 = Get(
"totalPressureLossBtwnPlanes2and5", planeDataV8);
204 const bool plane5upstreamOfPlane2 = GetBool(
"plane5upstreamOfPlane2", planeDataV8);
207 PlaneData planeData(fanInletFlange, fanEvaseOrOutletFlange, flowTraverse, std::move(addlTravPlanes), inletMstPlane, outletMstPlane, totalPressureLossBtwnPlanes1and4, totalPressureLossBtwnPlanes2and5, plane5upstreamOfPlane2);
214 std::string
const &gasTypeStr = GetStr(
"gasType", obj);
217 if (gasTypeStr ==
"AIR")
219 return BaseGasDensity::GasType::AIR;
221 else if (gasTypeStr ==
"STANDARDAIR")
223 return BaseGasDensity::GasType::STANDARDAIR;
225 return BaseGasDensity::GasType::OTHERGAS;
231 std::string
const &inputTypeStr = GetStr(
"inputType", obj);
234 if (inputTypeStr ==
"relativeHumidity")
236 return BaseGasDensity::InputType::RelativeHumidity;
238 else if (inputTypeStr ==
"dewPoint")
240 return BaseGasDensity::InputType::DewPoint;
242 return BaseGasDensity::InputType::WetBulbTemp;
245 NAN_METHOD(fanResultsExisting)
248 inp = Nan::To<Object>(info[0]).ToLocalChecked();
249 r = Nan::New<Object>();
250 const double fanSpeed = Get(
"fanSpeed", inp);
251 const double airDensity = Get(
"airDensity", inp);
252 Motor::Drive drive1 = GetEnumVal<Motor::Drive>(
"drive", inp);
253 double specifiedDriveEfficiency;
254 if (drive1 == Motor::Drive::SPECIFIED)
256 specifiedDriveEfficiency = Get(
"specifiedDriveEfficiency", inp);
260 specifiedDriveEfficiency = 100.0;
262 Motor::LineFrequency
const lineFrequency = GetEnumVal<Motor::LineFrequency>(
"lineFrequency", inp);
263 double const motorRatedPower = Get(
"motorRatedPower", inp);
264 double const motorRpm = Get(
"motorRpm", inp);
265 Motor::EfficiencyClass
const efficiencyClass = GetEnumVal<Motor::EfficiencyClass>(
"efficiencyClass", inp);
266 double const specifiedEfficiency = Get(
"specifiedEfficiency", inp);
267 double const motorRatedVoltage = Get(
"motorRatedVoltage", inp);
268 double const fullLoadAmps = Get(
"fullLoadAmps", inp);
269 double const sizeMargin = Get(
"sizeMargin", inp);
270 double const measuredPower = Get(
"measuredPower", inp);
271 double const measuredVoltage = Get(
"measuredVoltage", inp);
272 double const measuredAmps = Get(
"measuredAmps", inp);
273 double const flowRate = Get(
"flowRate", inp);
274 double const inletPressure = Get(
"inletPressure", inp);
275 double const outletPressure = Get(
"outletPressure", inp);
276 double const compressibilityFactor = Get(
"compressibilityFactor", inp);
277 double const operatingHours = Get(
"operatingHours", inp);
278 double const unitCost = Get(
"unitCost", inp);
279 Motor::LoadEstimationMethod
const loadEstimationMethod = GetEnumVal<Motor::LoadEstimationMethod>(
"loadEstimationMethod", inp);
282 specifiedDriveEfficiency =
Conversion(specifiedDriveEfficiency).percentToFraction();
283 Fan::Input input(fanSpeed, airDensity, drive1, specifiedDriveEfficiency);
284 Motor motor(lineFrequency, motorRatedPower, motorRpm, efficiencyClass, specifiedEfficiency, motorRatedVoltage, fullLoadAmps, sizeMargin);
285 Fan::FieldDataBaseline fanFieldData(measuredPower, measuredVoltage, measuredAmps, flowRate, inletPressure, outletPressure,
286 compressibilityFactor, loadEstimationMethod);
287 FanResult result(input, motor, operatingHours, unitCost);
290 output.fanEfficiency =
Conversion(output.fanEfficiency).fractionToPercent();
291 output.motorEfficiency =
Conversion(output.motorEfficiency).fractionToPercent();
292 output.motorPowerFactor =
Conversion(output.motorPowerFactor).fractionToPercent();
293 output.driveEfficiency =
Conversion(output.driveEfficiency).fractionToPercent();
296 SetR(
"fanEfficiency", output.fanEfficiency);
297 SetR(
"motorRatedPower", output.motorRatedPower);
298 SetR(
"motorShaftPower", output.motorShaftPower);
299 SetR(
"fanShaftPower", output.fanShaftPower);
300 SetR(
"motorEfficiency", output.motorEfficiency);
301 SetR(
"motorPowerFactor", output.motorPowerFactor);
302 SetR(
"motorCurrent", output.motorCurrent);
303 SetR(
"motorPower", output.motorPower);
304 SetR(
"loadFactor", output.loadFactor);
305 SetR(
"driveEfficiency", output.driveEfficiency);
306 SetR(
"annualEnergy", output.annualEnergy);
307 SetR(
"annualCost", output.annualCost);
308 SetR(
"estimatedFLA", output.estimatedFLA);
309 SetR(
"fanEnergyIndex", output.fanEnergyIndex);
311 info.GetReturnValue().Set(r);
314 NAN_METHOD(fanResultsModified)
316 inp = Nan::To<Object>(info[0]).ToLocalChecked();
317 r = Nan::New<Object>();
319 const double fanSpeed = Get(
"fanSpeed", inp);
320 const double airDensity = Get(
"airDensity", inp);
321 Motor::Drive drive1 = GetEnumVal<Motor::Drive>(
"drive", inp);
322 double specifiedDriveEfficiency;
323 if (drive1 == Motor::Drive::SPECIFIED)
325 specifiedDriveEfficiency = Get(
"specifiedDriveEfficiency", inp);
329 specifiedDriveEfficiency = 100.0;
331 double const measuredVoltage = Get(
"measuredVoltage", inp);
332 double const measuredAmps = Get(
"measuredAmps", inp);
333 double const flowRate = Get(
"flowRate", inp);
334 double const inletPressure = Get(
"inletPressure", inp);
335 double const outletPressure = Get(
"outletPressure", inp);
336 double const compressibilityFactor = Get(
"compressibilityFactor", inp);
337 Motor::LineFrequency
const lineFrequency = GetEnumVal<Motor::LineFrequency>(
"lineFrequency", inp);
338 double const motorRatedPower = Get(
"motorRatedPower", inp);
339 double const motorRpm = Get(
"motorRpm", inp);
340 Motor::EfficiencyClass
const efficiencyClass = GetEnumVal<Motor::EfficiencyClass>(
"efficiencyClass", inp);
341 double const specifiedEfficiency = Get(
"specifiedEfficiency", inp);
342 double const motorRatedVoltage = Get(
"motorRatedVoltage", inp);
343 double const fullLoadAmps = Get(
"fullLoadAmps", inp);
344 double const sizeMargin = Get(
"sizeMargin", inp);
345 const double operatingHours = Get(
"operatingHours", inp);
346 const double unitCost = Get(
"unitCost", inp);
347 double fanEfficiency = Get(
"fanEfficiency", inp);
350 fanEfficiency =
Conversion(fanEfficiency).percentToFraction();
351 specifiedDriveEfficiency =
Conversion(specifiedDriveEfficiency).percentToFraction();
352 Fan::Input input(fanSpeed, airDensity, drive1, specifiedDriveEfficiency);
354 outletPressure, compressibilityFactor);
355 Motor motor(lineFrequency, motorRatedPower, motorRpm, efficiencyClass, specifiedEfficiency, motorRatedVoltage, fullLoadAmps, sizeMargin);
356 FanResult result(input, motor, operatingHours, unitCost);
357 FanResult::Output output = result.calculateModified(fanFieldData, fanEfficiency);
359 output.fanEfficiency =
Conversion(output.fanEfficiency).fractionToPercent();
360 output.motorEfficiency =
Conversion(output.motorEfficiency).fractionToPercent();
361 output.motorPowerFactor =
Conversion(output.motorPowerFactor).fractionToPercent();
362 output.driveEfficiency =
Conversion(output.driveEfficiency).fractionToPercent();
365 SetR(
"fanEfficiency", output.fanEfficiency);
366 SetR(
"motorRatedPower", output.motorRatedPower);
367 SetR(
"motorShaftPower", output.motorShaftPower);
368 SetR(
"fanShaftPower", output.fanShaftPower);
369 SetR(
"motorEfficiency", output.motorEfficiency);
370 SetR(
"motorPowerFactor", output.motorPowerFactor);
371 SetR(
"motorCurrent", output.motorCurrent);
372 SetR(
"motorPower", output.motorPower);
373 SetR(
"loadFactor", output.loadFactor);
374 SetR(
"driveEfficiency", output.driveEfficiency);
375 SetR(
"annualEnergy", output.annualEnergy);
376 SetR(
"annualCost", output.annualCost);
377 SetR(
"estimatedFLA", output.estimatedFLA);
378 SetR(
"fanEnergyIndex", output.fanEnergyIndex);
380 info.GetReturnValue().Set(r);
439 void SetBaseGasDensityData(Local<Object> & obj,
const BaseGasDensity & bgd)
441 Local<String> gasDensity = Nan::New<String>(
"gasDensity").ToLocalChecked();
442 Local<String> absolutePressure = Nan::New<String>(
"absolutePressure").ToLocalChecked();
443 Local<String> saturatedHumidity = Nan::New<String>(
"saturatedHumidity").ToLocalChecked();
444 Local<String> saturationDegree = Nan::New<String>(
"saturationDegree").ToLocalChecked();
445 Local<String> humidityRatio = Nan::New<String>(
"humidityRatio").ToLocalChecked();
446 Local<String> specificVolume = Nan::New<String>(
"specificVolume").ToLocalChecked();
447 Local<String> enthalpy = Nan::New<String>(
"enthalpy").ToLocalChecked();
448 Local<String> dewPoint = Nan::New<String>(
"dewPoint").ToLocalChecked();
449 Local<String> relativeHumidity = Nan::New<String>(
"relativeHumidity").ToLocalChecked();
450 Local<String> saturationPressure = Nan::New<String>(
"saturationPressure").ToLocalChecked();
451 Local<String> wetBulbTemp = Nan::New<String>(
"wetBulbTemp").ToLocalChecked();
453 Nan::Set(obj, gasDensity, Nan::New<Number>(bgd.getGasDensity()));
454 Nan::Set(obj, absolutePressure, Nan::New<Number>(bgd.getAbsolutePressureIn()));
455 Nan::Set(obj, saturatedHumidity, Nan::New<Number>(bgd.getSaturatedHumidityRatio()));
456 Nan::Set(obj, saturationDegree, Nan::New<Number>(bgd.getDegreeOfSaturation()));
457 Nan::Set(obj, humidityRatio, Nan::New<Number>(bgd.getHumidityRatio()));
458 Nan::Set(obj, specificVolume, Nan::New<Number>(bgd.getSpecificVolume()));
459 Nan::Set(obj, enthalpy, Nan::New<Number>(bgd.getEnthalpy()));
460 Nan::Set(obj, dewPoint, Nan::New<Number>(bgd.getDewPoint()));
461 Nan::Set(obj, relativeHumidity, Nan::New<Number>(bgd.getRelativeHumidity()));
462 Nan::Set(obj, saturationPressure, Nan::New<Number>(bgd.getSaturationPressure()));
463 Nan::Set(obj, wetBulbTemp, Nan::New<Number>(bgd.getWetBulbTemp()));
465 NAN_METHOD(getBaseGasDensityRelativeHumidity)
467 Local<Object> obj = Nan::New<Object>();
469 inp = Nan::To<Object>(info[0]).ToLocalChecked();
470 r = Nan::New<Object>();
474 const double dryBulbTemp = Get(
"dryBulbTemp", inp);
475 const double staticPressure = Get(
"staticPressure", inp);
476 const double barometricPressure = Get(
"barometricPressure", inp);
477 const double relativeHumidity = Get(
"relativeHumidity", inp);
480 const double specificGravity = Get(
"specificGravity", inp);
492 SetBaseGasDensityData(obj, bgd);
495 info.GetReturnValue().Set(obj);
500 catch (std::runtime_error
const &e)
502 Local<Object> obj_err = Nan::New<Object>();
504 SetBaseGasDensityData(obj_err, bgd_err);
505 info.GetReturnValue().Set(obj_err);
506 std::string
const what = e.what();
507 ThrowError(std::string(
"std::runtime_error thrown in getBaseGasDensityRelativeHumidity - fan.h: " + what).c_str());
511 NAN_METHOD(getBaseGasDensityDewPoint)
513 Local<Object> obj = Nan::New<Object>();
515 inp = Nan::To<Object>(info[0]).ToLocalChecked();
516 r = Nan::New<Object>();
520 const double dryBulbTemp = Get(
"dryBulbTemp", inp);
521 const double staticPressure = Get(
"staticPressure", inp);
522 const double barometricPressure = Get(
"barometricPressure", inp);
523 const double dewPoint = Get(
"dewPoint", inp);
526 const double specificGravity = Get(
"specificGravity", inp);
538 SetBaseGasDensityData(obj, bgd);
541 info.GetReturnValue().Set(obj);
546 catch (std::runtime_error
const &e)
548 Local<Object> obj_err = Nan::New<Object>();
550 SetBaseGasDensityData(obj_err, bgd_err);
551 info.GetReturnValue().Set(obj_err);
552 std::string
const what = e.what();
553 ThrowError(std::string(
"std::runtime_error thrown in getBaseGasDensityDewPoint - fan.h: " + what).c_str());
557 NAN_METHOD(getBaseGasDensityWetBulb)
559 Local<Object> obj = Nan::New<Object>();
561 inp = Nan::To<Object>(info[0]).ToLocalChecked();
562 r = Nan::New<Object>();
566 const double dryBulbTemp = Get(
"dryBulbTemp", inp);
567 const double staticPressure = Get(
"staticPressure", inp);
568 const double barometricPressure = Get(
"barometricPressure", inp);
569 const double wetBulbTemp = Get(
"wetBulbTemp", inp);
572 const double specificGravity = Get(
"specificGravity", inp);
573 const double specificHeatGas = Get(
"specificHeatGas", inp);
586 SetBaseGasDensityData(obj, bgd);
589 info.GetReturnValue().Set(obj);
594 catch (std::runtime_error
const &e)
596 Local<Object> obj_err = Nan::New<Object>();
598 SetBaseGasDensityData(obj_err, bgd_err);
599 info.GetReturnValue().Set(obj_err);
600 std::string
const what = e.what();
601 ThrowError(std::string(
"std::runtime_error thrown in getBaseGasDensityWetBulb - fan.h: " + what).c_str());
608 v8::Isolate *isolate = v8::Isolate::GetCurrent();
609 v8::Local<v8::Context> context = isolate->GetCurrentContext();
610 Local<Object> baseGasDensityV8 = Nan::To<Object>(Nan::To<Object>(inp).ToLocalChecked()->Get(context, Nan::New<String>(
"BaseGasDensity").ToLocalChecked()).ToLocalChecked()).ToLocalChecked();
611 const double dryBulbTemp = Get(
"dryBulbTemp", baseGasDensityV8);
612 const double staticPressure = Get(
"staticPressure", baseGasDensityV8);
613 const double barometricPressure = Get(
"barometricPressure", baseGasDensityV8);
614 const double gasDensity = Get(
"gasDensity", baseGasDensityV8);
618 BaseGasDensity baseGasDensity(dryBulbTemp, staticPressure, barometricPressure, gasDensity, gasType);
619 return baseGasDensity;
625 v8::Isolate *isolate = v8::Isolate::GetCurrent();
626 v8::Local<v8::Context> context = isolate->GetCurrentContext();
627 Local<Object> fanShaftPowerV8 = Nan::To<Object>(Nan::To<Object>(inp).ToLocalChecked()->Get(context, Nan::New<String>(
"FanShaftPower").ToLocalChecked()).ToLocalChecked()).ToLocalChecked();
628 const double motorShaftPower = Get(
"motorShaftPower", fanShaftPowerV8);
629 const double efficiencyMotor = Get(
"efficiencyMotor", fanShaftPowerV8);
630 const double efficiencyVFD = Get(
"efficiencyVFD", fanShaftPowerV8);
631 const double efficiencyBelt = Get(
"efficiencyBelt", fanShaftPowerV8);
632 const double sumSEF = Get(
"sumSEF", fanShaftPowerV8);
635 FanShaftPower fanShaftPower(motorShaftPower, efficiencyMotor, efficiencyVFD, efficiencyBelt, sumSEF);
636 return fanShaftPower;
639 NAN_METHOD(getVelocityPressureData)
642 inp = Nan::To<Object>(info[0]).ToLocalChecked();
643 r = Nan::New<Object>();
644 TraversePlane const travPlane = constructTraverse(Nan::To<Object>(inp).ToLocalChecked());
647 double pv3 = travPlane.getPv3Value();
648 double percent75Rule = travPlane.get75percentRule();
649 percent75Rule =
Conversion(percent75Rule).fractionToPercent();
653 SetR(
"percent75Rule", percent75Rule);
656 info.GetReturnValue().Set(r);
659 NAN_METHOD(getPlaneResults)
661 Local<Object> rv = Nan::New<Object>();
662 inp = Nan::To<Object>(info[0]).ToLocalChecked();
674 Local<Array> addlTravPlanes = Nan::New<v8::Array>(output.addlTravPlanes.size());
676 std::size_t index = 0;
679 bool isArray =
false,
bool isStaticPressure =
false,
const double staticPressure = 0) {
681 r = Nan::New<Object>();
682 SetR(
"gasDensity", data.gasDensity);
683 SetR(
"gasVolumeFlowRate", data.gasVolumeFlowRate);
684 SetR(
"gasVelocity", data.gasVelocity);
685 SetR(
"gasVelocityPressure", data.gasVelocityPressure);
686 SetR(
"gasTotalPressure", data.gasTotalPressure);
687 if (isStaticPressure)
689 SetR(
"staticPressure", staticPressure);
694 Nan::Set(addlTravPlanes, index, r);
698 Nan::Set(rv, Nan::New<String>(name).ToLocalChecked(), r);
704 setData(data,
"",
true);
707 Nan::Set(rv, Nan::New<String>(
"AddlTraversePlanes").ToLocalChecked(), addlTravPlanes);
708 setData(output.fanInletFlange,
"FanInletFlange",
false,
true, output.fanInletFlange.staticPressure);
709 setData(output.fanOrEvaseOutletFlange,
"FanOrEvaseOutletFlange",
false,
true, output.fanOrEvaseOutletFlange.staticPressure);
710 setData(output.flowTraverse,
"FlowTraverse");
711 setData(output.inletMstPlane,
"InletMstPlane");
712 setData(output.outletMstPlane,
"OutletMstPlane");
714 catch (std::runtime_error
const &e)
716 std::string
const what = e.what();
717 ThrowError(std::string(
"std::runtime_error thrown in getPlaneResults - fan.h: " + what).c_str());
720 info.GetReturnValue().Set(rv);
725 inp = Nan::To<Object>(info[0]).ToLocalChecked();
726 r = Nan::New<Object>();
736 Fan203::Output const rv =
Fan203(fanRatedInfo, planeData, baseGasDensity, fanShaftPower).calculate();
739 SetR(
"fanEfficiencyTotalPressure", rv.fanEfficiencyTotalPressure);
740 SetR(
"fanEfficiencyStaticPressure", rv.fanEfficiencyStaticPressure);
741 SetR(
"fanEfficiencyStaticPressureRise", rv.fanEfficiencyStaticPressureRise);
742 SetR(
"flow", rv.asTested.flow);
743 SetR(
"pressureTotal", rv.asTested.pressureTotal);
744 SetR(
"pressureStatic", rv.asTested.pressureStatic);
745 SetR(
"staticPressureRise", rv.asTested.staticPressureRise);
746 SetR(
"power", rv.asTested.power);
747 SetR(
"kpc", rv.asTested.kpc);
748 SetR(
"flowCorrected", rv.converted.flow);
749 SetR(
"pressureTotalCorrected", rv.converted.pressureTotal);
750 SetR(
"pressureStaticCorrected", rv.converted.pressureStatic);
751 SetR(
"staticPressureRiseCorrected", rv.converted.staticPressureRise);
752 SetR(
"powerCorrected", rv.converted.power);
753 SetR(
"kpcCorrected", rv.converted.kpc);
755 catch (std::runtime_error
const &e)
757 std::string
const what = e.what();
758 ThrowError(std::string(
"std::runtime_error thrown in fan203 - fan.h: " + what).c_str());
762 info.GetReturnValue().Set(r);
768 std::string
const curveTypeStr = GetStr(
"curveType", inp);
771 if (curveTypeStr ==
"StaticPressureRise")
773 return FanCurveType::StaticPressureRise;
775 else if (curveTypeStr ==
"FanTotalPressure")
777 return FanCurveType::FanTotalPressure;
779 return FanCurveType::FanStaticPressure;
784 v8::Isolate *isolate = v8::Isolate::GetCurrent();
785 v8::Local<v8::Context> context = isolate->GetCurrentContext();
786 Local<Value>
const &arrayTmp = Nan::To<Object>(inp).ToLocalChecked()->Get(context, Nan::New<String>(
"BaseCurveData").ToLocalChecked()).ToLocalChecked();
787 Local<Array>
const &array = v8::Local<v8::Array>::Cast(arrayTmp);
788 std::vector<FanCurveData::BaseCurve> curveData;
789 for (std::size_t i = 0; i < array->Length(); i++)
791 Local<Value>
const &innerArrayTmp = Nan::To<Object>(array->Get(context, i).ToLocalChecked()).ToLocalChecked();
792 Local<Array>
const &innerArray = Local<Array>::Cast(innerArrayTmp);
793 curveData.emplace_back(
FanCurveData::BaseCurve(Nan::To<double>(innerArray->Get(context, 0).ToLocalChecked()).FromJust(),
794 Nan::To<double>(innerArray->Get(context, 1).ToLocalChecked()).FromJust(),
795 Nan::To<double>(innerArray->Get(context, 2).ToLocalChecked()).FromJust()));
800 FanCurveData fanCurveData(fanCurveType, std::move(curveData));
806 v8::Isolate *isolate = v8::Isolate::GetCurrent();
807 v8::Local<v8::Context> context = isolate->GetCurrentContext();
808 Local<Value>
const &arrayTmp = Nan::To<Object>(inp).ToLocalChecked()->Get(context, Nan::New<String>(
"RatedPointCurveData").ToLocalChecked()).ToLocalChecked();
809 Local<Array>
const &array = v8::Local<v8::Array>::Cast(arrayTmp);
810 std::vector<FanCurveData::RatedPoint> curveData;
811 for (std::size_t i = 0; i < array->Length(); i++)
813 Local<Value>
const &innerArrayTmp = Nan::To<Object>(array->Get(context, i).ToLocalChecked()).ToLocalChecked();
814 Local<Array>
const &innerArray = Local<Array>::Cast(innerArrayTmp);
815 curveData.emplace_back(
FanCurveData::RatedPoint(Nan::To<double>(innerArray->Get(context, 0).ToLocalChecked()).FromJust(),
816 Nan::To<double>(innerArray->Get(context, 1).ToLocalChecked()).FromJust(),
817 Nan::To<double>(innerArray->Get(context, 2).ToLocalChecked()).FromJust(),
818 Nan::To<double>(innerArray->Get(context, 3).ToLocalChecked()).FromJust(),
819 Nan::To<double>(innerArray->Get(context, 4).ToLocalChecked()).FromJust(),
820 Nan::To<double>(innerArray->Get(context, 5).ToLocalChecked()).FromJust()));
826 FanCurveData fanCurveData(fanCurveType, std::move(curveData));
832 v8::Isolate *isolate = v8::Isolate::GetCurrent();
833 v8::Local<v8::Context> context = isolate->GetCurrentContext();
834 Local<Value>
const &arrayTmp = Nan::To<Object>(inp).ToLocalChecked()->Get(context, Nan::New<String>(
"BaseOperatingPointCurveData").ToLocalChecked()).ToLocalChecked();
835 Local<Array>
const &array = v8::Local<v8::Array>::Cast(arrayTmp);
836 std::vector<FanCurveData::BaseOperatingPoint> curveData;
837 for (std::size_t i = 0; i < array->Length(); i++)
839 Local<Value>
const &innerArrayTmp = Nan::To<Object>(array->Get(context, i).ToLocalChecked()).ToLocalChecked();
840 Local<Array>
const &innerArray = Local<Array>::Cast(innerArrayTmp);
842 Nan::To<double>(innerArray->Get(context, 1).ToLocalChecked()).FromJust(),
843 Nan::To<double>(innerArray->Get(context, 2).ToLocalChecked()).FromJust(),
844 Nan::To<double>(innerArray->Get(context, 3).ToLocalChecked()).FromJust(),
845 Nan::To<double>(innerArray->Get(context, 4).ToLocalChecked()).FromJust(),
846 Nan::To<double>(innerArray->Get(context, 5).ToLocalChecked()).FromJust(),
847 Nan::To<double>(innerArray->Get(context, 6).ToLocalChecked()).FromJust(),
848 Nan::To<double>(innerArray->Get(context, 7).ToLocalChecked()).FromJust(),
849 Nan::To<double>(innerArray->Get(context, 8).ToLocalChecked()).FromJust()));
854 FanCurveData fanCurveData(fanCurveType, std::move(curveData));
858 void returnResultData(std::vector<ResultData>
const &results)
860 v8::Isolate *isolate = v8::Isolate::GetCurrent();
861 v8::Local<v8::Context> context = isolate->GetCurrentContext();
863 std::size_t index = 0;
864 Local<Array> outerArray = Nan::New<Array>(results.size());
867 Local<Array> array = Nan::New<Array>(4);
868 Nan::Set(array, 0, Nan::New<Number>(row.flow));
869 Nan::Set(array, 1, Nan::New<Number>(row.pressure));
870 Nan::Set(array, 2, Nan::New<Number>(row.power));
871 Nan::Set(array, 3, Nan::New<Number>(row.efficiency));
873 Nan::Set(outerArray, index, array);
876 Nan::Set(r, Nan::New<String>(
"ResultData").ToLocalChecked(), outerArray);
883 inp = Nan::To<Object>(info[0]).ToLocalChecked();
884 r = Nan::New<Object>();
886 const bool baseCurveDataDefined = isDefined(inp,
"BaseCurveData");
887 const bool ratedPointCurveDataDefined = isDefined(inp,
"RatedPointCurveData");
890 const double density = Get(
"density", inp);
891 const double densityCorrected = Get(
"densityCorrected", inp);
892 const double speed = Get(
"speed", inp);
893 const double speedCorrected = Get(
"speedCorrected", inp);
894 const double pressureBarometric = Get(
"pressureBarometric", inp);
895 const double pressureBarometricCorrected = Get(
"pressureBarometricCorrected", inp);
896 const double pt1Factor = Get(
"pt1Factor", inp);
897 const double gamma = Get(
"gamma", inp);
898 const double gammaCorrected = Get(
"gammaCorrected", inp);
899 const double area1 = Get(
"area1", inp);
900 const double area2 = Get(
"area2", inp);
902 if (baseCurveDataDefined)
906 std::vector<ResultData>
const rv =
FanCurve(density, densityCorrected, speed,
907 speedCorrected, pressureBarometric, pressureBarometricCorrected, pt1Factor,
908 gamma, gammaCorrected, area1, area2,
913 returnResultData(rv);
915 else if (ratedPointCurveDataDefined)
917 FanCurveData fanCurveData = getFanRatedPointCurveData();
919 std::vector<ResultData>
const rv =
FanCurve(density, densityCorrected, speed,
920 speedCorrected, pressureBarometric, pressureBarometricCorrected, pt1Factor,
921 gamma, gammaCorrected, area1, area2,
926 returnResultData(rv);
930 FanCurveData fanCurveData = getFanBaseOperatingPointCurveData();
932 std::vector<ResultData>
const rv =
FanCurve(density, densityCorrected, speed,
933 speedCorrected, pressureBarometric, pressureBarometricCorrected, pt1Factor,
934 gamma, gammaCorrected, area1, area2,
939 returnResultData(rv);
942 info.GetReturnValue().Set(r);
945 NAN_METHOD(optimalFanEfficiency)
948 inp = Nan::To<Object>(info[0]).ToLocalChecked();
949 OptimalFanEfficiency::FanType
const fanType = GetEnumVal<OptimalFanEfficiency::FanType>(
"fanType", inp);
950 double const fanSpeed = Get(
"fanSpeed", inp);
951 double const flowRate = Get(
"flowRate", inp);
952 double const inletPressure = Get(
"inletPressure", inp);
953 double const outletPressure = Get(
"outletPressure", inp);
954 double const compressibility = Get(
"compressibility", inp);
957 double efficiency =
OptimalFanEfficiency(fanType, fanSpeed, flowRate, inletPressure, outletPressure,
960 efficiency =
Conversion(efficiency).fractionToPercent();
963 info.GetReturnValue().Set(efficiency);
966 NAN_METHOD(compressibilityFactor)
969 inp = Nan::To<Object>(info[0]).ToLocalChecked();
970 const double moverShaftPower = Get(
"moverShaftPower", inp);
971 const double inletPressure = Get(
"inletPressure", inp);
972 const double outletPressure = Get(
"outletPressure", inp);
973 const double barometricPressure = Get(
"barometricPressure", inp);
974 const double flowRate = Get(
"flowRate", inp);
975 const double specificHeatRatio = Get(
"specificHeatRatio", inp);
979 moverShaftPower, inletPressure, outletPressure,
980 barometricPressure, flowRate, specificHeatRatio)
984 info.GetReturnValue().Set(compressibilityFactor);
Contains InputData for both PSAT and Fan results.
Contains some of the Fan related classes.