Esempio n. 1
0
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()