1

I have developed a model which uses replaceable records quite extensively. The parameters are passed down to arrays of components. I tried two approaches to do this, but neither of them work in all my test environments SimulationX (SimX), OpenModelica (OM), Dymola and Wolfram SystemModeler (WSM).

Let's consider a simplified package to illustrate my problem. Depending on the chosen sumbodel, the model calculates either the sum or the product of a replaceable record's parameters. I tried two approaches for changing the record within the sub-models.

  • approach 1: redeclare sub-model record by modification (MOD)
  • approach 2: redeclare a corresponding inner record to change the outer record within the sub-model (IO)

The package contains an example with 4 models with different record/sub-model combinations for MOD and IO each.

  • Both approaches work fine in SimX
  • Dymola correctly simulates with the MOD approach, but produces errors for IO
  • OM can simulate the model, but does not produce the correct results for all scenarios
  • WSM produces warning messages concerning the records I mentioned, but simulates the correct results.

I removed the example and annotations from the shown code for readability, but the full package can be downloaded here: https://hessenbox.tu-darmstadt.de/getlink/fiEgNjMEBZpSyJWHKafmoYYS/RedeclareTestPackage.rar

package RedeclareTestPackage "redeclarationTest"
    partial record datasetPartial "NewRecord1"
        parameter Real whatever;
        parameter Integer idontcare;
    end datasetPartial;
    
record datasetA "record A"
        extends datasetPartial(
            whatever=1.0,
            idontcare=2);
    end datasetA;
    
record datasetB "record B"
        extends datasetPartial(
            whatever=2.0,
            idontcare=3);
    end datasetB;

    partial model partialSubModelType_Mod "NewModel1"
        replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        Real C;
    end partialSubModelType_Mod;
    
model subModelTypeMultiply_Mod "sub-model type Multiply"
        extends partialSubModelType_Mod;
        equation
            C=subModelDataset.whatever*subModelDataset.idontcare;
    end subModelTypeMultiply_Mod;
    
model subModelTypeAdd_Mod "sub-model type Add"
        extends partialSubModelType_Mod;
        equation
            C=subModelDataset.whatever+subModelDataset.idontcare;
    end subModelTypeAdd_Mod;
    
partial model partialSubModelType_innerOuter "NewModel1"
        outer replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        Real C;
    end partialSubModelType_innerOuter;
    
model subModelTypeMultiply_innerOuter "sub-model type Multiply"
        extends partialSubModelType_innerOuter;
        equation
            C=subModelDataset.whatever*subModelDataset.idontcare;
    end subModelTypeMultiply_innerOuter;
    
model subModelTypeAdd_innerOuter "sub-model type Add"
        extends partialSubModelType_innerOuter;
        equation
            C=subModelDataset.whatever+subModelDataset.idontcare;
    end subModelTypeAdd_innerOuter;
    
model modificationModel "NewModel1"
        replaceable parameter datasetA modelData constrainedby datasetPartial;
        replaceable subModelTypeAdd_Mod submodel[1,1] constrainedby 
partialSubModelType_Mod(each subModelDataset=modelData);
        Real test=submodel[1,1].C;
    end modificationModel;

    model innerOuterModel "NewModel1"
        inner replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
        replaceable subModelTypeAdd_innerOuter submodel[1,1] constrainedby 
partialSubModelType_innerOuter;
        Real test=submodel[1,1].C;
    end innerOuterModel;

end RedeclareTestPackage;

The error message in OM reads:

Translation Warning [RedeclareTestPackage: 39:3-39:84]: An inner declaration for outer component subModelDataset could not be found and was automatically generated.

Strangely, it is only the combination of redeclaring both the dataset and the sub-model with inner/outer which produces the message and fails to simulate correctly. Everything else works fine.

WSM produces error messages for both approaches. The MOD approach producing e.g.:

Warning: In variable or component 'MOD_ADD_1and2.submodel.subModelDataset': Duplicate modification of element =(untyped) 1.0 and each = (typed)1.0 DAE.PROP(Real, C_CONST), value: 1.0 on component whatever.

Warning: Duplicate modification of element =(untyped) 1.0 and each = (typed)1.0 DAE.PROP(Real, C_CONST), value: 1.0 on component whatever.

A WSM example for the IO approach reads:

Warning: Ignoring the modification on outer element: IO_ADD_1and2.submodel[1,1].subModelDataset .

All models simulate the correct results in WSM though. Dymola only works for the modification examples, the inner/outer redeclaration producing errors like:

Replaceable must be a subtype of constraining class. But different inner/outer qualifiers for component subModelDataset. In declaration of component subModelDataset: File: C:/.../RedeclareTestPackage/RedeclareTestPackage.mo, line 39 Original declaration of subModelDataset: File: C:/.../RedeclareTestPackage/RedeclareTestPackage.mo, line 39 Context: RedeclareTestPackage.partialSubModelType_innerOuter.subModelDataset

If someone could enlighten me, I would be very grateful. My actual model works just fine in SimX, but in my opinion one of the main reasons for Modelica is to develop vendor independent models, to be able to share them with a large community.

Best regards Julian

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
jufo
  • 121
  • 3
  • None of the code should work in any Modelica tools. There are syntactic errors (incomplete code). Please try to provide a complete example if possible. – Adrian Pop Jan 30 '20 at 10:15
  • You're totaly right, sorry. I was just trying to illustrate the general problem with code as short as possible. I updatet my question with a proper model – jufo Jan 30 '20 at 14:52
  • Okay, so at least for OM the problem is "solved". Apparently the implementation of record redeclaration is a hot topic right now (https://trac.openmodelica.org/OpenModelica/ticket/2079). As soon as i hard code the different records into the models, they do work as intended. The only issue in OM with my full-size model that remains, are arrays of record. As mentioned above, using the old-frontend did the trick. – jufo Feb 13 '20 at 17:32

0 Answers0