def struct_radius_scatter(psi_arr, cur, den): hess = hessian(psi_arr) ntheta = 2 nx, ny = psi_arr.shape psi_grad_x, psi_grad_y = gradient(psi_arr) bmag = np.sqrt(psi_grad_x**2 + psi_grad_y**2) den_x, den_y = gradient(den) den_grad_mag = np.sqrt(den_x**2 + den_y**2) surf = _cp.TopoSurface(psi_arr) regions = surf.get_minmax_regions() res = {} for (minmax, pss, type), region in regions.items(): if len(region) < 50: continue name_2_field = {'bmag': [bmag], 'den': [den], 'cur': [cur], 'psi': [psi_arr], 'hess': [hess], 'den_grad': [den_grad_mag], } for name, (field,) in name_2_field.items(): th_sector = theta_sectors(field, minmax[0], minmax[1], region, ntheta=2)[0] field_radius = r_moment(th_sector['r'],th_sector['val'], th_sector['valstd']) res.setdefault(name, []).append(field_radius) return res
def vis_regions(h5fname, idx, savedir='.'): idx_str = str(idx) dta = tables.openFile(h5fname, 'r') arrs = izip(dta.walkNodes('/psi', 'Array'), dta.walkNodes('/bx', 'Array'), dta.walkNodes('/by', 'Array')) for psi_arr, bx_arr, by_arr in arrs: if not psi_arr.name.endswith(idx_str): continue print psi_arr.name psi_arr = psi_arr.read() psi_arr = psi_arr.astype(np.double) bx_arr = bx_arr.read().astype(np.double) by_arr = by_arr.read().astype(np.double) bmag = bx_arr**2 + by_arr**2 hess = hessian(psi_arr) surf = _cp.TopoSurface(psi_arr) regions = surf.get_minmax_regions().values() bmag_mask = mask_arr(bmag, regions) hess_mask = mask_arr(hess, regions) pl.figure() pl.imshow(bmag, interpolation='nearest', cmap='hot') pl.title(r'$|B|$') pl.colorbar(pad=0.0, shrink=0.9) pl.savefig('%s/bmag-fig.pdf' % savedir) visualize(psi_arr, crit_pts=surf.crit_pts, cmap='hot', save_fig=('%s/psi-crit-pts' % savedir), fig_title=r'$\psi$ with critical points', exts=('.pdf',)) visualize(bmag_mask, cmap='hot', save_fig=('%s/bmag-regions-crit-pts' % savedir), exts=('.pdf',), fig_title=r'$|B|$ regions') visualize(hess, cmap='hot', save_fig=('%s/hessian' % savedir), fig_title=r'$H(\psi)$', exts=('.pdf',)) hess_neg_mask = hess.copy() hess_neg_mask[hess <= 0] = 1.1 * np.min(hess) visualize(hess_mask, cmap='hot', save_fig=('%s/hess-regions' % savedir), fig_title=r'$H(\psi)$ regions', exts=('.pdf',)) visualize(hess_neg_mask, cmap='hot', save_fig=('%s/hess-neg-mask' % savedir), fig_title=r'$H(\psi)$, negative regions masked', exts=('.pdf',)) dta.close()
def mag_shear_theta_sectors(psi_arr, cur, den, thresh=100, save_basename='field-vs-r'): hess = hessian(psi_arr) ntheta = 2 nx, ny = psi_arr.shape psi_grad_x, psi_grad_y = gradient(psi_arr) bmag = np.sqrt(psi_grad_x**2 + psi_grad_y**2) den_x, den_y = gradient(den) den_grad_mag = np.sqrt(den_x**2 + den_y**2) # pl.ion() # pl.figure() # pl.imshow(bmag, interpolation='nearest', cmap='hot') surf = _cp.TopoSurface(psi_arr) regions = surf.get_minmax_regions() pl.figure(figsize=(9,12)) nr = 6 nc = 2 ctr = 0 for (minmax, pss, type), region in regions.items(): if len(region) < thresh: continue ctr += 1 print ctr gs = gridspec.GridSpec(nr, nc, width_ratios=[1,2], hspace=0.0) nbr_func = lambda t: _cp.neighbors6(t[0], t[1], nx, ny) lset = field_trace._level_set(psi_arr, level_val=psi_arr[pss], position=pss, neighbors_func=nbr_func) bx = -psi_grad_y by = psi_grad_x br, btheta = cartesian_to_polar(bx, by, minmax[0], minmax[1]) region = expand_region_circ(psi_arr, region, minmax, extra=2.0) lset = lset.intersection(region) # psi ax = pl.subplot(gs[0]) ax.set_title("Field & separatrix", size='x-large') field_region_image(ax, psi_arr, region, minmax, lset, title=r'$\psi$') # ax = pl.subplot2grid((nr, nc), (0, 1)) ax = pl.subplot(gs[1]) ax.set_title(r"Field vs. $r/\rho_s$ (id={0})".format(ctr), size='x-large') plot_theta_sectors(ax, psi_arr, minmax, region, ntheta, title=r'$\psi$ vs. $r/\rho_s$') # b_theta ax = pl.subplot(gs[2]) # field_region_image(ax, btheta, region, minmax, lset, title=r'$B_{\theta}$') field_region_image(ax, bmag, region, minmax, lset, title=r'$|B|$') ax = pl.subplot(gs[3]) # btheta_sectors = plot_theta_sectors(ax, btheta, minmax, region, ntheta, title=r'$B_{\theta}$ vs. $r/\rho_s$') plot_theta_sectors(ax, bmag, minmax, region, ntheta, title=r'$|B|$ vs. $r/\rho_s$') # b_shear # pl.subplot(nr, nc, 5) # field_region_image(btheta, region, minmax, lset, title=r'$B_{\theta}$') # pl.subplot(nr, nc, 6) # plot_sect_derivs_by_r(btheta_sectors, title=r'$\partial_{r} \frac{B_{\theta}}{r}$ vs. $r/\rho_s$') # den ax = pl.subplot(gs[4]) field_region_image(ax, den, region, minmax, lset, title=r'$n$') ax = pl.subplot(gs[5]) plot_theta_sectors(ax, den, minmax, region, ntheta, title=r'$n$ vs. $r/\rho_s$') # den_grad ax = pl.subplot(gs[6]) field_region_image(ax, den_grad_mag, region, minmax, lset, title=r'$|\nabla n|$') ax = pl.subplot(gs[7]) plot_theta_sectors(ax, den_grad_mag, minmax, region, ntheta, title=r'$|\nabla n|$ vs. $r/\rho_s$') # cur ax = pl.subplot(gs[8]) field_region_image(ax, cur, region, minmax, lset, title=r'$J$') ax = pl.subplot(gs[9]) plot_theta_sectors(ax, cur, minmax, region, ntheta, title=r'$J$ vs. $r/\rho_s$') # hessian ax = pl.subplot(gs[10]) field_region_image(ax, hess, region, minmax, lset, title=r'$H(\psi)$', xvis=True) ax = pl.subplot(gs[11]) ax.set_xlabel(r'$r/\rho_s$', size='x-large') plot_theta_sectors(ax, hess, minmax, region, ntheta, title=r'$H(\psi)$ vs. $r/\rho_s$', xvis=True) # raw_input('enter to continue') pl.savefig('{0}_{1:04d}.pdf'.format(save_basename, ctr)) pl.clf() pl.close('all')