"""
Basic tools for getting grid normals, area and working with vectors.
"""
# Load modules
import logging
import numpy as np
# Local imports
import avaframe.in3Utils.geoTrans as geoTrans
# create local logger
# change log level in calling module to DEBUG to see log messages
log = logging.getLogger(__name__)
[docs]def getAreaMesh(dem, num):
""" Get area of grid cells.
Parameters
----------
dem dict updated with:
Nx: 2D numpy array
x component of the normal vector field on grid points
Ny: 2D numpy array
y component of the normal vector field on grid points
Nz: 2D numpy array
z component of the normal vector field on grid points
header : dict
dem header (cellsize)
num: int
chose between 4, 6 or 8 (using then 4, 6 or 8 triangles) or
1 to use the simple cross product method (with the diagonals)
Returns
-------
dem dict updated with:
areaRaster: 2D numpy array
real area of grid cells
"""
csz = dem['header']['cellsize']
Nx = dem['Nx']
Ny = dem['Ny']
Nz = dem['Nz']
# see documentation and issue 202
if num == 1:
A = norm(Nx, Ny, Nz)
else:
_, _, NzNormed = normalize(Nx, Ny, Nz)
A = csz * csz / NzNormed
dem['areaRaster'] = A
return dem
##############################################################################
# ###################### Vectorial functions #################################
##############################################################################
[docs]def norm(x, y, z):
""" Compute the Euclidean norm of the vector (x, y, z).
(x, y, z) can be numpy arrays.
Parameters
----------
x: numpy array
x component of the vector
y: numpy array
y component of the vector
z: numpy array
z component of the vector
Returns
-------
norme: numpy array
norm of the vector
"""
norme = np.sqrt(x*x + y*y + z*z)
return norme
[docs]def norm2(x, y, z):
""" Compute the square of the Euclidean norm of the vector (x, y, z).
(x, y, z) can be numpy arrays.
Parameters
----------
x: numpy array
x component of the vector
y: numpy array
y component of the vector
z: numpy array
z component of the vector
Returns
-------
norme2: numpy array
square of the norm of the vector
"""
norme2 = (x*x + y*y + z*z)
return norme2
[docs]def normalize(x, y, z):
""" Normalize vector (x, y, z) for the Euclidean norm.
(x, y, z) can be np arrays.
Parameters
----------
x: numpy array
x component of the vector
y: numpy array
y component of the vector
z: numpy array
z component of the vector
Returns
-------
x: numpy array
x component of the normalized vector
y: numpy array
y component of the normalized vector
z: numpy array
z component of the normalized vector
"""
norme = norm(x, y, z)
ind = np.where(norme > 0)
x[ind] = x[ind] / norme[ind]
y[ind] = y[ind] / norme[ind]
z[ind] = z[ind] / norme[ind]
return x, y, z
[docs]def crossProd(ux, uy, uz, vx, vy, vz):
""" Compute cross product of vector u = (ux, uy, uz) and v = (vx, vy, vz).
"""
wx = uy*vz - uz*vy
wy = uz*vx - ux*vz
wz = ux*vy - uy*vx
return wx, wy, wz
[docs]def scalProd(ux, uy, uz, vx, vy, vz):
""" Compute scalar product of vector u = (ux, uy, uz) and v = (vx, vy, vz).
"""
scal = ux*vx + uy*vy + uz*vz
return scal