RAPTOR tutorial: Control vector parametrization.

Here we explore how to parametrize the input (control) trajectory with a set of parameters. This is useful for optimization purposes, so you can parametrize a whole time-trajectory with just a few numbers.

Contents

The actuator trajectories are written as a sum of basis functions in time

$u_i(t) = \sum_{j=1}^{n_{kts}} P_{ij}(t) p_{ij}$

where $i$ is the actuator index and $j$ is the basis function index. In the end, collect all $p_{ij}$ together in a single vector.

We start by using use the same example as tutorial 3 but specify the inputs differently.

Set up for time-varying H&CD actuators

This is identical to the set-up of tutorial 3

close all hidden;
clear; run('../RAPTOR_path.m');

[config] = RAPTOR_config; % load default config
config.grid.tgrid = [0:0.001:0.1]; % time grid
config.grid.rhogrid = linspace(0,1,21); % spatial grid
config.debug.iterplot = 0; %10; % plot profiles every N iterations
config.debug.iterdisp = 5; % display progress every N iterations

% heating & current drive parameters
% set ECH/ECCD parameters
config.echcd.params.active = true;
config.echcd.params.rdep = [-1 -1]; % -1 to indicate it is commanded extrernally
config.echcd.params.wdep = [0.3, 0.35]; % deposition width
config.echcd.params.cd_eff = [0 1]; % CD efficiency
config.echcd.params.uindices = [2 3 4 5]; % index in input vector
% 2,3 are for the two powers, 4,5 is for the deposition location

% set NBI parameters
config.nbhcd.params.active = true;
config.nbhcd.params.rdep = [0]; % -1 to indicate commanded extrernally
config.nbhcd.params.wdep = [0.8]; % broad heating
config.nbhcd.params.cd_eff = [0]; % no current drive
config.nbhcd.params.uindices = [6]; % index in input vector

% rerun the config file with the new config structure definition
[model,params,init,g,v,U] = build_RAPTOR_model(config);

Define inputs via control vector parametrization:

Define number of knots in time grid.

params.cvp.tknots = 3; % 3 knots in time (start,middle,end)

Define a scaling factor for each input such that the numbers are "human".

params.cvp.pscale = [1e6 1e6 1e6 1 1 1e6]; % [MA, MW, MW, [0,1], [0.1], MW] scales

Define the order for the polynomial bases of each vector.

params.cvp.psporder = [1 0 0 1 1 0]; % piecew linear Ip, pw constant Paux, pwl rdep

Generate input vector from parameters

specify parameter vector in order of appearance. Note the 'piecewise linear' (usporder=1) require 3 numbers, while 'piecewise constant' (usporder=0) require 2 numbers. In general $np_i$ = tknots+usporder-1

p0 = [ [0.08,0.25,0.25], ... % Ip ramp to 250kA
    [0.0  0.5],... % Power step to 0.5MW
    [0.2  0.5],... % Power step to 0.5MW
    [0 0.4 0] ,... % Position sweep from 0 to 0.4 and back
    [0.2 0 0.2],...% Position sweep from 0.2 to 0 and back
    [0,1]]'; % 1MW NBI power.
[U,dU_dp,dU_dt] = RAPTOR_cvp(p0,params);

% inspect the results
plot(params.tgrid,diag(1./params.cvp.pscale)*U);
legend('Ip [MA]','P_{EC1} [MW]','P_{EC2} [MW]','r_{dep,EC1}','r_{dep,EC2}','P_{NBI} [MW]')

initial condition

init.Ip0 = U(1,1);
x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1));
% Run RAPTOR
simres = RAPTOR_predictive(x0,g,v,U,model,params);
     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.077    4 2.9e-09       0       1      80   0.451    1.41    78.1    15.4    5.54    5.98 3.0e+00    0.40    0.40    1.00 1.7e+01 
      6    0.22    2 5.9e-10       5       1      97     1.5     8.2    87.3    12.7    3.82    5.05 3.5e+00    0.79    0.79    1.00 1.5e+01 
     11    0.34    2 3.0e-14      10       1     114    1.92    9.38     103    10.8    3.02    3.97 3.4e+00    0.98    0.98    1.00 1.5e+01 
     16    0.46    2 1.5e-13      15       1     131    2.34    10.2     118    9.41     2.5    3.16 3.3e+00    1.17    1.17    1.00 1.5e+01 
     21    0.58    2 1.1e-13      20       1     148    2.79    10.8     134    8.33    2.15     2.6 3.3e+00    1.36    1.36    1.00 1.4e+01 
     26    0.69    2 7.1e-14      25       1     165    3.25    11.4     150    7.47    1.89    2.22 3.2e+00    1.56    1.56    1.00 1.4e+01 
     31    0.81    2 5.1e-14      30       1     182    3.72    11.8     166    6.77    1.69    1.93 3.1e+00    1.76    1.76    1.00 1.4e+01 
     36    0.94    2 5.6e-14      35       1     199    4.19    12.3     183    6.19    1.54    1.71 3.1e+00    1.96    1.96    1.00 1.4e+01 
     41     1.1    2 2.6e-14      40       1     216    4.67    12.6     199    5.71    1.41    1.52 3.0e+00    2.15    2.15    1.00 1.4e+01 
     46     1.2    2 4.0e-14      45       1     233    5.14    12.9     215    5.29    1.31    1.36 3.0e+00    2.35    2.35    1.00 1.4e+01 
     51     1.3    5 3.9e-14      50       1     250    5.61    13.2     231    4.93    1.23    1.27 2.3e+00    6.36    6.36    1.00 1.2e+01 
     56     1.5    3 4.3e-14      55       1     250    70.7    65.1     114    4.93     1.2    1.38 5.3e-01   13.70   13.70    1.00 3.3e+00 
     61     1.6    2 4.5e-10      60       1     250      86    80.9      83    4.93    1.19    1.51 3.4e-01   15.92   15.92    1.00 2.2e+00 
     66     1.8    2 5.3e-12      65       1     250    91.5    86.4      72    4.93    1.18    1.66 2.8e-01   16.86   16.86    1.00 1.9e+00 
     71     1.9    2 1.7e-12      70       1     250    93.9    88.9    67.1    4.93    1.17    1.81 2.6e-01   17.45   17.45    1.00 1.7e+00 
     76       2    2 9.1e-14      75       1     250    95.1    90.5    64.3    4.93    1.16    1.96 2.4e-01   17.93   17.93    1.00 1.7e+00 
     81     2.1    2 5.0e-14      80       1     250    95.6    91.7    62.7    4.93    1.15     2.1 2.3e-01   18.38   18.38    1.00 1.6e+00 
     86     2.3    2 5.9e-14      85       1     250    95.4    92.7    61.8    4.93    1.15     2.2 2.2e-01   18.80   18.80    1.00 1.6e+00 
     91     2.4    2 7.4e-14      90       1     250    94.6    93.6    61.8    4.93    1.15    2.27 2.1e-01   19.20   19.20    1.00 1.5e+00 
     96     2.5    2 4.8e-14      95       1     250    93.2    94.3    62.5    4.93    1.15    2.31 2.0e-01   19.55   19.55    1.00 1.5e+00 
     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  
    101     2.6    2 6.1e-14     100       1     250    91.3    94.9    63.8    4.93    1.14    2.32 1.9e-01   19.87   19.87    1.00 1.5e+00 

plot results

out = RAPTOR_out(simres,model,params);
subplot(321); plot(out.time,out.U(1,:)); title('Ip');
subplot(322); plot(out.time,out.U([2:3,6],:)); title('P_{aux}')
subplot(323); plot(out.time,out.U([4:5],:)); title('\rho_{dep}')
subplot(324); plot(out.time,out.f_ss); title('f_{ss} (steady stateness)')
subplot(325); [cs,h] = contour(out.time,out.rho,out.q,[1 2 3 4],'color','k'); clabel(cs,h,'labelspacing',72); title('rational q locations');
xlabel('t [s]'); ylabel('\rho');
subplot(326); [cs,h] = contour(out.time,out.rho,out.te/1e3,[0.5 1 2 4 8],'color','k'); clabel(cs,h,'labelspacing',72); title('T_e contours [keV]')
xlabel('t [s]'); ylabel('\rho');

Set different time knots for each grid

params.cvp.psporder = [1 1 1 1 1 1]; % all piecewise linear

tknots1 = linspace(params.tgrid(1),params.tgrid(end),3)';
tknots2 = linspace(params.tgrid(1),params.tgrid(end),4)';
tknots3 = params.tgrid(1) + [0,0.45,0.5,1]'*params.tgrid(end);
params.cvp.tknots = {tknots1,tknots2,tknots2,tknots2,tknots2,tknots3}; % define as cell array, one cell for each actuator

p0 = [ [0.08,0.25,0.25], ... % Ip ramp to 250kA
    [0.0  0.2  0.2 0.5],... % Power step to 0.5MW
    [0.2  0.2  0.5 0.5],... % Power step to 0.5MW
    [0 0.4 0.4 0] ,... % Position sweep from 0 to 0.4 and back
    [0.2 0 0 0.2],...% Position sweep from 0.2 to 0 and back
    [0,0,1,1]]'; % 1MW NBI power.
[U,dU_dp,dU_dt] = RAPTOR_cvp(p0,params);

% *plot results*
figure
subplot(411); plot(params.tgrid,U(1,:));     title('Ip');
subplot(412); plot(params.tgrid,U([2:3],:)); title('P_{aux}')
subplot(413); plot(params.tgrid,U(6,:));     title('P_{aux}')
subplot(414); plot(params.tgrid,U([4:5],:)); title('\rho_{dep}')
xlabel('t[s]');

% end of tutorial