]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
Add an epsilon to simulation result filtering
authorjkauttio <jkauttio@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Fri, 24 Apr 2015 10:35:30 +0000 (10:35 +0000)
committerjkauttio <jkauttio@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Fri, 24 Apr 2015 10:35:30 +0000 (10:35 +0000)
fixes #5785

git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@31206 ac1ea38d-2e2b-0410-8846-a27921b304fc

org.simantics.modelica/src/org/simantics/modelica/data/DataSet.java

index ff5b332bb476766f4fe935408fd367daea7fbd3c..86ff325d092e932aeda027bf9fbc5a4bc2b1f49a 100644 (file)
@@ -39,7 +39,7 @@ public class DataSet {
      * @param timeStep\r
      */\r
     public void filter(double startTime, double stopTime, double timeStep) {\r
-       // TODO: this makes implicit assumptions about the values, probably not kosher\r
+       // construct a new time array with the "expected" time steps\r
        int size = (int)Math.round((stopTime - startTime) / timeStep) + 1;\r
        if (times.length < size) {\r
                // if the original data has less time steps than requested, there is no need\r
@@ -51,16 +51,21 @@ public class DataSet {
        double[] newTimes = new double[size];\r
        double[] newValues = new double[size];\r
        \r
-       // simply skip all simulation steps that are not at the expected intervals\r
+       // generate a new value array from the original value array by walking\r
+       // through it and including only time steps that occur at the expected\r
+       // intervals (with an appropriate epsilon which is based on the \r
+       // simulation step)\r
+       double epsilon = timeStep / 1000;\r
        int old = 0;\r
        for (int i = 0; i < size; i++) {\r
                newTimes[i] = startTime + i * timeStep;\r
-               while (times[old] < newTimes[i] && old != times.length - 1) {\r
+               while (times[old] < newTimes[i] - epsilon && old != times.length - 1) {\r
                        old++;\r
                }\r
                newValues[i] = values[old];\r
        }\r
        \r
+       // replace the original arrays with the new ones\r
        times = newTimes;\r
        values = newValues;\r
     }\r