Beispiel #1
0
 def __init__(self, config, family='S', nTF=16, obj='L'):
     self.nTF = nTF
     self.config = config
     datadir = trim_dir('../../Data')
     file = 'salome_input'  #  config #  +'_{}{}{}'.format(family,nTF,obj)
     self.filename = datadir + '/' + file + '.json'
     self.profile = Profile(config['TF'],
                            family=family,
                            load=True,
                            part='TF',
                            nTF=nTF,
                            obj=obj,
                            npoints=250)
     setup = Setup(config['eq'])
     self.sf = SF(setup.filename)
     self.tf = TF(self.profile, sf=self.sf)
     self.pf = PF(self.sf.eqdsk)
     self.PF_support()  # calculate PF support seats
     self.CS_support()  # calculate CS support seats
     self.Gravity_support()
     self.cage = coil_cage(nTF=nTF,
                           rc=self.tf.rc,
                           ny=3,
                           plasma={'config': config['eq']},
                           coil=self.tf.x['cl'])
     self.eq = EQ(self.sf,
                  self.pf,
                  dCoil=0.5,
                  sigma=0,
                  boundary=self.sf.get_sep(expand=0.5),
                  n=1e3)
     self.eq.plasma()
     self.ff = force_feild(self.pf.index, self.pf.coil, self.eq.coil,
                           self.eq.plasma_coil)
Beispiel #2
0
 def __init__(self,profile,eqconf='unset',sep='unset',**kwargs):
     self.ny = kwargs.get('ny',3)  # TF filament number (y-dir)
     self.alpha = kwargs.get('alpha',1-1e-4)
     self.color = cycle(sns.color_palette('Set2',10))
     self.profile = profile
     self.loop = self.profile.loop
     self.bound = {}  # initalise bounds
     self.bindex = {'internal':[0],'interior':[0],'external':[0]}  # index
     for side in ['internal','interior','external']:
         self.bound[side] = {'r':[],'z':[]}
         if side in kwargs:
             self.add_bound(kwargs[side],side)
     if self.profile.nTF is not 'unset' and \
     (eqconf is not 'unset' or sep is not 'unset'):
         if eqconf is not 'unset':
             plasma = {'config':eqconf}
             sf = SF(Setup(eqconf).filename)
             self.tf = TF(profile=self.profile,sf=sf)
         else:
             plasma = {'r':sep['r'],'z':sep['z']}
             self.tf = TF(profile=self.profile)
         self.cage = coil_cage(nTF=self.profile.nTF,rc=self.tf.rc,
                               plasma=plasma,ny=self.ny,alpha=self.alpha)
         x = self.tf.get_loops(self.loop.draw())
         self.cage.set_TFcoil(x['cl'],smooth=False)
     else:
         if self.profile.obj is 'E':
             errtxt = 'nTF and SFconfig keywords not set\n'
             errtxt += 'unable to calculate stored energy\n'
             errtxt += 'initalise with \'nTF\' keyword'
             raise ValueError(errtxt)
Beispiel #3
0
 def load_sf(self, eq_names):
     sf_dict, sf_list = OrderedDict(), []
     for configuration in eq_names:
         sf = SF(Setup(configuration).filename)
         sf_dict[configuration] = sf.filename.split('/')[-1]
         sf_list.append(sf)
     self.config['eqdsk'] = sf_dict
     return sf_list
Beispiel #4
0
 def get_seperatrix(self, nplasma=80, alpha=1 - 1e-4, plot=False, **kwargs):
     self.nplasma = nplasma
     self.plasma_loop = np.zeros((self.nplasma, 3))  # initalise loop array
     if 'sf' in kwargs or 'setup' in kwargs or 'config' in kwargs:
         if 'sf' in kwargs:  # seperatrix directly from sf object
             sf = kwargs['sf']
         elif 'setup' in kwargs:
             setup = kwargs.get('setup')
             sf = SF(setup.filename)
         elif 'config' in kwargs:
             setup = Setup(kwargs.get('config'))
             sf = SF(setup.filename)
         r, z = sf.get_boundary(alpha=alpha)
         self.eqdsk = sf.eqdsk
         self.LFP = np.array([sf.LFPr, sf.LFPz])
     else:
         if 'eqdsk' in kwargs:  # seperatrix from eqdsk
             self.eqdsk = geqdsk.read(kwargs.get('eqdsk'))
             r, z = self.eqdsk['rbdry'], self.eqdsk['zbdry']
         elif 'r' in kwargs and 'z' in kwargs:  # separatrix from input
             r, z = kwargs.get('r'), kwargs.get('z')
             self.eqdsk = {
                 'rcentr': 9.0735,
                 'zmagx': 0.15295,
                 'bcentr': -5.6211
             }
         LFindex = np.argmax(r)
         self.LFP = np.array([r[LFindex], z[LFindex]])
     if not hasattr(self, 'eqdsk'):
         errtxt = '\n'
         errtxt += 'Require plasma={} input of following types:\n'
         errtxt += '1) configuration flag, {\'config\':\'SN\'} \n'
         errtxt += '2) eqdsk file, {\'eqdsk\':\'\'} \n'
         errtxt += '3) seperatrix profile, {\'r\':[],\'z\':[]}'
         raise ValueError(errtxt)
     r, z = geom.clock(r, z)
     (self.plasma_loop[:,0],self.plasma_loop[:,2]) = \
     geom.rzSLine(r,z,npoints=self.nplasma)
     self.plasma_length = geom.length(self.plasma_loop[:, 0],
                                      self.plasma_loop[:, 2])
     rfun, zfun = geom.rzfun(r, z)
     self.plasma_interp = {'r': rfun, 'z': zfun}
     if plot:
         pl.plot(self.plasma_loop[:, 0], self.plasma_loop[:, 2])
Beispiel #5
0
class SALOME(object):
    def __init__(self, config, family='S', nTF=16, obj='L'):
        self.nTF = nTF
        self.config = config
        datadir = trim_dir('../../Data')
        file = 'salome_input'  #  config #  +'_{}{}{}'.format(family,nTF,obj)
        self.filename = datadir + '/' + file + '.json'
        self.profile = Profile(config['TF'],
                               family=family,
                               load=True,
                               part='TF',
                               nTF=nTF,
                               obj=obj,
                               npoints=250)
        setup = Setup(config['eq'])
        self.sf = SF(setup.filename)
        self.tf = TF(self.profile, sf=self.sf)
        self.pf = PF(self.sf.eqdsk)
        self.PF_support()  # calculate PF support seats
        self.CS_support()  # calculate CS support seats
        self.Gravity_support()
        self.cage = coil_cage(nTF=nTF,
                              rc=self.tf.rc,
                              ny=3,
                              plasma={'config': config['eq']},
                              coil=self.tf.x['cl'])
        self.eq = EQ(self.sf,
                     self.pf,
                     dCoil=0.5,
                     sigma=0,
                     boundary=self.sf.get_sep(expand=0.5),
                     n=1e3)
        self.eq.plasma()
        self.ff = force_feild(self.pf.index, self.pf.coil, self.eq.coil,
                              self.eq.plasma_coil)

    def write(self):
        print('writing', self.filename, self.nTF)
        color = sns.color_palette('Set2', 12)
        data = {
            'p': self.profile.loop.p,
            'section': self.tf.section,
            'pf': self.pf.coil,
            'nTF': self.nTF,
            'color': color,
            'PFsupport': self.PFsupport,
            'CSsupport': self.CSsupport,
            'Gsupport': self.Gsupport,
            'OISsupport': self.OISsupport
        }

        with open(self.filename, 'w') as f:
            json.dump(data, f, indent=4)

    def CS_support(self):
        depth = self.tf.section['winding_pack']['depth']
        side = self.tf.section['case']['side']
        width = self.tf.section['winding_pack']['width']
        inboard = self.tf.section['case']['inboard']
        nose = self.tf.section['case']['nose']
        segment = self.profile.loop.p[0]
        ro, zo = segment['p0']['r'], segment['p0']['z']
        theta = np.pi / self.nTF
        rsep = (depth / 2 + side) / np.tan(theta)
        rnose = ro - (width + inboard + nose)
        rwp = ro - (width + inboard)
        if rsep <= rnose:
            ynose = depth / 2 + side
        else:
            ynose = rnose * np.tan(theta)
        if rsep <= rwp:
            ywp = depth / 2 + side
        else:
            ywp = rwp * np.tan(theta)

        self.tf.loop_interpolators(offset=0)  # construct TF interpolators
        TFloop = self.tf.fun['out']
        L = minimize_scalar(SALOME.cs_top,
                            method='bounded',
                            args=(rwp, TFloop),
                            bounds=[0.5, 1]).x
        ztop = float(TFloop['z'](L))
        self.CSsupport = {
            'rnose': rnose,
            'ynose': ynose,
            'rwp': rwp,
            'ywp': ywp,
            'ztop': ztop,
            'zo': zo,
            'dt': side
        }

    def cs_top(L, rwp, TFloop):
        err = abs(TFloop['r'](L) - rwp)
        return err

    def support_arm(L, coil, TFloop):
        dl = np.sqrt((coil['r'] - TFloop['r'](L))**2 +
                     (coil['z'] - TFloop['z'](L))**2)
        return dl

    def intersect(x, xc, nhat, TFloop):
        L, s = x  # unpack
        rTF, zTF = TFloop['r'](L), TFloop['z'](L)
        rs, zs = s * nhat + xc
        err = np.sqrt((rTF - rs)**2 + (zTF - zs)**2)
        return err

    def connect(self, coil, loop, edge=0.15, hover=0.1, argmin=60):
        L = minimize_scalar(SALOME.support_arm,
                            method='bounded',
                            args=(coil, loop),
                            bounds=[0, 1]).x
        rTF, zTF = loop['r'](L), loop['z'](L)
        nhat = np.array([rTF - coil['r'], zTF - coil['z']])
        ndir = 180 / np.pi * np.arctan(abs(nhat[1] / nhat[0]))  # angle, deg
        if ndir < argmin:  # limit absolute support angle
            nhat = np.array([
                np.sign(nhat[0]),
                np.tan(argmin * np.pi / 180) * np.sign(nhat[1])
            ])
        nhat /= np.linalg.norm(nhat)
        above = np.sign(np.dot(nhat, [0, 1]))
        zc = coil['z'] + above * (coil['dz'] / 2 + hover)
        nodes = [[] for _ in range(4)]
        for i, sign in enumerate([-1, 1]):  #  inboard / outboard
            rc = coil['r'] + sign * (coil['dr'] / 2 + edge)
            nodes[i] = [rc, zc]
            xc = np.array([rc, zc])
            xo = np.array([L, 0.5])
            res = minimize(SALOME.intersect,
                           xo,
                           method='L-BFGS-B',
                           bounds=([0, 1], [0, 15]),
                           args=(xc, nhat, loop))
            rs, zs = res.x[1] * nhat + xc
            nodes[3 - i] = [rs, zs]
        return nodes

    def PF_support(self):
        self.tf.loop_interpolators(offset=-0.15)  # construct TF interpolators
        TFloop = self.tf.fun['out']
        self.PFsupport = {}
        for name in self.pf.index['PF']['name']:
            coil = self.pf.coil[name]
            nodes = self.connect(coil, TFloop, edge=0.15, hover=0.1, argmin=60)
            self.PFsupport[name] = nodes

    def GS_placement(L, radius, TFloop):
        return abs(radius - TFloop['r'](L))

    def Gravity_support(self, radius=13, width=0.75):
        self.tf.loop_interpolators(offset=-0.15)  # construct TF interpolators
        TFloop = self.tf.fun['out']
        self.tf.loop_interpolators(offset=0)
        Sloop = self.tf.fun['out']
        L = minimize_scalar(SALOME.GS_placement,
                            method='bounded',
                            args=(radius - width / 2, Sloop),
                            bounds=[0, 0.5]).x
        coil = {
            'r': Sloop['r'](L) + width / 2,
            'z': Sloop['z'](L) - width / 2,
            'dr': width,
            'dz': width
        }
        nodes = self.connect(coil, TFloop, edge=0, hover=0, argmin=90)
        self.Gsupport = {'base': nodes}
        z = [[self.pf.coil[name]['z']-self.pf.coil[name]['dz']/2]\
             for name in self.pf.coil]
        floor = np.min(z) - 1
        self.Gsupport['zbase'] = float(Sloop['z'](L))
        self.Gsupport['zfloor'] = floor
        self.Gsupport['radius'] = radius
        self.Gsupport['width'] = width

    def OIS_placment(L, TFloop, point):
        err = (point[0] - TFloop['r'](L))**2 + (point[1] - TFloop['z'](L))**2
        return err

    def draw_OIS(self, L, width, thickness, TFloop):
        dl = width / TFloop['L']
        rcl = np.array([TFloop['r'](L - dl / 2), TFloop['r'](L + dl / 2)])
        zcl = np.array([TFloop['z'](L - dl / 2), TFloop['z'](L + dl / 2)])
        ro, zo = np.mean(rcl), np.mean(zcl)
        L = minimize_scalar(SALOME.OIS_placment,
                            method='bounded',
                            args=(TFloop, (ro, zo)),
                            bounds=[0, 1]).x
        dr, dz = TFloop['r'](L) - ro, TFloop['z'](L) - zo
        rcl += dr / 2
        zcl += dz / 2
        dt = np.array([rcl[1] - rcl[0], 0, zcl[1] - zcl[0]])
        dt /= np.linalg.norm(dt)
        dn = np.cross(dt, np.array([0, 1, 0]))

        rcl = np.append(rcl + dn[0] * thickness / 2,
                        rcl[::-1] - dn[0] * thickness / 2)
        zcl = np.append(zcl + dn[2] * thickness / 2,
                        zcl[::-1] - dn[2] * thickness / 2)
        nodes = [[rcl[i], zcl[i]] for i in range(4)]
        return nodes

    def OIS(self, width=3.5, thickness=0.15, rmin=10):
        self.tf.loop_interpolators(offset=0)  # construct TF interpolators
        TFloop = self.tf.fun['cl']
        self.OISsupport = {}
        for i, (L, width) in enumerate(zip([0.4, 0.64], [4.5, 2.5])):
            nodes = self.draw_OIS(L, width, thickness, TFloop)
            self.OISsupport['OIS{:d}'.format(i)] = nodes

    def plot(self):
        self.tf.fill()
        self.pf.plot(coils=self.pf.coil, label=True, current=True)
        self.pf.plot(coils=self.eq.coil, plasma=True)
        for name in self.PFsupport:
            nodes = np.array(self.PFsupport[name])
            geom.polyfill(nodes[:, 0], nodes[:, 1], color=0.4 * np.ones(3))
        nodes = np.array(self.Gsupport['base'])
        geom.polyfill(nodes[:, 0], nodes[:, 1], color=0.4 * np.ones(3))
        pl.plot(self.Gsupport['radius'] * np.ones(2),
                [self.Gsupport['zbase'], self.Gsupport['zfloor']],
                'o-',
                color=0.4 * np.ones(3),
                lw=4)
        for name in self.OISsupport:
            nodes = np.array(self.OISsupport[name])
            geom.polyfill(nodes[:, 0], nodes[:, 1], color=0.4 * np.ones(3))
        rnose = self.CSsupport['rnose']
        rwp = self.CSsupport['rwp']
        zo = self.CSsupport['zo']
        ztop = self.CSsupport['ztop']
        rCS = [rnose, rwp, rwp, rnose]
        zCS = [zo, zo, ztop, ztop]
        geom.polyfill(rCS, zCS, color=0.4 * np.ones(3))

    def ansys(self, plot=False, nl=250, nr=5, ny=5):
        filename = '../../Data/TFload_{:d}'.format(self.nTF)
        ans = table(filename)
        ans.f.write('! loading tables for {:d}TF coil concept\n'.format(
            self.nTF))
        ans.f.write('! loop length parameterized from 0-1\n')
        ans.f.write('! loop starts at the inboard midplane\n')
        ans.f.write('! loop progresses in the anti-clockwise direction\n')
        ans.f.write('! tables defined with cylindrical coordinate system\n')
        ans.f.write(
            '! body applied to nodes of winding-pack in cartisean system x,y,z\n'
        )
        ans.f.write(
            '! winding-pack must be labled as named-selection \'wp\'\n')
        ans.f.write('\nlocal,11,1,{:1.9f},0,{:1.9f},0,90,0'\
                    .format(self.sf.mo[0],self.sf.mo[1]))
        ans.f.write('  ! define local cylindrical coordinate system\n')
        ans.f.write('csys,0  ! restore to cartesian\n')

        ans.f.write('\n! per-TF PF coil forces (Fr,Fz) [N]\n')
        ans.f.write('! order as numbered in plots\n')
        F = self.ff.get_force()['F']
        ans.load('F_coil', F / self.nTF)
        ans.write_array()
        ans.f.write('\n/nopr  ! suppress large table output\n')

        self.tf.loop_interpolators(offset=0,
                                   full=True)  # construct TF interpolators
        TFloop = self.tf.fun['cl']

        ngrid = {'nr': 20, 'nt': 150}  #  coordinate interpolation grid
        ndata = {
            'nl': nl,
            'nr': nr,
            'ny': ny
        }  #  coordinate interpolation grid
        l = np.linspace(0, 1, 250)  # calculate grid extent
        xin, zin = self.tf.fun['in']['r'](l), self.tf.fun['in']['z'](l)
        rin = np.sqrt((xin - self.sf.mo[0])**2 + (zin - self.sf.mo[1])**2)
        rmin = np.min(rin)  # minimum radius
        xout, zout = self.tf.fun['out']['r'](l), self.tf.fun['out']['z'](l)
        rout = np.sqrt((xout - self.sf.mo[0])**2, (zout - self.sf.mo[1])**2)
        rmax = np.max(rout)  # maximum radius

        radius = np.linspace(rmin, rmax, ngrid['nr'])
        theta = np.linspace(-np.pi, np.pi, ngrid['nt'])
        l_map = np.zeros((ngrid['nr'], ngrid['nt']))
        dr_map = np.zeros((ngrid['nr'], ngrid['nt']))
        for i in range(ngrid['nr']):
            for j in range(ngrid['nt']):
                x = self.sf.mo[0] + radius[i] * np.cos(theta[j])
                z = self.sf.mo[1] + radius[i] * np.sin(theta[j])
                L = minimize_scalar(SALOME.OIS_placment,
                                    method='bounded',
                                    args=(TFloop, (x, z)),
                                    bounds=[0, 1]).x
                xl, zl = TFloop['r'](L), TFloop['z'](L)
                l_map[i, j] = L
                dr_map[i,j] = np.sqrt((x-xl)**2+(z-zl)**2)*\
                np.sign(np.dot([x-xl,z-zl],[x-self.sf.mo[0],z-self.sf.mo[1]]))

        width = self.tf.section['winding_pack']['width']
        depth = self.tf.section['winding_pack']['depth']
        cross_section = width * depth
        l_data = np.linspace(0, 1, ndata['nl'])
        if ndata['nr'] > 1:
            dr_data = np.linspace(-width / 2, width / 2, ndata['nr'])
        else:
            dr_data = np.array([0])
        if ndata['ny'] > 1:
            dy_data = np.linspace(-depth / 2, depth / 2, ndata['ny'])
        else:
            dy_data = np.array([0])
        Fbody = {}
        for var in ['x', 'y', 'z']:
            Fbody[var] = np.zeros((ndata['nl'], ndata['nr'], ndata['ny']))

        self.tf.loop_interpolators(offset=0, full=True)  # centreline
        Jturn = self.cage.Iturn / cross_section
        for i, l in enumerate(l_data):
            iter_str = '\rcalculating TF body force:'
            iter_str += 'segment {:d} of {:d}'.format(i, ndata['nl'])
            sys.stdout.write(iter_str)
            sys.stdout.flush()
            xo = self.tf.fun['cl']['r'](l)
            zo = self.tf.fun['cl']['z'](l)
            dxo = self.tf.fun['cl']['dr'](l)
            dzo = self.tf.fun['cl']['dz'](l)
            that = np.array([dxo, 0, dzo])
            that /= np.linalg.norm(that)
            J = Jturn * that  # current density vector
            nhat = np.array([that[2], 0, -that[0]])
            for j, dr in enumerate(dr_data):
                for k, dy in enumerate(dy_data):
                    point = np.array([xo, dy, zo]) + dr * nhat
                    Fb = self.ff.topple(point,
                                        J,
                                        self.cage,
                                        self.eq.Bpoint,
                                        method='BS')  # body force
                    for m, var in enumerate(['x', 'y', 'z']):  # store
                        Fbody[var][i, j, k] = Fb[m]
                    if plot:
                        Fvec = Fb / np.linalg.norm(Fb)
                        Fvec = that
                        pl.arrow(point[0],
                                 point[2],
                                 Fvec[0],
                                 Fvec[2],
                                 head_width=0.15,
                                 head_length=0.3)
        print('\n',
              np.sum(Fbody['x'][:-1, :, :]) * 1e-9,
              np.sum(Fbody['y'][:-1, :, :]) * 1e-9,
              np.sum(Fbody['z'][:-1, :, :]) * 1e-9)

        ans.f.write('\n! parametric coil length, fn(theta)\n')
        ans.load('l_map', l_map, [radius, theta])
        ans.write(['radus', 'theta'])
        ans.f.write('\n! parametric coil offset, fn(theta)\n')
        ans.load('dr_map', dr_map, [radius, theta])
        ans.write(['radus', 'theta'])
        for var in ['x', 'y', 'z']:
            ans.f.write(
                '\n! winding-pack body force, Fbody_{} [N/m3]\n'.format(var))
            ans.load('Fbody_{}'.format(var), Fbody[var],
                     [l_data, dr_data, dy_data])
            ans.write(['l_map', 'dr_map', 'offset'])
        ans.f.write('/gopr  ! enable output\n')

        apdlstr = '''
pi = 4*atan(1)
csys,11  ! switch to cylindrical coordinate system
esel,s,elem,,wp  ! select winding pack (requires named selection 'wp')
*get,nel,elem,0,count
*vget,el_sel,elem,,esel  ! selection mask
*vget,el_id,elem,,elist  ! winding pack selection array
*vget,el_vol,elem,,geom  ! element volume
*vget,el_radius,elem,,cent,x  ! element radius
*vget,el_theta,elem,,cent,y  ! element theta
*vget,el_offset,elem,,cent,z  ! element axial offset
*voper,el_theta,el_theta,mult,pi/180  ! convert to radians
csys,0  ! return coordinate system

! compress selections
*dim,el_v,array,nel
*dim,el_r,array,nel
*dim,el_t,array,nel
*dim,el_o,array,nel
*dim,el_l,array,nel
*dim,el_dr,array,nel

*vmask,el_sel
*vfun,el_v,comp,el_vol  ! volume
*vmask,el_sel
*vfun,el_r,comp,el_radius  ! radius
*vmask,el_sel
*vfun,el_t,comp,el_theta  ! theta
*vmask,el_sel
*vfun,el_o,comp,el_offset  ! offset
*vitrp,el_l,l_map,el_r,el_t  ! interpolate l_map table
*vitrp,el_dr,dr_map,el_r,el_t !  interpolate dr_map table

xyz = 'x','y','z'  ! axes
fcum,add  ! accumulate nodal forces
*do,i,1,nel  ! apply forces to loads
  esel,s,elem,,el_id(i)
  nsle  ! select nodes attached to element
  nsel,r,node,,wp  ! ensure all nodes from winding pack
  *get,nnd,node,0,count  ! count nodes
  *do,j,1,3  ! Fx,Fy,Fz - all nodes attached to element
      F,all,F%xyz(j)%,Fbody_%xyz(j)%(el_l(i),el_dr(i),el_o(i))*el_v(i)*el_v(i)/nnd
  *enddo
*enddo
allsel  
        '''
        ans.f.write(apdlstr)
        ans.close()
Beispiel #6
0
from nova.firstwall import main_chamber
from nova.shape import Shape

import seaborn as sns
sns.set(context='talk', style='white', font='sans-serif', font_scale=7 / 8)
Color = cycle(sns.color_palette('Set2'))

pkl = PKL('SXdev', directory='../../Movies/')

name = 'SX'

nTF, ripple = 18, True
base = {'TF': 'dtt', 'eq': 'DTT_SN', 'name': name}
config, setup = select(base, nTF=nTF, update=False)

sf = SF(setup.filename)
pf = PF(sf.eqdsk)

for coil in pf.index['CS']['name']:
    pf.coil[coil]['r'] = 2.7
    pf.coil[coil]['dr'] = 0.8

profile = Profile(config['TF'], family='S', part='TF', nTF=nTF, obj='L')
tf = TF(profile=profile, sf=sf)
#tf.adjust_xo('dz',value=-2)
#tf.fill()

eq = EQ(sf,
        pf,
        dCoil=2.0,
        sigma=0,
Beispiel #7
0
    'savefig.pad_inches': 0.1,
    'lines.linewidth': 0.75
}
sns.set(context='paper',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

nTF = 18  #,nPF,nCS = 18,6,5
config = {'TF': 'dtt', 'eq': 'SFp'}
config, setup = select(config, nTF=nTF, update=False)  # nPF=nPF,nCS=nCS

sf = SF(setup.filename)
rb = RB(setup, sf)
pf = PF(sf.eqdsk)
tf = TF(
    Profile(config['TF'], family='S', part='TF', nTF=nTF, obj='L', load=True))
rb.firstwall(symetric=True, DN=True, plot=True)
#pf.plot(coils=pf.coil,label=False,plasma=False,current=True)
tf.fill()

#sf.cpasma *= 1.1
eq = EQ(sf, pf, dCoil=1.5, sigma=0, boundary=sf.get_sep(expand=1.1), n=3e3)
eq.gen_bal()
#eq.gen_opp()

sf.contour()
Beispiel #8
0
        ax[i][j].axis('equal')
        #ax[i][j].set_xlim([2.6000000000000001, 17.699999999999999])
        #ax[i][j].set_ylim([-14.292150967273809, 9.0768966517738079])

        ax[i][j].axis('off')

title = ['SN', 'X', 'SF-', 'SF+', 'SX', 'SXex']
for j, config in enumerate(['SN', 'X', 'SFm', 'SFp', 'SX', 'SXex']):
    print('')
    print(config)
    pl.sca(ax[0][j])
    pl.title(title[j])
    Color = cycle(sns.color_palette('Set2'))

    setup = Setup(config)
    sf = SF(setup.filename)
    rb = RB(setup, sf)
    pf = PF(sf.eqdsk)
    eq = EQ(sf, pf, sigma=0.1, boundary=rb.get_fw(expand=0.25), n=5e4)
    #eq = EQ(sf,pf,sigma=0.1,boundary=rb.get_fw(expand=0.25),n=5e3)
    sf.contour(Nlevel=21, lw=0.5)

    pl.plot([14, 14], [-14.5, 9.5], 'o', alpha=0)

    pf.plot(coils=pf.coil, label=False, plasma=False, current=False)
    rb.firstwall(calc=False, plot=True, debug=False)

    rb.vessel()
    tf = TF(nTF=16,
            shape={
                'vessel': rb.loop,
Beispiel #9
0
from nova.loops import Profile

import seaborn as sns
rc = {'figure.figsize':[7*10/16,7],'savefig.dpi':150, #*12/16
      'savefig.jpeg_quality':100,'savefig.pad_inches':0.1,
      'lines.linewidth':0.75}
sns.set(context='paper',style='white',font='sans-serif',palette='Set2',
        font_scale=7/8,rc=rc)
Color = cycle(sns.color_palette('Set2'))

pkl = PKL('DEMO_SN54')
nTF = 16

config = {'TF':'SN','eq':'DEMO_SN'}
setup = Setup(config['eq'])
sf = SF(setup.filename)

rb = RB(setup,sf)
pf = PF(sf.eqdsk)
tf = TF(Profile(config['TF'],family='S',part='TF',nTF=nTF,obj='L',load=True))

eq = EQ(sf,pf,dCoil=2.0,sigma=0,boundary=sf.get_sep(expand=1.5),n=1e4) 
eq.gen_opp()


inv = INV(sf,eq,tf)
Lpf = inv.grid_PF(nPF=4)
Lcs = inv.grid_CS(nCS=3,Zbound=[-8.2,11],gap=0.1)
Lo = np.append(Lpf,Lcs)
inv.update_coils()
Beispiel #10
0
    'figure.figsize': [7, 7 * 16 / 12],
    'savefig.dpi': 125,  # 
    'savefig.jpeg_quality': 200,
    'savefig.pad_inches': 0.1,
    'lines.linewidth': 1.5
}
sns.set(context='talk',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
color = sns.color_palette('Set2', 5)

config, setup = select(base={'TF': 'dtt', 'eq': 'DEMO_FW_SOF'}, nTF=18)
sf = SF(setup.filename)
pf = PF(sf.eqdsk)
pf.plot(coils=pf.coil, label=True, plasma=False, current=True)
levels = sf.contour(plot_vac=False)
rb = RB(setup, sf)
rb.firstwall(plot=True, debug=False, color=color[1])
rb.trim_sol()

filename = trim_dir('../../Data/') + 'CATIA_FW.xlsx'
wb = load_workbook(filename=filename, read_only=True, data_only=True)
ws = wb[wb.get_sheet_names()[0]]

FW = {}
for col, var in zip([5, 6], ['r', 'z']):
    row = ws.columns[col]
    FW[var] = np.zeros(len(row) - 1)
Beispiel #11
0
    'savefig.pad_inches': 0.1,
    'lines.linewidth': 0.75
}
sns.set(context='paper',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

#base = {'TF':'dtt','eq':'SN'}
base = {'TF': 'dtt', 'eq': 'SN2014_EOF'}
#config,setup = select(base={'TF':'dtt','eq':'SN2014_EOF'},nTF=18)
config, setup = select(base=base, update=False, nTF=18, nPF=5, nCS=3)
sf = SF(setup.filename)
rb = RB(setup, sf)
pf = PF(sf.eqdsk)
tf = TF(
    Profile(config['TF'],
            family='S',
            part='TF',
            nTF=config['nTF'],
            obj='L',
            load=True))
tf.fill()
eq = EQ(sf,
        pf,
        dCoil=1.0,
        sigma=0,
        n=1e4,
Beispiel #12
0
}
sns.set(context='paper',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

#pkl = PKL('moveSX_Dev3')

nPF, nCS, nTF = 4, 3, 18
config = {'TF': 'dtt', 'eq': 'SN'}
config['TF'] = '{}{}{:d}'.format(config['eq'], config['TF'], nTF)
setup = Setup(config['eq'])
sf = SF(setup.filename)
rb = RB(setup, sf)
pf = PF(sf.eqdsk)

profile = Profile(config['TF'],
                  family='S',
                  part='TF',
                  nTF=nTF,
                  obj='L',
                  load=True)

tf = TF(profile, sf=sf)
eq = EQ(sf, pf, dCoil=2.0, limit=[5.2, 13, -6.5, 6], n=5e3)  #
eq.get_plasma_coil()
eq.run(update=False)
Beispiel #13
0
from itertools import cycle
import numpy as np
from nova.radial_build import RB
from nova.shelf import PKL
import nova.cross_coil as cc
from nova.coils import PF, TF
from time import time
from nova import loops
import scipy.optimize as op
from amigo.addtext import linelabel
from nova.loops import Profile

config = 'SN'
setup = Setup(config)

sf = SF(setup.filename)
rb = RB(setup, sf)
pf = PF(sf.eqdsk)

profile = Profile(config, family='S', part='TF', nTF=18, objective='L')
tf = TF(profile)

eq = EQ(sf, pf, dCoil=2.5, sigma=0, boundary=sf.get_sep(expand=0.5), n=5e2)
eq.get_plasma_coil()
eq.run(update=False)

inv = INV(sf, eq, tf)
inv.initialize_log()

Lpf = inv.grid_PF(nPF=5)
Lcs = inv.grid_CS(nCS=5)
Beispiel #14
0
    date = '2017_03_10'
elif machine == 'dtt':
    eq_names = ['DTT_SN']
    date = '2017_03_08'
else:
    raise ValueError('list machine type')

mc = main_chamber(machine,date=date)  
mc.generate(eq_names,psi_n=1.07,flux_fit=True,plot=False,symetric=False)
mc.load_data(plot=False)  # load from file
mc.shp.plot_bounds()


config = {'TF':machine,'eq':eq_names[0]}    
config,setup = select(config,nTF=nTF,update=False)     
sf = SF(setup.filename) 
sf.contour()


rb = RB(sf,setup)
rb.generate(mc,plot=True,DN=False,debug=False)
rb.get_sol(plot=True)


#pl.plot(rb.segment['divertor']['r'],rb.segment['divertor']['z'])


profile = Profile(config['TF'],family='S',part='TF',nTF=nTF,obj='L')
shp = Shape(profile,eqconf=config['eq'],ny=3)
shp.add_vessel(rb.segment['vessel_outer'])
#shp.minimise(ripple=ripple,verbose=True)
Beispiel #15
0
        font_scale=7 / 8,
        rc=rc)

#config,setup = select(base={'TF':'dtt','eq':'SN'},nTF=18,nPF=5,nCS=3)
#config,setup = select(base={'TF':'dtt','eq':'SX'},nTF=18,nPF=5,nCS=3)
#config,setup = select(base={'TF':'dtt','eq':'DEMO_FW_SOF'},nTF=18)
#config,setup = select(base={'TF':'dtt','eq':'SN2014_EOF'},nTF=18)

setup.firstwall['flux_fit'] = False

if 'DN' in setup.configuration:
    DN = True
else:
    DN = False

sf = SF(setup.filename)

sf.shape_parameters()  #verbose=True

#pf = PF(sf.eqdsk)

eq_names = ['DEMO_SN_SOF', 'DEMO_SN_EOF']
mc = main_chamber('DTT')  # ,date='2017_03_03'
mc.generate(eq_names, psi_n=1.07, flux_fit=True, debug=True)

mc.load_data()
mc.draw(True)

#target = targets(sf,setup.targets)
#target.place(debug=True)
'''
Beispiel #16
0
import seaborn as sns
rc = {
    'figure.figsize': [7 * 10 / 16, 7],
    'savefig.dpi': 250,  #*12/16
    'savefig.jpeg_quality': 100,
    'savefig.pad_inches': 0.1,
    'lines.linewidth': 1
}
sns.set(context='poster',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=0.75,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

text = linelabel(Ndiv=20, value='')

nTF = 18

for eq in ['DEMO_SN_SOF', 'DEMO_SN_EOF']:
    config = {'TF': 'demo', 'eq': eq}
    config, setup = select(config, nTF=nTF, update=False)
    sf = SF(setup.filename)
    sf.get_boundary(plot=True, alpha=1 - 1e-5)
    text.add(eq)
    sf.sol(plot=True)

text.plot()
pl.axis('equal')
pl.axis('off')
Beispiel #17
0
    'lines.linewidth': 0.75
}
sns.set(context='paper',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

base = {'TF': 'dtt', 'eq': 'DN'}
config, setup = select(base=base, update=False, nTF=18, nPF=4, nCS=3)

config['TF'] = config['TF'].replace('DN', 'SN')

sf = SF(setup.filename)
rb = RB(setup, sf)
pf = PF(sf.eqdsk)
tf = TF(
    Profile(config['TF'],
            family='S',
            part='TF',
            nTF=config['nTF'],
            obj='L',
            load=True))
#tf.fill()

eq = EQ(sf,
        pf,
        dCoil=1.5,
        sigma=0,
Beispiel #18
0
from amigo import geom

rc = {'figure.figsize':[8*10/16,8],'savefig.dpi':150, #*12/16
      'savefig.jpeg_quality':100,'savefig.pad_inches':0.1,
      'lines.linewidth':0.75}
sns.set(context='paper',style='white',font='sans-serif',palette='Set2',
        font_scale=7/8,rc=rc)

nTF = 16
config = {'TF':'SN','eq':'DEMO_SNb'}
          

profile = Profile(config['TF'],family='S',load=True,part='TF',
                       nTF=nTF,obj='L',npoints=250)
setup = Setup(config['eq'])
sf = SF(setup.filename)
tf = TF(profile,sf=sf)   
pf = PF(sf.eqdsk)
rb = RB(setup,sf)

cage = coil_cage(nTF=nTF,rc=tf.rc,plasma={'config':config['eq']},coil=tf.x['cl'])
 
demo = DEMO()
demo.fill_part('Vessel')
demo.fill_part('Blanket')
demo.fill_part('TF_Coil')
demo.plot_ports()
demo.plot_limiter()  

sf.contour(Nlevel=51,plot_vac=False,lw=0.5)
pl.plot(sf.rbdry,sf.zbdry,color=0.75*np.ones(3),lw=1)
Beispiel #19
0
import pylab as pl
from nova.shelf import PKL

import seaborn as sns
rc = {'figure.figsize':[7*10/16,7],'savefig.dpi':150, #*12/16
      'savefig.jpeg_quality':100,'savefig.pad_inches':0.1,
      'lines.linewidth':0.75}
sns.set(context='paper',style='white',font='sans-serif',palette='Set2',
        font_scale=7/8,rc=rc)
Color = cycle(sns.color_palette('Set2'))


base = {'TF':'dtt','eq':'SN','label':'SX'}
config,setup = select(base=base,update=False,nTF=18,nPF=5,nCS=3)

sf = SF(setup.filename)
pf = PF(sf.eqdsk)
tf = TF(Profile(config['TF'],family='S',part='TF',
                nTF=config['nTF'],obj='L',load=True))
tf.fill()


eq = EQ(sf,pf,dCoil=1.0,sigma=0,n=2e4,
        boundary=sf.get_sep(expand=1.1),zmin=sf.Xpoint[1]-6) 
eq.gen_opp()

inv = INV(sf,eq,tf)
Lpf = inv.grid_PF(nPF=config['nPF'])
Lcs = inv.grid_CS(nCS=config['nCS'],Zbound=[-8,8],gap=0.1,fdr=1)
L = np.append(Lpf,Lcs)
inv.update_coils()
Beispiel #20
0
    'savefig.pad_inches': 0.1,
    'lines.linewidth': 0.75
}
sns.set(context='paper',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)
Color = cycle(sns.color_palette('Set2'))

nPF, nCS, nTF = 5, 5, 18
config = {'TF': 'dtt', 'eq': 'SFm'}
config['TF'] = '{}{}{:d}'.format(config['eq'], config['TF'], nTF)
setup = Setup(config['eq'])
sf = SF(setup.filename)

rb = RB(setup, sf)
pf = PF(sf.eqdsk)
tf = TF(
    Profile(config['TF'], family='S', part='TF', nTF=nTF, obj='L', load=True))

eq = EQ(sf,
        pf,
        dCoil=2.0,
        sigma=0,
        n=1e4,
        boundary=sf.get_sep(expand=0.75),
        rmin=sf.Xpoint[0] - 3.5,
        zmin=sf.Xpoint[1] - 3.5)
eq.gen_opp()
Beispiel #21
0
    'lines.linewidth': 1.5
}
sns.set(context='talk',
        style='white',
        font='sans-serif',
        palette='Set2',
        font_scale=7 / 8,
        rc=rc)

nPF, nTF = 3, 18
config = {'TF': 'SN_dtt', 'eq': 'SN_{:d}PF_{:d}TF'.format(nPF, nTF)}
config = {'TF': 'SN_dtt', 'eq': 'DEMO_SNb'}

setup = Setup(config['eq'])

sf = SF(setup.filename)
pf = PF(sf.eqdsk)

pf.plot(coils=pf.coil, label=True, plasma=False, current=True)
levels = sf.contour()

rb = RB(setup, sf)
rb.firstwall(plot=False, debug=False)

profile = Profile(config['TF'],
                  family='S',
                  part='TF',
                  nTF=18,
                  obj='L',
                  load=True)
Beispiel #22
0
 def get_boundary(filename, alpha=1e-3):
     sf = SF(filename)
     r, z = sf.get_boundary(alpha=alpha)
     return r, z
Beispiel #23
0
tf = TF(R=X[:,0],Z=X[:,2])
tf.energy(nTF,Iturn=134*68e3)
pl.plot(tf.Rmid,tf.Zmid)
'''

#setup = Setup('SN')
#sf = SF(setup.filename)

#eq = EQ(sf,pf,sigma=0.2,boundary=rb.get_fw(expand=0.25),n=7.5e4)
#eq.plotj(trim=True)
#pl.plot(sf.rbdry,sf.zbdry,color=0.75*np.ones(3),lw=1.5)

for conf in ['SN', 'X', 'SFm', 'SX', 'SXex']:  #
    print(conf)
    setup = Setup(conf)
    sf = SF(setup.filename)
    pf = PF(sf.eqdsk)
    rb = RB(setup, sf)
    rb.firstwall(calc=False, plot=True, debug=False)
    rb.vessel()
    pf.plot(coils=pf.coil, label=True, plasma=False, current=False)
    tf = TF(nTF=18,
            shape={
                'vessel': rb.loop,
                'pf': pf,
                'fit': False,
                'setup': setup,
                'plot': True,
                'config': conf,
                'coil_type': 'A'
            })
Beispiel #24
0
        'figure.figsize': [8 * 12 / 16, 8],
        'savefig.dpi': 120,  # 
        'savefig.jpeg_quality': 100,
        'savefig.pad_inches': 0.1,
        'lines.linewidth': 2
    }
    sns.set(context='talk',
            style='white',
            font='sans-serif',
            palette='Set2',
            font_scale=7 / 8,
            rc=rc)

    config = 'DEMO_SN'
    setup = Setup(config)
    sf = SF(setup.filename)
    sf.get_boundary(plot=True)

    config = 'DEMO_SNb'
    setup = Setup(config)
    sf = SF(setup.filename)
    sf.get_boundary(plot=True)

    pf = PF(sf.eqdsk)
    eq = EQ(sf, pf, limit=[4.5, 14.5, -8, 8], n=1e4)
    rb = RB(setup, sf)
    #sf.contour(plot_vac=True)

    #sf.get_legs(debug=True)

    rb.set_firstwall(sf.eqdsk['xlim'], sf.eqdsk['ylim'])