# Tutorial showing some options for how to specify kinetic profiles

Kinetic profiles that are not solved for (i.e. are evolved as part of the state vector `x`, can be prescribed by other means. Either by scaling another profile, or by direct specification. This tutorial provides some examples

## Contents

- Basic default case
- ti defined as independent state
- ti scaled with respect to te
- ni scaled w.r.t. ne
- kinetic profiles defined by hand

    run(fullfile(pwd,'..','RAPTOR_path.m')); % add RAPTOR path
    close all hidden; clear;
    [config] = RAPTOR_config; % load default params
    config.debug.iterdisp = 0; % nice and quiet

## Basic default case

    config.ti.method
    config.ni.method
    [model,params,init,g,v,U] = build_RAPTOR_model(config); % generate model structure for these params.

    U(1,:) = 80e3*ones(size(params.tgrid)); % input Ip trace: constant 80kA
    init.Ip0 = U(1); % initial condition for current
    x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1)); % Define the initial condition
    simres = RAPTOR_predictive(x0,g,v,U,model,params);
    out = RAPTOR_out(simres,model,params);

    ans =

    tescal

    ans =

    direct

## ti defined as independent state

    config.ti.method = 'state';
    config.ti.BCtype = 'Te';
    config.ti.BCval = config.te.BCval;
    [model,params,init,g,v,U] = build_RAPTOR_model(config); % generate model structure for these params.

    U(1,:) = 80e3*ones(size(params.tgrid)); % input Ip trace: constant 80kA
    init.Ip0 = U(1); % initial condition for current
    x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1)); % Define the initial condition
    simres = RAPTOR_predictive(x0,g,v,U,model,params);
    out = RAPTOR_out(simres,model,params);

## ti scaled with respect to te

    config.ti.method = 'tescal';
    [model,params,init,g,v,U] = build_RAPTOR_model(config);
    disp(init)
    init.ti0scal = 0.9;
    init.tiescal = 1;
    % Construct kinetic profiles according to the new settings.
    v = build_kinetic_profiles(model,init);

    U(1,:) = 80e3*ones(size(params.tgrid)); % input Ip trace: constant 80kA
    init.Ip0 = U(1); % initial condition for current
    x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1)); % Define the initial condition
    v(model.ti.vind)

    simres = RAPTOR_predictive(x0,g,v,U,model,params);
    out = RAPTOR_out(simres,model,params);

    plot(out.rho,[out.te(:,end),out.ti(:,end)]);
    disp(out.ti(:,end)'./out.te(:,end)')

            te0: 200
        tewidth: 0.6000
        ti0scal: 1
        tiescal: 1
            ne0: 1.0000e+19
        newidth: 0.8000
            ni0: 1.0000e+19
        niwidth: 0.8000
         n1scal: 0
         n2scal: 0
         n3scal: 0
            ze0: 3.5000
            zee: 3.5000
           jpow: 4
            Ip0: 80000
          psib0: 0

    ans =

        0.9000
        0.9022
        0.9067
        0.9133
        0.9200
        0.9267
        0.9333
        0.9400
        0.9467
        0.9533
        0.9600
        0.9667
        0.9733
        0.9800
        0.9867
        0.9933
        0.9978
        1.0000

      Columns 1 through 7

        0.9000    0.9067    0.9133    0.9200    0.9267    0.9333    0.9400

      Columns 8 through 14

        0.9467    0.9533    0.9600    0.9667    0.9733    0.9800    0.9867

      Columns 15 through 16

        0.9933    1.0000

## ni scaled w.r.t. ne

    config.ni.method = 'nescal';
    [model,params,init,g,v,U] = build_RAPTOR_model(config);
    disp(init)
    init.ni0scal = 0.9;
    init.niescal = 1;
    % Construct kinetic profiles according to the new settings.
    v = build_kinetic_profiles(model,init);

    U(1,:) = 80e3*ones(size(params.tgrid)); % input Ip trace: constant 80kA
    init.Ip0 = U(1); % initial condition for current
    x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1)); % Define the initial condition
    simres = RAPTOR_predictive(x0,g,v,U,model,params);
    out = RAPTOR_out(simres,model,params);

    plot(out.rho,[out.ne(:,end),out.ni(:,end)]);
    disp(out.ni(:,end)'./out.ne(:,end)')

            te0: 200
        tewidth: 0.6000
        ti0scal: 1
        tiescal: 1
            ne0: 1.0000e+19
        newidth: 0.8000
        ni0scal: 1
        niescal: 1
         n1scal: 0
         n2scal: 0
         n3scal: 0
            ze0: 3.5000
            zee: 3.5000
           jpow: 4
            Ip0: 80000
          psib0: 0

      Columns 1 through 7

        0.9000    0.9067    0.9133    0.9200    0.9267    0.9333    0.9400

      Columns 8 through 14

        0.9467    0.9533    0.9600    0.9667    0.9733    0.9800    0.9867

      Columns 15 through 16

        0.9933    1.0000

## kinetic profiles defined by hand

    [config] = RAPTOR_config;
    % Ti value will be defined below.
    config.ti.method = 'direct';
    % Generate model structure for these params.
    [model,params,init,g,v,U] = build_RAPTOR_model(config);
    % Check which profiles should be defined;
    new_profiles = build_kinetic_profiles; % empty call
    disp(new_profiles);
    % Define new profiles and radial grid
    np = 20;
    new_profiles.rho = linspace(0,1,np)';
    new_profiles.ne = 1.5e19*exp(-new_profiles.rho.^2/0.7^2);
    new_profiles.ni = 1.0e19*exp(-new_profiles.rho.^2/0.7^2);
    new_profiles.ti = 0.9e03*exp(-new_profiles.rho.^2/0.7^2);
    new_profiles.ze = 1.85*ones(size(new_profiles.rho));
    % Construct new plasma profiles
    v = build_kinetic_profiles(model,config,new_profiles);
    % input Ip trace: constant 80kA
    U(1,:) = 80e3*ones(size(params.tgrid));
    % initial condition for current
    init.Ip0 = U(1,1);
    % Define the initial condition
    x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1));
    % Run simulation
    simres = RAPTOR_predictive(x0,g,v,U,model,params);
    out = RAPTOR_out(simres,model,params);

         ne: []
         ni: []
         ti: []
         ze: []
         n1: []
        rho: []

         it  telaps newt     res   t[ms]  dt[ms]  Ip[kA] Icd[kA] Ibs[kA] Ioh[kA]      qe    qmin      q0   Vl[V] Te0[keV] Ti0[keV] ne0[e19]   f_ss
          1   0.035    4 1.5e-13       0       1      80       0    4.16    75.8    15.3    5.76    5.82 2.2e+00    0.18    0.90    1.50 8.1e+00
         11    0.22    2 5.2e-13      10       1      80       0    4.17    75.8    15.3    3.78    3.78 2.3e+00    0.19    0.90    1.50 2.0e+00
         21     0.4    2 7.4e-15      20       1      80       0     4.2    75.8    15.3    3.23    3.23 2.2e+00    0.20    0.90    1.50 9.9e-01
         31    0.58    2 1.0e-14      30       1      80       0    4.22    75.7    15.3       3       3 2.1e+00    0.21    0.90    1.50 5.2e-01
         41    0.74    1 7.0e-09      40       1      80       0    4.23    75.7    15.3    2.89    2.89 2.1e+00    0.21    0.90    1.50 2.8e-01
         51    0.86    1 2.0e-09      50       1      80       0    4.23    75.7    15.3    2.83    2.83 2.1e+00    0.21    0.90    1.50 1.5e-01