Просмотр исходного кода

added zero order interpolation support, and make boeing case study work

Claudio Gomes 7 лет назад
Родитель
Сommit
c7200f1a79

+ 2 - 1
HintCO/META-INF/MANIFEST.MF

@@ -13,7 +13,8 @@ Bundle-ClassPath: .,
  lib/commons-cli-1.4.jar,
  lib/commons-beanutils-1.9.3.jar,
  lib/commons-lang3-3.8.1.jar,
- lib/opencsv-4.3.2.jar
+ lib/opencsv-4.3.2.jar,
+ lib/nativebinaries/
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Automatic-Module-Name: ua.ansymo.HintCO

+ 10 - 7
HintCO/build.properties

@@ -2,7 +2,8 @@ source.. = src/,\
            test/,\
            src-gen/,\
            lib/nativebinaries/,\
-           target/xtend-gen/
+           target/xtend-gen/,\
+           target/test-xtend-gen/
 bin.includes = META-INF/,\
                .,\
                plugin.xml,\
@@ -11,14 +12,16 @@ bin.includes = META-INF/,\
                src-gen/,\
                test/,\
                resources/,\
-               lib/commons-compress-1.18.jar,\
-               lib/commons-io-2.6.jar,\
                lib/fmi2.jar,\
                lib/jnifmuapi.jar,\
-               lib/slf4j-api.jar,\
-               lib/slf4j-simple.jar,\
+               lib/commons-lang3-3.8.1.jar,\
+               lib/commons-io-2.6.jar,\
+               lib/commons-compress-1.18.jar,\
                lib/commons-cli-1.4.jar,\
                lib/commons-beanutils-1.9.3.jar,\
-               lib/commons-lang3-3.8.1.jar,\
-               lib/opencsv-4.3.2.jar
+               lib/opencsv-4.3.2.jar,\
+               lib/slf4j-api.jar,\
+               lib/slf4j-simple.jar,\
+               target/,\
+               lib/nativebinaries/
 jars.compile.order = .

+ 13 - 4
HintCO/examples/case_study_double_loop_better.xmi

@@ -6,7 +6,7 @@
     xmlns:hintco="ua.ansymo.hintco">
   <candidates
       identifier="Original"
-      stopTime="10.0"
+      stopTime="20.0"
       stepSize="1.0E-5"
       outputStepSize="0.001">
     <cosimunits
@@ -51,7 +51,10 @@
           xsi:type="hintco:InputPortInstance"
           identifier="REFERENCE@expseu_"
           declaration="//@csuDeclarations.1/@ports.2"
-          valueFrom="//@candidates.0/@cosimunits.0/@ports.1"/>
+          valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="OUTPUT@expseu_"
@@ -68,12 +71,18 @@
           xsi:type="hintco:InputPortInstance"
           identifier="torque_input@expseu_"
           declaration="//@csuDeclarations.2/@ports.0"
-          valueFrom="//@candidates.0/@cosimunits.1/@ports.3"/>
+          valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="psu_vol_input_v@expseu_"
           declaration="//@csuDeclarations.2/@ports.1"
-          valueFrom="//@candidates.0/@cosimunits.0/@ports.0"/>
+          valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="V_IN@expseu_"

+ 199 - 0
HintCO/instances/case_study_double_loop_better.xmi

@@ -0,0 +1,199 @@
+<?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">
+    <cosimunits
+        identifier="Scenario"
+        declaration="//@csuDeclarations.0">
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="psuvolt"
+          valueTo="//@candidates.0/@cosimunits.2/@ports.1"
+          declaration="//@csuDeclarations.0/@ports.0"/>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="ref"
+          valueTo="//@candidates.0/@cosimunits.1/@ports.2"
+          declaration="//@csuDeclarations.0/@ports.1"/>
+    </cosimunits>
+    <cosimunits
+        identifier="DLoopController_FixedEuler_1Em6"
+        declaration="//@csuDeclarations.1">
+      <adaptation
+          xsi:type="hintco:MultiRateAdaptation"
+          rate="10"/>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="VEL_FB@expseu_"
+          declaration="//@csuDeclarations.1/@ports.0"
+          valueFrom="//@candidates.0/@cosimunits.2/@ports.4">
+        <adaptation
+            xsi:type="hintco:ExtrapolationAdaptation"
+            order="1"/>
+      </ports>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="POS_FB@expseu_"
+          declaration="//@csuDeclarations.1/@ports.1"
+          valueFrom="//@candidates.0/@cosimunits.3/@ports.1">
+        <adaptation
+            xsi:type="hintco:ExtrapolationAdaptation"
+            order="1"/>
+      </ports>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="REFERENCE@expseu_"
+          declaration="//@csuDeclarations.1/@ports.2"
+          valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="OUTPUT@expseu_"
+          valueTo="//@candidates.0/@cosimunits.2/@ports.0"
+          declaration="//@csuDeclarations.1/@ports.3"/>
+    </cosimunits>
+    <cosimunits
+        identifier="EMAPlantNoLoad_FixedEuler_1Em6"
+        declaration="//@csuDeclarations.2">
+      <adaptation
+          xsi:type="hintco:MultiRateAdaptation"
+          rate="10"/>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="torque_input@expseu_"
+          declaration="//@csuDeclarations.2/@ports.0"
+          valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="psu_vol_input_v@expseu_"
+          declaration="//@csuDeclarations.2/@ports.1"
+          valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="V_IN@expseu_"
+          declaration="//@csuDeclarations.2/@ports.2"
+          valueFrom="//@candidates.0/@cosimunits.3/@ports.2">
+        <adaptation
+            xsi:type="hintco:ExtrapolationAdaptation"
+            order="1"/>
+      </ports>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="X_IN@expseu_"
+          declaration="//@csuDeclarations.2/@ports.3"
+          valueFrom="//@candidates.0/@cosimunits.3/@ports.3">
+        <adaptation
+            xsi:type="hintco:ExtrapolationAdaptation"
+            order="1"/>
+      </ports>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="ang_vel_out_rpm@expseu_"
+          valueTo="//@candidates.0/@cosimunits.1/@ports.0"
+          declaration="//@csuDeclarations.2/@ports.4"/>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="F_OUT@expseu_"
+          valueTo="//@candidates.0/@cosimunits.3/@ports.0"
+          declaration="//@csuDeclarations.2/@ports.5"/>
+    </cosimunits>
+    <cosimunits
+        identifier="LoadNSensor_FixedEuler_1Em6"
+        declaration="//@csuDeclarations.3">
+      <adaptation
+          xsi:type="hintco:MultiRateAdaptation"
+          rate="10"/>
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="F_INPUT@expseu_"
+          declaration="//@csuDeclarations.3/@ports.0"
+          valueFrom="//@candidates.0/@cosimunits.2/@ports.5">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"
+            order="1"/>
+      </ports>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="X_AFTER_LOAD@expseu_"
+          valueTo="//@candidates.0/@cosimunits.1/@ports.1"
+          declaration="//@csuDeclarations.3/@ports.1"/>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="V_OUTPUT@expseu_"
+          valueTo="//@candidates.0/@cosimunits.2/@ports.2"
+          declaration="//@csuDeclarations.3/@ports.2"/>
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="X_OUTPUT@expseu_"
+          valueTo="//@candidates.0/@cosimunits.2/@ports.3"
+          declaration="//@csuDeclarations.3/@ports.3"/>
+    </cosimunits>
+  </candidates>
+  <csuDeclarations
+      identifier="Scenario"
+      path="resources/Scenario.fmu"
+      guid="{a174734c-d15f-4ef0-838d-06526230b19e}">
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="psuvolt"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="ref"/>
+  </csuDeclarations>
+  <csuDeclarations
+      identifier="DLoopController_FixedEuler_1Em6"
+      path="resources/DLoopController_FixedEuler_1Em6.fmu"
+      guid="2761528305">
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="VEL_FB@expseu_"/>
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="POS_FB@expseu_"/>
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="REFERENCE@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="OUTPUT@expseu_"/>
+  </csuDeclarations>
+  <csuDeclarations
+      identifier="EMAPlantNoLoad_FixedEuler_1Em6"
+      path="resources/EMAPlantNoLoad_FixedEuler_1Em6.fmu"
+      guid="698567049">
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="torque_input@expseu_"/>
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="psu_vol_input_v@expseu_"/>
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="V_IN@expseu_"/>
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="X_IN@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="ang_vel_out_rpm@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="F_OUT@expseu_"/>
+  </csuDeclarations>
+  <csuDeclarations
+      identifier="LoadNSensor_FixedEuler_1Em6"
+      path="resources/LoadNSensor_FixedEuler_1Em6.fmu"
+      guid="2810456241">
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="F_INPUT@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="X_AFTER_LOAD@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="V_OUTPUT@expseu_"/>
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="X_OUTPUT@expseu_"/>
+  </csuDeclarations>
+</hintco:Candidates>

+ 48 - 0
HintCO/instances/zero_interpolation_test.xmi

@@ -0,0 +1,48 @@
+<?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="Scenario"
+      stopTime="10.0"
+      stepSize="1.0"
+      outputStepSize="1.0">
+    <cosimunits
+        identifier="Source"
+        declaration="//@csuDeclarations.0">
+      <ports
+          xsi:type="hintco:OutputPortInstance"
+          identifier="out"
+          valueTo="//@candidates.0/@cosimunits.1/@ports.0"
+          declaration="//@csuDeclarations.0/@ports.0"/>
+    </cosimunits>
+    <cosimunits
+        identifier="Sink"
+        declaration="//@csuDeclarations.1">
+      <ports
+          xsi:type="hintco:InputPortInstance"
+          identifier="in"
+          declaration="//@csuDeclarations.1/@ports.0"
+          valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
+        <adaptation
+            xsi:type="hintco:InterpolationAdaptation"/>
+      </ports>
+    </cosimunits>
+  </candidates>
+  <csuDeclarations
+      identifier="Source"
+      path="resources/Scenario.fmu"
+      guid="{a174734c-d15f-4ef0-838d-06526230b19e}">
+    <ports xsi:type="hintco:OutputPortDeclaration"
+        identifier="out"/>
+  </csuDeclarations>
+  <csuDeclarations
+      identifier="Sink"
+      path="resources/DLoopController_FixedEuler_1Em6.fmu"
+      guid="2761528305">
+    <ports xsi:type="hintco:InputPortDeclaration"
+        identifier="in"/>
+  </csuDeclarations>
+</hintco:Candidates>

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

@@ -27,10 +27,10 @@ class AdaptedFMUInstance extends FmuInstance {
 			// Check which adaptation is selected for the input port, and instantiate the appropriate class.
 			val portAdaptation = p.selectedAdaptation
 			switch (portAdaptation) {
-				InterpolationAdaptation: {
+				InterpolationAdaptation case portAdaptation.order == 1: {
 					adaptedInPorts.put(p.identifier, new InterpolationAdaptedPort(p, portAdaptation))
 				}
-				ExtrapolationAdaptation: {
+				ExtrapolationAdaptation case portAdaptation.order == 1: {
 					adaptedInPorts.put(p.identifier, new ExtrapolationAdaptedPort(p, portAdaptation))
 				}
 			}

+ 45 - 0
HintCO/test/ua/ansymo/hintco/test/AdaptedFMUTest.xtend

@@ -81,6 +81,51 @@ class AdaptedFMUTest {
 		assertEquals(110, numInnerSteps.size)
 	}
 	
+	@Test
+	def void zeroOrderInterpolationTest(){
+		val loader = new ModelStorage()
+		
+		val src = loader.loadCandidates("instances/zero_interpolation_test.xmi")
+		
+		val source = src.eAllContents.filter(CosimUnitInstance).findFirst[u | u.identifier == "Source"]
+		val sink = src.eAllContents.filter(CosimUnitInstance).findFirst[u | u.identifier == "Sink"]
+		
+		val numInnerSteps = new LinkedList()
+		
+		val mockLoader = new IFmuLoader{
+			override instantiate(CosimUnitInstance u) {
+				assertTrue(u===source || u===sink)
+				if (u===source){
+					return new AdaptedFMUInstance(new MockSourceFmuInstance[t, H | 
+						t+H
+					], u)
+				}
+				if (u===sink){
+					return new AdaptedFMUInstance(new MockSinkFmuInstance[t, H, in | 
+						numInnerSteps.add(t)
+						assertTrue(MathUtils.isApproximatelyEqual(in, t+H, 1e-6))
+					], u)
+				}
+				return null
+			}
+			override free() {}
+		}
+		
+		val outputCheck = new IOutputProcessor{
+			override initialize(CandidateScenario scenario, String variantID) {}
+			override setOutputs(int i, double d, Map<OutputPortInstance, Double> map) {
+				val o = map.get(map.keySet.head)
+				assertTrue(MathUtils.isApproximatelyEqual(o, d, 1e-6))
+			}
+			override terminate() {}
+		}
+		
+		val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(new CosimRunner(outputCheck, mockLoader)))
+		generator.createVariantTree(src)
+		generator.generateVariants(src)
+		assertEquals(11, numInnerSteps.size)
+	}
+	
 	@Test
 	def void ExtrapolationTest(){
 		val loader = new ModelStorage()

+ 11 - 1
HintCO/test/ua/ansymo/hintco/test/CosimRunnerTest.xtend

@@ -5,7 +5,7 @@ import org.intocps.fmi.Fmi2Status
 import org.intocps.fmi.IFmuCallback
 import org.intocps.fmi.jnifmuapi.Factory
 import org.intocps.orchestration.coe.modeldefinition.ModelDescription
-import org.junit.Assert
+import org.junit.Ignore
 import org.junit.Test
 import ua.ansymo.hintco.CandidatesGenerator
 import ua.ansymo.hintco.ConstraintChecker
@@ -106,6 +106,16 @@ class CosimRunnerTest {
 		generator.generateVariants(src, 1)
 	}
 	
+	@Test
+	@Ignore // Because it only works on windows.
+	def void executeCosimulationTestDoubleLoop(){
+		val resultsDirPath = "results-gen/cosimTestDLoop"
+		val loader = new ModelStorage()
+		val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(new CosimRunner(new OutputProcessor(resultsDirPath), new FmuLoader)))
+		val src = loader.loadCandidates("instances/case_study_double_loop_better.xmi")
+		generator.createVariantTree(src)
+		generator.generateVariants(src, 1)
+	}
 	
 	
 }