소스 검색

hierarchical mutlirate power bond working

Claudio Gomes 6 년 전
부모
커밋
36a87ac568

+ 1 - 1
HintCO/examples/case_study_double_loop_pbond.hintco

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="ASCII"?>
 <hintco:Candidates xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hintco="ua.ansymo.hintco">
-  <candidates identifier="Original" stopTime="2.0" stepSize="1.0E-5" outputStepSize="0.001">
+  <candidates identifier="Original" stopTime="0.5" stepSize="1.0E-5" outputStepSize="0.001">
     <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="Scenario" declaration="//@csuDeclarations.0">
       <ports xsi:type="hintco:OutputPortInstance" identifier="psuvolt" valueTo="//@candidates.0/@cosimunits.2/@ports.1"/>
       <ports xsi:type="hintco:OutputPortInstance" identifier="ref" valueTo="//@candidates.0/@cosimunits.1/@ports.2"/>

+ 14 - 9
HintCO/instances/case_study_double_loop_pbond_hier.hintco

@@ -1,29 +1,29 @@
 <?xml version="1.0" encoding="ASCII"?>
 <hintco:Candidates xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hintco="ua.ansymo.hintco">
-  <candidates identifier="Original" stopTime="2.0" stepSize="0.001" outputStepSize="0.001">
+  <candidates identifier="Original" stopTime="2.0" stepSize="1.0E-5" outputStepSize="0.001">
     <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="Scenario" declaration="//@csuDeclarations.0">
-      <ports xsi:type="hintco:OutputPortInstance" identifier="psuvolt" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.1"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="psuvolt" valueTo="//@candidates.0/@cosimunits.2/@ports.0"/>
       <ports xsi:type="hintco:OutputPortInstance" identifier="ref" valueTo="//@candidates.0/@cosimunits.1/@ports.2"/>
     </cosimunits>
     <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="DLoopController_FixedEuler_1Em6" declaration="//@csuDeclarations.1">
-      <ports xsi:type="hintco:InputPortInstance" identifier="VEL_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.4">
+      <ports xsi:type="hintco:InputPortInstance" identifier="VEL_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.3">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:InputPortInstance" identifier="POS_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.1/@ports.1">
+      <ports xsi:type="hintco:InputPortInstance" identifier="POS_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.2">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports xsi:type="hintco:InputPortInstance" identifier="REFERENCE@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:OutputPortInstance" identifier="OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.0"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.1"/>
     </cosimunits>
     <cosimunits xsi:type="hintco:HierarchicalCosimUnit" identifier="plant">
       <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="EMAPlantNoLoad_FixedEuler_1Em6" declaration="//@csuDeclarations.2">
         <adaptation xsi:type="hintco:PowerBondAdaptation" effort="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.5" flow="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.2"/>
-        <ports xsi:type="hintco:InputPortInstance" identifier="torque_input@expseu_" valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
+        <ports xsi:type="hintco:InputPortInstance" identifier="torque_input@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.1">
           <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
         </ports>
-        <ports xsi:type="hintco:InputPortInstance" identifier="psu_vol_input_v@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
+        <ports xsi:type="hintco:InputPortInstance" identifier="psu_vol_input_v@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.0">
           <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
         </ports>
         <ports xsi:type="hintco:InputPortInstance" identifier="V_IN@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.1/@ports.2">
@@ -32,7 +32,7 @@
         <ports xsi:type="hintco:InputPortInstance" identifier="X_IN@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.1/@ports.3">
           <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
         </ports>
-        <ports xsi:type="hintco:OutputPortInstance" identifier="ang_vel_out_rpm@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.0"/>
+        <ports xsi:type="hintco:OutputPortInstance" identifier="ang_vel_out_rpm@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.3"/>
         <ports xsi:type="hintco:OutputPortInstance" identifier="F_OUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.1/@ports.0"/>
       </cosimunits>
       <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="LoadNSensor_FixedEuler_1Em6" declaration="//@csuDeclarations.3">
@@ -40,10 +40,15 @@
         <ports xsi:type="hintco:InputPortInstance" identifier="F_INPUT@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.5">
           <adaptation xsi:type="hintco:InterpolationAdaptation"/>
         </ports>
-        <ports xsi:type="hintco:OutputPortInstance" identifier="X_AFTER_LOAD@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.1"/>
+        <ports xsi:type="hintco:OutputPortInstance" identifier="X_AFTER_LOAD@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.2"/>
         <ports xsi:type="hintco:OutputPortInstance" identifier="V_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.2"/>
         <ports xsi:type="hintco:OutputPortInstance" identifier="X_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.3"/>
       </cosimunits>
+      <adaptation xsi:type="hintco:MultiRateAdaptation" rate="10"/>
+      <ports xsi:type="hintco:HierarchicalUnitPort" identifier="psu" valueFrom="//@candidates.0/@cosimunits.0/@ports.0" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.1"/>
+      <ports xsi:type="hintco:HierarchicalUnitPort" identifier="ctrl_in" valueFrom="//@candidates.0/@cosimunits.1/@ports.3" valueTo="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.0"/>
+      <ports xsi:type="hintco:HierarchicalUnitPort" identifier="x" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.1/@ports.1" valueTo="//@candidates.0/@cosimunits.1/@ports.1"/>
+      <ports xsi:type="hintco:HierarchicalUnitPort" identifier="w" valueFrom="//@candidates.0/@cosimunits.2/@cosimunits.0/@ports.4" valueTo="//@candidates.0/@cosimunits.1/@ports.0"/>
     </cosimunits>
   </candidates>
   <csuDeclarations identifier="Scenario" path="resources/Scenario.fmu" guid="{a174734c-d15f-4ef0-838d-06526230b19e}"/>

+ 1 - 1
HintCO/src-gen/ua/ansymo/hintco/impl/HierarchicalUnitPortImpl.java

@@ -105,7 +105,7 @@ public class HierarchicalUnitPortImpl extends InputPortInstanceImpl implements H
 			final boolean auxIsInput = (!_exists);
 			final boolean auxAltIsInput = this.altIsInput();
 			if (((auxIsInput && (!auxAltIsInput)) || ((!auxIsInput) && auxAltIsInput))) {
-				throw new RuntimeException("Something wrong with the implementation of isInput");
+				throw new RuntimeException("Something wrong with the implementation of isInput, or the model is invalid.");
 			}
 			_xblockexpression = auxIsInput;
 		}

+ 2 - 2
HintCO/src/ua/ansymo/hintco/AdaptedFMUInstance.xtend

@@ -75,10 +75,10 @@ class AdaptedFMUInstance extends FmuInstance {
 				Assert.isTrue(portAdaptation.adapted === p)
 				switch (portAdaptation) {
 					InterpolationAdaptation case portAdaptation.order == 1: {
-						addInAdaptation(p.identifier, new InterpolationAdaptedPort(portAdaptation, this))
+						addInAdaptation(p.identifier, new InterpolationAdaptedPort(p.identifier, this))
 					}
 					ExtrapolationAdaptation case portAdaptation.order == 1: {
-						addInAdaptation(p.identifier, new ExtrapolationAdaptedPort(portAdaptation, this))
+						addInAdaptation(p.identifier, new ExtrapolationAdaptedPort(p.identifier, this))
 					}
 				}
 				

+ 2 - 2
HintCO/src/ua/ansymo/hintco/ApproximationAdaptedPort.xtend

@@ -12,9 +12,9 @@ abstract class ApproximationAdaptedPort implements IAdaptedInputPort {
 	var protected AdaptedFMUInstance fmu
 	var protected String portId;
 	
-	new(PortAdaptation adaptation, AdaptedFMUInstance f) {
+	new(String pId, AdaptedFMUInstance f) {
 		fmu = f
-		portId = adaptation.adapted.identifier
+		portId = pId
 		inCosimStepMode = false
 	}
 	

+ 7 - 3
HintCO/src/ua/ansymo/hintco/ExtrapolationAdaptedPort.xtend

@@ -2,16 +2,20 @@ package ua.ansymo.hintco
 
 class ExtrapolationAdaptedPort extends ApproximationAdaptedPort {
 	
-	new(ExtrapolationAdaptation adaptation, AdaptedFMUInstance fmu) {
-		super(adaptation, fmu)
+	new(String pId, AdaptedFMUInstance f) {
+		super(pId, f)
 	}
 	
 	override computeReal(double t, double dt, double h, double H) {
 		var o = current_val
 		if (inCosimStepMode){
-			o = previous_val + ((current_val - previous_val)/H)*(H + dt + h)
+			o = extrapolate(t, dt, h, H)
 		}
 		fmu.setInnerReal(portId, o)
 	}
 	
+	def extrapolate(double t, double dt, double h, double H) {
+		previous_val + ((current_val - previous_val)/H)*(H + dt + h)
+	}
+	
 }

+ 2 - 2
HintCO/src/ua/ansymo/hintco/InterpolationAdaptedPort.xtend

@@ -2,8 +2,8 @@ package ua.ansymo.hintco
 
 class InterpolationAdaptedPort extends ApproximationAdaptedPort {
 	
-	new(InterpolationAdaptation adaptation, AdaptedFMUInstance fmu) {
-		super(adaptation, fmu)
+	new(String pId, AdaptedFMUInstance f) {
+		super(pId, f)
 	}
 	
 	override computeReal(double t, double dt, double h, double H) {

+ 6 - 7
HintCO/src/ua/ansymo/hintco/PowerCorrectionPort.xtend

@@ -3,17 +3,15 @@ package ua.ansymo.hintco
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
-class PowerCorrectionPort extends StoreAdaptedPort {
-	
-	var AdaptedFMUInstance fmu
+class PowerCorrectionPort extends ExtrapolationAdaptedPort {
 	
 	var String portId
 	
 	var double accumulatedDeficit = 0.0
 	var double energyDeficit = 0.0
 	
-	var Kp = 10.0
-	var Ki = 10.0
+	var Kp = 1.0
+	var Ki = 100.0
 	
 	PowerOutAdaptedPort pOut
 	StoreAdaptedPort pIn
@@ -21,7 +19,7 @@ class PowerCorrectionPort extends StoreAdaptedPort {
 	Logger logger = LoggerFactory.getLogger(typeof(PowerCorrectionPort))
 	
 	new(String pId, PowerOutAdaptedPort po, StoreAdaptedPort pi, AdaptedFMUInstance f) {
-		fmu = f
+		super(pId, f)
 		portId = pId
 		pOut = po
 		pIn = pi
@@ -40,7 +38,8 @@ class PowerCorrectionPort extends StoreAdaptedPort {
 	}
 	
 	override computeReal(double t, double dt, double h, double H) {
-		val givenInput = storedVal
+		var givenInput = extrapolate(t, dt, h, H) 
+		givenInput = current_val
 		val piControlOut = Kp*energyDeficit + Ki*accumulatedDeficit
 		val actualInput = givenInput + piControlOut
 		logger.debug("Applying power correction on port {}.{}.", 

+ 16 - 0
HintCO/test/ua/ansymo/hintco/test/CosimRunnerTest.xtend

@@ -257,6 +257,22 @@ class CosimRunnerTest {
 		assertEquals(1, numVariants)
 	}
 	
+	@Test
+	def void executeCosimulationTestDoubleLoopPowerBondHier(){
+		Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS) // Because it only works on windows.
+//		System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
+//		System.setProperty("org.slf4j.simpleLogger.logFile", "cosimTestDLoopPBondHier.log")
+		val resultsDirPath = "results-gen/cosimTestDLoopPBondHier"
+		val loader = new ModelStorage()
+		val src = loader.loadCandidates("instances/case_study_double_loop_pbond_hier.hintco")
+		val runner = new CosimRunner(new OutputProcessor(resultsDirPath), new FmuLoader)
+		val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(runner))
+		generator.processAdaptations(src)
+		generator.createVariantTree(src)
+		val numVariants = generator.generateVariants(src, 1)
+		runner.close()
+		assertEquals(1, numVariants)
+	}
 	
 	@Test
 	def void executeCosimulationTestDoubleLoopDefault(){