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.fmiSetReal(ScalarVariableReferenceVector, ScalarVariableValueVector) elif self.description.scalarVariables[valueName].type.type in ['Integer', 'Enumeration']: ScalarVariableValueVector = FMUInterface.createfmiIntegerVector(1) ScalarVariableValueVector[0] = int(valueValue) self.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.fmiSetBoolean(ScalarVariableReferenceVector, ScalarVariableValueVector) elif self.description.scalarVariables[valueName].type.type == 'String': ScalarVariableValueVector = FMUInterface.createfmiStringVector(1) ScalarVariableValueVector[0] = str(valueValue) self.fmiSetString(ScalarVariableReferenceVector, ScalarVariableValueVector)
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 Plugins.Simulator.SimulatorBase.Model.__init__( self, self.description.modelName, modelFileName, 'FMU1.0', config) # 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
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 = Plugins.SimulationResult.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
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]
def getValue(self, name): ''' Returns the values of the variables given in name; name is either a String or a list of Strings. ''' if type(name) == list: 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) #TODO: hier werden Werte für bestimmte Variablen abgerufen. retValue = list(range(n)) k = len(refReal) if k > 0: ref = FMUInterface.createfmiReferenceVector(k) for i in range(k): ref[i] = refReal[i] values = self.fmiGetReal(ref) for i in range(k): retValue[iReal[i]] = values[i] k = len(refInteger) if k > 0: ref = FMUInterface.createfmiReferenceVector(k) for i in range(k): ref[i] = refInteger[i] values = self.fmiGetInteger(ref) for i in range(k): retValue[iInteger[i]] = values[i] k = len(refBoolean) if k > 0: ref = FMUInterface.createfmiReferenceVector(k) for i in range(k): ref[i] = refBoolean[i] values = self.fmiGetBoolean(ref) for i in range(k): retValue[iBoolean[i]] = values[i] k = len(refString) if k > 0: ref = FMUInterface.createfmiReferenceVector(k) for i in range(k): ref[i] = refString[i] values = self.fmiGetString(ref) for i in range(k): retValue[iString[i]] = values[i] if nameList: return retValue else: return retValue[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 = Plugins.SimulationResult.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