Exemplo n.º 1
0
 def setValue(self, valueName, valueValue):
     ''' set the variable valueName to valueValue
         @param valueName: name of variable to be set
         @type valueName: string
         @param valueValue: new value
         @type valueValue: any type castable to the type of the variable valueName
     '''
     ScalarVariableReferenceVector = FMUInterface.createfmiReferenceVector(1)
     ScalarVariableReferenceVector[0] = self.description.scalarVariables[valueName].valueReference
     if self.description.scalarVariables[valueName].type.type == 'Real':
         ScalarVariableValueVector = FMUInterface.createfmiRealVector(1)
         ScalarVariableValueVector[0] = float(valueValue)
         self.interface.fmiSetReal(ScalarVariableReferenceVector, ScalarVariableValueVector)
     elif self.description.scalarVariables[valueName].type.type in ['Integer', 'Enumeration']:
         ScalarVariableValueVector = FMUInterface.createfmiIntegerVector(1)
         ScalarVariableValueVector[0] = int(valueValue)
         self.interface.fmiSetInteger(ScalarVariableReferenceVector, ScalarVariableValueVector)
     elif self.description.scalarVariables[valueName].type.type == 'Boolean':
         ScalarVariableValueVector = FMUInterface.createfmiBooleanVector(1)
         if valueValue == "true":
             ScalarVariableValueVector[0] = fmiTrue
         else:
             ScalarVariableValueVector[0] = fmiFalse
         self.interface.fmiSetBoolean(ScalarVariableReferenceVector, ScalarVariableValueVector)
     elif self.description.scalarVariables[valueName].type.type == 'String':
         ScalarVariableValueVector = FMUInterface.createfmiStringVector(1)
         ScalarVariableValueVector[0] = unicode(valueValue)
         self.interface.fmiSetString(ScalarVariableReferenceVector, ScalarVariableValueVector)
Exemplo n.º 2
0
    def __init__(self,
                 modelName=None,
                 modelFileName=None,
                 config=None,
                 loggingOn=False):
        ''' Opens a given model and sets it up with its default values
            @param modelFileName: fully qualified file name and path of model
        '''
        def updateSettingsByFMI(description):
            '''
                Function to update the settings with the experiment settings
                in the model's FMI description
            '''
            if description is not None:
                if description.defaultStartTime is not None:
                    self.integrationSettings.startTime = float(
                        description.defaultStartTime)
                if description.defaultStopTime is not None:
                    self.integrationSettings.stopTime = float(
                        description.defaultStopTime)
                if description.defaultTolerance is not None:
                    self.integrationSettings.errorToleranceRel = float(
                        description.defaultTolerance)

        if modelFileName is None:
            self.interface = None
            self.description = FMIDescription.FMIDescription(None)
        else:
            self.interface = FMUInterface.FMUInterface(modelFileName[0], self,
                                                       loggingOn)
            self.description = self.interface.description

        # modelName will not be used, because the modelName of FMIDescription is used
        SimulatorBase.Model.__init__(self, self.description.modelName,
                                     modelFileName, config)
        self.modelType = 'FMU 1.0 Model Exchange' + ' in FMUSimulator'

        # Dummy object to get properties
        self.integrationResults = Mtsf.Results('')
        self.integrationSettings.resultFileExtension = 'mtsf'
        # Default values
        updateSettingsByFMI(self.description)
        self._availableIntegrationAlgorithms = [
            "BDF (IDA, Dassl like)", "BDF (CVode)", "Adams (CVode)",
            "Explicit Euler (fixed step size)"
        ]
        self._IntegrationAlgorithmHasFixedStepSize = [
            False, False, False, True
        ]
        self._IntegrationAlgorithmCanProvideStepSizeResults = [
            True, True, True, True
        ]
        self._IntegrationAlgorithmSupportsStateEvents = [
            True, True, True, True
        ]

        self.integrationSettings.algorithmName = self._availableIntegrationAlgorithms[
            0]
        self.simulationStopRequest = False
Exemplo n.º 3
0
 def setValue(self, valueName, valueValue):
     ''' set the variable valueName to valueValue
         @param valueName: name of variable to be set
         @type valueName: string
         @param valueValue: new value
         @type valueValue: any type castable to the type of the variable valueName
     '''
     ScalarVariableReferenceVector = FMUInterface.createfmiReferenceVector(
         1)
     ScalarVariableReferenceVector[0] = self.description.scalarVariables[
         valueName].valueReference
     if self.description.scalarVariables[valueName].type.type == 'Real':
         ScalarVariableValueVector = FMUInterface.createfmiRealVector(1)
         ScalarVariableValueVector[0] = float(valueValue)
         self.interface.fmiSetReal(ScalarVariableReferenceVector,
                                   ScalarVariableValueVector)
     elif self.description.scalarVariables[valueName].type.type in [
             'Integer', 'Enumeration'
     ]:
         ScalarVariableValueVector = FMUInterface.createfmiIntegerVector(1)
         ScalarVariableValueVector[0] = int(valueValue)
         self.interface.fmiSetInteger(ScalarVariableReferenceVector,
                                      ScalarVariableValueVector)
     elif self.description.scalarVariables[
             valueName].type.type == 'Boolean':
         ScalarVariableValueVector = FMUInterface.createfmiBooleanVector(1)
         if valueValue == "true":
             ScalarVariableValueVector[0] = fmiTrue
         else:
             ScalarVariableValueVector[0] = fmiFalse
         self.interface.fmiSetBoolean(ScalarVariableReferenceVector,
                                      ScalarVariableValueVector)
     elif self.description.scalarVariables[valueName].type.type == 'String':
         ScalarVariableValueVector = FMUInterface.createfmiStringVector(1)
         ScalarVariableValueVector[0] = unicode(valueValue)
         self.interface.fmiSetString(ScalarVariableReferenceVector,
                                     ScalarVariableValueVector)
Exemplo n.º 4
0
        def prepareResultFile():
            # Prepare result file
            fmi = self.description
            (modelDescription, modelVariables, simpleTypes, units,
             enumerations) = MtsfFmi.convertFromFmi('', fmi)
            # Phase 1 of result file generation
            settings = self.integrationSettings
            experimentSetup = pyMtsf.ExperimentSetup(
                startTime=settings.startTime,
                stopTime=settings.stopTime,
                algorithm=settings.algorithmName,
                relativeTolerance=settings.errorToleranceRel,
                author=getpass.getuser(),
                description="",
                generationDateAndTime=time.strftime("%a, %d %b %Y %H:%M:%S",
                                                    time.gmtime()),
                generationTool="PySimulator",
                machine=os.getenv('COMPUTERNAME'),
                cpuTime="")
            modelVariables.allSeries[0].initialRows = 1  # Fixed
            modelVariables.allSeries[2].initialRows = 10  # Discrete
            if settings.gridPointsMode == 'NumberOf':
                nGridPoints = settings.gridPoints
            elif settings.gridPointsMode == 'Width':
                nGridPoints = 1 + int(
                    (settings.stopTime - settings.startTime) /
                    settings.gridWidth)
            else:
                nGridPoints = 1
            modelVariables.allSeries[1].initialRows = max(
                nGridPoints,
                modelVariables.allSeries[2].initialRows)  # Continuous

            # Create result object
            mtsf = Mtsf.Results(settings.resultFileName, modelDescription,
                                modelVariables, experimentSetup, simpleTypes,
                                units, enumerations)
            if not mtsf.isAvailable:
                print("Result file " + settings.resultFileName +
                      " cannot be opened for write access.\n")
                self.integrationResults = IntegrationResults.Results()
                return False

            # Create fmi reference lists in categories
            for series in mtsf._mtsf.results.series.values():
                for category in series.category.values():
                    category.references = FMUInterface.createfmiReferenceVector(
                        category.nColumn)
                    category.iReferences = -1
                    dataType = pyMtsf.CategoryReverseMapping[category.name]
                    if dataType == 'Real':
                        category.fmiGetValues = self.interface.fmiGetReal
                    elif dataType == 'Integer':
                        category.fmiGetValues = self.interface.fmiGetInteger
                    elif dataType == 'Boolean':
                        category.fmiGetValues = self.interface.fmiGetBoolean
                    elif dataType == 'String':
                        category.fmiGetValues = self.interface.fmiGetString
            for name, variable in modelVariables.variable.items():
                if variable.aliasName is None:
                    variable.category.iReferences += 1
                    if name in fmi.scalarVariables:
                        # print variable.seriesIndex, variable.category.name, name, variable.category.iReferences, len(variable.category.references)
                        variable.category.references[
                            variable.category.
                            iReferences] = fmi.scalarVariables[
                                name].valueReference
                    else:
                        # e.g. for time variables, that do not exist in fmi-world
                        series = variable.category.series
                        series.independentVariableCategory = variable.category
                        variable.category.independentVariableColumn = variable.columnIndex
                        variable.category.references[
                            variable.category.iReferences] = 0

            for series in mtsf._mtsf.results.series.values():
                if hasattr(series, 'independentVariableCategory'):
                    category = series.independentVariableCategory
                    column = category.independentVariableColumn
                    if column > 0:
                        dummy = 0
                    else:
                        dummy = 1
                    if category.references.shape[0] > dummy:
                        category.references[column] = category.references[
                            dummy]
                    else:
                        category.references = numpy.array([])
                else:
                    series.independentVariableCategory = None
            self.integrationResults = mtsf
            return True
Exemplo n.º 5
0
    def getValue(self, name):
        ''' Returns the values of the variables given in name;
            name is either a String or a list of Strings.
        '''
        if types.TypeType(name) == types.ListType:
            n = len(name)
            nameList = True
            names = name
        else:
            n = 1
            nameList = False
            names = [name]

        iReal = []
        iInteger = []
        iBoolean = []
        iString = []
        refReal = []
        refInteger = []
        refBoolean = []
        refString = []
        for i, x in enumerate(names):
            dataType = self.description.scalarVariables[x].type.type
            if dataType == 'Real':
                refReal.append(
                    self.description.scalarVariables[x].valueReference)
                iReal.append(i)
            elif dataType == 'Integer':
                refInteger.append(
                    self.description.scalarVariables[x].valueReference)
                iInteger.append(i)
            elif dataType == 'Boolean':
                refBoolean.append(
                    self.description.scalarVariables[x].valueReference)
                iBoolean.append(i)
            elif dataType == 'String':
                refString.append(
                    self.description.scalarVariables[x].valueReference)
                iString.append(i)

        retValue = range(n)
        k = len(refReal)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refReal[i]
            values = self.interface.fmiGetReal(ref)
            for i in xrange(k):
                retValue[iReal[i]] = values[i]
        k = len(refInteger)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refInteger[i]
            values = self.interface.fmiGetInteger(ref)
            for i in xrange(k):
                retValue[iInteger[i]] = values[i]
        k = len(refBoolean)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refBoolean[i]
            values = self.interface.fmiGetBoolean(ref)
            for i in xrange(k):
                retValue[iBoolean[i]] = values[i]
        k = len(refString)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refString[i]
            values = self.interface.fmiGetString(ref)
            for i in xrange(k):
                retValue[iString[i]] = values[i]

        if nameList:
            return retValue
        else:
            return retValue[0]
Exemplo n.º 6
0
        def prepareResultFile():
            # Prepare result file
            fmi = self.description
            (modelDescription, modelVariables, simpleTypes, units, enumerations) = MtsfFmi.convertFromFmi('', fmi)
            # Phase 1 of result file generation
            settings = self.integrationSettings
            experimentSetup = pyMtsf.ExperimentSetup(startTime=settings.startTime, stopTime=settings.stopTime,
                                                     algorithm=settings.algorithmName, relativeTolerance=settings.errorToleranceRel,
                                                     author=getpass.getuser(), description="",
                                                     generationDateAndTime=time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()),
                                                     generationTool="PySimulator", machine=os.getenv('COMPUTERNAME'),
                                                     cpuTime="")
            modelVariables.allSeries[0].initialRows = 1  # Fixed
            modelVariables.allSeries[2].initialRows = 10  # Discrete
            if settings.gridPointsMode == 'NumberOf':
                nGridPoints = settings.gridPoints
            elif settings.gridPointsMode == 'Width':
                nGridPoints = 1 + int((settings.stopTime - settings.startTime) / settings.gridWidth)
            else:
                nGridPoints = 1
            modelVariables.allSeries[1].initialRows = max(nGridPoints, modelVariables.allSeries[2].initialRows)  # Continuous

            # Create result object
            mtsf = Mtsf.Results(settings.resultFileName,
                               modelDescription, modelVariables, experimentSetup, simpleTypes, units, enumerations)
            if not mtsf.isAvailable:
                print("Result file " + settings.resultFileName + " cannot be opened for write access.\n")
                self.integrationResults = IntegrationResults.Results()
                return False

            # Create fmi reference lists in categories
            for series in mtsf._mtsf.results.series.values():
                for category in series.category.values():
                    category.references = FMUInterface.createfmiReferenceVector(category.nColumn)
                    category.iReferences = -1
                    dataType = pyMtsf.CategoryReverseMapping[category.name]
                    if dataType == 'Real':
                        category.fmiGetValues = self.interface.fmiGetReal
                    elif dataType == 'Integer':
                        category.fmiGetValues = self.interface.fmiGetInteger
                    elif dataType == 'Boolean':
                        category.fmiGetValues = self.interface.fmiGetBoolean
                    elif dataType == 'String':
                        category.fmiGetValues = self.interface.fmiGetString
            for name, variable in modelVariables.variable.items():
                if variable.aliasName is None:
                    variable.category.iReferences += 1
                    if name in fmi.scalarVariables:
                        # print variable.seriesIndex, variable.category.name, name, variable.category.iReferences, len(variable.category.references)
                        variable.category.references[variable.category.iReferences] = fmi.scalarVariables[name].valueReference
                    else:
                        # e.g. for time variables, that do not exist in fmi-world
                        series = variable.category.series
                        series.independentVariableCategory = variable.category
                        variable.category.independentVariableColumn = variable.columnIndex
                        variable.category.references[variable.category.iReferences] = 0

            for series in mtsf._mtsf.results.series.values():
                if hasattr(series, 'independentVariableCategory'):
                    category = series.independentVariableCategory
                    column = category.independentVariableColumn
                    if column > 0:
                        dummy = 0
                    else:
                        dummy = 1
                    if category.references.shape[0] > dummy:
                        category.references[column] = category.references[dummy]
                    else:
                        category.references = numpy.array([])
                else:
                    series.independentVariableCategory = None
            self.integrationResults = mtsf
            return True
Exemplo n.º 7
0
    def getValue(self, name):
        ''' Returns the values of the variables given in name;
            name is either a String or a list of Strings.
        '''
        if types.TypeType(name) == types.ListType:
            n = len(name)
            nameList = True
            names = name
        else:
            n = 1
            nameList = False
            names = [name]

        iReal = []
        iInteger = []
        iBoolean = []
        iString = []
        refReal = []
        refInteger = []
        refBoolean = []
        refString = []
        for i, x in enumerate(names):
            dataType = self.description.scalarVariables[x].type.type
            if dataType == 'Real':
                refReal.append(self.description.scalarVariables[x].valueReference)
                iReal.append(i)
            elif dataType == 'Integer':
                refInteger.append(self.description.scalarVariables[x].valueReference)
                iInteger.append(i)
            elif dataType == 'Boolean':
                refBoolean.append(self.description.scalarVariables[x].valueReference)
                iBoolean.append(i)
            elif dataType == 'String':
                refString.append(self.description.scalarVariables[x].valueReference)
                iString.append(i)

        retValue = range(n)
        k = len(refReal)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refReal[i]
            values = self.interface.fmiGetReal(ref)
            for i in xrange(k):
                retValue[iReal[i]] = values[i]
        k = len(refInteger)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refInteger[i]
            values = self.interface.fmiGetInteger(ref)
            for i in xrange(k):
                retValue[iInteger[i]] = values[i]
        k = len(refBoolean)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refBoolean[i]
            values = self.interface.fmiGetBoolean(ref)
            for i in xrange(k):
                retValue[iBoolean[i]] = values[i]
        k = len(refString)
        if k > 0:
            ref = FMUInterface.createfmiReferenceVector(k)
            for i in xrange(k):
                ref[i] = refString[i]
            values = self.interface.fmiGetString(ref)
            for i in xrange(k):
                retValue[iString[i]] = values[i]

        if nameList:
            return retValue
        else:
            return retValue[0]