def main(): mt = [7.982, -0.154, -7.574, 0.548, 7.147, -0.211] #focal mechanism #mt = [0.,0.,0, 0., 0., 0.] #focal mechanism mopad_mt = MomentTensor(mt, system='NED') bb = BeachBall(mopad_mt, npoints=200) bb._setup_BB(unit_circle=False) # extract the coordinates of the nodal lines neg_nodalline = bb._nodalline_negative pos_nodalline = bb._nodalline_positive #plot radiation pattern and nodal lines pointsp, dispp = farfieldP(mt) pointss, disps = farfieldS(mt) npointsp = pointsp.shape[1] normp = np.sum(pointsp * dispp, axis=0) norms = np.sum(pointss * disps, axis=0) rangep = np.max(np.abs(normp)) ranges = np.max(np.abs(normp)) fig1 = mlab.figure(size=(800, 800), bgcolor=(0, 0, 0)) pts1 = mlab.quiver3d(pointsp[0], pointsp[1], pointsp[2], dispp[0], dispp[1], dispp[2], scalars=normp, vmin=-rangep, vmax=rangep) pts1.glyph.color_mode = 'color_by_scalar' mlab.plot3d(*neg_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.plot3d(*pos_nodalline, color=(0, 0.5, 0), tube_radius=0.01) plot_sphere(0.7) fig2 = mlab.figure(size=(800, 800), bgcolor=(0, 0, 0)) mlab.quiver3d(pointss[0], pointss[1], pointss[2], disps[0], disps[1], disps[2], vmin=-ranges, vmax=ranges) mlab.plot3d(*neg_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.plot3d(*pos_nodalline, color=(0, 0.5, 0), tube_radius=0.01) plot_sphere(0.7) mlab.show()
def main(): mt = [7.982,-0.154, -7.574, 0.548, 7.147, -0.211] #focal mechanism #mt = [0.,0.,0, 0., 0., 0.] #focal mechanism mopad_mt = MomentTensor(mt,system='NED') bb = BeachBall(mopad_mt, npoints=200) bb._setup_BB(unit_circle=False) # extract the coordinates of the nodal lines neg_nodalline = bb._nodalline_negative pos_nodalline = bb._nodalline_positive #plot radiation pattern and nodal lines pointsp,dispp = farfieldP(mt) pointss,disps = farfieldS(mt) npointsp = pointsp.shape[1] normp = np.sum(pointsp*dispp,axis=0) norms = np.sum(pointss*disps,axis=0) rangep = np.max(np.abs(normp)) ranges = np.max(np.abs(normp)) fig1 = mlab.figure(size=(800,800),bgcolor=(0,0,0)) pts1 = mlab.quiver3d(pointsp[0],pointsp[1],pointsp[2],dispp[0],dispp[1],dispp[2], scalars=normp,vmin=-rangep,vmax=rangep) pts1.glyph.color_mode = 'color_by_scalar' mlab.plot3d(*neg_nodalline,color=(0,0.5,0),tube_radius=0.01) mlab.plot3d(*pos_nodalline,color=(0,0.5,0),tube_radius=0.01) plot_sphere(0.7) fig2 = mlab.figure(size=(800,800),bgcolor=(0,0,0)) mlab.quiver3d(pointss[0],pointss[1],pointss[2],disps[0],disps[1],disps[2], vmin=-ranges,vmax=ranges) mlab.plot3d(*neg_nodalline,color=(0,0.5,0),tube_radius=0.01) mlab.plot3d(*pos_nodalline,color=(0,0.5,0),tube_radius=0.01) plot_sphere(0.7) mlab.show()
def _write_radiation_pattern_vtk(ned_mt, fname_rpattern='rpattern.vtk', fname_beachlines='beachlines.vtk'): # output a vtkfile that can for exampled be displayed by ParaView mtensor = MomentTensor(ned_mt, system='NED') bb = BeachBall(mtensor, npoints=200) bb._setup_BB(unit_circle=False) # extract the coordinates of the nodal lines neg_nodalline = bb._nodalline_negative pos_nodalline = bb._nodalline_positive # plot radiation pattern and nodal lines points = _equalarea_spherical_grid() ndim, npoints = points.shape dispp = farfield(ned_mt, points, type="P") disps = farfield(ned_mt, points, type="S") # write vector field with open(fname_rpattern, 'w') as vtk_file: vtk_header = '# vtk DataFile Version 2.0\n' + \ 'radiation pattern vector field\n' + \ 'ASCII\n' + \ 'DATASET UNSTRUCTURED_GRID\n' + \ 'POINTS {:d} float\n'.format(npoints) vtk_file.write(vtk_header) # write point locations for x, y, z in np.transpose(points): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write vector field vtk_file.write('POINT_DATA {:d}\n'.format(npoints)) vtk_file.write('VECTORS s_radiation float\n') for x, y, z in np.transpose(disps): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) vtk_file.write('VECTORS p_radiation float\n'.format(npoints)) for x, y, z in np.transpose(dispp): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write nodal lines with open(fname_beachlines, 'w') as vtk_file: npts_neg = neg_nodalline.shape[1] npts_pos = pos_nodalline.shape[1] npts_tot = npts_neg + npts_pos vtk_header = '# vtk DataFile Version 2.0\n' + \ 'beachball nodal lines\n' + \ 'ASCII\n' + \ 'DATASET UNSTRUCTURED_GRID\n' + \ 'POINTS {:d} float\n'.format(npts_tot) vtk_file.write(vtk_header) # write point locations for x, y, z in np.transpose(neg_nodalline): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) for x, y, z in np.transpose(pos_nodalline): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write line segments vtk_file.write('\nCELLS 2 {:d}\n'.format(npts_tot + 4)) ipoints = list(range(0, npts_neg)) + [0] vtk_file.write('{:d} '.format(npts_neg + 1)) for ipoint in ipoints: if ipoint % 30 == 29: vtk_file.write('\n') vtk_file.write('{:d} '.format(ipoint)) vtk_file.write('\n') ipoints = list(range(0, npts_pos)) + [0] vtk_file.write('{:d} '.format(npts_pos + 1)) for ipoint in ipoints: if ipoint % 30 == 29: vtk_file.write('\n') vtk_file.write('{:d} '.format(ipoint + npts_neg)) vtk_file.write('\n') # cell types. 4 means cell type is a poly_line vtk_file.write('\nCELL_TYPES 2\n') vtk_file.write('4\n4')
def _plot_radiation_pattern_mayavi(ned_mt): """ Plot the radiation pattern using MayaVi. This private function uses the mayavi (vtk) library to plot the radiation pattern to screen. Note that you might have to set the QT_API environmental variable to e.g. export QT_API=pyqt that mayavi works properly. :param ned_mt: moment tensor in NED convention """ # use mayavi if possible. try: from mayavi import mlab except Exception as err: print(err) msg = ("ObsPy failed to import MayaVi. " "You need to install the mayavi module " "(e.g. 'conda install mayavi', 'pip install mayavi'). " "If it is installed and still doesn't work, " "try setting the environmental variable QT_API to " "pyqt (e.g. export QT_API=pyqt) before running the " "code. Another option is to avoid mayavi and " "directly use kind='vtk' for vtk file output of the " "radiation pattern that can be used by external " "software like ParaView") raise ImportError(msg) # get mopad moment tensor mopad_mt = MomentTensor(ned_mt, system='NED') bb = BeachBall(mopad_mt, npoints=200) bb._setup_BB(unit_circle=False) # extract the coordinates of the nodal lines neg_nodalline = bb._nodalline_negative pos_nodalline = bb._nodalline_positive # add the first point to the end to close the nodal line neg_nodalline = np.hstack((neg_nodalline, neg_nodalline[:, 0][:, None])) pos_nodalline = np.hstack((pos_nodalline, pos_nodalline[:, 0][:, None])) # plot radiation pattern and nodal lines points = _equalarea_spherical_grid(nlat=20) dispp = farfield(ned_mt, points, type="P") disps = farfield(ned_mt, points, type="S") # get vector lengths normp = np.sum(dispp * points, axis=0) normp /= np.max(np.abs(normp)) norms = np.sqrt(np.sum(disps * disps, axis=0)) norms /= np.max(np.abs(norms)) # make sphere to block view to the other side of the beachball rad = 0.8 pi = np.pi cos = np.cos sin = np.sin phi, theta = np.mgrid[0:pi:101j, 0:2 * pi:101j] x = rad * sin(phi) * cos(theta) y = rad * sin(phi) * sin(theta) z = rad * cos(phi) # p wave radiation pattern mlab.figure(size=(800, 800), bgcolor=(0, 0, 0)) pts1 = mlab.quiver3d(points[0], points[1], points[2], dispp[0], dispp[1], dispp[2], scalars=normp, vmin=-1., vmax=1.) pts1.glyph.color_mode = 'color_by_scalar' mlab.plot3d(*neg_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.plot3d(*pos_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.mesh(x, y, z, color=(0, 0, 0)) # s wave radiation pattern mlab.figure(size=(800, 800), bgcolor=(0, 0, 0)) pts2 = mlab.quiver3d(points[0], points[1], points[2], disps[0], disps[1], disps[2], scalars=norms, vmin=-0., vmax=1.) pts2.glyph.color_mode = 'color_by_scalar' mlab.plot3d(*neg_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.plot3d(*pos_nodalline, color=(0, 0.5, 0), tube_radius=0.01) mlab.mesh(x, y, z, color=(0, 0, 0)) mlab.show()
def _write_radiation_pattern_vtk( ned_mt, fname_rpattern='rpattern.vtk', fname_beachlines='beachlines.vtk'): # output a vtkfile that can for exampled be displayed by ParaView mtensor = MomentTensor(ned_mt, system='NED') bb = BeachBall(mtensor, npoints=200) bb._setup_BB(unit_circle=False) # extract the coordinates of the nodal lines neg_nodalline = bb._nodalline_negative pos_nodalline = bb._nodalline_positive # plot radiation pattern and nodal lines points = _equalarea_spherical_grid() ndim, npoints = points.shape dispp = farfield(ned_mt, points, type="P") disps = farfield(ned_mt, points, type="S") # write vector field with open(fname_rpattern, 'w') as vtk_file: vtk_header = '# vtk DataFile Version 2.0\n' + \ 'radiation pattern vector field\n' + \ 'ASCII\n' + \ 'DATASET UNSTRUCTURED_GRID\n' + \ 'POINTS {:d} float\n'.format(npoints) vtk_file.write(vtk_header) # write point locations for x, y, z in np.transpose(points): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write vector field vtk_file.write('POINT_DATA {:d}\n'.format(npoints)) vtk_file.write('VECTORS s_radiation float\n') for x, y, z in np.transpose(disps): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) vtk_file.write('VECTORS p_radiation float\n'.format(npoints)) for x, y, z in np.transpose(dispp): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write nodal lines with open(fname_beachlines, 'w') as vtk_file: npts_neg = neg_nodalline.shape[1] npts_pos = pos_nodalline.shape[1] npts_tot = npts_neg + npts_pos vtk_header = '# vtk DataFile Version 2.0\n' + \ 'beachball nodal lines\n' + \ 'ASCII\n' + \ 'DATASET UNSTRUCTURED_GRID\n' + \ 'POINTS {:d} float\n'.format(npts_tot) vtk_file.write(vtk_header) # write point locations for x, y, z in np.transpose(neg_nodalline): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) for x, y, z in np.transpose(pos_nodalline): vtk_file.write('{:.3e} {:.3e} {:.3e}\n'.format(x, y, z)) # write line segments vtk_file.write('\nCELLS 2 {:d}\n'.format(npts_tot + 4)) ipoints = list(range(0, npts_neg)) + [0] vtk_file.write('{:d} '.format(npts_neg + 1)) for ipoint in ipoints: if ipoint % 30 == 29: vtk_file.write('\n') vtk_file.write('{:d} '.format(ipoint)) vtk_file.write('\n') ipoints = list(range(0, npts_pos)) + [0] vtk_file.write('{:d} '.format(npts_pos + 1)) for ipoint in ipoints: if ipoint % 30 == 29: vtk_file.write('\n') vtk_file.write('{:d} '.format(ipoint + npts_neg)) vtk_file.write('\n') # cell types. 4 means cell type is a poly_line vtk_file.write('\nCELL_TYPES 2\n') vtk_file.write('4\n4')