@@ -42,7 +42,7 @@ public class MultiStreamHeatExchanger extends Heater implements MultiStreamHeatE
42
42
43
43
protected double dT = 0.0 ;
44
44
private double temperatureApproach = 0.0 ;
45
-
45
+ private boolean UAvalueIsSet = false ;
46
46
47
47
private double UAvalue = 500.0 ; // Overall heat transfer coefficient times area
48
48
private double duty = 0.0 ;
@@ -194,6 +194,7 @@ public double getUAvalue() {
194
194
* @param UAvalue UA value to set
195
195
*/
196
196
public void setUAvalue (double UAvalue ) {
197
+ UAvalueIsSet = true ;
197
198
this .UAvalue = UAvalue ;
198
199
}
199
200
@@ -629,6 +630,84 @@ public void run(UUID id) {
629
630
630
631
logger .debug ("Adjusted heated stream " + i + ": ΔH = " + targetDeltaH );
631
632
}
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
+
632
711
}
633
712
setCalculationIdentifier (id );
634
713
}
0 commit comments