Tutorial explaining how to simulate density evolution

The default setting in RAPTOR is to simulate only flux diffusion and electron temperature evolution. Here we explain how to add also an equation for evolving electron density.

Contents

% First, add the relevant paths
close all hidden;
run(fullfile(pwd,'..','RAPTOR_path.m')); % add RAPTOR path

Solve for ne with manual transport coefficients, fix ni/ne fraction

Load the default configuration structure.

[config] = RAPTOR_config; % load default params
config.equi.mode = 'free'; % required to solve for ne

% To solve ne equation, set these options:
config.ne.method = 'state';
% Set boundary condition type (Dirichlet, specify ne directly) and value
config.ne.BCtype = 'ne';
config.ne.BCval =  0.1e19;

config.ni.method = 'nescal'; % also specify ion density method: scale w.r.t. ne
init.ni0scal = 0.9; init.niescal = 1; % set core ni to be 90% of core ne and edge ni=ne;

[model,params,init,g,v,U] = build_RAPTOR_model(config);

% inspect transport model used for ne;
disp(model.vpdn_e); % manual model
disp(params.vpdn_e);

x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1));

% Run RAPTOR
simres = RAPTOR_predictive(x0,g,v,U,model,params);
% To compute some physical outputs, we run the RAPTOR_out function.
out = RAPTOR_out(simres,model,params);
% Plots
hf=figure(1); set(hf,'position',[50 50 700 300]); clf(hf);
subplot(131); plot(out.time,out.ne/1e19); xlabel('time [s]'); title('n_e at various rho [10^{19}m^{-3}]');
subplot(132); plot(out.rho,out.ne(:,1:5:end)/1e19); xlabel('\rho_{tor}'); title('n_e profiles [10^{19}m^{-3}]');
subplot(133); plot(out.time,out.ne(1,:)/1e19,'b',out.time,out.ni(1,:)/1e19,'r--'); xlabel('time [s]'); title('ne(-),ni(--)');
manual
    dne_pr: 1
    vpe_pr: -5

     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.063    4 3.0e-09       0       1      80       0     1.5    78.5    15.3    5.68    5.68 3.1e+00    0.21    0.21    1.16 8.8e+00 
     11    0.38    2 3.9e-12      10       1      80       0    3.33    76.6    15.3    3.27    3.27 2.4e+00    0.35    0.35    1.05 4.4e+00 
     21    0.67    2 3.5e-13      20       1      80       0    3.32    76.6    15.3    2.35    2.35 2.1e+00    0.46    0.46    0.80 3.2e+00 
     31    0.95    2 1.2e-13      30       1      80       0    3.16    76.8    15.3    1.88    1.88 1.8e+00    0.57    0.57    0.64 2.6e+00 
     41     1.2    2 4.2e-14      40       1      80       0    2.98      77    15.3     1.6     1.6 1.7e+00    0.67    0.67    0.54 2.2e+00 
     51     1.5    2 1.8e-14      50       1      80       0    2.84    77.1    15.3    1.41    1.41 1.5e+00    0.75    0.75    0.48 1.8e+00 

Solve for ne with manual transport coefficients, compute ni from Zeff and quasineutrality

To solve for ni via Zeff and quasineutrality, we need to introduce one impurity species (since we have two constraints).

% Change the method for ne to 'qnze' (quasi-neutrality and Z-effective).
config.ni.method = 'qnze';
config.n1.method = 'qnze'; % solve for one impurity species as wel.
config.atom.Z1 = 6; config.atom.A1 = 12; % choose carbon impurity

[model,params,init,g,v,U] = build_RAPTOR_model(config);
init.ze0 = 2.0; init.zee = 3.0; % set Zeff at axis and edge.
v = build_kinetic_profiles(model,init); % update Zeff in v
x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1));

% Run RAPTOR
simres = RAPTOR_predictive(x0,g,v,U,model,params);
% To compute some physical outputs, we run the RAPTOR_out function.
out = RAPTOR_out(simres,model,params);

hf=figure(1); set(hf,'position',[50 50 700 300]); clf(hf);
subplot(131); plot(out.rho,[out.ne(:,end),out.ni(:,end)]/1e19); xlabel('\rho_{tor}'); title('n_e,n_i [10^{19}m^{-3}]');
subplot(132); plot(out.rho,out.ze,'r',out.rho,out.ne(:,end)./out.ni(:,end)); xlabel('\rho_{tor}'); title('Z_{eff}, n_i/n_e');
subplot(133); plot(out.time,out.ne(1,:)/1e19,'b',out.time,out.ni(1,:)/1e19,'r--'); xlabel('time [s]'); title('ne(-),ni(--)');
     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.081    4 2.0e-10       0       1      80       0    1.64    78.3    15.3    5.56    5.56 2.7e+00    0.20    0.20    1.16 9.2e+00 
     11    0.43    2 3.2e-12      10       1      80       0    3.06    76.9    15.3    3.07    3.07 2.2e+00    0.31    0.31    1.05 4.7e+00 
     21    0.77    2 3.1e-13      20       1      80       0    3.02    76.9    15.3    2.15    2.15 1.9e+00    0.41    0.41    0.80 3.4e+00 
     31     1.1    2 1.3e-13      30       1      80       0    2.84    77.1    15.3    1.69    1.69 1.6e+00    0.51    0.51    0.64 2.7e+00 
     41     1.4    2 4.5e-14      40       1      80       0    2.66    77.3    15.3    1.43    1.43 1.5e+00    0.60    0.60    0.54 2.3e+00 
     51     1.8    2 1.7e-14      50       1      80       0    2.51    77.5    15.3    1.26    1.26 1.4e+00    0.68    0.68    0.48 1.9e+00 

ITPA-IOS benchmark coordinated by Y.S. Na [paper in preparation]

[config] = RAPTOR_config('ITER'); % load default params
config.grid.tgrid = [0:.1:10];
config.grid.rhogrid = linspace(0,1,41);
config.equi.mode = 'free';

config.ne.method = 'state';
config.ne.scal = 1e19;
config.ne.BCtype = 'ne';
config.ne.BCval =  4.6e19;

config.ni.method = 'nescal';

config.init.ne0 = 6e19;
config.init.ni0 = 6e19;

% Transport and sources
config.vpdn_e = vpdn_e('benchmark');
config.sn_e = sn_e('benchmark');

[model,params,init,g,v,U] = build_RAPTOR_model(config);

x0 = RAPTOR_initial_conditions(model,init,g(:,1),v(:,1));
simres = RAPTOR_predictive(x0,g,v,U,model,params);
out = RAPTOR_out(simres,model,params);

% plots
hf=figure(1); set(hf,'position',[50 50 700 300]); clf(hf);
subplot(131); plot(out.rho,out.ne(:,end)/1e19,'b',out.rho,out.ni(:,end)/1e19,'r--');
legend({'ne','ni'},'location','southwest'); xlabel('\rho_{tor}'); title('Final n_e,n_i profiles'); ylabel('m^{-3}');
subplot(132); plot(out.sne(:,end)/1e19,'b');
title('Source'); ylabel('m^{-3}/s'); xlabel('\rho_{tor}'); set(gca,'ylim',[0,5]);
subplot(133); plot(out.rho,out.dne(:,end),'r',out.rho,out.vne(:,end),'b');
legend({'D_{ne} [m^2/s]','V_{ne} [m/s]'},'location','northwest'); title('diffusion, pinch')
     it  telaps newt     res   t[ s]  dt[ s]  Ip[MA] Icd[MA] Ibs[MA] Ioh[MA]      qe    qmin      q0   Vl[V] Te0[keV] Ti0[keV] ne0[e19]   f_ss  
      1    0.14    5 6.3e-12       0     0.1       4       0   0.724    3.28    14.9    2.63    2.63 5.1e-02    3.60    3.60    6.01 3.3e+00 
     11     1.1    3 3.7e-12       1     0.1       4       0   0.163    3.84    14.9    2.54    2.54 2.9e-01    1.45    1.45    6.54 4.3e+00 
     21     1.9    3 4.0e-12       2     0.1       4       0   0.106    3.89    14.9    2.46    2.46 4.1e-01    1.08    1.08    7.50 4.3e+00 
     31     2.7    2 4.5e-09       3     0.1       4       0  0.0951     3.9    14.9    2.38    2.38 4.9e-01    1.00    1.00    8.24 3.9e+00 
     41     3.4    2 1.4e-09       4     0.1       4       0  0.0905    3.91    14.9    2.31    2.31 5.4e-01    0.97    0.97    8.74 3.5e+00 
     51       4    2 4.8e-10       5     0.1       4       0  0.0871    3.91    14.9    2.26    2.26 5.9e-01    0.94    0.94    9.06 3.2e+00 
     61     4.6    2 1.7e-10       6     0.1       4       0  0.0842    3.92    14.9    2.24    2.24 6.2e-01    0.92    0.92    9.26 3.1e+00 
     71     5.3    2 6.6e-11       7     0.1       4       0  0.0815    3.92    14.9    2.25    2.25 6.5e-01    0.89    0.89    9.40 3.0e+00 
     81       6    2 2.5e-11       8     0.1       4       0   0.079    3.92    14.9     2.3     2.3 6.7e-01    0.87    0.87    9.48 3.0e+00 
     91     6.6    2 1.1e-11       9     0.1       4       0  0.0767    3.92    14.9    2.37    2.37 7.0e-01    0.84    0.84    9.54 2.9e+00 
    101     7.3    2 5.1e-12      10     0.1       4       0  0.0745    3.93    14.9    2.47    2.47 7.1e-01    0.81    0.81    9.57 2.9e+00