]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
Change modelica code generation for stocks to correctly define initial values when...
authorjkauttio <jkauttio@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Tue, 17 Jun 2014 11:34:16 +0000 (11:34 +0000)
committerjkauttio <jkauttio@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Tue, 17 Jun 2014 11:34:16 +0000 (11:34 +0000)
fixes #4932

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

org.simantics.sysdyn/src/org/simantics/sysdyn/modelica/ModelicaWriter.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/IndependentVariable.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Stock.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/StockExpression.java

index e242149048b48a726f9665e68760a271938cc704..f2c0a1b7d54bddc6134c1f3ad3c25220f720896e 100644 (file)
@@ -265,7 +265,9 @@ public class ModelicaWriter {
                b.append("// Variable definitions\n");\r
                for(IndependentVariable variable : variables) {\r
                        app = variable.getDeclaration();\r
-                       if (app != null) b.append(app);\r
+                       if (app != null) {\r
+                               b.append(app);\r
+                       }\r
                }\r
 \r
                if(defTime) {\r
index 3c0decd671c6a0bebd4f97173b9f4725f95ca129..4245299868fa06e1e7220840d54ed79ae9a5d0a4 100644 (file)
@@ -72,7 +72,7 @@ public abstract class IndependentVariable extends Variable {
                     sb.append(addition);\r
             }\r
         }\r
-\r
+        \r
         return sb.toString();\r
     }\r
 \r
@@ -113,6 +113,7 @@ public abstract class IndependentVariable extends Variable {
             if(initialEquation != null)\r
                 sb.append(initialEquation);\r
         }\r
+        \r
         String result = sb.toString();\r
         return result.length() > 0 ? result : null;\r
     }\r
@@ -122,8 +123,7 @@ public abstract class IndependentVariable extends Variable {
      * @return Equation or null\r
      */\r
     public String getEquation() {\r
-        Variability variability =  Variability.getVariability(this);\r
-        if(variability == Variability.CONTINUOUS) {\r
+        if(Variability.getVariability(this) == Variability.CONTINUOUS) {\r
             return getVariableEquation();\r
         } else {\r
             return null;\r
index 54c1d29d471e467e0620c76a85f14bda94f15415..e706bc2252ae4b92af31ae1e070c5a1329369174 100644 (file)
@@ -56,13 +56,13 @@ public class Stock extends IndependentVariable {
     \r
     @Override\r
     public String getDeclaration() {\r
-\r
-        String each = "";\r
+       // is it really guaranteed that variability is the only necessary \r
+       // parameter to consider when deciding whether to use start=value \r
+       // notation or initial equations?\r
+        String each = (getArrayIndexes() != null && !getArrayIndexes().isEmpty()) ? "each " : "";\r
         // each is required when a single value is used for all dimensions e.g. Stock[30](each start = 0)  \r
         if (Variability.getVariability(this) == Variability.CONTINUOUS) {\r
             // start parameter is not used, everything needs to be fixed=false\r
-            if(getArrayIndexes() != null && !getArrayIndexes().isEmpty())\r
-                each = "each ";\r
             return "    " + getType() + " " + getModelicaName() + getRange() + "(" + each + "fixed=false);\n";\r
         } else {\r
             // Start parameter is used. Parameter guarantees that there is only one expression.\r
@@ -70,17 +70,12 @@ public class Stock extends IndependentVariable {
             String initialEquation = e.getModelicaExpression();\r
             initialEquation = SheetFormatUtils.reformatSheetReferences(this, initialEquation);\r
 \r
-            if(getArrayIndexes() != null && !getArrayIndexes().isEmpty())\r
-                each = "each ";\r
-\r
-            // TODO: there is probably a bug with startvalue here\r
             return "    " + \r
             getType() + \r
             " " + \r
             getModelicaName() + \r
             getRange() + \r
             "(" + \r
-            (e.getStartValue() != null ? each : "") + \r
             "start=" + \r
             initialEquation + \r
             ", " + \r
index a6efc5e251bdd1fda9e8547798ee98e28bf4fa57..3fb5f59fd6edfdca3c331090d5c2d44f817fdc31 100644 (file)
  *******************************************************************************/\r
 package org.simantics.sysdyn.representation.expressions;\r
 \r
-import java.io.StringReader;\r
 import java.util.ArrayList;\r
-import java.util.Set;\r
 \r
 import org.simantics.db.ReadGraph;\r
 import org.simantics.objmap.annotations.GraphType;\r
 import org.simantics.objmap.annotations.RelatedValue;\r
 import org.simantics.sysdyn.SysdynResource;\r
-import org.simantics.sysdyn.expressionParser.ExpressionParser;\r
-import org.simantics.sysdyn.expressionParser.ParseException;\r
 import org.simantics.sysdyn.manager.SysdynModel;\r
-import org.simantics.sysdyn.representation.Book;\r
 import org.simantics.sysdyn.representation.Enumeration;\r
-import org.simantics.sysdyn.representation.IElement;\r
-import org.simantics.sysdyn.representation.Sheet;\r
 import org.simantics.sysdyn.representation.Stock;\r
 import org.simantics.sysdyn.representation.Valve;\r
 import org.simantics.sysdyn.representation.utils.FormatUtils;\r
@@ -112,69 +105,13 @@ public class StockExpression extends Expression {
         }\r
            return b.toString();\r
     }\r
-    \r
-    /** \r
-     * Check whether to use fixed=true and start=... in Modelica code\r
-     * @return\r
-     */\r
-    private boolean useStartValue() {\r
-        // If no variables are used in the equation, start value is used\r
-        \r
-        // First the equation is formatted and parsed\r
-        String equation = FormatUtils.formatExpressionForModelica(parent, initialEquation);\r
-        ExpressionParser parser = new ExpressionParser(new StringReader(equation));\r
-        try {\r
-            parser.expr();\r
-            if(parser.getReferences().isEmpty()) {\r
-                // if equation did not contain any references, start value is used\r
-                return true;\r
-            } else {\r
-                // Check if references are references to sheets. \r
-                // Sheet references are allowed, since sheets contain only constants\r
-                boolean found = false;\r
-                Set<String> references = parser.getReferences().keySet();\r
-                \r
-                // Go through each reference\r
-                for(String reference : references) {\r
-                    // We only need the first element to know that it is a Sheet (SheetName.CellOrRange)\r
-                    reference = reference.split("\\.")[0]; \r
-                    found = false;\r
-                    for(IElement element : parent.getParentConfiguration().getElements()) {\r
-                        if(element instanceof Book) {\r
-                            for(Sheet sheet : ((Book)element).getSheets()) {\r
-                                if(reference.equals(sheet.getName())) {\r
-                                    found = true;\r
-                                    break;\r
-                                }\r
-                            }\r
-                        }\r
-                        if(found)\r
-                            break;\r
-                    }\r
-                    \r
-                    // If there was no sheet for this reference name, return false\r
-                    if(!found)\r
-                        return false;\r
-                }\r
-            }\r
-        } catch (ParseException e) {\r
-               e.printStackTrace();\r
-        }\r
-        return true;\r
-    }\r
-\r
     @Override\r
     public String getInitialEquation() {\r
        String initialEquation = FormatUtils.replaceWhitespace(this.initialEquation);\r
-        // if start value is used, no initial equation is returned\r
-        if(useStartValue())\r
-            return null;\r
         // format the initial equation for modelica execution \r
         String equation = FormatUtils.formatExpressionForModelica(parent, initialEquation, false);\r
        String range = IndexUtils.rangeToIndexes(parent, this.getArrayRange());\r
-       if(range == null)\r
-               range = "";\r
-       return "    " + parent.getModelicaName() + range + " = " + equation + ";\n";\r
+       return "    " + parent.getModelicaName() + (range != null ? range : "") + " = " + equation + ";\n";\r
     }\r
     \r
     \r