Sfoglia il codice sorgente

resistance calculation now differnentiate between high and low voltage part of the grid and pays attention to transformer losses

David Heck 4 anni fa
parent
commit
916ced92d7

+ 7 - 57
src/blackstart/controlAlgorithm.java

@@ -13,18 +13,14 @@ import ui.controller.Control;
 import ui.controller.StorageProductionController;
 
 public class controlAlgorithm implements AddOn {
-	private boolean cancel = false;
-
 	// Gui Part:
 	private Control control;
 	private JTextArea textArea;
 	private JPanel content = new JPanel();
 	// ProgressBar
-	private JProgressBar progressBar = new JProgressBar();
 	private long startTime;
 	private Thread runThread;
 
-	// Blackstart Resistance in Watt
 	private HolonObject powerplant;
 
 	private TextField blackstartEnergyrequierementTextfield;
@@ -117,11 +113,11 @@ public class controlAlgorithm implements AddOn {
 		powerplantMaxOutputLabel.setBounds(185, 110, 300, 20);
 		parameterPanel.add(powerplantMaxOutputLabel);
 
-		storageStartCharge = new TextField("10000");
+		storageStartCharge = new TextField("0.16666666");
 		storageStartCharge.setBounds(10, 135, 170, 20);
 		parameterPanel.add(storageStartCharge);
 
-		JLabel storageStartChargeLabel = new JLabel("Storage charge at start");
+		JLabel storageStartChargeLabel = new JLabel("Storage charge at start in kWh");
 		storageStartChargeLabel.setBounds(185, 135, 300, 20);
 		parameterPanel.add(storageStartChargeLabel);
 
@@ -133,36 +129,11 @@ public class controlAlgorithm implements AddOn {
 		waitBetweenIterationsLabel.setBounds(185, 205, 300, 20);
 		parameterPanel.add(waitBetweenIterationsLabel);
 
-//		JButton selectGroupNodeButton = new JButton("Select GroupNode");
-//		selectGroupNodeButton.setEnabled(false);
-//		selectGroupNodeButton.setBounds(10, 25, 165, 20);
-//		selectGroupNodeButton.addActionListener(actionEvent -> selectGroupNode());
-//		borderPanel.add(selectGroupNodeButton);
-
-//		JCheckBox useGroupNodeCheckBox = new JCheckBox();
-//		useGroupNodeCheckBox.setSelected(false);
-//		useGroupNodeCheckBox.setBounds(155, 1, 25, 20);
-//		useGroupNodeCheckBox.addActionListener(actionEvent -> {
-//			useGroupNode = useGroupNodeCheckBox.isSelected();
-//			selectGroupNodeButton.setEnabled(useGroupNode);
-//		});
-//		borderPanel.add(useGroupNodeCheckBox);
-
 		return parameterPanel;
 	}
 
 	public JPanel createButtonPanel() {
 		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-		JButton cancelButton = new JButton("Cancel Run");
-		cancelButton.addActionListener(actionEvent -> cancel());
-		buttonPanel.add(cancelButton);
-		JButton clearButton = new JButton("Clear Console");
-		clearButton.addActionListener(actionEvent -> clear());
-		buttonPanel.add(clearButton);
-		JButton resetButton = new JButton("Reset");
-		resetButton.setToolTipText("Resets the State to before the Algorithm has runed.");
-		resetButton.addActionListener(actionEvent -> reset());
-		buttonPanel.add(resetButton);
 		JButton runButton = new JButton("Run");
 		runButton.addActionListener(actionEvent -> {
 			Runnable task = this::run;
@@ -173,36 +144,15 @@ public class controlAlgorithm implements AddOn {
 		return buttonPanel;
 	}
 
-	private void cancel() {
-		if (runThread.isAlive()) {
-			println("");
-			println("Cancel run.");
-			cancel = true;
-			progressBar.setValue(0);
-		} else {
-			println("Nothing to cancel.");
-		}
-	}
-
 	private void run() {
 		clear();
-		cancel = false;
 		disableGuiInput(true);
 		startTimer();
 		initAlgo();
-		if (cancel) {
-			reset();
-			disableGuiInput(false);
-			return;
-		}
 		printElapsedTime();
 		disableGuiInput(false);
 	}
 
-	private void reset() {
-			println("RESET DOES NOTHING platzhalter");
-	}
-
 	private void disableGuiInput(boolean bool) {
 		control.guiDisable(bool);
 	}
@@ -250,9 +200,8 @@ public class controlAlgorithm implements AddOn {
 				println("No Power Plant in Model");
 				return;
 			}
-			resistanceCalculator resistanceCalculator = new resistanceCalculator(230, 30, 0.017);//TODO
+			resistanceCalculator resistanceCalculator = new resistanceCalculator(230, 20000, 30, 0.017);//TODO
 			resistanceCalculator.setDistancesToCalcResistance(powerplant);
-//			println("bla" + resistanceCalculator.calcEnergyNeededForCertainEnergyAfterResistance(1750, 1000, 4000000));
 			blackstartRunningCounter = 0;
 			deactivateBlackstart();
 			control.getModel().setCurIteration(0);
@@ -273,7 +222,7 @@ public class controlAlgorithm implements AddOn {
 			control.getModel().setIterations(Integer.parseInt(simulationDurationTextfield.getText()));
 			for (StorageElement se :
 					getStorageElements()) {
-				se.setStateOfCharge(Integer.parseInt(storageStartCharge.getText()));
+				se.setStateOfCharge(Float.parseFloat(storageStartCharge.getText())*1000*60);
 			}
 
 			updateVisual();
@@ -336,7 +285,8 @@ public class controlAlgorithm implements AddOn {
 	 * TODO: batterie status wechesel fuehrt zu unterversorgung in GUI FIX?: in storage if bei charge auskommentieren
 	 * TODO: batterie laden prios? entfernung? doppelt sortieren
 	 * TODO: renewables mit verlust
-	 * TODO: transformer + voltage unterscheidung
+	 * TODO: cable diameter/specificresistance
+	 * TODO: stelle fuer ergebnissausgabe ueberdenken
 	 *
 	 * @return true or false depending on whether the blackstart was successful for
 	 *         this iteration
@@ -397,7 +347,7 @@ public class controlAlgorithm implements AddOn {
 		println("currenctrenewable: " + currentRenewableProduction());
 		for (StorageElement ele :
 				getStorageElements()) {
-			println("Storage ID: " + ele.getId() + " now at " + ele.getStateOfCharge() + " charge " + "(" + (ele.getStateOfCharge()/60)/1000 + "kWh)");
+			println("Storage ID: " + ele.getId() + " at distance " + ele.getLowDistance() + " at charge " + (ele.getStateOfCharge()/60)/1000 + "kWh");
 		}
 		println("currenctpossiblestorage: " + SPC.currentPossibleStorageProduction());
 		println("blackstart resi: " + getEnergyRequiredForPowerplantBlackstart());

+ 17 - 7
src/classes/HolonElement.java

@@ -5,7 +5,6 @@ import com.google.gson.annotations.Expose;
 import interfaces.GraphEditable;
 import interfaces.LocalMode;
 import ui.controller.FlexManager;
-import ui.controller.SingletonControl;
 import ui.model.Model;
 import ui.view.IndexTranslator;
 
@@ -26,7 +25,10 @@ public class HolonElement implements LocalMode, GraphEditable{
 
 
     @Expose
-    private double distance;
+    private double lowDistance;
+
+    @Expose
+    private double highDistance;
 
     /** Points of new TestGraph 
      * Represent the Graph 
@@ -454,15 +456,23 @@ public class HolonElement implements LocalMode, GraphEditable{
 		
 	}
 
-    public double getDistance() {
-        return distance;
+    public double getLowDistance() {
+        return lowDistance;
+    }
+
+    public double getHighDistance() {
+        return highDistance;
+    }
+
+    public void setLowDistance(double lowDistance){
+        this.lowDistance = lowDistance;
     }
 
-    public void setDistance(double distance){
-        this.distance = distance;
+    public void setHighDistance(double highDistance) {
+        this.highDistance = highDistance;
     }
 
-	//interfaces.LocalMode
+    //interfaces.LocalMode
 	@Override
 	public void setLocalPeriod(int period) {
 		localPeriod=period;

+ 6 - 12
src/classes/StorageElement.java

@@ -35,7 +35,7 @@ public class StorageElement extends HolonElement implements Comparable<StorageEl
 									// minutes//TODO:!
 		this.status = Mode.STANDBY;
 		this.chargingRatio = 0;
-		this.resistanceCalculator = new resistanceCalculator(230, 30, 0.017);//TODO
+		this.resistanceCalculator = new resistanceCalculator(230, 20000, 30, 0.017);//TODO
 	}
 
 	public float getEnergyPerElement() {
@@ -58,7 +58,7 @@ public class StorageElement extends HolonElement implements Comparable<StorageEl
 	}
 
 	private float energyAfterResistance(float energy, float energyRequiredForPowerplantBlackstart){
-		return resistanceCalculator.calcEnergyAfterResistance(energy, getDistance(), energyRequiredForPowerplantBlackstart);
+		return resistanceCalculator.calcEnergyAfterResistance(energy, getLowDistance(), getHighDistance(), energyRequiredForPowerplantBlackstart);
 	}
 
 	/**
@@ -72,7 +72,8 @@ public class StorageElement extends HolonElement implements Comparable<StorageEl
 	//TODO: das beachtet nicht wie viel durch widerstand verloren geht
 
 	public float setStatusAndSetEnergy(Mode status, float energyWanted, float energyRequiredForPowerplantBlackstart) {
-		float energyNeed = resistanceCalculator.calcEnergyNeededForCertainEnergyAfterResistance(energyWanted, getDistance(), energyRequiredForPowerplantBlackstart);
+		//TODO: stellen fuer energyNeed nochmal ueberdenken
+		float energyNeed = resistanceCalculator.calcEnergyNeededForCertainEnergyAfterResistance(energyWanted, getLowDistance(), getHighDistance(), energyRequiredForPowerplantBlackstart);
 		this.status = status;
 		switch (status) {
 		case STANDBY:
@@ -96,13 +97,6 @@ public class StorageElement extends HolonElement implements Comparable<StorageEl
 				}else{
 					return notEnoughChargedToEmitWantedEnergy(energyRequiredForPowerplantBlackstart);
 				}
-//				if (stateOfCharge >= energyWanted) { // more energy stored than wanted
-//					this.setEnergyPerElement(energyAfterResistance(energyWanted, energyRequiredForPowerplantBlackstart));
-//					chargingRatio = energyWanted;
-//					return energyAfterResistance(energyWanted, energyRequiredForPowerplantBlackstart);
-//				} else { // less energy stored than wanted
-//					return notEnoughChargedToEmitWantedEnergy();
-//				}
 			}
 			case COLLECT://TODO: more testing
 			if (energyWanted >= maxInRatio) { // more engery given than can be collected
@@ -205,11 +199,11 @@ public class StorageElement extends HolonElement implements Comparable<StorageEl
 		}else if(this.stateOfCharge > storageElement.getStateOfCharge()){
 			return 1;
 		}else{
-			return 0;
+			return Double.compare(storageElement.getLowDistance(), this.getLowDistance());
 		}
 	}
 
 	public enum Mode {
 		COLLECT, EMIT, STANDBY
 	}
-}
+}

+ 30 - 17
src/classes/resistanceCalculator.java

@@ -1,13 +1,13 @@
 package classes;
 
-import classes.*;
 import com.google.gson.annotations.Expose;
-import ui.model.Model;
 
 public class resistanceCalculator {
+    @Expose
+    private int lowVoltage;
 
     @Expose
-    private int voltage;
+    private int highVoltage;
 
     @Expose
     private int diameter;
@@ -15,8 +15,9 @@ public class resistanceCalculator {
     @Expose
     private double specificMaterialResistance;
 
-    public resistanceCalculator(int voltage, int diameter, double specificMaterialResistance){
-        this.voltage = voltage;
+    public resistanceCalculator(int lowVoltage, int highVoltage, int diameter, double specificMaterialResistance){
+        this.lowVoltage = lowVoltage;
+        this.highVoltage = highVoltage;
         this.diameter = diameter;
         this.specificMaterialResistance = specificMaterialResistance;
     }
@@ -27,9 +28,9 @@ public class resistanceCalculator {
             if (powerPlant.getConnectedTo().size() > 0) {
                 for (CpsEdge edge : powerPlant.getConnectedTo()) {
                     if (powerPlant.getId() == edge.getA().getId()) {
-                        traversEdges(edge.getB(), powerPlant, calcEdgeLength(edge));
+                        traversEdges(edge.getB(), powerPlant, calcEdgeLength(edge), 0);
                     } else {
-                        traversEdges(edge.getA(), powerPlant, calcEdgeLength(edge));
+                        traversEdges(edge.getA(), powerPlant, calcEdgeLength(edge), 0);
                     }
                 }
             } else {
@@ -40,22 +41,24 @@ public class resistanceCalculator {
         }
     }
 
-    private void traversEdges(AbstractCpsObject currentObject, AbstractCpsObject last, double distance) {
+    private void traversEdges(AbstractCpsObject currentObject, AbstractCpsObject last, double distance, double lastDistance) {
         if (currentObject.getConnectedTo().size() > 1) { // recursive call for all edges
             for (CpsEdge edge : currentObject.getConnectedTo()) {
+                double newDistance = calcEdgeLength(edge);
                 if (currentObject.getId() == edge.getA().getId()) { // look at which way the edge points
                     if (last.getId() != edge.getB().getId()) {
-                        traversEdges(edge.getB(), currentObject, distance + calcEdgeLength(edge));
+                        traversEdges(edge.getB(), currentObject, distance + newDistance, newDistance);
                     }
                 } else {
                     if (last.getId() != edge.getA().getId()) {
-                        traversEdges(edge.getA(), currentObject, distance + calcEdgeLength(edge));
+                        traversEdges(edge.getA(), currentObject, distance + newDistance, newDistance);
                     }
                 }
             }
         } else { // at leaf
             for (HolonElement ele : ((HolonObject) currentObject).getElements()) {
-                ele.setDistance(distance);
+                ele.setHighDistance(distance - lastDistance);
+                ele.setLowDistance(lastDistance);
             }
         }
     }
@@ -68,11 +71,16 @@ public class resistanceCalculator {
         return Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2));
     }
 
-    public float calcEnergyAfterResistance(float currentEnergy, double distance, float energyRequiredForPowerplantBlackstart){
+    public float calcEnergyAfterResistance(float currentEnergy, double lowDistance, double highDistance, float energyRequiredForPowerplantBlackstart){
+        double energyAfterLowVoltage = calcEnergyAfterPartOfGrid(currentEnergy, lowVoltage, lowDistance, energyRequiredForPowerplantBlackstart);
+        energyAfterLowVoltage = (0.98 * energyAfterLowVoltage); //transfomer loses
+        return (float) calcEnergyAfterPartOfGrid(energyAfterLowVoltage, highVoltage, highDistance, energyRequiredForPowerplantBlackstart);
+    }
+
+    private double calcEnergyAfterPartOfGrid(double currentEnergy, int voltage, double distance, float energyRequiredForPowerplantBlackstart){
         double blackstartResistance = blackstartResistance(voltage, energyRequiredForPowerplantBlackstart);
         double cableResistance = cableResistance(specificMaterialResistance, distance, diameter);
-
-        return (float) (1 - (cableResistance / (cableResistance + blackstartResistance))) * currentEnergy;
+        return (1 - (cableResistance / (cableResistance + blackstartResistance))) * currentEnergy;
     }
 
     private double blackstartResistance(int voltage, float energyRequiredForPowerplantBlackstart){
@@ -83,10 +91,15 @@ public class resistanceCalculator {
         return specificMaterialResistance * (distance / (0.25 * Math.PI * Math.pow(diameter, 2)));
     }
 
-    public float calcEnergyNeededForCertainEnergyAfterResistance(float energyWanted, double distance, float energyRequiredForPowerplantBlackstart){
+    public float calcEnergyNeededForCertainEnergyAfterResistance(float energyWanted, double lowDistance, double highDistance, float energyRequiredForPowerplantBlackstart){
+        double energyBeforeHighVoltage = calcEnergyNeededBeforePartOfGrid(energyWanted, highVoltage, highDistance,energyRequiredForPowerplantBlackstart);
+        energyBeforeHighVoltage = 1.02 * energyBeforeHighVoltage;
+        return (float) calcEnergyNeededBeforePartOfGrid(energyBeforeHighVoltage, lowVoltage, lowDistance, energyRequiredForPowerplantBlackstart);
+    }
+
+    private double calcEnergyNeededBeforePartOfGrid(double energyWanted, int voltage, double distance, float energyRequiredForPowerplantBlackstart){
         double blackstartResistance = blackstartResistance(voltage, energyRequiredForPowerplantBlackstart);
         double cableResistance = cableResistance(specificMaterialResistance, distance, diameter);
-
-        return (float) (energyWanted / (1 - (cableResistance / (cableResistance + blackstartResistance))));
+        return (energyWanted / (1 - (cableResistance / (cableResistance + blackstartResistance))));
     }
 }