diff --git a/matlab/TCV_IMAS/tcv_get_ids_core_sources.m b/matlab/TCV_IMAS/tcv_get_ids_core_sources.m index 00eb0980395422472d9424f9c633fd957413a432..3bbed99345c41b3d96245a5977ed06550b367167 100644 --- a/matlab/TCV_IMAS/tcv_get_ids_core_sources.m +++ b/matlab/TCV_IMAS/tcv_get_ids_core_sources.m @@ -208,7 +208,7 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources % load LIUQE data to convert % \tilde{V,TORAY}_// = dI_\phi/dV = (1/2\pi)<j_\phi/R> to j_//0 = <jdotB>/B0; - % conversion using j_//,cd = <j_cd/B> B, thus j_// = 2\pi <B^2> / (B_0 <B_\phi/R>) + % conversion using j_//,cd = <j_cd/B> B, thus j_// = 2\pi <B^2> / (B_0 <B_\phi/R>) mu0 = 4*pi*10^-7; % interpolate liuqe outputs on ohm_tgrid T = interp1(liuqe_time,T_liu.data.', ec_tgrid_toray)'; @@ -216,14 +216,17 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources vol = interp1(liuqe_time,vol_liu.data.', ec_tgrid_toray)'; Ip = interp1(liuqe_time,Ip_liu.data, ec_tgrid_toray); q = interp1(liuqe_time,q_liu.data.', ec_tgrid_toray)'; - mVprime = -2*pi*q./T./Rm2_fs; - B2_fs = mu0*Ip./mVprime + T.^2.*Rm2_fs; + Vprime = -2*pi*q./T./Rm2_fs; + B2_fs = -mu0*Ip./Vprime + T.^2.*Rm2_fs; + % Iphi? needs to be a profile? + % R is also a profile in icdbseval? should not be! It's definitely R0 see + % eq.(30) in dok % get vacuum field data from ids R0 = ids_core_sources.vacuum_toroidal_field.r0; 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; + 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)); @@ -233,6 +236,10 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources interp1(rho_pol_norm_liu.data,jtoray_to_jpar0(:,ii),ec_data.cd_dens.grids.rho_pol_norm(:,ii)); vol_mapped(:,ii) = ... interp1(rho_pol_norm_liu.data,vol(:,ii),ec_data.cd_dens.grids.rho_pol_norm(:,ii)); + % for testing + T_mapped(:,ii) = interp1(rho_pol_norm_liu.data,T(:,ii),ec_data.cd_dens.grids.rho_pol_norm(:,ii)); + [~,dTdV_mapped(:,ii)] = interpos(vol_mapped(:,ii),T_mapped(:,ii)); + Rm2_fs_mapped(:,ii) = interp1(rho_pol_norm_liu.data,Rm2_fs(:,ii),ec_data.cd_dens.grids.rho_pol_norm(:,ii)); end % load 1d_profiles from ec_data @@ -242,17 +249,58 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources p_integrated(isnan(p_integrated)) = 0; cd_dens = ec_data.cd_dens_doublewidth.data; % use double width to have realistic deposition broadening cd_dens(isnan(cd_dens)) = 0; + + % initialize variables + jpar0 = zeros(size(cd_dens)); + jpar0_integrated = zeros(size(cd_dens)); + + cd_integrated = ec_data.cd_integrated.data; - cd_integrated = zeros(size(ec_data.cd_integrated.data)); for i_lau = active_launchers % convert to j// with conversion factor - cd_dens(:,i_lau,:) = squeeze(cd_dens(:,i_lau,:)).*jtoray_to_jpar0_mapped; + jpar0(:,i_lau,:) = squeeze(cd_dens(:,i_lau,:)).*jtoray_to_jpar0_mapped; + + jpar_tilde(:,i_lau,:) = 2*pi/R0./Rm2_fs_mapped.*(squeeze(cd_dens(:,i_lau,:))-dTdV_mapped./T_mapped.*squeeze(cd_integrated(:,i_lau,:))); + jpar02(:,i_lau,:) = squeeze(jpar_tilde(:,i_lau,:)).*R0.*T_mapped.*Rm2_fs_mapped./B0; + 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); + [~,~,~,jpar0_integrated(:,i_lau,ii)] = interpos(vol_mapped(:,ii),jpar0(:,i_lau,ii)/(2*pi*R0)); + [~,~,~,jpar02_integrated(:,i_lau,ii)] = interpos(vol_mapped(:,ii),jpar02(:,i_lau,ii)/(2*pi*R0)); end end - + + figure; hold on; plot(squeeze(jpar0(:,1,50))); + plot(squeeze(jpar02(:,1,50)),'x'); + legend('ids','icdbseval'); ylabel('j||0') + + figure; plot(squeeze(cd_integrated(end,1,:))); hold on; + plot(squeeze(jpar0_integrated(end,1,:))); + plot(squeeze(jpar02_integrated(end,1,:))); + legend('I_\phi','I||,ids','I||,icdbseval'); + + % test to integrate but still is not the same + ilau = 4; + jtilde_test = B0./R0./T_mapped./Rm2_fs_mapped.*squeeze(jpar0(:,ilau,:)); + jtilde_test2 = squeeze(jpar_tilde(:,ilau,:)); + for ii = 1:nt_ec_toray + [~,~,~,icd_test(:,ii)] = interpos(vol_mapped(:,ii),Rm2_fs_mapped(:,ii)./T_mapped(:,ii).*jtilde_test(:,ii)); + out(:,ii) = R0/2/pi.*T_mapped(:,ii).*icd_test(:,ii); + % icdbseval + [~,~,~,icd_test2(:,ii)] = interpos(vol_mapped(:,ii),Rm2_fs_mapped(:,ii)./T_mapped(:,ii).*jtilde_test2(:,ii)); + out2(:,ii) = R0/2/pi.*T_mapped(:,ii).*icd_test2(:,ii); + end + + figure; + plot(ec_tgrid_toray,out(end,:)); hold on; + plot(ec_tgrid_toray,squeeze(cd_integrated(end,ilau,:))); + plot(ec_tgrid_toray,out2(end,:),'x'); + ylabel('I_\phi'); legend('from ids','from icdbseval','TORAY') + + figure; + plot(squeeze(out(end,:))-squeeze(cd_integrated(end,1,:))'); hold on; plot(squeeze(out2(end,:))-squeeze(cd_integrated(end,1,:))'); + ylabel('diff (I_\phi,I_TORARY)'); legend('from ids','from icdbseval') + %% 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 @@ -262,35 +310,35 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources rho_tor_norm = ec_data.cd_dens.grids.rho_tor_norm; % 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); + 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_jpar0 = zeros(n_rho,nb_launchers+1,nt_ec_toray); + norm_jpar0_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); + 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_jpar0(:,:,it) = jpar0(:,:,it) ./sparse_p_ec_injected(it); + norm_jpar0_integrated(:,:,it) = jpar0_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_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); + 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_jpar0 = zeros(n_rho,nb_launchers+1,nt_ec_out); + interp_norm_jpar0_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 trace_p_dens = squeeze(norm_p_dens(irho,i_lau,:)); trace_p_integrated = squeeze(norm_p_integrated(irho,i_lau,:)); - trace_cd_dens = squeeze(norm_cd_dens(irho,i_lau,:)); - trace_cd_integrated = squeeze(norm_cd_integrated(irho,i_lau,:)); + trace_jpar0 = squeeze(norm_jpar0(irho,i_lau,:)); + trace_jpar0_integrated = squeeze(norm_jpar0_integrated(irho,i_lau,:)); % interpolate on gdat powers tgrid, interpos 21 to extrapolate, % taking constant value y_edge; needed for time window between start of EC and first TS time - interp_norm_p_dens( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_p_dens, ec_tgrid_out(3:end-2)); - interp_norm_p_integrated( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_p_integrated, ec_tgrid_out(3:end-2)); - interp_norm_cd_dens( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_cd_dens, ec_tgrid_out(3:end-2)); - interp_norm_cd_integrated(irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_cd_integrated,ec_tgrid_out(3:end-2)); + interp_norm_p_dens( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_p_dens, ec_tgrid_out(3:end-2)); + interp_norm_p_integrated( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_p_integrated, ec_tgrid_out(3:end-2)); + interp_norm_jpar0( irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_jpar0, ec_tgrid_out(3:end-2)); + interp_norm_jpar0_integrated(irho,i_lau,3:end-2) = interpos(21,ec_tgrid_toray,trace_jpar0_integrated,ec_tgrid_out(3:end-2)); end end @@ -307,13 +355,13 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources % normalised & interpolated profiles * p_ec_injected on interp_tgrid 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); + interp_jpar0 = zeros(n_rho,nb_launchers+1,nt_ec_out); + interp_jpar0_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); + 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_jpar0(:,:,it) = interp_norm_jpar0(:,:,it) .*p_ec_injected(it); + interp_jpar0_integrated(:,:,it) = interp_norm_jpar0_integrated(:,:,it).*p_ec_injected(it); end % fill the ids entries @@ -333,10 +381,10 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources interp_p_integrated(:,i_lau,ii); % current density ids_core_sources.source{last_index+i_lau}.profiles_1d{ii}.j_parallel = ... - interp_cd_dens(:,i_lau,ii); + interp_jpar0(:,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); + interp_jpar0_integrated(:,i_lau,ii); end % globals @@ -344,7 +392,7 @@ if ~isempty(ec_gdat.ec.data) % if EC data available, fill sources 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); + interp_jpar0_integrated(end,i_lau,ii); end end