From d3d59d95abac21dad681e12c478f530e367a5e79 Mon Sep 17 00:00:00 2001
From: Antonia Frank <antonia.frank@epfl.ch>
Date: Fri, 9 Aug 2024 18:40:21 +0200
Subject: [PATCH] Update ec_tgrid_out for interpolation saveing to ids

---
 matlab/TCV_IMAS/tcv_get_ids_core_sources.m | 134 +++++++++++----------
 1 file changed, 69 insertions(+), 65 deletions(-)

diff --git a/matlab/TCV_IMAS/tcv_get_ids_core_sources.m b/matlab/TCV_IMAS/tcv_get_ids_core_sources.m
index a904007c..ea30cb6a 100644
--- a/matlab/TCV_IMAS/tcv_get_ids_core_sources.m
+++ b/matlab/TCV_IMAS/tcv_get_ids_core_sources.m
@@ -58,7 +58,7 @@ id_ohm.index = 7; id_ohm.name = 'ohmic';
 ids_core_sources.source{last_index+1} = source_template;
 ids_core_sources.source{last_index+1}.identifier = id_ohm;
 ids_core_sources.source{last_index+1}.profiles_1d(1:ohm_n_t) = {profiles_template};
-ids_core_sources.source{last_index+1}.global_quantities(1:ohm_n_t) = globals_template;
+ids_core_sources.source{last_index+1}.global_quantities(1:ohm_n_t) = {globals_template};
 ohm_data = ohm_gdat.ohm.ohm_data;
 
 % load LIUQE data to convert
@@ -107,7 +107,7 @@ id_bs.index = 13; id_bs.name = 'bootstrap_current';
 ids_core_sources.source{last_index+1} = source_template;
 ids_core_sources.source{last_index+1}.identifier = id_bs;
 ids_core_sources.source{last_index+1}.profiles_1d(1:bs_n_t) = {profiles_template};
-ids_core_sources.source{last_index+1}.global_quantities(1:bs_n_t) = globals_template;
+ids_core_sources.source{last_index+1}.global_quantities(1:bs_n_t) = {globals_template};
 
 for ii = 1:bs_n_t
   % profiles_1d
@@ -139,7 +139,7 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
 
   ec_data = ec_gdat.ec.ec_data; ec_inputs = ec_gdat.ec.ec_inputs;
   % get tgrid from gdat ec_data
-  ec_tgrid = ec_data.p_dens.t; nt_ec_data = numel(ec_tgrid);
+  ec_tgrid_toray = ec_data.p_dens.t; nt_ec_toray = numel(ec_tgrid_toray);
 
   % retrieve active launcher information from ec_inputs
   nb_launchers = numel(ec_inputs.launchers_active.data);
@@ -147,10 +147,13 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
 
   % find times of injected EC power to interpolate power & current densities
   % on p_ec_injected tgrid
-  ec_powers_tgrid = powers_gdat.ec.t; %nt_ec_powers = numel(ec_powers_tgrid);
-  itime_ec = powers_gdat.ec.data(:,end)>0;
-  interp_tgrid = ec_powers_tgrid(itime_ec); nt_interp = numel(interp_tgrid);
-  interp_p_ec_injected = powers_gdat.ec.data(itime_ec,end);
+  ec_powers_tgrid = powers_gdat.ec.t; %nt_ec_powers = numel(ec_powers_tgrid);  
+  % find times where EC is on to define time grid with extra time slice just 
+  % before/after  EC power and at start/end of shot
+  itime_ec = find(powers_gdat.ec.data(:,end)>0);  
+  ec_tgrid_out = [ohm_t_grid(1),ec_powers_tgrid(itime_ec(1)-1:itime_ec(end)+1)',ohm_t_grid(end)];
+  nt_ec_out = numel(ec_tgrid_out);
+  p_ec_injected = interpos(ec_powers_tgrid,powers_gdat.ec.data(:,end),ec_tgrid_out);
 
   % Setup source structs for active launchers from template
   main_desc = 'Source from electron cyclotron heating and current drive';
@@ -160,13 +163,13 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
     id_ec.description = sprintf('L%i/G%i, %s from %s double width CD profiles',i_lau,ec_inputs.gyro2launcher.data(i_lau),main_desc,production);
     ids_core_sources.source{last_index+i_lau} = source_template;
     ids_core_sources.source{last_index+i_lau}.identifier = id_ec;
-    ids_core_sources.source{last_index+i_lau}.profiles_1d(1:nt_interp) = {profiles_template};
-    ids_core_sources.source{last_index+i_lau}.global_quantities(1:nt_interp) = globals_template;
+    ids_core_sources.source{last_index+i_lau}.profiles_1d(1:nt_ec_out) = {profiles_template};
+    ids_core_sources.source{last_index+i_lau}.global_quantities(1:nt_ec_out) = {globals_template};
   end
 
   % load LIUQE data to convert
   % \tilde{j}_// = <jdotB>/(R0<Bphi/R>) to j_//0 = <jdotB>/B0; Bphi=T(psi)/R
-  [L,~,LY] = liuqe(shot,ec_tgrid,'iterq',50,'ilim',3,'icsint',true);
+  [L,~,LY] = liuqe(shot,ec_tgrid_toray,'iterq',50,'ilim',3,'icsint',true);
   rho_pol_norm_liu = L.pQ; % normalized sqrt poloidal flux including axis
   mu0     = 4*pi*10^-7;
   Rm2_fs  = LY.Q2Q;
@@ -176,13 +179,13 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
   vol     = LY.VQ;
   B2_fs   = mu0*Ip_psi./mVprime + T.^2.*Rm2_fs;
   R0 = ids_core_sources.vacuum_toroidal_field.r0;
-  B0 = interp1(ids_core_sources.time,ids_core_sources.vacuum_toroidal_field.b0,ec_tgrid);
+  B0 = interp1(ids_core_sources.time,ids_core_sources.vacuum_toroidal_field.b0,ec_tgrid_toray);
   jtoray_to_jpar0 = 2*pi./B0./(T.*Rm2_fs).*B2_fs;
 
   % interpolate on ec_data rho_pol grid
   jtoray_to_jpar0_mapped = nan(size(ec_data.cd_dens.x));
   vol_mapped = nan(size(ec_data.cd_dens.x));
-  for ii = 1:nt_ec_data
+  for ii = 1:nt_ec_toray
     jtoray_to_jpar0_mapped(:,ii) = ...
       interp1(rho_pol_norm_liu,jtoray_to_jpar0(:,ii),ec_data.cd_dens.grids.rho_pol_norm(:,ii));
     vol_mapped(:,ii) = ...
@@ -198,41 +201,37 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
   for i_lau = active_launchers
     % convert to j// with conversion factor
     cd_dens(:,i_lau,:) = squeeze(cd_dens(:,i_lau,:)).*jtoray_to_jpar0_mapped;
-    for ii = 1:nt_ec_data
+    for ii = 1:nt_ec_toray
       % integrate j//
       cd_integrated(:,i_lau,ii) = cumtrapz(vol_mapped(:,ii),cd_dens(:,i_lau,ii))/(2*pi*R0);
     end
   end
 
-%% interpolating 1d_profiles from 'ec_tgrid' grid (toray tgrid) to 'interp_tgrid' (powers tgrid when powers.data>0)
-  ij = iround_os(interp_tgrid,ec_tgrid);
-  sparse_p_ec_injected = interp_p_ec_injected(ij,:); % injected ec power vals corresponding to ec_tgrid
+%% interpolating 1d_profiles from 'ec_tgrid_toray' grid (toray tgrid) to 'interp_tgrid' (powers tgrid when powers.data>0)
+  ij = iround_os(ec_tgrid_out,ec_tgrid_toray);
+  sparse_p_ec_injected = p_ec_injected(ij); % injected ec power vals corresponding to ec_tgrid_toray
   n_rho = size(p_dens, 1);
   %rho grids to be interpolated on power time grid
   rho_pol_norm = ec_data.cd_dens.grids.rho_pol_norm;
   rho_tor_norm = ec_data.cd_dens.grids.rho_tor_norm;
 
-  % calculate normalised profiles on ec_tgrid grid
-  norm_p_dens        = zeros(n_rho,nb_launchers+1,nt_ec_data);
-  norm_p_integrated  = zeros(n_rho,nb_launchers+1,nt_ec_data);
-  norm_cd_dens       = zeros(n_rho,nb_launchers+1,nt_ec_data);
-  norm_cd_integrated = zeros(n_rho,nb_launchers+1,nt_ec_data);
-  for it = 1:nt_ec_data
-    norm_p_dens(:,:,it)        = p_dens(:,:,it)./sparse_p_ec_injected(it,:);
-    norm_p_integrated(:,:,it)  = p_integrated(:,:,it)./sparse_p_ec_injected(it,:);
-    norm_cd_dens(:,:,it)       = cd_dens(:,:,it)./sparse_p_ec_injected(it,:);
-    norm_cd_integrated(:,:,it) = cd_integrated(:,:,it)./sparse_p_ec_injected(it,:);
+  % calculate normalised profiles on ec_tgrid_toray grid
+  norm_p_dens        = zeros(n_rho,nb_launchers+1,nt_ec_toray);
+  norm_p_integrated  = zeros(n_rho,nb_launchers+1,nt_ec_toray);
+  norm_cd_dens       = zeros(n_rho,nb_launchers+1,nt_ec_toray);
+  norm_cd_integrated = zeros(n_rho,nb_launchers+1,nt_ec_toray);
+  for it = 1:nt_ec_toray
+    norm_p_dens(:,:,it)        = p_dens(:,:,it)       ./sparse_p_ec_injected(it);
+    norm_p_integrated(:,:,it)  = p_integrated(:,:,it) ./sparse_p_ec_injected(it);
+    norm_cd_dens(:,:,it)       = cd_dens(:,:,it)      ./sparse_p_ec_injected(it);
+    norm_cd_integrated(:,:,it) = cd_integrated(:,:,it)./sparse_p_ec_injected(it);
   end
 
   % interpolate normalised p_dens profiles on ec_powers_tgrid
-  interp_norm_p_dens        = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_norm_p_integrated  = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_norm_cd_dens       = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_norm_cd_integrated = zeros(n_rho,nb_launchers+1,nt_interp);
-  % interpolate the rho_pol & rho_tor on ec_powers_tgrid
-  interp_rho_pol             = zeros(n_rho,nt_interp);
-  interp_rho_tor             = zeros(n_rho,nt_interp);
-  interp_rho_flag = 1;
+  interp_norm_p_dens        = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_norm_p_integrated  = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_norm_cd_dens       = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_norm_cd_integrated = zeros(n_rho,nb_launchers+1,nt_ec_out);
   for i_lau = active_launchers
     for irho = 1:n_rho
       % get power and current density at each rho
@@ -241,59 +240,64 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources
       trace_cd_dens       = squeeze(norm_cd_dens(irho,i_lau,:));
       trace_cd_integrated = squeeze(norm_cd_integrated(irho,i_lau,:));
       % interpolate on gdat powers tgrid
-      interp_norm_p_dens(irho,i_lau,:)        = interpos(ec_tgrid,trace_p_dens,interp_tgrid);
-      interp_norm_p_integrated(irho,i_lau,:)  = interpos(ec_tgrid,trace_p_integrated,interp_tgrid);
-      interp_norm_cd_dens(irho,i_lau,:)       = interpos(ec_tgrid,trace_cd_dens,interp_tgrid);
-      interp_norm_cd_integrated(irho,i_lau,:) = interpos(ec_tgrid,trace_cd_integrated,interp_tgrid);
-
-      % only interpolate rho grids once
-      if interp_rho_flag
-        interp_rho_pol(irho,:) = interpos(ec_tgrid,rho_pol_norm(irho,:),interp_tgrid');
-        interp_rho_tor(irho,:) = interpos(ec_tgrid,rho_tor_norm(irho,:),interp_tgrid');
-      end
+      interp_norm_p_dens(       irho,i_lau,3:end-2) = interpos(ec_tgrid_toray,trace_p_dens,       ec_tgrid_out(3:end-2));
+      interp_norm_p_integrated( irho,i_lau,3:end-2) = interpos(ec_tgrid_toray,trace_p_integrated, ec_tgrid_out(3:end-2));
+      interp_norm_cd_dens(      irho,i_lau,3:end-2) = interpos(ec_tgrid_toray,trace_cd_dens,      ec_tgrid_out(3:end-2));
+      interp_norm_cd_integrated(irho,i_lau,3:end-2) = interpos(ec_tgrid_toray,trace_cd_integrated,ec_tgrid_out(3:end-2));
     end
-    interp_rho_flag = 0;
   end
+  
+  % interpolate the rho_pol & rho_tor on ec_powers_tgrid
+  interp_rho_pol = zeros(n_rho,nt_ec_out);
+  interp_rho_tor = zeros(n_rho,nt_ec_out);
+  for irho = 1:n_rho
+    interp_rho_pol(irho,3:end-2) = interpos(ec_tgrid_toray,rho_pol_norm(irho,:),ec_tgrid_out(3:end-2));
+    interp_rho_tor(irho,3:end-2) = interpos(ec_tgrid_toray,rho_tor_norm(irho,:),ec_tgrid_out(3:end-2));
+  end
+  % fill rho_pol just outside of TORAY times(zero power) with the known profiles one time slice after/before 
+  interp_rho_pol(:,2) = interp_rho_pol(:,3); interp_rho_pol(:,end-1) = interp_rho_pol(:,end-2);
 
   % normalised & interpolated profiles * p_ec_injected on interp_tgrid
-  interp_p_dens        = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_p_integrated  = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_cd_dens       = zeros(n_rho,nb_launchers+1,nt_interp);
-  interp_cd_integrated = zeros(n_rho,nb_launchers+1,nt_interp);
-  for it = 1:nt_interp
-    interp_p_dens(:,:,it)        = interp_norm_p_dens(:,:,it).*interp_p_ec_injected(it,:);
-    interp_p_integrated(:,:,it)  = interp_norm_p_integrated(:,:,it).*interp_p_ec_injected(it,:);
-    interp_cd_dens(:,:,it)       = interp_norm_cd_dens(:,:,it).*interp_p_ec_injected(it,:);
-    interp_cd_integrated(:,:,it) = interp_norm_cd_integrated(:,:,it).*interp_p_ec_injected(it,:);
+  interp_p_dens        = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_p_integrated  = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_cd_dens       = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  interp_cd_integrated = zeros(n_rho,nb_launchers+1,nt_ec_out);
+  for it = 1:nt_ec_out % fill profiles only for time slices when EC is nonzero, thus it+2 assignment
+    interp_p_dens(:,:,it)        = interp_norm_p_dens(:,:,it)       .*p_ec_injected(it);
+    interp_p_integrated(:,:,it)  = interp_norm_p_integrated(:,:,it) .*p_ec_injected(it);
+    interp_cd_dens(:,:,it)       = interp_norm_cd_dens(:,:,it)      .*p_ec_injected(it);
+    interp_cd_integrated(:,:,it) = interp_norm_cd_integrated(:,:,it).*p_ec_injected(it);
   end
 
   % fill the ids entries
   for i_lau = active_launchers
-    for ii = 1:nt_interp
+    for ii = 1:nt_ec_out
       % 1d_profiles
-      ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.time = interp_tgrid(ii);
-      % grids
-      ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.grid.rho_tor_norm = interp_rho_tor(:,ii);
-      ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.grid.rho_pol_norm = interp_rho_pol(:,ii);
+      ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.time = ec_tgrid_out(ii);
+      % grids (do not fill for first and last time slice)
+      if ii~=1 || ii~=nt_ec_out
+        ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.grid.rho_tor_norm = interp_rho_tor(:,ii);
+        ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.grid.rho_pol_norm = interp_rho_pol(:,ii);
       % power density
       ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.electrons.energy = ...
         interp_p_dens(:,i_lau,ii);
       % integrated power density
       ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.electrons.power_inside = ...
         interp_p_integrated(:,i_lau,ii);
-      power_coupled_tmp = interp_p_integrated(end,i_lau,ii);
       % current density
       ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.j_parallel = ...
         interp_cd_dens(:,i_lau,ii);
       % integrated current density
       ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.current_parallel_inside = ...
         interp_cd_integrated(:,i_lau,ii);
-      current_parallel_tmp = interp_cd_integrated(end,i_lau,ii);
-      
+      end
+     
       % globals
-      ids_core_sources.source{last_index+i_lau}.globa_quantities{ii}.time = interp_tgrid(ii);
-      ids_core_sources.source{last_index+i_lau}.global_quantities{ii}.power = power_coupled_tmp;
-      ids_core_sources.source{last_index+i_lau}.global_quantities{ii}.current_parallel = current_parallel_tmp;  
+      ids_core_sources.source{last_index+i_lau}.global_quantities{ii}.time = ec_tgrid_out(ii);
+      ids_core_sources.source{last_index+i_lau}.global_quantities{ii}.power = ...
+        interp_p_integrated(end,i_lau,ii);
+      ids_core_sources.source{last_index+i_lau}.global_quantities{ii}.current_parallel = ...
+        interp_cd_integrated(end,i_lau,ii);  
     end
   end
 
-- 
GitLab