Source code for pyglimer.utils.create_geom

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
Automatic creation of raysum geom files

:copyright:
   The PyGLImER development team (makus@gfz-potsdam.de).
:license:
   GNU Lesser General Public License, Version 3
   (https://www.gnu.org/copyleft/lesser.html)
:author:
    Peter Makus (makus@gfz-potsdam.de)

Created: Thursday, 14th May 2020 10:23:03
Last Modified: Monday, 30th May 2022 02:58:04 pm
'''

import os
import numpy as np

from pyglimer.data import finddir


[docs]def create_geom( N: int, bazv: np.ndarray, raypv: np.ndarray, shift_max: int, filename: str, shape='cross'): """ Creates geometry files for Raysum. Parameters ---------- N : int Number of stations. Has to be uneven if shape=cross. Else has to be N=M**2. Were M is a natural number bazv : np.ndarray(1D) 1D array containing the backzimuths per station (deg). raypv : np.ndarray(1D) 1D array containing the slownesses in s/m per backzimuth. shift_max : int Maximum horizontal shift in m. filename : str Name of the output file. shape : str shape of the array Raises ------ ValueError For Even Ns. Returns ------- None. """ if shape == 'cross': if N/2 == round(N/2): raise ValueError('Number of station has to be uneven.') # create shift vectors xshift = np.hstack((np.linspace(-shift_max, shift_max, round((N+1)/2)), np.zeros(round((N+1)/2)))) yshift = np.hstack((np.zeros(round((N+1)/2)), np.linspace(-shift_max, shift_max, round((N+1)/2)))) coords = np.unique(np.column_stack((yshift, xshift)), axis=0) else: M = np.sqrt(N) # Number of stations per line xshift, yshift = np.mgrid[ -shift_max:shift_max:M, -shift_max:shift_max:M] coords = np.column_stack((xshift.ravel(), yshift.ravel())) lines = [] # list with text # header lines.append('# Automatically created geometry file.\n') lines.append( '# Note that one file cannot contain more than ' + '200 traces (max for raysum).\n') ntr = 0 # Number of traces counter fpi = [] # List with indices to split file for i in range(N): lines.append('# Station '+str(i)+'\n') for j, baz in enumerate(bazv): for k, rayp in enumerate(raypv): if rayp == 0: rayp = '0.' else: rayp = str(round(rayp, 6)) line = ' '.join( [str(int(bazv[j]))+'.', rayp, str(int(coords[i, 0]))+'.', str(int(coords[i, 1]))+'.\n']) lines.append(line) ntr = ntr + 1 if ntr == 200: fpi.append(lines.index(line)) ntr = 0 fpi.append(lines.index(line)) # Write text to file # open outfile of = os.path.join(finddir(), 'raysum_traces', filename+'.geom') with open(of, 'w') as text: text.writelines(lines) # Write splitted files for i, j in enumerate(fpi): of = os.path.join(finddir(), 'raysum_traces', filename+str(i)+'.geom') with open(of, 'w') as text: if i: text.writelines(lines[fpi[i-1]+1:j+1]) else: text.writelines(lines[:j+1])