413 lines
15 KiB
Python
413 lines
15 KiB
Python
import sys
|
|
sys.dont_write_bytecode = True
|
|
|
|
import adcptool.sdxf as sdxf
|
|
from adcptool.vector import Vector
|
|
from adcpprocess import compute_direction_angle
|
|
|
|
|
|
def writeAscii3D(profile, format, f, voidtext="---", header=None):
|
|
'''
|
|
create custom ascii file that follows a user defined format
|
|
defined via "format" keyword, which has the following names for cell attributes
|
|
x, y, z
|
|
vx, vy, vz, vmag, vmag3d
|
|
artificial
|
|
|
|
'''
|
|
output = open(f, 'w')
|
|
|
|
if not header == None:
|
|
output.write(header)
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
output.write((format+'\n').format(
|
|
x=e.position.x if hasattr(e, 'position') else voidtext,
|
|
y=e.position.y if hasattr(e, 'position') else voidtext,
|
|
z=c.z_position if hasattr(c, 'z_position') else voidtext,
|
|
vx=c.velocity.x if hasattr(c, 'velocity') else voidtext,
|
|
vy=c.velocity.y if hasattr(c, 'velocity') else voidtext,
|
|
vz=c.velocity.z if hasattr(c, 'velocity') else voidtext,
|
|
vmag=c.velocity.magn2d() if hasattr(c, 'velocity') else voidtext,
|
|
vmag3d=c.velocity.magn() if hasattr(c, 'velocity') else voidtext,
|
|
artificial=c.artificial if hasattr(c, 'artificial') else False
|
|
))
|
|
output.close()
|
|
|
|
def writeAscii2D(profile, format, f, voidtext="---", header=None):
|
|
'''
|
|
create custom ascii file that follows a user defined format
|
|
defined via "format" keyword, which has the following names for cell attributes
|
|
x, y, z
|
|
vx, vy, vz, vmag, vmag3d
|
|
depth
|
|
ks, tau_shear, v_shear
|
|
four_depths_1, four_depths_2, four_depths_3, four_depths_4
|
|
'''
|
|
output = open(f, 'w')
|
|
|
|
if not header == None:
|
|
output.write(header)
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
output.write((format+'\n').format(
|
|
x=e.position.x if hasattr(e, 'position') else voidtext,
|
|
y=e.position.y if hasattr(e, 'position') else voidtext,
|
|
z=e.position.z if hasattr(e, 'position') else voidtext,
|
|
vx=e.velocity.x if hasattr(e, 'velocity') else voidtext,
|
|
vy=e.velocity.y if hasattr(e, 'velocity') else voidtext,
|
|
vz=e.velocity.z if hasattr(e, 'velocity') else voidtext,
|
|
vmag=e.velocity.magn2d() if hasattr(e, 'velocity') else voidtext,
|
|
vmag3d=e.velocity.magn() if hasattr(e, 'velocity') else voidtext,
|
|
depth=e.depth if hasattr(e, 'depth') else voidtext,
|
|
four_depths_1=e.depths[0] if hasattr(e, 'depths') else voidtext,
|
|
four_depths_2=e.depths[1] if hasattr(e, 'depths') else voidtext,
|
|
four_depths_3=e.depths[2] if hasattr(e, 'depths') else voidtext,
|
|
four_depths_4=e.depths[3] if hasattr(e, 'depths') else voidtext,
|
|
ks=e.ks if hasattr(e, 'ks') else voidtext,
|
|
tau_shear=e.tau_shear if hasattr(e, 'tau_shear') else voidtext,
|
|
v_shear=e.v_shear if hasattr(e, 'v_shear') else voidtext
|
|
))
|
|
output.close()
|
|
|
|
def write2DVelocity(profile, f):
|
|
'''
|
|
create an ascii file with X Y and averaged velocity in U V coords
|
|
'''
|
|
|
|
data_2D = open(f, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
data_2D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y,
|
|
e.velocity.x if not e.void else 0,
|
|
e.velocity.y if not e.void else 0))
|
|
|
|
data_2D.close()
|
|
|
|
def writeDebug2D(profile, f):
|
|
'''
|
|
create an ascii file with X Y and averaged velocity in U V coords
|
|
'''
|
|
|
|
data_2D = open(f, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
data_2D.write('{:12.3f}{:12.3f}{:12.3f}{:12.5f}{:12.9f}\n'.format(
|
|
e.position.x, e.position.y,
|
|
e.velocity.x if not e.void else 0,
|
|
e.velocity.y if not e.void else 0,
|
|
e.velocity.magn() if not e.void else 0,
|
|
compute_direction_angle(e.velocity) if not e.void else 0
|
|
))
|
|
|
|
data_2D.close()
|
|
|
|
def write2DVelocity_BlueKenue(profile, f):
|
|
'''
|
|
create an ascii file for Blue Kenue with adcp 2D data and node connectivity table
|
|
'''
|
|
# build the node connectivity table
|
|
node1 = range(1,len(profile.ensembles))
|
|
node2 = range(2,len(profile.ensembles) + 1)
|
|
node3 = range(1,len(profile.ensembles))
|
|
|
|
BK_2D = open(f, 'w')
|
|
|
|
# header for BlueKenue
|
|
BK_2D.write('#\n' + ':AttributeName 1 ADCP_VEL UV\n' + ':AttributeUnits 1 M/S\n'
|
|
+ '#\n' + ':NodeCount ' + str(len(profile.ensembles)) + '\n' + ':ElementCount '
|
|
+ str(len(profile.ensembles)-1) + '\n' + ':ElementType T3\n' + '#\n' + ':EndHeader\n')
|
|
|
|
# output of adcp data and node table
|
|
for e in profile.ensembles:
|
|
BK_2D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y,
|
|
e.velocity.x if not e.void else 0,
|
|
e.velocity.y if not e.void else 0))
|
|
|
|
for i in range(len(node1)):
|
|
BK_2D.write(str(node1[i]) + ' ' + str(node2[i]) + ' ' + str(node3[i]) + '\n')
|
|
|
|
|
|
BK_2D.close()
|
|
|
|
def write2DVelocity_Paraview(profile, f):
|
|
'''
|
|
create an ascii file for Paraview with adcp 2D data in*.vtk format
|
|
'''
|
|
|
|
liste_vert =range(0,len(profile.ensembles))
|
|
liste_vert = str(liste_vert).replace(',', '').strip('[' ']')
|
|
|
|
Paraview_2D = open(f, 'w')
|
|
|
|
# header for BlueKenue
|
|
Paraview_2D.write('# vtk DataFile Version 3.0\n' + 'vtk output\n' + 'ASCII\n'
|
|
+ 'DATASET POLYDATA\n' + 'POINTS ' + str(len(profile.ensembles)) + ' double\n')
|
|
for e in profile.ensembles:
|
|
Paraview_2D.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, 0.0))
|
|
Paraview_2D.write('VERTICES 1 ' + str(len(profile.ensembles)+1) + '\n'
|
|
+ str(len(profile.ensembles)) + ' ' + liste_vert + '\n' + '\n' + 'POINT_DATA '
|
|
+ str(len(profile.ensembles)) + '\n' + 'VECTORS UV double\n')
|
|
for e in profile.ensembles:
|
|
Paraview_2D.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.velocity.x if not e.void else 0,
|
|
e.velocity.y if not e.void else 0, 0.0))
|
|
|
|
Paraview_2D.close()
|
|
|
|
def write3DVelocity_Paraview(profile, f):
|
|
'''
|
|
create an ascii file for Paraview with adcp 2D data in*.vtk format
|
|
'''
|
|
|
|
liste_UVW = []
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
liste_UVW.append(c.velocity)
|
|
|
|
liste_vert =range(0,len(liste_UVW))
|
|
liste_vert = str(liste_vert).replace(',', '').strip('[' ']')
|
|
|
|
|
|
Paraview_3D = open(f, 'w')
|
|
|
|
# header for BlueKenue
|
|
Paraview_3D.write('# vtk DataFile Version 3.0\n' + 'vtk output\n' + 'ASCII\n'
|
|
+ 'DATASET POLYDATA\n' + 'POINTS ' + str(len(liste_UVW)) + ' double\n')
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
Paraview_3D.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
pos.x, pos.y, pos.z))
|
|
|
|
Paraview_3D.write('VERTICES 1 ' + str(len(liste_UVW)+1) + '\n'
|
|
+ str(len(liste_UVW)) + ' ' + liste_vert + '\n' + '\n' + 'POINT_DATA '
|
|
+ str(len(liste_UVW)) + '\n' + 'VECTORS UV double\n')
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
Paraview_3D.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
vel.x, vel.y, vel.z))
|
|
|
|
Paraview_3D.close()
|
|
|
|
def write3DVelocity(profile, f):
|
|
'''
|
|
create an ascii file whith X Y and measured velocity in U V W coords
|
|
'''
|
|
|
|
data_3D = open(f, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
data_3D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
pos.x, pos.y, pos.z,
|
|
vel.x, vel.y, vel.z))
|
|
|
|
|
|
data_3D.close()
|
|
|
|
def writeDebug3D(profile, f):
|
|
'''
|
|
create an ascii file whith X Y and measured velocity in U V W coords
|
|
'''
|
|
|
|
data_3D = open(f, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
data_3D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
pos.x, pos.y, pos.z,
|
|
vel.x, vel.y, vel.z,
|
|
vel.magn(), compute_direction_angle(vel)
|
|
|
|
))
|
|
|
|
|
|
data_3D.close()
|
|
|
|
def write3DVelocity_BlueKenue(profile, f):
|
|
'''
|
|
create an ascii file for Blue Kenue with adcp 3D data and node connectivity table
|
|
'''
|
|
|
|
liste_UVW = []
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
liste_UVW.append(c.velocity)
|
|
|
|
node1 = range(1,len(liste_UVW))
|
|
node2 = range(2,len(liste_UVW) + 1)
|
|
node3 = range(1,len(liste_UVW))
|
|
node4 = range(2,len(liste_UVW) + 1)
|
|
|
|
BK_3D = open(f, 'w')
|
|
|
|
# header for BlueKenue
|
|
BK_3D.write('#\n' + ':AttributeName 1 ADCP_VEL UVW\n' + ':AttributeUnits 1 M/S\n'
|
|
+ '#\n' + ':NodeCount ' + str(len(liste_UVW)) + '\n' + ':ElementCount '
|
|
+ str(len(liste_UVW)-1) + '\n' + '#\n' + ':EndHeader\n')
|
|
|
|
# output of adcp data and node table
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
BK_3D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
pos.x, pos.y, pos.z,
|
|
vel.x, vel.y, vel.z))
|
|
|
|
for i in range(len(node1)):
|
|
BK_3D.write(str(node1[i]) + ' ' + str(node2[i]) + ' ' + str(node3[i]) + ' ' + str(node4[i]) + '\n')
|
|
|
|
BK_3D.close()
|
|
|
|
def write3DVelocity_W0_BlueKenue(profile, f): #sets vertical velocity W = 0.0
|
|
'''
|
|
create an ascii file for Blue Kenue with adcp 3D data and node connectivity table
|
|
'''
|
|
|
|
liste_UVW = []
|
|
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
liste_UVW.append(c.velocity)
|
|
|
|
node1 = range(1,len(liste_UVW))
|
|
node2 = range(2,len(liste_UVW) + 1)
|
|
node3 = range(1,len(liste_UVW))
|
|
node4 = range(2,len(liste_UVW) + 1)
|
|
|
|
BK_3D = open(f, 'w')
|
|
|
|
# header for BlueKenue
|
|
BK_3D.write('#\n' + ':AttributeName 1 ADCP_VEL UVW\n' + ':AttributeUnits 1 M/S\n'
|
|
+ '#\n' + ':NodeCount ' + str(len(liste_UVW)) + '\n' + ':ElementCount '
|
|
+ str(len(liste_UVW)-1) + '\n' + '#\n' + ':EndHeader\n')
|
|
|
|
# output of adcp data and node table
|
|
for e in profile.ensembles:
|
|
if e.void == False:
|
|
for c in e.cells:
|
|
vel = c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
|
|
BK_3D.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
pos.x, pos.y, pos.z,
|
|
vel.x, vel.y, 0.0))
|
|
|
|
for i in range(len(node1)):
|
|
BK_3D.write(str(node1[i]) + ' ' + str(node2[i]) + ' ' + str(node3[i]) + ' ' + str(node4[i]) + '\n')
|
|
|
|
BK_3D.close()
|
|
|
|
def writeAverageDepth(profile, f):
|
|
|
|
Av_depth = open(f, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
e.depth *= -1
|
|
|
|
Av_depth.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, e.depth))
|
|
|
|
Av_depth.close()
|
|
|
|
def write4BeamDepths(profile, f_depth4Beams, f_depthBeam1, f_depthBeam2, f_depthBeam3, f_depthBeam4):
|
|
|
|
d_AllBeams = open(f_depth4Beams, 'w')
|
|
d_beam1 = open(f_depthBeam1, 'w')
|
|
d_beam2 = open(f_depthBeam2, 'w')
|
|
d_beam3 = open(f_depthBeam3, 'w')
|
|
d_beam4 = open(f_depthBeam4, 'w')
|
|
|
|
for e in profile.ensembles:
|
|
e.four_depths[0] *= -1
|
|
e.four_depths[1] *= -1
|
|
e.four_depths[2] *= -1
|
|
e.four_depths[3] *= -1
|
|
|
|
d_AllBeams.write('{:12.3f}{:12.3f}{:12.3f}{:12.3f}\n'.format(e.four_depths[0],
|
|
e.four_depths[1], e.four_depths[2], e.four_depths[3]))
|
|
d_beam1.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, e.four_depths[0]))
|
|
d_beam2.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, e.four_depths[1]))
|
|
d_beam3.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, e.four_depths[2]))
|
|
d_beam4.write('{:12.3f}{:12.3f}{:12.3f}\n'.format(
|
|
e.position.x, e.position.y, e.four_depths[3]))
|
|
|
|
d_AllBeams.close()
|
|
d_beam1.close()
|
|
d_beam2.close()
|
|
d_beam3.close()
|
|
d_beam4.close()
|
|
|
|
def writeDXF2D(profile, f, vel_scale=50):
|
|
'''
|
|
create a DXF file with the profile in 2D and its velocity vectors
|
|
'''
|
|
|
|
dxf = sdxf.Drawing()
|
|
pline = [[],[],[]]
|
|
|
|
for e in profile.ensembles:
|
|
# convert into tuple and append
|
|
pline[0].append(tuple(e.position))
|
|
|
|
# draw velocity vectors too!
|
|
if not e.void:
|
|
dxf.append(sdxf.Line(points=[tuple(e.position), (e.position + (e.velocity * vel_scale))],
|
|
color=1))
|
|
|
|
dxf.append(sdxf.PolyLine(points=pline[0], closed=0, color=0))
|
|
|
|
dxf.saveas(f)
|
|
|
|
def writeDXF3D(profile, f, vel_scale=50):
|
|
'''
|
|
create a DXF file with the profile in 3D and its velocity vectors
|
|
'''
|
|
|
|
dxf = sdxf.Drawing()
|
|
|
|
for e in profile.ensembles:
|
|
if not e.void:
|
|
for c in e.cells:
|
|
vel = vel_scale * c.velocity
|
|
pos = e.position + Vector(0,0, c.z_position)
|
|
dxf.append(sdxf.Line( points=[tuple(pos), tuple(pos + vel)] ))
|
|
|
|
dxf.saveas(f)
|
|
|