Source code for magic.TOreaders

# -*- coding: utf-8 -*-
import glob
import re
import os
import copy
import numpy as np
import matplotlib.pyplot as plt
from .npfile import npfile
from .movie import Movie
from .log import MagicSetup
from .libmagic import scanDir


[docs]class TOMovie(Movie): """ This class allows to read and display the :ref:`TO_mov.TAG <secTO_movieFile>` generated when :ref:`l_TOmovie=.true. <varl_TOmovie>` is True. >>> # This will allow you to pick up one TO_mov files among the existing ones >>> t = TOMovie() >>> # Read TO_mov.N0m2, time-averaged it and display it with 65 contour levels >>> t = TOMovie(file='TO_mov.N0m2', avg=True, levels=65, cm='seismic') """
[docs] def __init__(self, file=None, iplot=True, cm='seismic', datadir='.', cut=0.5, levels=33, avg=True, precision=np.float32, lastvar=None, nvar='all'): """ :param file: the filename of the TO_mov file :type file: str :param nvar: the number of frames of the movie file we want to plot starting from the last line :type nvar: int :param lastvar: the index of the last timesteps to be read :type lastvar: int :param cm: the name of the color map :type cm: str :param levels: the number of contour levels :type levels: int :param cut: adjust the contour extrema to max(abs(data))*cut :type cut: float :param iplot: a boolean to specify if one wants to plot or not the results :type iplot: bool :param avg: time average of the different forces :type avg: bool :param precision: precision of the input file, np.float32 for single precision, np.float64 for double precision :type precision: str :param datadir: working directory :type datadir: str """ if file is None: dat = glob.glob('TO_mov.*') str1 = 'Which TO movie do you want ?\n' for k, movie in enumerate(dat): str1 += ' {}) {}\n'.format(k+1, movie) index = int(input(str1)) try: filename = dat[index-1] except IndexError: print('Non valid index: {} has been chosen instead'.format(dat[0])) filename = dat[0] else: filename = file filename = os.path.join(datadir, filename) # Get the version self._get_version(filename) # Read the movie file infile = npfile(filename, endian='B') # Header self._read_header(infile, 0, precision) if self.n_fields == 8: self.l_phase = True else: self.l_phase = False # Get the number of lines self._get_nlines(datadir, filename, nvar, lastvar) # Shape self._get_data_shape(precision, allocate=False) self.time = np.zeros(self.nvar, precision) self.asVphi = np.zeros((self.nvar, self.n_theta_max, self.n_r_max), precision) self.rey = np.zeros_like(self.asVphi) self.adv = np.zeros_like(self.asVphi) self.visc = np.zeros_like(self.asVphi) self.lorentz = np.zeros_like(self.asVphi) self.coriolis = np.zeros_like(self.asVphi) self.dtVp = np.zeros_like(self.asVphi) if self.l_phase: self.penalty = np.zeros_like(self.asVphi) # Read the data # If one skip the beginning, nevertheless read but do not store for i in range(self.var2-self.nvar): if self.version == 2: n_frame, t_movieS, omega_ic, omega_ma, movieDipColat, \ movieDipLon, movieDipStrength, movieDipStrengthGeo = \ infile.fort_read(precision) else: t_movieS = infile.fort_read(precision) for ll in range(self.n_fields): dat = infile.fort_read(precision, shape=self.shape, order='F') for k in range(self.nvar): if self.version == 2: n_frame, t_movieS, omega_ic, omega_ma, movieDipColat, \ movieDipLon, movieDipStrength, movieDipStrengthGeo \ = infile.fort_read(precision) else: t_movieS = infile.fort_read(precision) self.time[k] = t_movieS self.asVphi[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.rey[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.adv[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.visc[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.lorentz[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.coriolis[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') self.dtVp[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') if self.l_phase: self.penalty[k, ...] = infile.fort_read(precision, shape=self.shape, order='F') if iplot: cmap = plt.get_cmap(cm) self.plot(cut, levels, avg, cmap)
[docs] def __add__(self, new): """ Built-in function to sum two TO movies .. note:: So far this function only works for two TO movies with the same grid sizes. At some point, we might introduce grid extrapolation to allow any summation. """ out = copy.deepcopy(new) if new.time[0] == self.time[-1]: out.time = np.concatenate((self.time, new.time[1:]), axis=0) out.asVphi = np.concatenate((self.asVphi, new.asVphi[1:, ...]), axis=0) out.rey = np.concatenate((self.rey, new.rey[1:, ...]), axis=0) out.adv = np.concatenate((self.adv, new.adv[1:, ...]), axis=0) out.visc = np.concatenate((self.visc, new.visc[1:, ...]), axis=0) out.lorentz = np.concatenate((self.lorentz, new.lorentz[1:, ...]), axis=0) out.coriolis = np.concatenate((self.coriolis, new.coriolis[1:, ...]), axis=0) out.dtVp = np.concatenate((self.dtVp, new.dtVp[1:, ...]), axis=0) if self.l_phase: out.penalty = np.concatenate((self.penalty, new.penalty[1:, ...]), axis=0) else: out.time = np.concatenate((self.time, new.time), axis=0) out.asVphi = np.concatenate((self.asVphi, new.asVphi), axis=0) out.rey = np.concatenate((self.rey, new.rey), axis=0) out.adv = np.concatenate((self.adv, new.adv), axis=0) out.visc = np.concatenate((self.visc, new.visc), axis=0) out.lorentz = np.concatenate((self.lorentz, new.lorentz), axis=0) out.coriolis = np.concatenate((self.coriolis, new.coriolis), axis=0) out.dtVp = np.concatenate((self.dtVp, new.dtVp), axis=0) if self.l_phase: out.penalty = np.concatenate((self.penalty, new.penalty), axis=0) return out
[docs] def plot(self, cut=0.8, levs=16, avg=True, cmap='RdYlBu_r'): """ Plotting function :param cut: adjust the contour extrema to max(abs(data))*cut :type cut: float :param levs: number of contour levels :type levs: int :param avg: when set to True, quantities are time-averaged :type avg: bool :param cmap: name of the colormap :type cmap: str """ th = np.linspace(np.pi/2., -np.pi/2., self.n_theta_max) rr, tth = np.meshgrid(self.radius, th) xx = rr * np.cos(tth) yy = rr * np.sin(tth) xxout = rr.max() * np.cos(th) yyout = rr.max() * np.sin(th) xxin = rr.min() * np.cos(th) yyin = rr.min() * np.sin(th) fig = plt.figure(figsize=(20, 5)) fig.subplots_adjust(top=0.99, right=0.99, bottom=0.01, left=0.01, wspace=0.01) if avg: cor = self.coriolis.mean(axis=0) asVp = self.asVphi.mean(axis=0) rey = self.rey.mean(axis=0) adv = self.adv.mean(axis=0) lor = self.lorentz.mean(axis=0) vis = self.visc.mean(axis=0) if self.l_phase: pen = self.penalty.mean(axis=0) dt = self.dtVp[:-1].mean(axis=0) vmin = - max(abs(cor.max()), abs(cor.min())) vmin = cut * vmin vmax = -vmin cs = np.linspace(vmin, vmax, levs) vmin = - max(abs(asVp.max()), abs(asVp.min())) vmin = cut * vmin vmax = -vmin csVp = np.linspace(vmin, vmax, levs) ax = fig.add_subplot(181) ax.axis('off') im = ax.contourf(xx, yy, asVp, csVp, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'uphi', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(182) ax.axis('off') im = ax.contourf(xx, yy, adv, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'Adv', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(183) ax.axis('off') im = ax.contourf(xx, yy, rey, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'Rey', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(184) ax.axis('off') im = ax.contourf(xx, yy, vis, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'Visc', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(185) ax.axis('off') im = ax.contourf(xx, yy, lor, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'Lo.', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(186) ax.axis('off') im = ax.contourf(xx, yy, cor, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'Cor.', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(187) ax.axis('off') balance = adv+cor+vis+lor+rey if self.l_phase: balance += pen im = ax.contourf(xx, yy, balance, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.05, 0., 'sum', fontsize=20, horizontalalignment='left', verticalalignment='center') ax = fig.add_subplot(188) ax.axis('off') im = ax.contourf(xx, yy, dt, cs, cmap=cmap, extend='both') ax.plot(xxout, yyout, 'k-', lw=1.5) ax.plot(xxin, yyin, 'k-', lw=1.5) ax.text(0.01, 0., 'dvp/dt', fontsize=20, horizontalalignment='left', verticalalignment='center') else: plt.ion() vmin = - max(abs(self.coriolis.max()), abs(self.coriolis.min())) vmin = cut * vmin vmax = -vmin cs = np.linspace(vmin, vmax, levs) vmin = - max(abs(self.asVphi.max()), abs(self.asVphi.min())) vmin = cut * vmin vmax = -vmin cs1 = np.linspace(vmin, vmax, levs) for k in range(self.nvar-1): # avoid last dvp/dt which is wrong bal = self.asVphi[k, ...]+self.adv[k, ...]+self.rey[k, ...] + \ self.visc[k, ...]+self.lorentz[k, ...] + \ self.coriolis[k, ...] if k == 0: ax1 = fig.add_subplot(181) ax1.axis('off') im = ax1.contourf(xx, yy, self.asVphi[k, ...], cs1, cmap=cmap, extend='both') ax1.plot(xxout, yyout, 'k-', lw=1.5) ax1.plot(xxin, yyin, 'k-', lw=1.5) ax1.text(0.05, 0., 'uphi', fontsize=20, horizontalalignment='left', verticalalignment='center') ax2 = fig.add_subplot(182) ax2.axis('off') im = ax2.contourf(xx, yy, self.adv[k, ...], cs, cmap=cmap, extend='both') ax2.plot(xxout, yyout, 'k-', lw=1.5) ax2.plot(xxin, yyin, 'k-', lw=1.5) ax2.text(0.05, 0., 'Adv', fontsize=20, horizontalalignment='left', verticalalignment='center') ax3 = fig.add_subplot(183) ax3.axis('off') im = ax3.contourf(xx, yy, self.rey[k, ...], cs, cmap=cmap, extend='both') ax3.plot(xxout, yyout, 'k-', lw=1.5) ax3.plot(xxin, yyin, 'k-', lw=1.5) ax3.text(0.05, 0., 'Rey', fontsize=20, horizontalalignment='left', verticalalignment='center') ax4 = fig.add_subplot(184) ax4.axis('off') im = ax4.contourf(xx, yy, self.visc[k, ...], cs, cmap=cmap, extend='both') ax4.plot(xxout, yyout, 'k-', lw=1.5) ax4.plot(xxin, yyin, 'k-', lw=1.5) ax4.text(0.05, 0., 'Visc', fontsize=20, horizontalalignment='left', verticalalignment='center') ax5 = fig.add_subplot(185) ax5.axis('off') im = ax5.contourf(xx, yy, self.lorentz[k, ...], cs, cmap=cmap, extend='both') ax5.plot(xxout, yyout, 'k-', lw=1.5) ax5.plot(xxin, yyin, 'k-', lw=1.5) ax5.text(0.05, 0., 'Lo.', fontsize=20, horizontalalignment='left', verticalalignment='center') ax6 = fig.add_subplot(186) ax6.axis('off') im = ax6.contourf(xx, yy, self.coriolis[k, ...], cs, cmap=cmap, extend='both') ax6.plot(xxout, yyout, 'k-', lw=1.5) ax6.plot(xxin, yyin, 'k-', lw=1.5) ax6.text(0.05, 0., 'Cor.', fontsize=20, horizontalalignment='left', verticalalignment='center') ax7 = fig.add_subplot(187) ax7.axis('off') im = ax7.contourf(xx, yy, bal, cs, cmap=cmap, extend='both') ax7.plot(xxout, yyout, 'k-', lw=1.5) ax7.plot(xxin, yyin, 'k-', lw=1.5) ax7.text(0.05, 0., 'sum', fontsize=20, horizontalalignment='left', verticalalignment='center') ax8 = fig.add_subplot(188) ax8.axis('off') im = ax8.contourf(xx, yy, self.dtVp[k, ...], cs, cmap=cmap, extend='both') ax8.plot(xxout, yyout, 'k-', lw=1.5) ax8.plot(xxin, yyin, 'k-', lw=1.5) ax8.text(0.05, 0., 'dvp/dt', fontsize=20, horizontalalignment='left', verticalalignment='center') man = plt.get_current_fig_manager() man.canvas.draw() else: plt.cla() ax1.contourf(xx, yy, self.asVphi[k, ...], cs1, cmap=cmap, extend='both') ax2.contourf(xx, yy, self.adv[k, ...], cs, cmap=cmap, extend='both') ax3.contourf(xx, yy, self.rey[k, ...], cs, cmap=cmap, extend='both') ax4.contourf(xx, yy, self.visc[k, ...], cs, cmap=cmap, extend='both') ax5.contourf(xx, yy, self.lorentz[k, ...], cs, cmap=cmap, extend='both') ax6.contourf(xx, yy, self.coriolis[k, ...], cs, cmap=cmap, extend='both') ax7.contourf(xx, yy, bal, cs, cmap=cmap, extend='both') ax8.contourf(xx, yy, self.dtVp[k, ...], cs, cmap=cmap, extend='both') plt.axis('off') man.canvas.draw()
class MagicTOZ(MagicSetup): """ This class can be used to read the TOZ.TAG files produced by the TO outputs >>> # read the content of TOZ_1.tag >>> # where tag is the most recent file in the current directory >>> toz = MagicTOZ(itoz=1) >>> # read the content of TOZ_ave.test >>> toz = MagicTOZ(tag='test', ave=True) """ def __init__(self, datadir='.', itoz=None, tag=None, precision=np.float32, ave=False): """ :param datadir: current working directory :type datadir: str :param tag: file suffix (tag), if not specified the most recent one in the current directory is chosen :type tag: str :param precision: single or double precision :type precision: str :param iplot: display the output plot when set to True (default is True) :type iplot: bool :param ave: plot a time-averaged TOZ file when set to True :type ave: bool :param itoz: the number of the TOZ file you want to plot :type itoz: int """ if ave: self.name = 'TOZ_ave' n_fields = 9 else: self.name = 'TOZ_' n_fields = 8 if tag is not None: if itoz is not None: file = '{}{}.{}'.format(self.name, itoz, tag) filename = os.path.join(datadir, file) else: pattern = os.path.join(datadir, '{}*{}'.format(self.name, tag)) files = scanDir(pattern) if len(files) != 0: filename = files[-1] else: print('No such tag... try again') return if os.path.exists(os.path.join(datadir, 'log.{}'.format(tag))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(tag)) else: if itoz is not None: pattern = os.path.join(datadir, '{}{}*'.format(self.name, itoz)) files = scanDir(pattern) filename = files[-1] else: pattern = os.path.join(datadir, '{}*'.format(self.name)) files = scanDir(pattern) filename = files[-1] # Determine the setup mask = re.compile(r'.*\.(.*)') ending = mask.search(files[-1]).groups(0)[0] if os.path.exists(os.path.join(datadir, 'log.{}'.format(ending))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(ending)) infile = npfile(filename, endian='B') if ave: self.nSmax, self.omega_ic, self.omega_oc = infile.fort_read(precision) else: self.time, self.nSmax, self.omega_ic, \ self.omega_oc = infile.fort_read(precision) self.nSmax = int(self.nSmax) self.cylRad = infile.fort_read(precision) self.zall = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.vp = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.dvp = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.Rstr = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.Astr = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.LF = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.Cor = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.visc = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) self.cylRadall = np.zeros_like(self.zall) for i in range(2*self.nSmax): self.cylRadall[i, :] = self.cylRad[:] if n_fields == 9: self.CL = np.zeros((2*self.nSmax, self.nSmax), dtype=precision) for nS in range(self.nSmax): nZmaxNS = int(infile.fort_read(precision)) print(nZmaxNS) data = infile.fort_read(precision) data = data.reshape((n_fields, nZmaxNS)) self.zall[:nZmaxNS, nS] = data[0, :] self.vp[:nZmaxNS, nS] = data[1, :] self.dvp[:nZmaxNS, nS] = data[2, :] self.Rstr[:nZmaxNS, nS] = data[3, :] self.Astr[:nZmaxNS, nS] = data[4, :] self.LF[:nZmaxNS, nS] = data[5, :] self.visc[:nZmaxNS, nS] = data[6, :] self.Cor[:nZmaxNS, nS] = data[7, :] if n_fields == 9: self.CL[:nZmaxNS, nS] = data[8, :] infile.close() S = np.zeros_like(self.zall) for i in range(2*self.nSmax): S[i, :] = self.cylRad
[docs]class MagicTOHemi(MagicSetup): """ This class can be used to read and display z-integrated quantities produced by the TO outputs. Those are basically the TO[s|n]hn.TAG files >>> to = MagicTOHemi(hemi='n', iplot=True) # For the Northern hemisphere """
[docs] def __init__(self, datadir='.', hemi='n', tag=None, precision=np.float32, iplot=False): """ :param datadir: current working directory :type datadir: str :param hemi: Northern or Southern hemisphere ('n' or 's') :type hemi: str :param tag: file suffix (tag), if not specified the most recent one in the current directory is chosen :type tag: str :param precision: single or double precision :type precision: str :param iplot: display the output plot when set to True (default is True) :type iplot: bool """ if tag is not None: pattern = os.path.join(datadir, 'TO{}hs.{}'.format(hemi, tag)) files = scanDir(pattern) if len(files) != 0: filename = files[-1] else: print('No such tag... try again') return if os.path.exists(os.path.join(datadir, 'log.{}'.format(tag))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(tag)) else: pattern = os.path.join(datadir, 'TO{}hs.*'.format(hemi)) files = scanDir(pattern) filename = files[-1] # Determine the setup mask = re.compile(r'.*\.(.*)') ending = mask.search(files[-1]).groups(0)[0] if os.path.exists(os.path.join(datadir, 'log.{}'.format(ending))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(ending)) if not os.path.exists(filename): print('No such file') return infile = npfile(filename, endian='B') self.nSmax = int(infile.fort_read(precision)) self.cylRad = infile.fort_read(precision) self.height = np.zeros_like(self.cylRad) ro = self.cylRad[0] ri = ro - 1. self.height[self.cylRad>=ri] = 2.*np.sqrt(ro**2-self.cylRad[self.cylRad>=ri]**2) self.height[self.cylRad<ri] = np.sqrt(ro**2-self.cylRad[self.cylRad<ri]**2) - \ np.sqrt(ri**2-self.cylRad[self.cylRad<ri]**2) ind = 0 while 1: try: data = infile.fort_read(precision) if ind == 0: self.time = np.r_[data[0]] else: self.time = np.append(self.time, data[0]) data = data[1:] data = data.reshape((17, self.nSmax)) if ind == 0: self.vp = data[0, :] self.dvp = data[1, :] self.ddvp = data[2, :] self.vpr = data[3, :] self.rstr = data[4, :] self.astr = data[5, :] self.LF = data[6, :] self.viscstr = data[7, :] self.tay = data[8, :] self.Tau = data[9, :] self.TauB = data[10, :] self.BspdInt = data[11, :] self.BpsdInt = data[12, :] self.dTau = data[13, :] self.dTTau = data[14, :] self.dTTauB = data[15, :] self.Bs2 = data[16, :] else: self.vp = np.vstack((self.vp, data[0, :])) self.dvp = np.vstack((self.dvp, data[1, :])) self.ddvp = np.vstack((self.ddvp, data[2, :])) self.vpr = np.vstack((self.vpr, data[3, :])) self.rstr = np.vstack((self.rstr, data[4, :])) self.astr = np.vstack((self.astr, data[5, :])) self.LF = np.vstack((self.LF, data[6, :])) self.viscstr = np.vstack((self.viscstr, data[7, :])) self.tay = np.vstack((self.tay, data[8, :])) self.Tau = np.vstack((self.Tau, data[9, :])) self.TauB = np.vstack((self.TauB, data[10, :])) self.BspdInt = np.vstack((self.BspdInt, data[11, :])) self.BpsdInt = np.vstack((self.BpsdInt, data[12, :])) self.dTau = np.vstack((self.dTau, data[13, :])) self.dTTau = np.vstack((self.dTTau, data[14, :])) self.dTTauB = np.vstack((self.dTTauB, data[15, :])) self.Bs2 = np.vstack((self.Bs2, data[16, :])) ind += 1 except TypeError: break infile.close() if iplot: self.plot()
[docs] def __add__(self, new): """ This is an intrinsic '+' method to stack to TO[n|s]hs.TAG files .. note:: So far, this only works if the grid resolution does not change """ out = copy.deepcopy(new) if new.time[0] == self.time[-1]: out.time = np.concatenate((self.time, new.time[1:]), axis=0) out.vp = np.concatenate((self.vp, new.vp[1:, ...]), axis=0) out.dvp = np.concatenate((self.dvp, new.dvp[1:, ...]), axis=0) out.ddvp = np.concatenate((self.ddvp, new.ddvp[1:, ...]), axis=0) out.tay = np.concatenate((self.tay, new.tay[1:, ...]), axis=0) out.rstr = np.concatenate((self.rstr, new.rstr[1:, ...]), axis=0) out.astr = np.concatenate((self.astr, new.astr[1:, ...]), axis=0) out.viscstr = np.concatenate((self.viscstr, new.viscstr[1:, ...]), axis=0) out.LF = np.concatenate((self.LF, new.LF[1:, ...]), axis=0) out.Bs2 = np.concatenate((self.Bs2, new.Bs2[1:, ...]), axis=0) else: out.time = np.concatenate((self.time, new.time), axis=0) out.vp = np.concatenate((self.vp, new.vp), axis=0) out.dvp = np.concatenate((self.dvp, new.dvp), axis=0) out.ddvp = np.concatenate((self.ddvp, new.ddvp), axis=0) out.tay = np.concatenate((self.tay, new.tay), axis=0) out.rstr = np.concatenate((self.rstr, new.rstr), axis=0) out.astr = np.concatenate((self.astr, new.astr), axis=0) out.viscstr = np.concatenate((self.viscstr, new.viscstr), axis=0) out.LF = np.concatenate((self.LF, new.LF), axis=0) out.Bs2 = np.concatenate((self.Bs2, new.Bs2), axis=0) return out
[docs] def plot(self): """ Plotting function """ fig = plt.figure() ax = fig.add_subplot(111) ax.plot(self.cylRad, self.vp.mean(axis=0)) ax.set_xlabel('Cylindrical radius') ax.axhline(linestyle='--', linewidth=1.5, color='k') ax.set_ylabel('Vphi') #ax.set_xlim(self.cylRad[0], self.cylRad[-1]) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(self.cylRad, self.rstr.mean(axis=0), label='Reynolds stress') ax.plot(self.cylRad, self.astr.mean(axis=0), label='Axi. Reynolds stress') ax.plot(self.cylRad, self.LF.mean(axis=0), label='Lorentz force') ax.plot(self.cylRad, self.viscstr.mean(axis=0), label='Viscous stress') ax.set_xlabel('Cylindrical radius') ax.set_ylabel('Integrated forces') ax.legend(loc='upper left', frameon=False)
#ax.set_xlim(self.cylRad[0], self.cylRad[-1]) class MagicTaySphere(MagicSetup): """ This class can be used to read and display quantities produced by the TO outputs. Those are basically the TaySphere.TAG files >>> to = MagicTaySphere(iplot=True) # For the Northern hemisphere >>> print(to.time, to.e_kin) """ def __init__(self, datadir='.', tag=None, precision=np.float32, iplot=False): """ :param datadir: current working directory :type datadir: str :param tag: file suffix (tag), if not specified the most recent one in the current directory is chosen :type tag: str :param precision: single or double precision :type precision: str :param iplot: display the output plot when set to True (default is True) :type iplot: bool """ if tag is not None: pattern = os.path.join(datadir, 'TaySphere.{}'.format(tag)) files = scanDir(pattern) if len(files) != 0: filename = files[-1] else: print('No such tag... try again') return if os.path.exists(os.path.join(datadir, 'log.{}'.format(tag))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(tag)) else: pattern = os.path.join(datadir, 'TaySphere.*') files = scanDir(pattern) filename = files[-1] # Determine the setup mask = re.compile(r'.*\.(.*)') ending = mask.search(files[-1]).groups(0)[0] if os.path.exists(os.path.join(datadir, 'log.{}'.format(ending))): MagicSetup.__init__(self, datadir=datadir, quiet=True, nml='log.{}'.format(ending)) if not os.path.exists(filename): print('No such file') return infile = npfile(filename, endian='B') self.n_r_max = int(infile.fort_read(precision)) self.radius = infile.fort_read(precision) ind = 0 while 1: try: data = infile.fort_read(precision) if ind == 0: self.time = np.r_[data[0]] self.vpRMS = np.r_[data[1]] self.vgRMS = np.r_[data[2]] self.tayRMS = np.r_[data[3]] self.taySRMS = np.r_[data[4]] self.tayRRMS = np.r_[data[5]] self.tayVRMS = np.r_[data[6]] self.e_kin = np.r_[data[7]] else: self.time = np.append(self.time, data[0]) self.vpRMS = np.append(self.vgRMS, data[1]) self.vgRMS = np.append(self.vgRMS, data[2]) self.tayRMS = np.append(self.tayRMS, data[3]) self.taySRMS = np.append(self.taySRMS, data[4]) self.tayRRMS = np.append(self.tayRRMS, data[5]) self.tayVRMS = np.append(self.tayVRMS, data[6]) self.e_kin = np.append(self.e_kin, data[7]) data = data[8:] data = data.reshape((8, self.n_r_max)) if ind == 0: self.vp = data[0, :] self.dvp = data[1, :] self.rstr = data[2, :] self.astr = data[3, :] self.LF = data[4, :] self.viscstr = data[5, :] self.cor = data[6, :] self.tay = data[7, :] else: self.vp = np.vstack((self.vp, data[0, :])) self.dvp = np.vstack((self.dvp, data[1, :])) self.rstr = np.vstack((self.rstr, data[2, :])) self.astr = np.vstack((self.astr, data[3, :])) self.LF = np.vstack((self.LF, data[4, :])) self.viscstr = np.vstack((self.viscstr, data[5, :])) self.cor = np.vstack((self.cor, data[6, :])) self.tay = np.vstack((self.tay, data[7, :])) ind += 1 except TypeError: break infile.close() if iplot: self.plot() def plot(self): """ Plotting function """ fig = plt.figure() ax = fig.add_subplot(111) ax.plot(self.radius, self.vp.mean(axis=0)) ax.set_xlabel('Radius') ax.axhline(linestyle='--', linewidth=1.5, color='k') ax.set_ylabel('Vphi') ax.set_xlim(self.radius[0], self.radius[-1]) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(self.radius, self.rstr.mean(axis=0), label='Reynolds stress') ax.plot(self.radius, self.astr.mean(axis=0), label='Axi. Reynolds stress') ax.plot(self.radius, self.LF.mean(axis=0), label='Lorentz force') ax.plot(self.radius, self.viscstr.mean(axis=0), label='Viscous stress') ax.set_xlabel('Radius') ax.set_ylabel('Forces') ax.legend(loc='upper left', frameon=False) ax.set_xlim(self.radius[0], self.radius[-1]) if __name__ == '__main__': MagicTOZ(tag='start', itoz=1, ave=False, verbose=True) MagicTOHemi(hemi='n', iplot=True) file = 'TO_mov.test' TOMovie(file=file) plt.show()