def dynamic(self):
        
        # update model time using the current pcraster timestep value
        self.modelTime.update(self.currentTimeStep())

        # reading
        data_available = True
        if data_available:
            input_value = vos.netcdf2PCRobjClone(ncFile  = self.input_netcdf['file_name'],
                                                 varName = self.input_netcdf['variable_name'],
                                                 dateInput = str(self.modelTime.fulldate),
                                                 useDoy = None,
                                                 cloneMapFileName = self.clone_map_file)
            data_available = True  
        
        else:
            print "No values are available for this date: "+str(self.modelTime)
            data_available = False 
        
        if data_available: output_value = input_value

        # upscaling
        if data_available and self.resample_factor > 1.0:
        
            # upscaling using cell area
            cell_area = pcr.ifthen(pcr.defined(output_value), self.cell_area)
            output_value_in_pcraster = \
                            vos.getValDivZero(\
                            pcr.areatotal(output_value*self.cell_area, self.unique_ids),\
                            pcr.areatotal(self.cell_area, self.unique_ids), vos.smallNumber)
            
            # resample to the output clone resolution 
            output_value = vos.regridToCoarse(pcr.pcr2numpy(output_value_in_pcraster, vos.MV),
                                              self.resample_factor, "max", vos.MV)

        # reporting
        if data_available:

            # time stamp 
            timestepPCR = self.modelTime.timeStepPCR
            timeStamp = datetime.datetime(self.modelTime.year,\
                                          self.modelTime.month,\
                                          self.modelTime.day,0)
            # write to netcdf 
            self.output.data2NetCDF(self.output_netcdf['file_name'],\
                                    self.output_netcdf['variable_name'],\
                                    output_value,\
                                    timeStamp)

        # closing the file at the end of
        if self.modelTime.isLastTimeStep(): self.output.close(self.output_netcdf['file_name'])
示例#2
0
    def dynamic(self):
        
        # re-calculate model time using current pcraster timestep value
        self.modelTime.update(self.currentTimeStep())

        # processing / calculating only at the last day of the month:
        if self.modelTime.endMonth == True:
        
            #~ # open totalWaterStorageThickness (unit: m, monthly average values) 
            #~ value_at_5min = vos.netcdf2PCRobjClone(\
                            #~ self.input_files["model_total_water_storage"],\
                            #~ "total_thickness_of_water_storage",\
                            #~ str(self.modelTime.fulldate), useDoy = "end-month")
            
            # open totalWaterStorageThickness (unit: m, monthly average values) 
            value_at_5min = vos.netcdf2PCRobjClone(\
                            self.input_files["model_total_water_storage"],\
                            self.input_files["model_total_water_storage_variable_name"],\
                            str(self.modelTime.fulldate), useDoy = "end-month")

            # upscale to one degree resolution
            value_at_1deg_but_5min_cell = \
                            vos.getValDivZero(\
                            pcr.areatotal(self.cell_area*value_at_5min,\
                                                         self.one_degree_id),\
                            pcr.areatotal(self.cell_area,self.one_degree_id),
                            vos.smallNumber)
            
            # resample from 5 arc minute cells to one degree cells
            value_at_1deg = vos.regridToCoarse(\
                            pcr.pcr2numpy(value_at_1deg_but_5min_cell,vos.MV),self.resample_factor,"max",vos.MV)
            #
            # reporting
            timestepPCR = self.modelTime.timeStepPCR
            timeStamp = datetime.datetime(self.modelTime.year,\
                                          self.modelTime.month,\
                                          self.modelTime.day,0)
            # write it to netcdf 
            self.output.data2NetCDF(self.output_files['one_degree_tws']['model'],\
                                    "pcrglobwb_tws",\
                                    value_at_1deg,\
                                    timeStamp)
                                                       useDoy = "Yes", \
                                                       cloneMapFileName  = clone_map_file,\
                                                       LatitudeLongitude = True,\
                                                       specificFillValue = None)
    fraction_of_surface_water = pcr.ifthen(
        landmask, pcr.cover(fraction_of_surface_water, 0.0))
    # - upscale it to 30 arc-min (dimensionless)
    fraction_of_surface_water_30min = pcr.areatotal(
        fraction_of_surface_water * cell_area,
        cell_ids_30min) / cell_area_30min

    # calculate surface water level at 30 arc-min resolution
    surface_water_level_30min = channel_storage_30min / (pcr.max(
        fraction_of_surface_water_30min, minimum_fraction_of_surface_water) *
                                                         cell_area_30min)

    # convert it 30 arcmin arrays
    surface_water_level_30min_arrays = vos.regridToCoarse(
        pcr.pcr2numpy(surface_water_level_30min, vos.MV), upscaling_factor,
        "max", vos.MV)

    # save it to netcdf file
    ncFileName = netcdf_file[var_name]['file_name']
    msg = "Saving to the netcdf file: " + str(
        netcdf_file[var_name]['file_name'])
    logger.info(msg)
    time_stamp_used = datetime.datetime(i_year, 12, 31, 0)
    netcdf_report.data2NetCDF(ncFileName, varDict.netcdf_short_name[var_name],
                              surface_water_level_30min_arrays,
                              time_stamp_used)
def main():

    # make output directory
    try:
        os.makedirs(output_directory)
    except:
        if cleanOutputDir == True:
            os.system('rm -r ' + output_directory + "/*")

    # change the current directory/path to output directory
    os.chdir(output_directory)

    # make temporary directory
    tmp_directory = output_directory + "/tmp"
    os.makedirs(tmp_directory)
    vos.clean_tmp_dir(tmp_directory)

    # format and initialize logger
    logger_initialize = Logger(output_directory)

    logger.info('Start processing for 5 arc-min resolution!')

    # clone and landmask for 5 arc-min resolution
    pcr.setclone(clone_map_05min_file)
    landmask = pcr.defined(clone_map_05min_file)

    # read thickness value (at 5 arc min resolution)
    logger.info('Reading the thickness at 5 arc-min resolution!')
    thickness = pcr.ifthen(landmask,\
                vos.netcdf2PCRobjCloneWithoutTime(thickness_05min_netcdf['filename'], "average_corrected", clone_map_05min_file))
    #
    # update landmask
    landmask = pcr.defined(thickness)

    # read aquifer properties at 5 arc min resolution
    logger.info(
        'Reading saturated conductivity and specific yield at 5 arc-min resolution!'
    )
    saturated_conductivity = pcr.ifthen(landmask,\
                             vos.netcdf2PCRobjCloneWithoutTime(\
                             aquifer_properties_05min_netcdf['filename'],\
                             "kSatAquifer"  , clone_map_05min_file))
    specific_yield         = pcr.ifthen(landmask,\
                             vos.netcdf2PCRobjCloneWithoutTime(\
                             aquifer_properties_05min_netcdf['filename'],\
                             "specificYield", clone_map_05min_file))

    # saving 5 min parameters to a netcdf file
    logger.info('Saving groundwater parameter parameters to a netcdf file: ' +
                output_05min_filename)
    #
    output_05min_netcdf = outputNetCDF.OutputNetCDF(clone_map_05min_file)
    #
    variable_names = ["saturated_conductivity", "specific_yield", "thickness"]
    units = ["m/day", "1", "m"]
    variable_fields = [
        pcr.pcr2numpy(saturated_conductivity, vos.MV),
        pcr.pcr2numpy(specific_yield, vos.MV),
        pcr.pcr2numpy(thickness, vos.MV),
    ]
    pcr.report(saturated_conductivity, "saturated_conductivity_05min.map")
    pcr.report(specific_yield, "specific_yield_05min.map")
    pcr.report(thickness, "thickness_05min.map")
    output_05min_netcdf.createNetCDF(output_05min_filename, variable_names,
                                     units)
    output_05min_netcdf.changeAtrribute(output_05min_filename,
                                        netcdf_attributes)
    output_05min_netcdf.data2NetCDF(output_05min_filename, variable_names,
                                    variable_fields)

    logger.info('Start processing for 30 arc-min resolution!')

    # upscaling thickness to 30 arc min resolution
    logger.info('Upscaling thickness from 5 arc-min resolution to 30 arc-min!')
    thickness_05min_array = pcr.pcr2numpy(thickness, vos.MV)
    thickness_30min_array = vos.regridToCoarse(thickness_05min_array, 30. / 5.,
                                               "average")
    #
    # set clone for 30 arc min resolution
    pcr.setclone(clone_map_30min_file)
    #
    landmask = pcr.defined(clone_map_30min_file)
    thickness = pcr.ifthen(
        landmask, pcr.numpy2pcr(pcr.Scalar, thickness_30min_array, vos.MV))
    #
    # update landmask
    landmask = pcr.defined(thickness)

    # read aquifer properties at 30 arc min resolution
    logger.info(
        'Reading saturated conductivity and specific yield at 30 arc-min resolution!'
    )
    saturated_conductivity = pcr.ifthen(landmask,\
                             vos.netcdf2PCRobjCloneWithoutTime(\
                             aquifer_properties_30min_netcdf['filename'],\
                             "kSatAquifer"  , clone_map_30min_file))
    specific_yield         = pcr.ifthen(landmask,\
                             vos.netcdf2PCRobjCloneWithoutTime(\
                             aquifer_properties_30min_netcdf['filename'],\
                             "specificYield", clone_map_30min_file))

    # saving 30 min parameters to a netcdf file
    logger.info('Saving groundwater parameter parameters to a netcdf file: ' +
                output_30min_filename)
    #
    output_30min_netcdf = outputNetCDF.OutputNetCDF(clone_map_30min_file)
    #
    variable_names = ["saturated_conductivity", "specific_yield", "thickness"]
    units = ["m/day", "1", "m"]
    variable_fields = [
        pcr.pcr2numpy(saturated_conductivity, vos.MV),
        pcr.pcr2numpy(specific_yield, vos.MV),
        pcr.pcr2numpy(thickness, vos.MV),
    ]
    pcr.report(saturated_conductivity, "saturated_conductivity_30min.map")
    pcr.report(specific_yield, "specific_yield_30min.map")
    pcr.report(thickness, "thickness_30min.map")
    output_30min_netcdf.createNetCDF(output_30min_filename, variable_names,
                                     units)
    output_30min_netcdf.changeAtrribute(output_30min_filename,
                                        netcdf_attributes)
    output_30min_netcdf.data2NetCDF(output_30min_filename, variable_names,
                                    variable_fields)
        # read extreme value map
        file_name = file_names[i_file]
        extreme_value_05min_map = pcr.readmap(file_name)
        # upscale it to 30 arcmin resolution:
        if map_type_name == "HESSEL_RESULT":
            extreme_value_30min_map_at_5min_resolution = pcr.areamaximum(
                extreme_value_05min_map, cell_ids_30min)
        else:
            extreme_value_30min_map_at_5min_resolution = pcr.areatotal(
                extreme_value_05min_map, cell_ids_30min)
        # convert it to 30 arcmin numpy array and store it in a dictionary
        extreme_value_30min_at_5min_resolution = pcr.pcr2numpy(
            extreme_value_30min_map_at_5min_resolution, vos.MV)
        resampling_factor = np.int(30. / (5.))
        extreme_value_30min[file_name] = vos.regridToCoarse(
            extreme_value_30min_at_5min_resolution, resampling_factor, "max",
            vos.MV)

# - set the clone map to 30 arcmin resolution
if with_upscaling or map_type_name == "HESSEL_RESULT":
    resampling_factor = np.int(30. / (5.))
    num_of_rows = np.round(pcr.clone().nrRows() / resampling_factor, 2)
    num_of_cols = np.round(pcr.clone().nrCols() / resampling_factor, 2)
    x_min = np.round(pcr.clone().west(), 2)
    y_max = np.round(pcr.clone().north(), 2)
    cell_length = pcr.clone().cellSize() * resampling_factor
    # set the cell length manually
    cell_length = '0.5'
    #
    # - make the map using 'mapattr' command
    cmd = 'mapattr -s -R ' + str(num_of_rows) + \
                                         None, False, None, True)
    cell_ids_30min = pcr.ifthen(pcr.scalar(cell_ids_30min) > 0.0, cell_ids_30min)
    # a dictionary that will contain 30 arcmin numpy array
    extreme_value_30min = {} 

    # upscaling to 30 arc-min:
    for i_file in range(0, len(file_names)):
        # read extreme value map
        file_name = file_names[i_file]
        extreme_value_05min_map = pcr.readmap(file_name)
        # upscale it to 30 arcmin resolution: 
        extreme_value_30min_map_at_5min_resolution = pcr.areatotal(extreme_value_05min_map, cell_ids_30min)
        # convert it to 30 arcmin numpy array and store it in a dictionary 
        extreme_value_30min_at_5min_resolution = pcr.pcr2numpy(extreme_value_30min_map_at_5min_resolution, vos.MV)
        resampling_factor = np.int(30. / (5.))
        extreme_value_30min[file_name] = vos.regridToCoarse(extreme_value_30min_at_5min_resolution, resampling_factor, "max", vos.MV)
  
    # save numpy arrays to 30 arcmin maps
    #
    # - set the clone map to 30 arcmin resolution
    num_of_rows = np.round(pcr.clone().nrRows() / resampling_factor   , 2)
    num_of_cols = np.round(pcr.clone().nrCols() / resampling_factor   , 2)
    x_min       = np.round(pcr.clone().west()                         , 2)
    y_max       = np.round(pcr.clone().north()                        , 2)
    cell_length = pcr.clone().cellSize() * resampling_factor
    # set the cell length manually
    cell_length = '0.5'
    #
    # - make the map using 'mapattr' command 
    cmd = 'mapattr -s -R ' + str(num_of_rows) + \
                    ' -C ' + str(num_of_cols) + \
        year) + "_maximum.nc"
    cmd = 'cdo timmax ' + inp_file_name + " " + out_file_name
    print(cmd)
    os.system(cmd)

    # time stamp for netcdf reporting
    timeStamp = datetime.datetime(year, 12, 31, 0)

    # read value and report it at 5 arcmin resolution
    print("Reading values at 5 arcmin resolution.")
    value_at_05_min = vos.netcdf2PCRobjCloneWithoutTime(ncFile = out_file_name, varName = variable_name, \
                                                         cloneMapFileName  = clone_map_05min_file)
    value_at_05_min = pcr.cover(value_at_05_min, 0.0)
    numpy_at_05_min = pcr.pcr2numpy(value_at_05_min, vos.MV)
    report_netcdf_05min.data2NetCDF(output_file_05min, \
                                    variable_name, \
                                    numpy_at_05_min, \
                                    timeStamp)

    # upscale it to 30 arcmin resolution and report it
    print("Upscale to 30 arcmin resolution.")
    value_at_30_min = pcr.areatotal(value_at_05_min * cell_area_05min, cell_ids_30min) /\
                      pcr.areatotal(                  cell_area_05min, cell_ids_30min)
    value_at_30_min = pcr.cover(value_at_30_min, 0.0)
    numpy_at_30_min = vos.regridToCoarse(pcr.pcr2numpy(value_at_30_min, vos.MV), \
                                         int(30./5.), "average", vos.MV)
    report_netcdf_30min.data2NetCDF(output_file_30min, \
                                    variable_name, \
                                    numpy_at_30_min, \
                                    timeStamp)
                                             LatitudeLongitude = True,\
                                             specificFillValue = None)
    channel_storage = pcr.ifthen(landmask, pcr.cover(channel_storage, 0.0))
    # - upscale it to 30 arc-min (unit: m3)
    channel_storage_30min = pcr.areatotal(channel_storage, cell_ids_30min)
    
    # read fraction_of_surface_water and upscale it to 30 arc-min (dimensionless)
    fraction_of_surface_water = vos.netcdf2PCRobjClone(input_files['file_name']['dynamicFracWat'], \
                                                       "fraction_of_surface_water", time_index_in_netcdf_file,\
                                                       useDoy = "Yes", \
                                                       cloneMapFileName  = clone_map_file,\
                                                       LatitudeLongitude = True,\
                                                       specificFillValue = None)
    fraction_of_surface_water = pcr.ifthen(landmask, pcr.cover(fraction_of_surface_water, 0.0))
    # - upscale it to 30 arc-min (dimensionless)
    fraction_of_surface_water_30min = pcr.areatotal(fraction_of_surface_water * cell_area, cell_ids_30min) / cell_area_30min
    
    # calculate surface water level at 30 arc-min resolution
    surface_water_level_30min = channel_storage_30min / (pcr.max(fraction_of_surface_water_30min, minimum_fraction_of_surface_water) * cell_area_30min)

    # convert it 30 arcmin arrays
    surface_water_level_30min_arrays = vos.regridToCoarse(pcr.pcr2numpy(surface_water_level_30min, vos.MV), upscaling_factor, "max", vos.MV)

    # save it to netcdf file
    ncFileName = netcdf_file[var_name]['file_name']
    msg = "Saving to the netcdf file: " + str(netcdf_file[var_name]['file_name'])
    logger.info(msg)
    time_stamp_used = datetime.datetime(i_year, 12, 31, 0)
    netcdf_report.data2NetCDF(ncFileName, varDict.netcdf_short_name[var_name], surface_water_level_30min_arrays, time_stamp_used)