Skip to content

Commit 702518b

Browse files
committed
specify UA for multi stream HX
1 parent 6cd2f4c commit 702518b

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

src/main/java/neqsim/process/equipment/heatexchanger/MultiStreamHeatExchanger.java

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class MultiStreamHeatExchanger extends Heater implements MultiStreamHeatE
4242

4343
protected double dT = 0.0;
4444
private double temperatureApproach = 0.0;
45-
45+
private boolean UAvalueIsSet = false;
4646

4747
private double UAvalue = 500.0; // Overall heat transfer coefficient times area
4848
private double duty = 0.0;
@@ -194,6 +194,7 @@ public double getUAvalue() {
194194
* @param UAvalue UA value to set
195195
*/
196196
public void setUAvalue(double UAvalue) {
197+
UAvalueIsSet = true;
197198
this.UAvalue = UAvalue;
198199
}
199200

@@ -629,6 +630,84 @@ public void run(UUID id) {
629630

630631
logger.debug("Adjusted heated stream " + i + ": ΔH = " + targetDeltaH);
631632
}
633+
634+
// ----------------------- LMTD and UA Calculations -----------------------
635+
636+
// Re-identify the hottest and coldest inlet streams after adjustment
637+
double adjustedHottestTemp = Double.NEGATIVE_INFINITY;
638+
double adjustedColdestTemp = Double.POSITIVE_INFINITY;
639+
int adjustedHottestIndex = -1;
640+
int adjustedColdestIndex = -1;
641+
642+
for (int i = 0; i < inStreams.size(); i++) {
643+
StreamInterface inStream = inStreams.get(i);
644+
double currentTemp = inStream.getThermoSystem().getTemperature("K");
645+
646+
if (currentTemp > adjustedHottestTemp) {
647+
adjustedHottestTemp = currentTemp;
648+
adjustedHottestIndex = i;
649+
}
650+
651+
if (currentTemp < adjustedColdestTemp) {
652+
adjustedColdestTemp = currentTemp;
653+
adjustedColdestIndex = i;
654+
}
655+
}
656+
657+
// Ensure valid indices
658+
if (adjustedHottestIndex == -1 || adjustedColdestIndex == -1) {
659+
throw new IllegalStateException(
660+
"Unable to determine adjusted hottest or coldest inlet streams.");
661+
}
662+
663+
// Outlet temperatures after adjustment
664+
double hotInletTemp = adjustedHottestTemp;
665+
double coldInletTemp = adjustedColdestTemp;
666+
667+
StreamInterface hotOutletStream = outStreams.get(adjustedHottestIndex);
668+
double hotOutletTemp = hotOutletStream.getThermoSystem().getTemperature("K");
669+
670+
StreamInterface coldOutletStream = outStreams.get(adjustedColdestIndex);
671+
double coldOutletTemp = coldOutletStream.getThermoSystem().getTemperature("K");
672+
673+
// Calculate temperature differences
674+
double deltaT1 = hotInletTemp - coldOutletTemp; // Hot inlet - Cold outlet
675+
double deltaT2 = hotOutletTemp - coldInletTemp; // Hot outlet - Cold inlet
676+
677+
// Validate temperature differences
678+
if (deltaT1 <= 0 || deltaT2 <= 0) {
679+
throw new IllegalStateException("Invalid temperature differences for LMTD calculation.");
680+
}
681+
682+
// Calculate LMTD
683+
double LMTD;
684+
if (deltaT1 == deltaT2) {
685+
// Avoid division by zero in logarithm
686+
LMTD = deltaT1;
687+
} else {
688+
LMTD = (deltaT1 - deltaT2) / Math.log(deltaT1 / deltaT2);
689+
}
690+
691+
// Total heat transfer rate (assuming energy balance is achieved)
692+
double totalQ = heatingIsLimiting ? totalHeatGained : totalHeatLost;
693+
694+
// Calculate UA
695+
double UA = totalQ / LMTD;
696+
// setUAvalue(UA);
697+
logger.info("Overall LMTD: " + LMTD + " K");
698+
logger.info("Overall UA: " + UA + " W/K");
699+
700+
if (UAvalueIsSet && Math.abs((UA - getUAvalue()) / getUAvalue()) > 0.001) {
701+
setTemperatureApproach(getTemperatureApproach() * UA / getUAvalue());
702+
firstTime = true;
703+
run(id);
704+
return;
705+
}
706+
707+
// Log the results
708+
logger.info("Overall LMTD: " + LMTD + " K");
709+
logger.info("Overall UA: " + UA + " W/K");
710+
632711
}
633712
setCalculationIdentifier(id);
634713
}

src/test/java/neqsim/process/equipment/heatexchanger/MultiStreamHeatExchangerTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ void testRun1() {
4545
heatEx.addInStream(stream_Hot);
4646
heatEx.addInStream(stream_Cold);
4747
heatEx.addInStream(stream_Cold2);
48-
heatEx.setTemperatureApproach(5.0);
48+
// heatEx.setUAvalue(1000);
49+
heatEx.setTemperatureApproach(5);
4950

5051

5152
neqsim.process.processmodel.ProcessSystem operations =
@@ -61,6 +62,14 @@ void testRun1() {
6162
assertEquals(95, heatEx.getOutStream(2).getTemperature("C"), 1e-3);
6263
assertEquals(70.5921794735, heatEx.getOutStream(0).getTemperature("C"), 1e-3);
6364

65+
heatEx.setUAvalue(1000);
66+
67+
operations.run();
68+
assertEquals(97.992627692, heatEx.getOutStream(1).getTemperature("C"), 1e-3);
69+
assertEquals(97.992627692, heatEx.getOutStream(2).getTemperature("C"), 1e-3);
70+
assertEquals(69.477801, heatEx.getOutStream(0).getTemperature("C"), 1e-3);
71+
assertEquals(1000, heatEx.getUAvalue(), 0.1);
72+
6473
}
6574

6675

0 commit comments

Comments
 (0)