Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
204 changes: 204 additions & 0 deletions pytrnsys/rsim/runParallelTrnsys.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import sys
import pkg_resources
import pytrnsys.utils.log as log
import random

try:
import pytrnsys_examples
Expand Down Expand Up @@ -126,6 +127,7 @@ def defaultInputs(self):
self.overwriteForcedByUser = False

self.variablesOutput = []
self.randVariablesOutput = []

def readFromFolder(self, pathRun):

Expand Down Expand Up @@ -236,11 +238,137 @@ def runConfig(self):

if self.foldersForDDckVariationUsed == True:
self.path = originalPath # recall the original path, otherwise the next folder will be cerated inside the first
elif self.changeRandomDDckFilesUsed == True:
# choosing randomly nrandvar ddcks specified in randvarddck, to each of which then random parameters are assigned.
# currently only one ddck can be randomly varied, also scaling is not yet implemented for the random variations
nameBase = self.nameBase

random.seed(a=self.randseed)
self.sinkRandDdck = random.choices(self.randSinkFilesToChange[0],k=int(self.nrandvar))
self.randseed+=1

originalSourceFile = self.randSourceFilesToChange[0]
sourceFile = self.randSourceFilesToChange[0]
for i in range(int(self.nrandvar)):
sinkFile = self.sinkRandDdck[i]
self.changeDDckFile(sourceFile, sinkFile)

sourceFile = sinkFile # for each case the listddck will be changed to the new one, so we need to compare with the updated string

self.nameBase = nameBase + "-" + os.path.split(sinkFile)[-1]

self.buildTrnsysDeck()
self.createDecksFromRandomVariant()


else:
self.buildTrnsysDeck()
self.createDecksFromVariant()

def createDecksFromRandomVariant(self):

parameters = self.parameters

randomVariation = []

for variation in self.randVariablesOutput:
random.seed(a=self.randseed)
randomVariation.append(variation[0:2] + [round(random.choice(variation[2:]),5)])
self.randseed+=1

myDeckGenerator = createDeck.CreateTrnsysDeck(self.path, self.nameBase, randomVariation)

successfulCases = []

if "masterFile" in self.inputs:
if os.path.isfile(self.inputs["masterFile"]):
try:
masterDf = pd.read_csv(self.inputs["masterFile"], sep=";", index_col=0)
except:
self.logger.error("Unable to read " + self.inputs["masterFile"])
self.logger.error("Variation dck files of %s won't be created" % self.nameBase)
return

self.logger.info("Checking for successful runs in " + self.inputs["masterFile"])
for index, row in masterDf.iterrows():
if row["outcome"] == "success":
successfulCases.append(index)
else:
self.logger.info("Master file does not exist, no runs will be excluded")

# creates a list of decks with the appripiate name but nothing changed inside!!
if self.randvarUsed or self.changeRandomDDckFilesUsed == True:
if successfulCases:
fileName = myDeckGenerator.generateDecks(successfulCases=successfulCases)
else:
fileName = myDeckGenerator.generateDecks()
else:
fileName = []
fileName.append(self.nameBase)

if myDeckGenerator.noVariationCreated and self.variation:
self.logger.warning("No variation dck files created from " + self.nameBase)
return

tests = []
cmds = []

variablePath = self.path

for i in range(len(fileName)):

self.logger.debug("name to run :%s" % fileName[i])

# if useLocationStructure:
# variablePath = os.path.join(path,location) #assign subfolder for path

# # Parameters changed by variation
localCopyPar = dict.copy(parameters) #

if self.variationsUsed:
myParameters = myDeckGenerator.getParameters(i)
localCopyPar.update(myParameters)

if self.randvarUsed:
myParameters = myDeckGenerator.getParameters(i)
localCopyPar.update(myParameters)

# # We add to the global parameters that also need to be modified
# If we assign like localCopyPar = parameters, then the parameters will change with localCopyPar !!
# Otherwise we change the global parameter and some values of last variation will remain.
# newPath = path + fileName[i]
# newFileDck = newPath+"\\"+fileName[i]+".dck"
# print "path:%s fileName:%s newPath:%s newFileDeck:%s"%(path,fileName[i],newPath,newFileDck)

tests.append(exeTrnsys.ExecuteTrnsys(variablePath, fileName[i]))

tests[i].setTrnsysExePath(self.inputs["trnsysExePath"])

tests[i].setRemovePopUpWindow(self.inputs["removePopUpWindow"])

# tests[i].setTrnsysVersion("TRNSYS17_EXE")

tests[i].moveFileFromSource()

tests[i].loadDeck(useDeckOutputPath=True)

tests[i].changeParameter(localCopyPar)

if self.inputs["ignoreOnlinePlotter"] == True:
tests[i].ignoreOnlinePlotter()

# ==============================================================================
# RESIZE PARAMETERS PIPE DIAMETER
# ==============================================================================
# tests[i].resizeParameters()
tests[i].cleanAndCreateResultsTempFolder()
tests[i].moveFileFromSource()

if self.inputs["runCases"] == True:
test = os.path.split(tests[i].nameDck)[-1]
self.cmds.append(tests[i].getExecuteTrnsys(self.inputs))


def createDecksFromVariant(self, fitParameters={}):

variations = self.variablesOutput
Expand Down Expand Up @@ -440,7 +568,31 @@ def addParametricVariations(self, variations):

self.variablesOutput = variations

def addRandomParametricVariations(self, variations):
"""
it fills a variableOutput with a list of all variations to choose from

Parameters
----------
variations : list of list
list object containing the variations to be used.

Returns
-------

"""

# self.randVariablesOutput=[]
for n in range(len(variations)):
variation_range = num.arange(variations[n][2],variations[n][3]+variations[n][4],variations[n][4])
variation_base = [variations[n][0],variations[n][1]]
variation = variation_base + list(variation_range)

self.randVariablesOutput.append(variation)

def runParallel(self, writeLogFile=True):

self.cmds = list(dict.fromkeys(self.cmds)) # convert to dictionary and back in order to delete any duplicates
if writeLogFile:
self.writeRunLogFile()

Expand Down Expand Up @@ -577,6 +729,8 @@ def getConfig(self):
# The vector self.inputs used in python has been filled. Now other variables for Trnsys will be filled

self.variation = [] # parametric studies
self.randvar = [] # random variations of parameters
self.nrandvar = 100 # number of random variations to be executed
self.parDeck = [] # fixed values changed in all simulations
self.listDdck = []
self.parameters = {} # deck parameters fixed for all simulations
Expand All @@ -587,6 +741,9 @@ def getConfig(self):
self.caseDict = {}
self.sourceFilesToChange = []
self.sinkFilesToChange = []
self.randSourceFilesToChange = []
self.randSinkFilesToChange = []
self.randseed = random.randrange(sys.maxsize) # default random value
self.foldersForDDckVariation = []
self.replaceLines = []

Expand All @@ -609,6 +766,32 @@ def getConfig(self):

self.variation.append(variation)

elif splitLine[0] == "randvar":
randvar = []
for i in range(len(splitLine)):
if i == 0:
pass
elif i <= 2:
randvar.append(splitLine[i])
else:
try:
randvar.append(float(splitLine[i]))
except:
randvar.append(splitLine[i])

self.randvar.append(randvar)

elif splitLine[0] == "nrandvar":
nrandvar = splitLine[1]
self.nrandvar = nrandvar

elif splitLine[0] == "randseed":
if splitLine[1] == 'None':
self.randseed = random.randrange(sys.maxsize)
else:
randseed = int(splitLine[1])
self.randseed = randseed

elif splitLine[0] == "deck":

if splitLine[2] == "string":
Expand Down Expand Up @@ -638,6 +821,16 @@ def getConfig(self):
sinkFilesToChange.append(splitLine[i])
self.sinkFilesToChange.append(sinkFilesToChange)

elif splitLine[0] == "randvarddck":
self.randSourceFilesToChange.append(splitLine[1])
sinkFilesToChange = []
for i in range(len(splitLine)):
if i < 2:
pass
else:
sinkFilesToChange.append(splitLine[i])
self.randSinkFilesToChange.append(sinkFilesToChange)

elif splitLine[0] == "addDDckFolder":
for i in range(len(splitLine)):
if i > 0:
Expand Down Expand Up @@ -674,11 +867,22 @@ def getConfig(self):
else:
self.variationsUsed = False

if len(self.randvar) > 0:
self.addRandomParametricVariations(self.randvar)
self.randvarUsed = True
else:
self.randvarUsed = False

if len(self.sourceFilesToChange) > 0:
self.changeDDckFilesUsed = True
else:
self.changeDDckFilesUsed = False

if len(self.randSourceFilesToChange) > 0:
self.changeRandomDDckFilesUsed = True
else:
self.changeRandomDDckFilesUsed = False

if len(self.foldersForDDckVariation) > 0:
self.foldersForDDckVariationUsed = True
else:
Expand Down
3 changes: 2 additions & 1 deletion pytrnsys/trnsys_util/createTrnsysDeck.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,8 @@ def generateDecks(self, successfulCases=None):
self.noVariationCreated = False
logger.info("Parametric variation generated with the following values" + str(parameterDict))
if not self.deckOutputs:
self.deckOutputs.append(self.case)
# self.deckOutputs.append(self.case) # This line is commented, because it is unclear why it is here...
pass

return self.deckOutputs

Expand Down