Esempio n. 1
0
from cherab.openadas import OpenADAS, print_available_adf15_rates

adas = OpenADAS()

print_available_adf15_rates("adf15/pec96#c/pec96#c_vsu#c1.dat")

print()
print()

print_available_adf15_rates("pec96#he_pju#he0.dat")

print()
print()

print_available_adf15_rates("pec96#he_pju#he1.dat")

print()
print()

print_available_adf15_rates("pec12#h_pju#h0.dat")
Esempio n. 2
0
from cherab.openadas import OpenADAS

###############
# Make Plasma #

width = 1.0
length = 1.0
height = 3.0
peak_density = 5e19
pedestal_top = 1
neutral_temperature = 0.5
peak_temperature = 2500
impurities = [(carbon, 6, 0.005)]

world = World()
adas = OpenADAS(permit_extrapolation=True, missing_rates_return_null=True)

plasma = Plasma(parent=world)
plasma.atomic_data = adas
plasma.geometry = Box(Point3D(0, -width / 2, -height / 2),
                      Point3D(length, width / 2, height / 2))

species = []

# make a non-zero velocity profile for the plasma
vy_profile = IonFunction(1E5, 0, pedestal_top=pedestal_top)


def vectorfunction3d(x, y, z):
    vy = vy_profile(x, y, z)
    return Vector3D(0, vy, 0)
Esempio n. 3
0
from cherab.core.math import ConstantVector3D
from cherab.core.atomic.elements import deuterium, nitrogen
from cherab.core.model import ExcitationLine, RecombinationLine,\
    MultipletLineShape, StarkBroadenedLine
from cherab.openadas import OpenADAS
from cherab.tools.plasmas import GaussianVolume

# tunables
ion_density = 1e20
sigma = 0.25

# setup scenegraph
world = World()

# create atomic data source
adas = OpenADAS(permit_extrapolation=True)

# PLASMA ----------------------------------------------------------------------
plasma = Plasma(parent=world)
plasma.atomic_data = adas
plasma.geometry = Sphere(sigma * 5.0)
plasma.geometry_transform = None
plasma.integrator = NumericalIntegrator(step=sigma / 5.0)

# define basic distributions
d_density = GaussianVolume(0.5 * ion_density, sigma * 10000)
n_density = d_density * 0.01
e_density = GaussianVolume(ion_density, sigma * 10000)
temperature = 1 + GaussianVolume(79, sigma)
bulk_velocity = ConstantVector3D(Vector3D(-1e6, 0, 0))
Esempio n. 4
0
    PI2_TO_PI3, PI4_TO_PI3
from cherab.tools.plasmas.slab import build_slab_plasma
from cherab.openadas import OpenADAS

###############
# Make Plasma #

world = World()

plasma = build_slab_plasma(width=1.0,
                           height=3.0,
                           peak_density=1e18,
                           impurities=[(carbon, 6, 0.005)],
                           parent=world)
plasma.b_field = ConstantVector3D(Vector3D(0, 1.5, 0))
plasma.atomic_data = OpenADAS(permit_extrapolation=True)

# add background emission
d_alpha = Line(hydrogen, 0, (3, 2))
plasma.models = [ExcitationLine(d_alpha), RecombinationLine(d_alpha)]

####################
# Visualise Plasma #

h0 = plasma.composition.get(hydrogen, 0)
h1 = plasma.composition.get(hydrogen, 1)
c6 = plasma.composition.get(carbon, 6)

# Run some plots to check the distribution functions and emission profile are as expected
ti = h1.distribution.effective_temperature
r, _, z, t_samples = sample3d(ti, (-1, 2, 200), (0, 0, 1), (-1, 1, 200))
Esempio n. 5
0
for cad_file in MESH_PARTS:
    directory, filename = os.path.split(cad_file)
    name, ext = filename.split('.')
    print("importing {} ...".format(filename))
    Mesh.from_file(cad_file,
                   parent=world,
                   material=AbsorbingSurface(),
                   name=name)  # material=Lambert(ConstantSF(0.25))

# Load plasma from SOLPS model
mds_server = 'solps-mdsplus.aug.ipp.mpg.de:8001'
ref_number = 69636  #69637
sim = load_solps_from_mdsplus(mds_server, ref_number)
plasma = sim.create_plasma(parent=world)
plasma.atomic_data = OpenADAS(permit_extrapolation=True)
mesh = sim.mesh
vessel = mesh.vessel

# Pick emission models
# d_alpha = Line(deuterium, 0, (3, 2))
# plasma.models = [ExcitationLine(d_alpha), RecombinationLine(d_alpha)]

# d_gamma = Line(deuterium, 0, (5, 2))
# plasma.models = [ExcitationLine(d_gamma), RecombinationLine(d_gamma)]

ciii_465 = Line(carbon, 2, ('2s1 3p1 3P4.0', '2s1 3s1 3S1.0'))
plasma.models = [ExcitationLine(ciii_465)]

# Select from available Cameras
# camera_config = load_calcam_calibration('/home/mcarr/mastu/cameras/mug_bulletb_midplane.nc')
Esempio n. 6
0
    VectorAxisymmetricMapper
from cherab.core import Plasma, Maxwellian, Species
from cherab.core.atomic import Line, deuterium, carbon
from cherab.core.model import SingleRayAttenuator, BeamCXLine
from cherab.openadas import OpenADAS
from cherab.jet.nbi import load_pini_from_ppf
from cherab.jet.equilibrium import JETEquilibrium
from cherab.jet.machine import import_jet_mesh

PULSE = 79666
PULSE_PLASMA = 79503  # /!\ Plasma configuration is from pulse 79503!
TIME = 61.0

world = World()

adas = OpenADAS(permit_extrapolation=True)  # create atomic data source

import_jet_mesh(world)

# ########################### PLASMA EQUILIBRIUM ############################ #
print('Plasma equilibrium')

equilibrium = JETEquilibrium(PULSE)
equil_time_slice = equilibrium.time(TIME)
psin_2d = equil_time_slice.psi_normalised
psin_3d = AxisymmetricMapper(equil_time_slice.psi_normalised)
inside_lcfs = equil_time_slice.inside_lcfs

# ########################### PLASMA CONFIGURATION ########################## #
print('Plasma configuration')
Esempio n. 7
0
"""
import numpy as np
from raysect.optical import World

from cherab.core.atomic import carbon, deuterium, Isotope
from cherab.solps import load_solps_from_mdsplus
from cherab.openadas import OpenADAS


def no_radiation(*_):
    """Placeholder for when rates are not found"""
    return 0


world = World()
adas = OpenADAS(permit_extrapolation=True)  # create atomic data source

SPECIES_MAP = {
    'D0': (deuterium, 0),
    'D+1': (deuterium, 1),
    'C0': (carbon, 0),
    'C+1': (carbon, 1),
    'C+2': (carbon, 2),
    'C+3': (carbon, 3),
    'C+4': (carbon, 4),
    'C+5': (carbon, 5),
    'C+6': (carbon, 6)
}

mds_server = 'solps-mdsplus.aug.ipp.mpg.de:8001'
ref_number = 69636
Esempio n. 8
0
import numpy as np
import matplotlib.pyplot as plt

from cherab.core.atomic import deuterium, helium, carbon
from cherab.openadas import OpenADAS

adas = OpenADAS()

# load the PEC rate objects for transitions of interest
dalpha = adas.impact_excitation_pec(deuterium, 0, (3, 2))
heliumii_468 = adas.impact_excitation_pec(helium, 1, (4, 3))
carbonii_515 = adas.impact_excitation_pec(
    carbon, 1, ("2s1 2p1 3d1 2D4.5", "2s2 4d1 2D4.5"))
carboniii_465 = adas.impact_excitation_pec(carbon, 2,
                                           ("2s1 3p1 3P4.0", "2s1 3s1 3S1.0"))

# settings for plot range
temp_low = 1
temp_high = 1000
num_points = 100
electron_density = 1E19
electron_temperatures = [
    10**x for x in np.linspace(
        np.log10(temp_low), np.log10(temp_high), num=num_points)
]

# sample the PECs
dalpha_pecs = []
heliumii_468_pecs = []
carbonii_515_pecs = []
carboniii_465_pecs = []
Esempio n. 9
0
parser.add_argument('-l', '--line', help='The emission line that will be simulated.',
                    choices=list(available_lines.keys()), default='d-alpha')
parser.add_argument('-o', '--output', help='The name of an output file to which the data and an'
                    'image will be written (excluding file extensions).')
args = parser.parse_args()


sensitivity = load_kl11_sensitivity_matrix(camera='c')
voxel_grid = load_kl11_voxel_grid()
camera = load_kl11_camera(stride=3)


edge2d_sim = load_edge2d_from_eproc(args.sim_path)
# edge2d_sim = load_edge2d_from_eproc('/common/cmg/jsimpson/edge2d/runs/run1708151A/tran')
plasma = edge2d_sim.create_plasma()
plasma.atomic_data = OpenADAS()

excitation_model = ExcitationLine(available_lines[args.line])
# excitation_model = ExcitationLine(available_lines['d-alpha'])
recombination_model = RecombinationLine(available_lines[args.line])
# recombination_model = RecombinationLine(available_lines['d-alpha'])
plasma.models = [excitation_model, recombination_model]


class EmissionFunction(PythonFunction3D):

    def __init__(self, model):

        self.model = model

    def __call__(self, x, y, z):
Esempio n. 10
0
world = World()
import_jet_mesh(world, override_material=AbsorbingSurface())
kb5v_collimator_mesh = import_obj(KB5V[0][0],
                                  scaling=0.001,
                                  parent=world,
                                  material=AbsorbingSurface())
kb5h_collimator_mesh = import_obj(KB5H[0][0],
                                  scaling=0.001,
                                  parent=world,
                                  material=AbsorbingSurface())

edge2d_sim = load_edge2d_from_eproc(args.sim_path)
# edge2d_sim = load_edge2d_from_eproc('/common/cmg/jsimpson/edge2d/runs/run1708151A/tran')
plasma = edge2d_sim.create_plasma(parent=world)
plasma.atomic_data = OpenADAS(missing_rates_return_null=True)

models = []
for species in plasma.composition:
    models.append(TotalRadiatedPower(species.element, species.charge))
plasma.models = models

plt.ion()
plt.figure()
xrange = np.linspace(0, 4, 200)
yrange = np.linspace(-2, 2, 200)
rad_rz_intensity = np.zeros((200, 200))
direction = Vector3D(0, 1, 0)
for i, x in enumerate(xrange):
    for j, y in enumerate(yrange):
        for model in models:
    def __init__(self, solps_ref_no, view, line, camera, optics='MAST_CI_mod', cherab_down_sample=50, verbose=True,
                 display=False, overwrite=False):
        """
        :param solps_ref_no: int
        :param view: str
        :param line: str
        :param camera: str
        :param optics: str
        :param cherab_down_sample: int downsample the image by ths factor in both dimensions, for speed / testing.
        :param verbose: bool
        :param display: bool
        :param overwrite: bool
        """

        self.world = World()
        self.solps_ref_no = solps_ref_no
        self.line = line
        self.view = view
        self.camera = camera
        self.optics = optics
        self.cherab_down_sample = cherab_down_sample
        self.verbose = verbose
        self.display = display
        self.overwrite = overwrite

        self.radiance = NotImplemented
        self.spectral_radiance = NotImplemented

        self.pupil_point = settings.view[self.view]['pupil_point']
        self.view_vector = settings.view[self.view]['view_vector']
        self.sensor_format = settings.camera[self.camera]['sensor_format']
        for s in self.sensor_format:
            assert s % cherab_down_sample == 0
        self.sensor_format_ds = tuple((np.array(self.sensor_format) / cherab_down_sample).astype(np.int))
        self.pixel_size = settings.camera[self.camera]['pixel_size']
        self.pixel_size_ds = self.pixel_size * cherab_down_sample

        self.x, self.y, = self.calc_pixel_position(self.pixel_size, self.sensor_format)
        self.x_pixel = self.x.x_pixel
        self.y_pixel = self.y.y_pixel

        self.x_ds = self.x.isel(x=slice(0, self.sensor_format[0], cherab_down_sample, ))
        self.y_ds = self.y.isel(y=slice(0, self.sensor_format[1], cherab_down_sample, ))
        self.x_pixel_ds = self.x_ds.x_pixel
        self.y_pixel_ds = self.y_ds.y_pixel

        self.chunks = {'x': 800, 'y': 800}

        # calculate field of view (FOV) (horizontal) using sensor geometry and lens focal lengths
        f_1, f_2, f_3 = settings.optics[self.optics]
        sensor_dim = self.sensor_format[0] * self.pixel_size
        self.fov = 2 * np.arctan((sensor_dim / 2) * f_2 / (f_3 * f_1)) * 180 / np.pi  # deg
#
        # file and directory paths
        self.dir_name = str(solps_ref_no) + '_' + view + '_' + line + '_' + camera
        self.dir_path = os.path.join(path_saved_data, self.dir_name)
        fname = 'spec_power.nc'
        fname_ds = 'spec_power_ds.nc'
        self.fpath_ds = os.path.join(self.dir_path, fname_ds, )
        self.fpath = os.path.join(self.dir_path, fname, )

        # load SOLPS plasma and set emission line model
        self.sim = load_solps_from_mdsplus(mds_server, self.solps_ref_no)
        self.plasma = self.sim.create_plasma(parent=self.world)
        self.plasma.atomic_data = OpenADAS(permit_extrapolation=True)

        emission_line = settings.line[self.line]
        element, charge, transition = [emission_line[s] for s in ['element', 'charge', 'transition', ]]
        line_obj = Line(element, charge, transition, )
        self._line_excit = ExcitationLine(line_obj, lineshape=StarkBroadenedLine)
        self._line_recom = RecombinationLine(line_obj, lineshape=StarkBroadenedLine)
        self.plasma.models = [Bremsstrahlung(), self._line_excit, self._line_recom]
        wl_0_nm = self._line_excit.atomic_data.wavelength(element, charge, transition, )
        self.wl_0 = wl_0_nm * 1e-9  # [m]
        self.wl_min_nm, self.wl_max_nm = wl_0_nm - 0.2, wl_0_nm + 0.2  # [m]

        # ugly, but I want to convert the density units to 10^{20} m^{-3}
        def get_ne(x, y, z, ):
            return 1e-20 * self.plasma.electron_distribution.density(x, y, z, )

        def get_ni(x, y, z, ):
            return 1e-20 * self.plasma.composition.get(deuterium, 0).distribution.density(x, y, z, )

        def get_b_field_mag(x, y, z, ):
            """
            magnitude of the magnetic field at x, y, z
            :param x:
            :param y:
            :param z:
            :return:
            """
            return self.plasma.b_field(x, y, z, ).length

        def get_emiss_excit(x, y, z, ):
            return self._line_excit.emission(Point3D(x, y, z, ), Vector3D(1, 1, 1), Spectrum(380, 700, 100)).total()

        def get_emiss_recom(x, y, z, ):
            return self._line_recom.emission(Point3D(x, y, z, ), Vector3D(1, 1, 1), Spectrum(380, 700, 100)).total()

        self.valid_param_get_fns = {'ne': get_ne,
                                    'ni': get_ni,
                                    'te': self.plasma.electron_distribution.effective_temperature,
                                    'ti': self.plasma.composition.get(deuterium, 0).distribution.effective_temperature,
                                    'tn': self.plasma.composition.get(deuterium, 1).distribution.effective_temperature,
                                    'b_field_mag': get_b_field_mag,
                                    'emiss_excit': get_emiss_excit,
                                    'emiss_recom': get_emiss_recom,
                                    }
        self.valid_params = list(self.valid_param_get_fns.keys())

        # load / make the cherab image
        if os.path.isdir(self.dir_path) and self.overwrite is False:
            if os.path.isfile(self.fpath) and os.path.isfile(self.fpath_ds):
                pass
        else:
            if not os.path.isdir(self.dir_path):
                os.mkdir(self.dir_path)
                self.make_cherab_image()

        ds, ds_ds = self.load_cherab_image()
        self.spectral_radiance = ds['spectral_radiance']
        self.radiance = self.spectral_radiance.integrate(dim='wavelength')
        self.radiance = xr.where(xr.ufuncs.isnan(self.radiance), 0, self.radiance, )

        self.spectral_radiance_ds = ds_ds['spectral_radiance_ds']
        self.radiance_ds = ds_ds['radiance_ds']
        self.view_vectors = ds_ds['view_vectors_ds']
        self.ray_lengths = ds_ds['ray_lengths_ds']
        ds.close()
Esempio n. 12
0
import numpy as np
import matplotlib.pyplot as plt
from cherab.core.atomic import neon, carbon, helium, hydrogen
from cherab.openadas import OpenADAS

adas = OpenADAS(permit_extrapolation=True)

electron_temperatures = [
    10**x for x in np.linspace(np.log10(1), np.log10(10000), num=100)
]
electron_density = 1e19

elem = neon

numstates = elem.atomic_number + 1

# Collect rate coefficients
coef_tcx = {}
for i in np.arange(1, elem.atomic_number + 1):
    coef_tcx[i] = adas.thermal_cx_rate(hydrogen, 0, neon, int(i))

    # test correctness of available charge numbers
    try:
        adas.thermal_cx_rate(hydrogen, 0, neon, i)
    except RuntimeError:
        print(
            "Check that thermal charge exchange between a neutral element and neutral hydrogen "
            "is not allowed.")

fig_tcxrates = plt.subplots()
ax = fig_tcxrates[1]