AJMR-Python-Baird/Mustique/adcptool/adcpexport.py

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)