Source code for in3Utils.getReleaseArea

"""
    Get release area corner coordinates for a rectangle of an area of approx. 100 000 m2

    This file is part of Avaframe.
"""

# Load modules
import numpy as np
import matplotlib.pyplot as plt
from avaframe.in3Utils import generateTopo as gT
import shapefile
import logging
import shutil
import pathlib

# create local logger
# change log level in calling module to DEBUG to see log messages
log = logging.getLogger(__name__)


[docs]def makexyPoints(x1, x2, y1, cfgR): """ Make xy Points of release area from given extent and start and end points """ lenp = int(cfgR['GENERAL']['lenP']) # define corner coordinates xyPoints = np.zeros((lenp, 2)) xyPoints[0, 0] = x1 + x2 # xlr xyPoints[0, 1] = -0.5 * y1 # ylr xyPoints[1, 0] = x1 + x2 # xur xyPoints[1, 1] = 0.5 * y1 # yur xyPoints[2, 0] = x1 # xul xyPoints[2, 1] = 0.5 * y1 # yul xyPoints[3, 0] = x1 # xll xyPoints[3, 1] = -0.5 * y1 # yll return xyPoints
[docs]def getCornersFP(cfgR): # Terrain parameters hr = cfgR['GENERAL'].getfloat('hr') vol = cfgR['GENERAL'].getfloat('vol') dh = cfgR['GENERAL'].getfloat('dh') xStart = cfgR['GENERAL'].getfloat('xStart') # Compute release area --------------------------------------------------------------------------------------- xr = cfgR['FP'].getfloat('xExtent') yr = vol / (xr * dh) log.info('volume is: %f' % (yr*xr*dh)) # make corner coordinates of release area xyPoints = makexyPoints(xStart, xr, yr, cfgR) return xyPoints
[docs]def getCornersIP(cfgR, cfgT): # Terrain parameters hr = cfgR['GENERAL'].getfloat('hr') vol = cfgR['GENERAL'].getfloat('vol') dh = cfgR['GENERAL'].getfloat('dh') xStart = cfgR['GENERAL'].getfloat('xStart') meanAlpha = cfgT['TOPO'].getfloat('meanAlpha') # Compute release area --------------------------------------------------------------------------------------- xr = hr / np.sin(np.radians(meanAlpha)) # along valley extent of release area xrp = hr / np.tan(np.radians(meanAlpha)) # projected to the flat plane yr = vol / (xr * dh) log.info('volume is: %f, xr: %f, xrp: %f' % (yr*xr*dh, xr, xrp)) # make corner coordinates of release area xyPoints = makexyPoints(xStart, xrp, yr, cfgR) return xyPoints
[docs]def getCornersHS(cfgR, cfgT): # Terrain parameters hr = cfgR['GENERAL'].getfloat('hr') vol = cfgR['GENERAL'].getfloat('vol') dh = cfgR['GENERAL'].getfloat('dh') lenp = int(cfgR['GENERAL']['lenP']) alphaStop = cfgR['HS'].getfloat('alphaStop') # get A, B from HS [A, B, fLen] = gT.getParabolaParams(cfgT) # Compute release area --------------------------------------------------------------------------------------- # along valley margin of release area at alpha_stopĀ° point xStop = (np.tan(np.radians(-alphaStop)) - B) / (2. * A) xr = hr / np.sin(np.radians(alphaStop)) xrp = hr / np.tan(np.radians(alphaStop)) yr = vol / (xr * dh) xStart = xStop - xrp # make corner coordinates of release area xyPoints = makexyPoints(xStart, xrp, yr, cfgR) return xyPoints
[docs]def correctOrigin(xyPoints, cfgT): """ Move the points so that the correct origin is set """ # determine number of rows and columns to define domain dx = cfgT['TOPO'].getfloat('dx') xEnd = cfgT['TOPO'].getfloat('xEnd') yEnd = cfgT['TOPO'].getfloat('yEnd') # Compute coordinate grid xv = np.arange(0, xEnd+dx, dx) yv = np.arange(-0.5 * yEnd, 0.5 * (yEnd+dx), dx) xl = cfgT['DEMDATA'].getfloat('xl') yl = cfgT['DEMDATA'].getfloat('yl') xv = xv + xl yv = yv + yl + 0.5 * yEnd xyPoints[:, 0] = xyPoints[:, 0] + xl xyPoints[:, 1] = xyPoints[:, 1] + yl + 0.5 * yEnd # list all points for m in range(len(xyPoints)): log.info('Point %d: x %f y %f' % (m, xyPoints[m, 0], xyPoints[m, 1])) return xv, yv, xyPoints
[docs]def writeReleaseArea(xyPoints, demType, cfgR, outDir): """ Write topography information to file """ lenp = len(xyPoints) relNo = int(cfgR['FILE']['relNo']) relH = cfgR['GENERAL'].getfloat('dh') relName = cfgR['FILE']['relName'] # Add vertical coordinate z = np.zeros((lenp, 1)) p_mat = np.matrix(np.append(xyPoints, z, axis=1)) # Save elevation data to .asc file and add header lines releaseFile = outDir / ('release%d%s.nxyz' % (relNo, demType)) with open(releaseFile, 'w') as f: f.write('name=%s\n' % (relName)) f.write('d0=%.2f\n' % (relH)) f.write('rho=None\n') f.write('%d\n' % (lenp)) for line in p_mat: np.savetxt(f, line, fmt='%f') # Log info here log.info('Release Area written to: %s/release_%d%s as .nxyz and .shp' % (outDir, relNo, demType)) if cfgR.getboolean('GENERAL', 'outputtxt'): shutil.copyfile((outDir / ('release%d%s.nxyz' % (relNo, demType))), (outDir / ('release%d%s.txt' % (relNo, demType)))) # Make list of Points xy = [] for m in range(len(xyPoints)): xy.append([xyPoints[m, 0], xyPoints[m, 1]]) # Wr releaseFileName = outDir / ('release%d%s' % (relNo, demType)) w = shapefile.Writer(str(releaseFileName)) w.poly([[xy[3], xy[2], xy[1], xy[0]]]) w.field('ID', 'C', '40') w.field('Name', 'C', '40') w.field('thickness', 'N', decimal=4) w.record('1', 'Rel_Example', relH) w.close()
[docs]def getReleaseArea(cfgT, cfgR, avalancheDir): """ Main function to compute release areas """ # Which DEM type demType = cfgT['TOPO']['demType'] log.info('DEM type is set to: %s' % demType) # Set Output directory outDir = pathlib.Path(avalancheDir, 'Inputs', 'REL') if outDir.is_dir(): log.info('The new release area is saved to %s' % (outDir)) else: log.error('Required folder structure: NameOfAvalanche/Inputs missing! \ Run runInitializeProject first!') flagCont = False # Get release area if demType == 'FP': xyPoints = getCornersFP(cfgR) flagCont = True elif demType == 'IP': xyPoints = getCornersIP(cfgR, cfgT) flagCont = True elif demType == 'PF': xyPoints = getCornersHS(cfgR, cfgT) flagCont = True elif demType == 'HS': xyPoints = getCornersIP(cfgR, cfgT) flagCont = True elif demType == 'HX': log.info('no release area available for demType: %s' % (demType)) elif demType == 'BL': log.warning('no release area available for demType: %s' % (demType)) if flagCont: # Move to correct correctOrigin [xv, yv, xyPoints] = correctOrigin(xyPoints, cfgT) # Write release area writeReleaseArea(xyPoints, demType, cfgR, outDir) return xv, yv, xyPoints