Пример #1
0
def nt(model_name, dat, let):
    """
    Read the number of time steps (used in observation file)
    """

    # Define path and file
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    input_file = rm.make_file_dir_names(model_name)[2]

    # Read records (number lines in time step input)
    num_time_records = rm.read_records_input(output_path + '/' + input_file,
                                             '# time periods')

    # Read hashtag input
    lines = rm.read_hashtag_input(output_path + '/' + input_file,
                                  '# time periods', num_time_records)

    # Split hashtag input by white space
    split_lines = str.split(lines)

    # Read entry 3/4 in each line
    right_entries = split_lines[2::4]

    # Sum of the entries
    # -> Adding one accounts for the first time step at time = 0
    nt = sum([int(right_entries[i]) for i in range(len(right_entries))]) + 1

    return nt
Пример #2
0
def obstimes(model_name, dat, let):
    """
    Read the observation times from the observations file.

    Remark
    ----------
        nskip is the number of observations per observation time.
        This method only works, when this number is constant over
        all observation times.
    """

    # Define path and file
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    observations_file = rm.make_file_dir_names(model_name)[13]

    # Read number of observations per observation time
    nskip = np.loadtxt(output_path + '/' + observations_file,
                       skiprows=1,
                       usecols=[2])[0]

    # Read time data from observations file
    obstimes = np.loadtxt(output_path + '/' + observations_file,
                          skiprows=1,
                          usecols=[1])[::nskip + 1]

    # Take only the first nrobs_int entries
    obstimes = obstimes[:nrobs_int(model_name, dat, let)]

    return obstimes
Пример #3
0
def units(model_name, dat, let, uindex, pindex):
    """
    Read parameters pindex from unit uindex
    pindex:
    1 - Porosity
    4 - Permeability
    8 - Thermal conductivity
    10 - Volumetric heat capacity
    """

    # Define path and file
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    input_file = rm.make_file_dir_names(model_name)[2]

    # Read hashtag input
    lines = rm.read_hashtag_input(output_path + '/' + input_file, '# units',
                                  uindex)

    # Split hashtag input by white space
    split_lines = str.split(lines)

    # Find the number of parameters per line
    num_ps = len(split_lines) / uindex
    # Calculate the index of the right parameter
    right_index = (uindex - 1) * num_ps + pindex

    right_entry = split_lines[right_index]

    return right_entry
Пример #4
0
def delz(model_name, dat, let):
    """
    Read model name, output date and letter and
    return the corresponding array of cell lengths
    in z-direction.
    """
    output_dir = rm.make_output_dirs(model_name, dat, let)[0]
    input_file = rm.make_file_dir_names(model_name)[2]

    arr_filename = pm.py_output_filename('specs', 'delz',
                                         specl(model_name, dat, let), 'npy')

    if rm.check_hashtag(output_dir, input_file, "# delz"):
        line = rm.read_hashtag_input(output_dir + '/' + input_file, '# delz',
                                     1)
    else:
        input_file = rm.make_file_dir_names(model_name)[4]
        if rm.check_hashtag(output_dir, input_file, "# delz"):
            line = rm.read_hashtag_input(output_dir + '/' + input_file,
                                         '# delz', 1)
        else:
            if os.path.isfile(arr_filename):
                return np.load(arr_filename)
            else:
                raise IOError('Input files, hashtags or' +
                              ' npy file not found:\n\n' + output_dir +
                              '\n\n' + input_file + '\n\n' + arr_filename)

    num_entries = len(str.split(line))
    nums = [
        int(str.split(entry, "*")[0]) if len(str.split(entry, "*")) > 1 else 1
        for entry in str.split(line)
    ]
    lens = [
        float(str.split(entry, "*")[1])
        if len(str.split(entry, "*")) > 1 else float(str.split(entry, "*")[0])
        for entry in str.split(line)
    ]

    vec = [[lens[i] for j in range(nums[i])] for i in range(num_entries)]

    arr = np.array([num for elem in vec for num in elem])

    np.save(arr_filename, arr)

    return arr
Пример #5
0
def num_mons(model_name, dat, let):
    """
    Number of monitoring points for model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    true_input_file = rm.make_file_dir_names(model_name)[4]

    num_mons = rm.read_records_input(output_path + '/' + true_input_file,
                                     '# monitor,')

    return num_mons
Пример #6
0
def num_pres_vel(model_name, dat, let):
    """
    Number of velocity components for model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    enkf_input_file = rm.make_file_dir_names(model_name)[3]

    num_pres_vel = rm.read_records_input(output_path + '/' + enkf_input_file,
                                         '# prescribed velocity')

    return num_pres_vel
Пример #7
0
def nrobs_int(model_name, dat, let):
    """
    Number of observation intervals for model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    enkf_input_file = rm.make_file_dir_names(model_name)[3]

    line = rm.read_hashtag_input(output_path + '/' + enkf_input_file,
                                 '# nrobs_int', 1)
    first_entry = str.split(line)[0]
    nrobs_int = int(first_entry)
    return nrobs_int
Пример #8
0
def nrens(model_name, dat, let):
    """
    Number of ensemble members for model_name
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    input_file = rm.make_file_dir_names(model_name)[2]

    line = rm.read_hashtag_input(output_path + '/' + input_file, '# simulate',
                                 1)
    first_entry = str.split(line)[0]
    nrens = int(first_entry)

    return nrens
Пример #9
0
def num_single_cell(model_name, dat, let):
    """
    Number of single cell observation points for model_name.

    Remark: We use the comma in the hashtag-search in order to exclude
    '# single cell output times' from the read_records_input search.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    enkf_input_file = rm.make_file_dir_names(model_name)[3]

    num_single_cell = rm.read_records_input(
        output_path + '/' + enkf_input_file, '# single cell output,')

    return num_single_cell
Пример #10
0
def monitor_locs(model_name, dat, let):
    """
    Monitor point locations of model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    true_input_file = rm.make_file_dir_names(model_name)[4]
    n_mons = num_mons(model_name, dat, let)

    lines = rm.read_hashtag_input(output_path + '/' + true_input_file,
                                  '# monitor', n_mons)
    locs = [[int(str.split(lines)[j]) for j in range(i, i + 3)]
            for i in range(0, 4 * n_mons, 4)]

    return locs
Пример #11
0
def ns(model_name, dat, let):
    """
    First observation time for model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    obs_file = rm.make_file_dir_names(model_name)[13]

    file_input = open(output_path + '/' + obs_file, 'r')
    file_input.readline()
    ns = int(str.split(file_input.readline())[0])

    # Python starts at 0
    ns = ns - 1

    return ns
Пример #12
0
def single_cell_locs(model_name, dat, let):
    """
    Single cell locations of model_name, dat and lets
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    enkf_input_file = rm.make_file_dir_names(model_name)[3]
    n_sc = num_single_cell(model_name, dat, let)

    lines = rm.read_hashtag_input(output_path + '/' + enkf_input_file,
                                  '# single cell output, ', n_sc)

    locs = [[int(str.split(lines)[j]) for j in range(i, i + 3)]
            for i in range(0, 5 * n_sc, 5)]

    return locs
Пример #13
0
def single_cell_variables(model_name, dat, let):
    """
    Single cell variable of model_name.

     1: head,  2:temp,  3:conc,  4:kz,  5:lz,  6:por  (inside mem)
    11: head, 12:temp, 13:conc, 14:kz, 15:lz, 16:por  (not inside mem)
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    enkf_input_file = rm.make_file_dir_names(model_name)[3]
    n_sc = num_single_cell(model_name, dat, let)

    lines = rm.read_hashtag_input(output_path + '/' + enkf_input_file,
                                  '# single cell output, ', n_sc)
    variables = [int(str.split(lines)[i]) for i in range(3, 5 * n_sc, 5)]

    return variables
Пример #14
0
def nm(model_name, dat, let):
    """
    Difference of observation times for model_name.
    """
    output_path = rm.make_output_dirs(model_name, dat, let)[0]
    obs_file = rm.make_file_dir_names(model_name)[13]

    n_mons = num_mons(model_name, dat, let)

    file_input = open(output_path + '/' + obs_file, 'r')
    file_input.readline()
    ns1 = int(str.split(file_input.readline())[0])
    for i in range(n_mons):
        file_input.readline()
    ns2 = int(str.split(file_input.readline())[0])
    nm = ns2 - ns1

    return nm
Пример #15
0
def read(
    model_name,
    dat,
    let,
    varname='kz_mean',
    befaft='aft',
    fdir=None,
    fname=None,
    nt=10,
):
    """
    Reading variable arrays from SHEMAT-Suite.

    Parameters
    ----------
    model_name : string
        String of model name.

    dat : string
        String with date of model run.

    let : string
        String of letter of model run.

    varname : string
        Variable name for array to be read.
        Possibilities: 'kz_mean' 'kz_std','head_mean','lz_mean', 'temp_mean'

    befaft : string
        Specifies whether the output is read in from
        before ('bef') or after ('aft') the EnKF update.

    nt : integer
        Number inside file name.

    fdir : string
        Full directory of vtk file.

    fname : string
        Full name of vtk file.

    Returns
    -------
    numpy_array : array
        Array containing the variable array

    numpy_array_name : string
        Containing proposed saving location for Array.
    """

    # Automatic file name generation
    if (not fdir and not fname):
        # enkf_output_dir
        fdir = rm.make_output_dirs(model_name, dat, let)[2]
        if befaft == 'aft':
            # assim_out_file_aft
            fname = rm.make_file_dir_names(model_name, nt)[19]
        elif befaft == 'bef':
            # assim_out_file_bef
            fname = rm.make_file_dir_names(model_name, nt)[18]

    # Get vtk_reader ##########################################################
    vtk_reader = pf.my_vtk(fdir, fname, varname)

    # Debug ###################################################################
    print(varname,
          vtk_reader.GetOutput().GetCellData().GetArray(0).GetValueRange())

    # Numpy Array  ############################################################
    numpy_array = pf.my_vtk_to_numpy(vtk_reader)

    # Numpy Array Name ########################################################
    numpy_array_name = pm.py_output_filename(
        aa.tag, varname + '_' + str(nt).zfill(4) + '_' + befaft,
        sc.specl(model_name, dat, let), "npy")

    return numpy_array, numpy_array_name
Пример #16
0
def read(
        model_name,
        dat,
        let,
        fdir=None,
        fname=None,
        varname='uindex',
        nt=0,
):
    """
    Reading variable array from SHEMAT-Suite vtk-file.

    Parameters
    ----------
    model_name : string
        String of model name.

    dat : string
        String with date of model run.

    let : string
        String of letter of model run.

    varname : string
        Variable name for array to be read.
        Possibilities: 'uindex' 'head','temp','kz', 'v'

    nt : string
        Number of time step output.

    Returns
    -------
    numpy_array : array
        Array containing the variable array

    numpy_array_name : string
        Containing proposed saving location for Array.
    """

    # Dirs
    if fdir is None:
        # samples_output_dir
        fdir = rm.make_output_dirs(model_name, dat, let)[1]
    if fname is None:
        # time_out_file
        fname = rm.make_file_dir_names(model_name, nt)[17]

    # Get filetype ############################################################
    if fname[-3:] == 'vtk':
        ftype = 'vtk'
    elif fname[-2:] == 'h5' or fname[-3:] == 'hdf':
        ftype = 'hdf'
    else:
        print(fname)
        raise RuntimeError('Wrong filetype.')

    # Get reader ##############################################################
    if ftype == 'vtk':
        reader = pf.my_vtk(fdir, fname, varname)
    elif ftype == 'hdf':
        reader = pf.my_hdf(fdir+'/'+fname, varname)

    # Numpy Array  ############################################################
    if ftype == 'vtk':
        numpy_array = pf.my_vtk_to_numpy(reader)
    elif ftype == 'hdf':
        numpy_array = reader

    # Numpy Array Name ########################################################
    numpy_array_name = pm.py_output_filename(
        fa.tag,
        varname,
        sc.specl(model_name, dat, let)+'_'+str(nt),
        "npy",
    )

    return numpy_array, numpy_array_name
Пример #17
0
def read(
    model_name,
    dat,
    let,
    fdir=None,
    fname=None,
    varname='uindex',
    num_mon=1,
):
    """
    Reading monitor arrays from SHEMAT-Suite.

    Parameters
    ----------
    model_name : string
        String of model name.

    dat : string
        String with date of model run.

    let : string
        String of letter of model run.

    varname : string
        Variable name for array to be read.
        Possibilities: 'uindex' 'head','temp','kz', 'v'

    num_mon : integer
        Number for monitoring point.
        IMPORTANT: num_mon = 0 corresponds to the first
        monitoring point in SHEMAT monitor file.
        General: num_mon = i corresponds to monitoring
        point i+1

    Returns
    -------
    numpy_array : array
        Array containing the monitor variable array

    numpy_array_name : string
        Containing proposed saving location for Array.
    """

    # Dirs
    if fdir is None:
        # samples_output_dir
        fdir = rm.make_output_dirs(model_name, dat, let)[1]
    if fname is None:
        # monitor_file
        fname = rm.make_file_dir_names(model_name)[16]

    # Read from monitor file ##################################################
    numpy_array = np.genfromtxt(
        fdir + '/' + fname,
        dtype='f8',
        comments='%',
        usecols=(ma.varpos[varname]),
    )
    # Reshape #################################################################
    num_mons = sc.num_mons(model_name, dat, let)
    if np.remainder(len(numpy_array), num_mons):
        raise RuntimeError('Problem with num_mons')
    numpy_array = numpy_array.reshape(len(numpy_array) / num_mons, num_mons)
    numpy_array = numpy_array[:, num_mon]

    # Numpy Array Name ########################################################
    numpy_array_name = pm.py_output_filename(
        ma.tag, varname,
        sc.specl(model_name, dat, let) + '_' + str(num_mon), "npy")

    return numpy_array, numpy_array_name