def run_test(_fld, _seeds, plot2d=True, plot3d=True, title="", show=False, **kwargs): lines, topo = viscid.calc_streamlines(_fld, _seeds, **kwargs) topo_color = viscid.topology2color(topo) # downsample lines for plotting lines = [line[:, ::8] for line in lines] try: if not plot2d: raise ImportError from viscid.plot import mpl mpl.plt.clf() mpl.plot2d_lines(lines, scalars=topo_color, symdir="y", marker="^") if title: mpl.plt.title(title) mpl.plt.savefig(next_plot_fname(__file__, series="2d")) if show: mpl.plt.show() except ImportError: pass try: if not plot3d: raise ImportError from viscid.plot import mvi try: fig = _global_ns["figure"] mvi.clf() except KeyError: fig = mvi.figure(size=[1200, 800], offscreen=not show) _global_ns["figure"] = fig fld_mag = np.log(viscid.magnitude(_fld)) try: # note: mayavi.mlab.mesh can't take color tuples as scalars # so one can't use topo_color on a mesh surface. This # is a limitation of mayavi. To actually plot a specific # set of colors on a mesh, one must use a texture mesh = mvi.mesh_from_seeds(_seeds, scalars=topo, opacity=0.6) mesh.actor.property.backface_culling = True except RuntimeError: pass mvi.plot_lines(lines, scalars=fld_mag, tube_radius=0.01, cmap="viridis") if title: mvi.title(title) mvi.savefig(next_plot_fname(__file__, series="3d")) if show: mvi.show() except ImportError: pass
def _test(_p1, _p2, r1=None, r2=None, color=(0.8, 0.8, 0.8)): if r1 is not None: _p1 = r1 * np.asarray(_p1) / np.linalg.norm(_p1) if r2 is not None: _p2 = r2 * np.asarray(_p2) / np.linalg.norm(_p2) circ = great_circle(_p1, _p2) if not np.all(np.isclose(circ[:, 0], _p1)): print("!! great circle error P1:", _p1, ", P2:", _p2) print(" first_point:", circ[:, 0], "!= P1") if not np.all(np.isclose(circ[:, -1], _p2)): print("!! great circle error P1:", _p1, ", P2:", _p2) print(" last_point:", circ[:, -1], "!= P2") if _HAS_MVI: mvi.plot_lines([circ], tube_radius=0.02, color=color)
def run_test(_fld, _seeds, plot2d=True, plot3d=True, show=False, **kwargs): lines, topo = viscid.calc_streamlines(_fld, _seeds, **kwargs) topo_fld = _seeds.wrap_field(topo) topo_color = viscid.topology2color(topo) # downsample lines for plotting lines = [line[:, ::8] for line in lines] try: if not plot2d: raise ImportError from viscid.plot import mpl mpl.plt.clf() mpl.plot2d_lines(lines, scalars=topo_color, symdir="y", marker="^") if show: mpl.plt.show() except ImportError: pass try: if not plot3d: raise ImportError from viscid.plot import mvi mvi.clf() fld_mag = np.log(viscid.magnitude(_fld)) try: # note: mayavi.mlab.mesh can't take color tuples as scalars # so one can't use topo_color on a mesh surface. This # is a limitation of mayavi. To actually plot a specific # set of colors on a mesh, one must use a texture vertices, scalars = _seeds.wrap_mesh(topo_fld.data) mesh = mvi.mlab.mesh(vertices[0], vertices[1], vertices[2], scalars=scalars, opacity=0.5) mesh.actor.property.backface_culling = True except RuntimeError: pass mvi.plot_lines(lines, scalars=fld_mag, tube_radius=0.005) if show: mvi.show() except ImportError: pass
def main(): parser = argparse.ArgumentParser(description="Test quasi potential") parser.add_argument("--show", "--plot", action="store_true") args = vutil.common_argparse(parser) b, e = make_arcade(8.0, N=[64, 64, 64]) epar = viscid.project(e, b) epar.pretty_name = "E parallel" ############### # Calculate Xi seeds = viscid.Volume(xl=[-10, 0.0, -10], xh=[10, 0.0, 10], n=[64, 1, 64]) b_lines, _ = viscid.calc_streamlines(b, seeds) xi_dat = viscid.integrate_along_lines(b_lines, e, reduction='dot') xi = seeds.wrap_field(xi_dat, name='xi', pretty_name=r"$\Xi$") ################################ # Make 2D Matplotlib plot of Xi mpl.plot(xi, x=(-10, 10), y=(-10, 10), style='contourf', levels=256, lin=(2e-4, 1.5718)) mpl.plot(xi, x=(-10, 10), y=(-10, 10), style='contour', colors='grey', levels=[0.5, 1.0]) mpl.savefig(next_plot_fname(__file__)) if args.show: mpl.show() ############################################################ # Make 3D mayavi plot of Xi and the 'brightest' field lines # as well as some other field lines for context try: from viscid.plot import mvi except ImportError: xfail("Mayavi not installed") mvi.figure(size=[1200, 800], offscreen=not args.show) inds = np.argsort(xi_dat)[-64:] inds = np.concatenate([inds, np.arange(len(xi_dat))[::71]]) s = mvi.plot_lines(b_lines[inds], scalars=epar, cmap='viridis') mvi.mesh_from_seeds(seeds, scalars=xi, cmap='inferno') mvi.colorbar(s, orientation='horizontal', title=epar.pretty_name) # mvi.streamline(b, scalars=e, seedtype='sphere', seed_resolution=4, # integration_direction='both') oa = mvi.orientation_axes() oa.marker.set_viewport(0.75, 0.75, 1.0, 1.0) mvi.view(roll=0, azimuth=90, elevation=25, distance=30.0, focalpoint=[0, 2, 0]) mvi.savefig(next_plot_fname(__file__)) if args.show: mvi.show()
def main(): parser = argparse.ArgumentParser(description="Test calc") parser.add_argument("--show", "--plot", action="store_true") args = vutil.common_argparse(parser) f3d = viscid.load_file(_viscid_root + '/../sample/sample.3df.[0].xdmf') f_iono = viscid.load_file(_viscid_root + "/../sample/*.iof.[0].xdmf") b = f3d["b"] pp = f3d["pp"] # plot a scalar cut plane of pressure pp_src = mvi.field2source(pp, center='node') scp = mlab.pipeline.scalar_cut_plane(pp_src, plane_orientation='z_axes', transparent=True, opacity=0.5, view_controls=False) scp.implicit_plane.normal = [0, 0, -1] scp.implicit_plane.origin = [0, 0, 0] # i don't know why this log10 doesn't seem to work scp.module_manager.scalar_lut_manager.lut.scale = 'log10' scp.module_manager.scalar_lut_manager.lut_mode = 'Reds' scp.module_manager.scalar_lut_manager.reverse_lut = True scp.module_manager.scalar_lut_manager.show_scalar_bar = True # calculate B field lines && topology in viscid and plot them seeds = viscid.SphericalPatch([0, 0, 0], [2, 0, 1], 30, 15, r=5.0, nalpha=5, nbeta=5) b_lines, topo = viscid.calc_streamlines(b, seeds, ibound=3.5, obound0=[-25, -20, -20], obound1=[15, 20, 20]) mvi.plot_lines(b_lines, scalars=viscid.topology2color(topo)) # Use Mayavi (VTK) to calculate field lines using an interactive seed b_src = mvi.field2source(b, center='node') bsl2 = mlab.pipeline.streamline(b_src, seedtype='sphere', integration_direction='both', seed_resolution=4) bsl2.stream_tracer.maximum_propagation = 20. bsl2.seed.widget.center = [-11, 0, 0] bsl2.seed.widget.radius = 1.0 bsl2.streamline_type = 'tube' bsl2.tube_filter.radius = 0.03 bsl2.stop() # this stop/start was a hack to get something to work? bsl2.start() bsl2.seed.widget.enabled = True # Plot the ionosphere too fac_tot = 1e9 * f_iono['fac_tot'] crd_system = 'gse' m = mvi.plot_ionosphere(fac_tot, crd_system=crd_system, bounding_lat=30.0, vmin=-300, vmax=300, opacity=0.75) m.module_manager.scalar_lut_manager.lut_mode = 'RdBu' m.module_manager.scalar_lut_manager.reverse_lut = True mvi.plot_blue_marble(r=1.0, orientation=(0, 21.5, -45.0)) # now shade the night side with a transparent black hemisphere mvi.plot_earth_3d(radius=1.01, crd_system="gse", night_only=True, opacity=0.5) mlab.axes(pp_src, nb_labels=5) mlab.orientation_axes() mvi.resize([1200, 800]) mlab.view(azimuth=40, elevation=70, distance=35.0, focalpoint=[-3, 0, 0]) # # Save Figure # print("saving png") # mvi.mlab.savefig('mayavi_msphere_sample.png') # print("saving x3d") # # x3d files can be turned into COLLADA files with meshlab, and # # COLLADA (.dae) files can be opened in OS X's preview # # # # IMPORTANT: for some reason, using bounding_lat in mvi.plot_ionosphere # # causes a segfault when saving x3d files # # # mvi.mlab.savefig('mayavi_msphere_sample.x3d') # print("done") if args.show: mlab.show()
def main(): parser = argparse.ArgumentParser(description="Test calc") parser.add_argument("--show", "--plot", action="store_true") parser.add_argument("--interact", "-i", action="store_true") args = vutil.common_argparse(parser) f3d = viscid.load_file(sample_dir + '/sample_xdmf.3d.[0].xdmf') f_iono = viscid.load_file(sample_dir + "/sample_xdmf.iof.[0].xdmf") b = f3d["b"] v = f3d["v"] pp = f3d["pp"] e = f3d["e_cc"] mvi.figure(size=(1200, 800), offscreen=not args.show) ########################################################## # make b a dipole inside 3.1Re and set e = 0 inside 4.0Re cotr = viscid.Cotr(dip_tilt=0.0) # pylint: disable=not-callable moment = cotr.get_dipole_moment(crd_system=b) isphere_mask = viscid.make_spherical_mask(b, rmax=3.1) viscid.fill_dipole(b, m=moment, mask=isphere_mask) e_mask = viscid.make_spherical_mask(b, rmax=4.0) viscid.set_in_region(e, 0.0, alpha=0.0, mask=e_mask, out=e) ###################################### # plot a scalar cut plane of pressure pp_src = mvi.field2source(pp, center='node') scp = mvi.scalar_cut_plane(pp_src, plane_orientation='z_axes', opacity=0.5, transparent=True, view_controls=False, cmap="inferno", logscale=True) scp.implicit_plane.normal = [0, 0, -1] scp.implicit_plane.origin = [0, 0, 0] cbar = mvi.colorbar(scp, title=pp.name, orientation='vertical') ###################################### # plot a vector cut plane of the flow vcp = mvi.vector_cut_plane(v, scalars=pp_src, plane_orientation='z_axes', view_controls=False, mode='arrow', cmap='Greens_r') vcp.implicit_plane.normal = [0, 0, -1] vcp.implicit_plane.origin = [0, 0, 0] ############################## # plot very faint isosurfaces iso = mvi.iso_surface(pp_src, contours=5, opacity=0.1, cmap=False) ############################################################## # calculate B field lines && topology in Viscid and plot them seeds = viscid.SphericalPatch([0, 0, 0], [2, 0, 1], 30, 15, r=5.0, nalpha=5, nbeta=5) b_lines, topo = viscid.calc_streamlines(b, seeds, ibound=3.5, obound0=[-25, -20, -20], obound1=[15, 20, 20], wrap=True) mvi.plot_lines(b_lines, scalars=viscid.topology2color(topo)) ###################################################################### # plot a random circle at geosynchronus orbit with scalars colored # by the Matplotlib viridis color map, just because we can; this is # a useful toy for debugging circle = viscid.Circle(p0=[0, 0, 0], r=6.618, n=128, endpoint=True) scalar = np.sin(circle.as_local_coordinates().get_crd('phi')) surf = mvi.plot_line(circle.get_points(), scalars=scalar, clim=0.8, cmap="Spectral_r") ###################################################################### # Use Mayavi (VTK) to calculate field lines using an interactive seed # These field lines are colored by E parallel epar = viscid.project(e, b) epar.name = "Epar" bsl2 = mvi.streamline(b, epar, seedtype='sphere', seed_resolution=4, integration_direction='both', clim=(-0.05, 0.05)) # now tweak the VTK streamlines bsl2.stream_tracer.maximum_propagation = 20. bsl2.seed.widget.center = [-11, 0, 0] bsl2.seed.widget.radius = 1.0 bsl2.streamline_type = 'tube' bsl2.tube_filter.radius = 0.03 bsl2.stop() # this stop/start was a hack to get something to update bsl2.start() bsl2.seed.widget.enabled = False cbar = mvi.colorbar(bsl2, title=epar.name, orientation='horizontal') cbar.scalar_bar_representation.position = (0.2, 0.01) cbar.scalar_bar_representation.position2 = (0.6, 0.14) ############################################################### # Make a contour at the open-closed boundary in the ionosphere seeds_iono = viscid.Sphere(r=1.063, pole=-moment, ntheta=256, nphi=256, thetalim=(0, 180), philim=(0, 360), crd_system=b) _, topo_iono = viscid.calc_streamlines(b, seeds_iono, ibound=1.0, nr_procs='all', output=viscid.OUTPUT_TOPOLOGY) topo_iono = np.log2(topo_iono) m = mvi.mesh_from_seeds(seeds_iono, scalars=topo_iono, opacity=1.0, clim=(0, 3), color=(0.992, 0.445, 0.0)) m.enable_contours = True #################################################################### # Plot the ionosphere, note that the sample data has the ionosphere # at a different time, so the open-closed boundary found above # will not be consistant with the field aligned currents fac_tot = 1e9 * f_iono['fac_tot'] m = mvi.plot_ionosphere(fac_tot, bounding_lat=30.0, vmin=-300, vmax=300, opacity=0.75, rotate=cotr, crd_system=b) m.actor.property.backface_culling = True ######################################################################## # Add some markers for earth, i.e., real earth, and dayside / nightside # representation mvi.plot_blue_marble(r=1.0, lines=False, ntheta=64, nphi=128, rotate=cotr, crd_system=b) # now shade the night side with a transparent black hemisphere mvi.plot_earth_3d(radius=1.01, night_only=True, opacity=0.5, crd_system=b) #################### # Finishing Touches # mvi.axes(pp_src, nb_labels=5) oa = mvi.orientation_axes() oa.marker.set_viewport(0.75, 0.75, 1.0, 1.0) # note that resize won't work if the current figure has the # off_screen_rendering flag set # mvi.resize([1200, 800]) mvi.view(azimuth=45, elevation=70, distance=35.0, focalpoint=[-2, 0, 0]) ############## # Save Figure # print("saving png") # mvi.savefig('mayavi_msphere_sample.png') # print("saving x3d") # # x3d files can be turned into COLLADA files with meshlab, and # # COLLADA (.dae) files can be opened in OS X's preview # # # # IMPORTANT: for some reason, using bounding_lat in mvi.plot_ionosphere # # causes a segfault when saving x3d files # # # mvi.savefig('mayavi_msphere_sample.x3d') # print("done") mvi.savefig(next_plot_fname(__file__)) ########################### # Interact Programatically if args.interact: mvi.interact() ####################### # Interact Graphically if args.show: mvi.show()
def main(): mhd_type = "C" make_plots = 1 mhd_type = mhd_type.upper() if mhd_type.startswith("C"): if mhd_type in ("C",): f = viscid.load_file("$WORK/tmedium/*.3d.[-1].xdmf") elif mhd_type in ("C2", "C3"): f = viscid.load_file("$WORK/tmedium2/*.3d.[-1].xdmf") else: raise ValueError() catol = 1e-8 rtol = 2e-6 elif mhd_type in ("F", "FORTRAN"): f = viscid.load_file("$WORK/tmedium3/*.3df.[-1]") catol = 1e-8 rtol = 7e-2 else: raise ValueError() do_fill_dipole = True gslc = "x=-21.2f:12f, y=-11f:11f, z=-11f:11f" b = f['b_cc'][gslc] b1 = f['b_fc'][gslc] e_cc = f['e_cc'][gslc] e_ec = f['e_ec'][gslc] if do_fill_dipole: mask = viscid.make_spherical_mask(b, rmax=3.5) viscid.fill_dipole(b, mask=mask) mask = viscid.make_spherical_mask(b1, rmax=3.5) viscid.fill_dipole(b1, mask=mask) mask = None # seeds = viscid.SphericalCap(r=1.02, ntheta=64, nphi=32, angle0=17, angle=20, # philim=(100, 260), roll=-180.0) # seeds = viscid.SphericalCap(r=1.02, ntheta=64, nphi=32, angle0=17, angle=20, # philim=(0, 10), roll=0.0) seedsN = viscid.Sphere(r=1.02, ntheta=16, nphi=16, thetalim=(15, 25), philim=(0, 300), crd_system=b) seedsS = viscid.Sphere(r=1.02, ntheta=16, nphi=16, thetalim=(155, 165), philim=(0, 300), crd_system=b) bl_kwargs = dict(ibound=0.9, obound0=(-20, -10, -10), obound1=(11, 10, 10)) # blines_cc, topo_cc = viscid.streamlines(b, seeds, **bl_kwargs) blinesN_fc, topoN_fc = viscid.streamlines(b1, seedsN, **bl_kwargs) _, topoS_fc = viscid.streamlines(b1, seedsS, output=viscid.OUTPUT_TOPOLOGY, **bl_kwargs) if True: from viscid.plot import mvi mesh = mvi.mesh_from_seeds(seedsN, scalars=topoN_fc) mesh.actor.property.backface_culling = True # mvi.plot_lines(blines_cc, scalars="#000000", tube_radius=0.03) mvi.plot_lines(blinesN_fc, scalars=viscid.topology2color(topoN_fc), opacity=0.7) mvi.plot_blue_marble(r=1.0) mvi.plot_earth_3d(radius=1.01, crd_system=b, night_only=True, opacity=0.5) mvi.show() if True: mpl.subplot(121, projection='polar') mpl.plot(topoN_fc) mpl.subplot(122, projection='polar') mpl.plot(topoS_fc) mpl.show() return 0