Source code for hyvr.geo.trough_utils

import numpy as np
import hyvr.utils as hu

[docs]def generate_trough_positions(bottom_surface, top_surface, type_params, grid): # TODO: # Idea: Generating the objects on planes between the maximum of the # bottom surface and the top surface is not exactly perfect imho. # Instead, we could maybe calculate the volume of the AE and use # this for generating the number of troughs, e.g.: # # trough_density = #troughs/area = (#throughs * height) / volume # # The height should be the 'agg' parameter. Therefore, the number # of troughs could be generated according to a poisson # distribution: # # n_troughs = np.random.poisson(lam=trough_density * volume/agg) # # For migrating troughs, we could then first assign the first half # in the "upper part" (what should this be?) and the second half as # migrated troughs based on the previous ones. # TODO: # Also randomly place objects a bit outside the domain if the domain is not # periodic. Therefore we need a and b # Randomly generated trough positions bottom_z = bottom_surface.zmax + type_params['depth'] * type_params['buffer'] top_z = top_surface.zmean # go from top to bottom planes_z = np.arange(top_z, bottom_z, -type_params['agg']) # construct list of random trough centers te_xyz = [] for i, z in enumerate(planes_z): if i == 0 or type_params['migrate'] is None: # randomly draw positions according to spatial uniform distribution lam = type_params['trough_density'] * grid.lx * grid.ly n_troughs = np.random.poisson(lam=lam) for k in range(n_troughs): xc = np.random.uniform(grid.x0, grid.xmax) yc = np.random.uniform(grid.y0, grid.ymax) te_xyz.append([xc, yc, z]) else: # migrate previous troughs # n_troughs stays the same for k in range(n_troughs): above_idx = k + (i-1)*n_troughs xc = te_xyz[above_idx][0] + np.random.normal(type_params['migrate'][0], type_params['migrate'][1]) yc = te_xyz[above_idx][1] + np.random.normal(type_params['migrate'][2], type_params['migrate'][3]) te_xyz.append([xc, yc, z]) return te_xyz
[docs]def rand_trough_params(type_params, z, grid): if type_params['size_ztrend'] is not None: delta_ztrend = type_params['size_ztrend'][1] - type_params['size_ztrend'][0] zfactor = type_params['size_ztrend'][0] +\ (z - grid.z0)*(delta_ztrend)/grid.lz else: zfactor = 1 params = {} params['a'] = type_params['length'] * zfactor / 2 params['b'] = type_params['width'] * zfactor / 2 params['c'] = type_params['depth'] * zfactor params['alpha'] = np.random.uniform(*type_params['paleoflow']) return params