From c16db3224f12a1f0505537c3035a8738c88e7c24 Mon Sep 17 00:00:00 2001 From: Jorge Morales Date: Wed, 30 Oct 2019 13:54:04 +0100 Subject: [PATCH 1/5] -Add 10 magnetic lines traced around torus, input and dR_sep input possible --- tofu/utils.py | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/tofu/utils.py b/tofu/utils.py index 7679c6864..e8b2c3603 100644 --- a/tofu/utils.py +++ b/tofu/utils.py @@ -623,7 +623,7 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, occ=None, indch=None, indDescription=None, equilibrium=None, dsig=None, data=None, X=None, t0=None, dextra=None, plot=True, plot_sig=None, plot_X=None, sharex=False, - bck=True, indch_auto=True, t=None, init=None): + bck=True, indch_auto=True, t=None, init=None, dR_sep=None): # ------------------- # import imas2tofu try: @@ -677,11 +677,33 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, assert shot.size == 1 import tofu.mag as tfm plot = True + + multi = imas2tofu.MultiIDSLoader(shot=shot[0], run=run, user=user, + tokamak=tokamak, version=version, + ids='equilibrium') + equi = multi.to_Plasma2D() + if t is None: - t = np.r_[38] + # Get time in the middle of equilibrium time interval + t = equi.ddata['equilibrium.t']['data'][int(0.5*equi.ddata['equilibrium.t']['data'].size)] + #t = np.r_[38] t = np.atleast_1d(t).ravel() if init is None: - init = [[2.9],[0.],[0.]] + equi_ind_t = np.abs(t - equi.ddata['equilibrium.t']['data']).argmin() + equi_ind_r_ext = np.argmax(equi.ddata['equilibrium.sep']['data'][equi_ind_t][0]) + equi_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][0][equi_ind_r_ext] + equi_z_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][1][equi_ind_r_ext] + + nbr_init = 10 + if dR_sep is not None: + r_init = [equi_r_ext + dR_sep]*nbr_init + else: + r_init = [equi_r_ext]*nbr_init + phi_init = [ii*2.*np.pi/nbr_init for ii in range(nbr_init)] + z_init = [equi_z_r_ext]*nbr_init + init = [r_init, phi_init, z_init] + #init = [[2.9, 2.9, 2.9, 2.9], [0., np.pi/2, np.pi, 3.*np.pi/2], [0., 0., 0., 0.]] + #init = [[2.9], [0.], [0.]] if False: multi = imas2tofu.MultiIDSLoader(shot=shot[0], run=run, user=user, @@ -690,16 +712,22 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, config = multi.to_Config(plot=False) else: import tofu.geom as tfg - config = tfg.utils.create_config('B2') + config = tfg.utils.create_config('B3') if config.nStruct > 1: config.set_colors_random() trace = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, direction='FWD', - length_line=None, + length_line=25, + stp=None) + trace_rev = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, + direction='REV', + length_line=25, stp=None) refpt = np.r_[2.4,0.] dax = config.plot_phithetaproj_dist(refpt) for ii in range(0,len(trace)): + # Concatenate trace lists + trace[ii] = trace[ii] + trace_rev[ii] for jj in range(0,len(trace[ii])): lab = r't = %s s'%str(t[ii]) phi = np.arctan2(np.sin(trace[ii][jj]['p']), np.cos(trace[ii][jj]['p'])) From 33c865affafcc12a2321a49e91c67297558049ec Mon Sep 17 00:00:00 2001 From: Jorge Morales Date: Tue, 8 Oct 2019 17:01:47 +0200 Subject: [PATCH 2/5] -Add test script for doctest --- tofu/mag/test_magFieldLines.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tofu/mag/test_magFieldLines.py diff --git a/tofu/mag/test_magFieldLines.py b/tofu/mag/test_magFieldLines.py new file mode 100644 index 000000000..9f955a7c1 --- /dev/null +++ b/tofu/mag/test_magFieldLines.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# Also if needed: retab +''' + TEST magFieldLines +''' +from __future__ import (unicode_literals, absolute_import, \ + print_function, division) +import doctest +import os +import sys + +#print('path 1 =', sys.path) +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +#print('path 2 =', sys.path) + +#import mag +from mag import magFieldLines + +doctest.testmod(magFieldLines, verbose=True) From 90f997959065c07b2e51492876612065fc171ae7 Mon Sep 17 00:00:00 2001 From: Jorge Morales Date: Wed, 30 Oct 2019 13:58:53 +0100 Subject: [PATCH 3/5] -Remove blank spaces --- tofu/mag/test_magFieldLines.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tofu/mag/test_magFieldLines.py b/tofu/mag/test_magFieldLines.py index 9f955a7c1..a6205e5da 100644 --- a/tofu/mag/test_magFieldLines.py +++ b/tofu/mag/test_magFieldLines.py @@ -15,6 +15,6 @@ #print('path 2 =', sys.path) #import mag -from mag import magFieldLines +from mag import magFieldLines -doctest.testmod(magFieldLines, verbose=True) +doctest.testmod(magFieldLines, verbose=True) From d2f55d1b3b86bdcd434213bfc0588a1c02714baa Mon Sep 17 00:00:00 2001 From: Jorge Morales Date: Wed, 30 Oct 2019 14:36:05 +0100 Subject: [PATCH 4/5] -Modifications of tofuplot for magfieldlines --- tofu/utils.py | 1 + tofuplot.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tofu/utils.py b/tofu/utils.py index e8b2c3603..263d36d04 100644 --- a/tofu/utils.py +++ b/tofu/utils.py @@ -743,6 +743,7 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, x = trace[ii][jj]['r']*np.cos(trace[ii][jj]['p']) y = trace[ii][jj]['r']*np.sin(trace[ii][jj]['p']) dax['hor'][0].plot(x, y, label=lab) + dax['t'][0].figure.suptitle('Shot {0}, t = {1:6.3f} s'.format(shot[0], t[0])) return dax diff --git a/tofuplot.py b/tofuplot.py index f8e3a2fb6..b99323774 100755 --- a/tofuplot.py +++ b/tofuplot.py @@ -49,7 +49,7 @@ _VERSION = '3' _LIDS_DIAG = MultiIDSLoader._lidsdiag _LIDS_PLASMA = tf.imas2tofu.MultiIDSLoader._lidsplasma -_LIDS = _LIDS_DIAG + _LIDS_PLASMA +_LIDS = _LIDS_DIAG + _LIDS_PLASMA + ['magfieldlines'] _T0 = 'IGNITRON' _SHAREX = False _BCK = True @@ -75,7 +75,7 @@ def call_tfloadimas(shot=None, run=_RUN, user=_USER, tokamak=_TOKAMAK, version=_VERSION, ids=None, quantity=None, X=None, t0=_T0, sharex=_SHAREX, indch=None, indch_auto=None, - background=_BCK): + background=_BCK, t=None, dR_sep=None): lidspla = [ids_ for ids_ in ids if ids_ in _LIDS_PLASMA] if t0.lower() == 'none': @@ -85,7 +85,8 @@ def call_tfloadimas(shot=None, run=_RUN, user=_USER, tokamak=tokamak, version=version, ids=ids, indch=indch, indch_auto=indch_auto, plot_sig=quantity, plot_X=X, - t0=t0, plot=True, sharex=sharex, bck=background) + t0=t0, plot=True, sharex=sharex, bck=background, + t=t, dR_sep=dR_sep) plt.show(block=True) @@ -125,7 +126,7 @@ def _str2bool(v): msg = 'username of the DB where the datafile is located' parser.add_argument('-u','--user',help=msg, required=False, default=_USER) msg = 'tokamak name of the DB where the datafile is located' - parser.add_argument('-t','--tokamak',help=msg, required=False, + parser.add_argument('-tok','--tokamak',help=msg, required=False, default=_TOKAMAK) parser.add_argument('-r','--run',help='run number', required=False, type=int, default=_RUN) @@ -143,6 +144,11 @@ def _str2bool(v): nargs='+', default=None) parser.add_argument('-t0', '--t0', type=str, required=False, help='Reference time event setting t = 0', default=_T0) + parser.add_argument('-t', '--t', type=float, required=False, + help='Input time when needed') + parser.add_argument('-dR_sep', '--dR_sep', type=float, required=False, + help='Distance to separatrix from r_ext to plot' + +'magneticfield lines') parser.add_argument('-ich', '--indch', type=int, required=False, help='indices of channels to be loaded', nargs='+', default=None) From b849cdcd8c853bbeb1f6964209dcc774a88f8855 Mon Sep 17 00:00:00 2001 From: Jorge Morales Date: Thu, 31 Oct 2019 18:53:39 +0100 Subject: [PATCH 5/5] -Add init variable as input, initial point for manual magnetic field line plot --- tofu/utils.py | 71 ++++++++++++++++++++++++++++++++++++--------------- tofuplot.py | 7 +++-- 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/tofu/utils.py b/tofu/utils.py index 263d36d04..a859142f2 100644 --- a/tofu/utils.py +++ b/tofu/utils.py @@ -688,22 +688,22 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, t = equi.ddata['equilibrium.t']['data'][int(0.5*equi.ddata['equilibrium.t']['data'].size)] #t = np.r_[38] t = np.atleast_1d(t).ravel() - if init is None: - equi_ind_t = np.abs(t - equi.ddata['equilibrium.t']['data']).argmin() - equi_ind_r_ext = np.argmax(equi.ddata['equilibrium.sep']['data'][equi_ind_t][0]) - equi_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][0][equi_ind_r_ext] - equi_z_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][1][equi_ind_r_ext] - - nbr_init = 10 - if dR_sep is not None: - r_init = [equi_r_ext + dR_sep]*nbr_init - else: - r_init = [equi_r_ext]*nbr_init - phi_init = [ii*2.*np.pi/nbr_init for ii in range(nbr_init)] - z_init = [equi_z_r_ext]*nbr_init - init = [r_init, phi_init, z_init] - #init = [[2.9, 2.9, 2.9, 2.9], [0., np.pi/2, np.pi, 3.*np.pi/2], [0., 0., 0., 0.]] - #init = [[2.9], [0.], [0.]] + + #init = [[2.9, 2.9, 2.9, 2.9], [0., np.pi/2, np.pi, 3.*np.pi/2], [0., 0., 0., 0.]] + #init = [[2.9], [0.], [0.]] + equi_ind_t = np.abs(t - equi.ddata['equilibrium.t']['data']).argmin() + equi_ind_r_ext = np.argmax(equi.ddata['equilibrium.sep']['data'][equi_ind_t][0]) + equi_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][0][equi_ind_r_ext] + equi_z_r_ext = equi.ddata['equilibrium.sep']['data'][equi_ind_t][1][equi_ind_r_ext] + + nbr_init = 10 + if dR_sep is not None: + r_init = [equi_r_ext + dR_sep]*nbr_init + else: + r_init = [equi_r_ext]*nbr_init + phi_init = [ii*2.*np.pi/nbr_init for ii in range(nbr_init)] + z_init = [equi_z_r_ext]*nbr_init + init_plt = [r_init, phi_init, z_init] if False: multi = imas2tofu.MultiIDSLoader(shot=shot[0], run=run, user=user, @@ -715,23 +715,54 @@ def load_from_imas(shot=None, run=None, user=None, tokamak=None, version=None, config = tfg.utils.create_config('B3') if config.nStruct > 1: config.set_colors_random() - trace = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, + trace = tfm.MagFieldLines(int(shot[0])).trace_mline(init_plt, t, direction='FWD', length_line=25, stp=None) - trace_rev = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, + trace_rev = tfm.MagFieldLines(int(shot[0])).trace_mline(init_plt, t, direction='REV', length_line=25, stp=None) + refpt = np.r_[2.4,0.] dax = config.plot_phithetaproj_dist(refpt) + + if init is not None: + trace_init = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, + direction='FWD', + length_line=25, + stp=None) + trace_init_rev = tfm.MagFieldLines(int(shot[0])).trace_mline(init, t, + direction='REV', + length_line=25, + stp=None) + trace_init[0] = trace_init[0] + trace_init_rev[0] + + for kk in range(0,len(trace_init[0])): + phi_init = np.arctan2(np.sin(trace_init[0][kk]['p']), + np.cos(trace_init[0][kk]['p'])) + theta_init = np.arctan2(trace_init[0][kk]['z']-refpt[1], + trace_init[0][kk]['r']-refpt[0]) + indnan = ((np.abs(np.diff(phi_init)) > np.pi) + | (np.abs(np.diff(theta_init)) > np.pi)).nonzero()[0] + 1 + dax['dist'][0].plot(np.insert(phi_init, indnan, np.nan), + np.insert(theta_init, indnan, np.nan), + linewidth=3, color='red') + dax['cross'][0].plot(trace_init[0][kk]['r'], trace_init[0][kk]['z'], + linewidth=3, color='red') + x = trace_init[0][kk]['r']*np.cos(trace_init[0][kk]['p']) + y = trace_init[0][kk]['r']*np.sin(trace_init[0][kk]['p']) + dax['hor'][0].plot(x, y, linewidth=3, color='red') + for ii in range(0,len(trace)): # Concatenate trace lists trace[ii] = trace[ii] + trace_rev[ii] for jj in range(0,len(trace[ii])): lab = r't = %s s'%str(t[ii]) - phi = np.arctan2(np.sin(trace[ii][jj]['p']), np.cos(trace[ii][jj]['p'])) - theta = np.arctan2(trace[ii][jj]['z']-refpt[1], trace[ii][jj]['r']-refpt[0]) + phi = np.arctan2(np.sin(trace[ii][jj]['p']), + np.cos(trace[ii][jj]['p'])) + theta = np.arctan2(trace[ii][jj]['z']-refpt[1], + trace[ii][jj]['r']-refpt[0]) # insert nans for clean periodicity indnan = ((np.abs(np.diff(phi)) > np.pi) | (np.abs(np.diff(theta)) > np.pi)).nonzero()[0] + 1 diff --git a/tofuplot.py b/tofuplot.py index b99323774..1aad802c3 100755 --- a/tofuplot.py +++ b/tofuplot.py @@ -75,7 +75,7 @@ def call_tfloadimas(shot=None, run=_RUN, user=_USER, tokamak=_TOKAMAK, version=_VERSION, ids=None, quantity=None, X=None, t0=_T0, sharex=_SHAREX, indch=None, indch_auto=None, - background=_BCK, t=None, dR_sep=None): + background=_BCK, t=None, dR_sep=None, init=None): lidspla = [ids_ for ids_ in ids if ids_ in _LIDS_PLASMA] if t0.lower() == 'none': @@ -86,7 +86,7 @@ def call_tfloadimas(shot=None, run=_RUN, user=_USER, ids=ids, indch=indch, indch_auto=indch_auto, plot_sig=quantity, plot_X=X, t0=t0, plot=True, sharex=sharex, bck=background, - t=t, dR_sep=dR_sep) + t=t, dR_sep=dR_sep, init=init) plt.show(block=True) @@ -149,6 +149,9 @@ def _str2bool(v): parser.add_argument('-dR_sep', '--dR_sep', type=float, required=False, help='Distance to separatrix from r_ext to plot' +'magneticfield lines') + parser.add_argument('-init', '--init', type=float, required=False, nargs=3, + help='Initial point from where trace magnetic field' + +'line') parser.add_argument('-ich', '--indch', type=int, required=False, help='indices of channels to be loaded', nargs='+', default=None)