Source code for omfit_classes.omfit_eped

try:
    # framework is running
    from .startup_choice import *
except ImportError as _excp:
    # class is imported by itself
    if (
        'attempted relative import with no known parent package' in str(_excp)
        or 'No module named \'omfit_classes\'' in str(_excp)
        or "No module named '__main__.startup_choice'" in str(_excp)
    ):
        from startup_choice import *
    else:
        raise

from omfit_classes.brainfusetf import btf_connect
from omfit_classes.brainfuse import activateNets
import numpy as np
from scipy import constants


__all__ = ['eped_nn_fann', 'eped_nn_tf', 'eped_nn']


[docs]def eped_nn_fann(a, betan, bt, delta, ip, kappa, m, neped, r, zeffped, z=1, zi=6, mi=12, solution=['H', 'superH'][0], model='multiroot'): """ Routine that returns results of the EPED1-NN model :param a: scalar or array of minor radius [m] :param betan: scalar or array of beta_n :param bt: scalar or array of toroidal magnetic field [T] :param delta: scalar or array of triangularity :param ip: scalar or array of plasma current [MA] :param kappa: scalar or array of elongation :param m: scalar or array of ion mass (2 for D and 2.5 for DT) :param neped: scalar or array of density at pedestal [1E19 m^-3] :param r: scalar or array of major radius [m] :param zeffped: scalar or array of effective ion charge at pedestal :param z: scalar or array of ion charge (only used for calculating Te from pressure) :param mi: scalar or array of impurity ion mass (only used for calculating Te from pressure) :param Zi: scalar or array of impurity ion charge (only used for calculating Te from pressure) :param solution: 'H' or 'superH' :return: scalars or arrays of electron temperature in keV and pedestal width as fraction of psi """ nets = OMFITsrc + f'/../modules/EPED/EPEDNN/{model}/*.net' dB = {} dB['a'] = a dB['betan'] = betan dB['bt'] = bt dB['delta'] = delta dB['ip'] = ip dB['kappa'] = kappa dB['m'] = m dB['neped'] = neped dB['r'] = r dB['zeffped'] = zeffped for k in dB: dB[k] = np.atleast_1d(dB[k]) out, sut, targets, nets, out_ = activateNets(nets, dB) outputNames = nets[list(nets.keys())[0]].outputNames output_name = 'OUT_p_E1_%d' % ['H', 'meta', 'superH'].index(solution) z = np.atleast_1d(z) zi = np.atleast_1d(zi) mi = np.atleast_1d(mi) nival = neped * (zeffped - z) / (zi**2 - zi) nval = neped - zi * nival nsum = neped + nval + nival pped = out[:, outputNames.index(output_name)] Te = pped * 1e6 / (nsum * 1e19) / constants.e / 1e3 wid = out[:, outputNames.index(output_name.replace('_p_', '_wid_'))] if len(Te) == 1: return Te[0], wid[0] else: return Te, wid
[docs]def eped_nn_tf( a, betan, bt, delta, ip, kappa, m, neped, r, zeffped, z=1, zi=6, mi=12, solution=['H', 'superH'][0], diamag=['GH', 'G', 'H'][0], model='eped1nn/models/EPED_mb_128_pow_norm_common_30x10.pb', ): """ Routine that returns results of the EPED1-NN model :param a: scalar or array of minor radius [m] :param betan: scalar or array of beta_n :param bt: scalar or array of toroidal magnetic field [T] :param delta: scalar or array of triangularity :param ip: scalar or array of plasma current [MA] :param kappa: scalar or array of elongation :param m: scalar or array of ion mass (2 for D and 2.5 for DT) :param neped: scalar or array of density at pedestal [1E19 m^-3] :param r: scalar or array of major radius [m] :param zeffped: scalar or array of effective ion charge at pedestal :param z: scalar or array of ion charge (only used for calculating Te from pressure) :param mi: scalar or array of impurity ion mass (only used for calculating Te from pressure) :param Zi: scalar or array of impurity ion charge (only used for calculating Te from pressure) :param solution: 'H' or 'superH' :param diamag: diamagnetic stabilization model 'GH' or 'G' or 'H' :param model: string to select the EPED1NN model :return: scalars or arrays of electron temperature in keV and pedestal width as fraction of psi """ output_name = f"OUT_p_E1_dmag{diamag}_sol{['H','meta','superH'].index(solution)}" a = np.atleast_1d(a) betan = np.atleast_1d(betan) bt = np.atleast_1d(bt) delta = np.atleast_1d(delta) ip = np.atleast_1d(ip) kappa = np.atleast_1d(kappa) m = np.atleast_1d(m) neped = np.atleast_1d(neped) r = np.atleast_1d(r) zeffped = np.atleast_1d(zeffped) input = [a, betan, bt, delta, ip, kappa, m, neped, r, zeffped] input = np.atleast_2d(input).T with btf_connect(path=model) as tf: input_names, output_names = tf.info() with btf_connect(path=model) as tf: output_list = tf.run(input=input) output = {} for k, oname in enumerate(output_names): output[oname] = output_list[:, k] z = np.atleast_1d(z) zi = np.atleast_1d(zi) mi = np.atleast_1d(mi) nival = neped * (zeffped - z) / (zi**2 - zi) nval = neped - zi * nival nsum = neped + nval + nival pped = output[output_name] Te = pped * 1e6 / (nsum * 1e19) / constants.e / 1e3 wid = output[output_name.replace('_p_', '_wid_')] if len(Te) == 1: return Te[0], wid[0] else: return Te, wid
eped_nn = eped_nn_fann ############################################ if '__main__' == __name__: test_classes_main_header() print(eped_nn_fann(0.5, 1.0, 2.5, 0.6, 1.8, 1.9, 2.0, 3.6, 1.7, 2.0)) print( eped_nn_fann([0.5, 0.5], [1.0, 1.0], [2.5, 2.5], [0.6, 0.6], [1.8, 1.8], [1.9, 1.9], [2.0, 2.0], [3.6, 3.6], [1.7, 1.7], [2.0, 2.0]) ) # print(eped_nn_tf(0.5, 1.0, 2.5, 0.6, 1.8, 1.9, 2.0, 3.6, 1.7, 2.0)) # print( # eped_nn_tf([0.5, 0.5], [1.0, 1.0], [2.5, 2.5], [0.6, 0.6], [1.8, 1.8], [1.9, 1.9], [2.0, 2.0], [3.6, 3.6], [1.7, 1.7], [2.0, 2.0]) # )