class GridBase: def __init__(self, xml_file, xml_recipe): self.grid = Grid(xml_recipe, xml_file) self.grid.initializeGrid() self.gridBasicMeasures = ['residence_time', 'concentrations'] self.beachCondition = getBeachFromRecipe(xml_recipe) def run(self, measures, sources, vtuParser, fileTimeHandler, netcdfWriter): print('-> Measures to compute: ', measures) sourcesDict = sources['id'] for sourceID, sourceName in sourcesDict.items(): print('\t' + sourceName) dt = fileTimeHandler.dt # initialize the measures: RawCounter = RawCounts(self.grid) if 'concentrations' in measures: AreaCounter = ConcentrationArea(self.grid) VolumeCounter = ConcentrationVolume(self.grid) if 'residence_time' in measures: ResidenceCounter = ResidenceTime(self.grid, dt) VarInCellCounter = {} for measure in measures: if measure not in self.gridBasicMeasures: VarInCellCounter[measure] = VarInCell(self.grid, base_name=measure) netcdfWriter.resetTimeIdx() vtuFileList = vtuParser.fileList for vtuFile in tqdm(vtuFileList, desc='Progress', position=0, leave=True): sourceIdx = 0 vtuParser.updateReaderWithFile(vtuFile) for sourceID, sourceName in sourcesDict.items(): # get particle position particlePos = vtuParser.getVariableData( 'coords', sourceID, beachCondition=self.beachCondition) # get counts nCountsArray = self.grid.getCountsInCell(particlePos) # Update valid cells (to avoid to compute measures on empty cells) self.grid.setValidCells(nCountsArray) dataArrayDict, dataArrayName = RawCounter.run( nCountsArray, sourceName) netcdfWriter.appendVariableTimeStepToDataset( dataArrayName, dataArrayDict) if 'residence_time' in measures: dataArrayDict, dataArrayName = ResidenceCounter.run( nCountsArray, sourceName) netcdfWriter.appendVariableTimeStepToDataset( dataArrayName, dataArrayDict) if 'concentrations' in measures: dataArrayDict, dataArrayName = AreaCounter.run( nCountsArray, sourceName) netcdfWriter.appendVariableTimeStepToDataset( dataArrayName, dataArrayDict) dataArrayDict, dataArrayName = VolumeCounter.run( nCountsArray, sourceName) netcdfWriter.appendVariableTimeStepToDataset( dataArrayName, dataArrayDict) for measure in VarInCellCounter: if measure not in self.gridBasicMeasures: varInParticles = vtuParser.getVariableData( measure, sourceID, beachCondition=self.beachCondition) varInCell = self.grid.getMeanDataInCell( particlePos, varInParticles) dataArrayDict, dataArrayName = VarInCellCounter[ measure].run(varInCell, sourceName) netcdfWriter.appendVariableTimeStepToDataset( dataArrayName, dataArrayDict) sourceIdx += 1 netcdfWriter.increaseTimeIdx()