From 2770168e0ede3b9eabda784878d8dfdd4d0134ef Mon Sep 17 00:00:00 2001 From: Olivier Sauter <olivier.sauter@epfl.ch> Date: Mon, 3 Jul 2017 10:32:15 +0000 Subject: [PATCH] fix phi_tor since not yet ready with liuqe.m git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@7733 d63d8f72-b253-0410-a779-e742ad2e26cf --- crpptbx/TCV/gdat_tcv.m | 81 +++++++++++++++++++++++++----- crpptbx/TCV/tcv_requests_mapping.m | 5 +- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/crpptbx/TCV/gdat_tcv.m b/crpptbx/TCV/gdat_tcv.m index af483bcf..2d9cb68e 100644 --- a/crpptbx/TCV/gdat_tcv.m +++ b/crpptbx/TCV/gdat_tcv.m @@ -281,6 +281,17 @@ if shot==-1 || (shot>=100000 && shot < 200000) || liuqe_version==-1 substr_liuqe = '", "FBTE" )'; end +% should replace all above by just psitbx_str... +liuqe_matlab = 1; +switch liuqe_version + case {-1}, liuqe_ext=''; psitbx_str='FBTE'; liuqe_matlab = 0; + case {1,21}, liuqe_ext=''; psitbx_str='LIUQE.M'; + case {11}, liuqe_ext=''; psitbx_str='LIUQE';liuqe_matlab = 0; + case {2, 3, 22, 23}, liuqe_ext=['_' num2str(mod(liuqe_version,10))]; psitbx_str=['LIUQE.M' num2str(mod(liuqe_version,10))]; + case {12,13}, liuqe_ext=['_' num2str(mod(liuqe_version,10))]; psitbx_str=['LIUQE' num2str(mod(liuqe_version,10))];liuqe_matlab = 0; + otherwise, error(['Unknown LIUQE version, liuqe = ' num2str(liuqe_version)]); +end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Specifications on how to get the data provided in tcv_requests_mapping @@ -692,11 +703,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dim = beta.dim; gdat_data.t = beta.dim{1}; gdat_data.data = beta.data; - ij=find(~isnan(ip.data)); + ij=find(isfinite(ip.data)); ip_t = interp1(ip.dim{1}(ij),ip.data(ij),gdat_data.t); - ij=find(~isnan(b0.data)); + ij=find(isfinite(b0.data)); b0_t = interp1(b0.dim{1}(ij),b0.data(ij),gdat_data.t); - ij=find(~isnan(a_minor.data)); + ij=find(isfinite(a_minor.data)); a_minor_t = interp1(a_minor.dim{1}(ij),a_minor.data(ij),gdat_data.t); gdat_data.data = 100.*beta.data ./ abs(ip_t).*1.e6 .* abs(b0_t) .* a_minor_t; gdat_data.data_fullpath='100*beta/ip*1e6*b0*a_minor, each from gdat_tcv'; @@ -1464,6 +1475,42 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % add grids_1d to have rhotor, etc gdat_data = get_grids_1d(gdat_data,1,1,gdat_params.nverbose); + case {'phi_tor', 'phitor', 'toroidal_flux'} + % Phi(LCFS) = int(Bphi dSphi), can use Eq.(11) of "Tokamak coordinate conventions: COCOS" paper: + % O. Sauter, S.Yu. Medvedev, Comput. Phys. Commun. 184 (2013) 293–302 + % since cocos=17 for LIUQE we get: + % q = -dPhi/dpsi => Phi = - int(q*dpsi) which should always have the sign of B0 + % need to get q_rho but to avoid loop for rhotor in grids_1d, get q_rho explicitely here + params_eff = gdat_data.gdat_params; + if liuqe_matlab==1 + nodenameeff = 'tcv_eq(''tor_flux_tot'',''LIUQE.M'')'; + phi_tor = tdi(nodenameeff); + else + phi_tor.data = []; + phi_tor.units = 'Wb'; + end + if ~any(any(isfinite(phi_tor.data))) + q_rho = tdi(['tcv_eq(''''''' liuqefortran2liuqematlab('q',1,liuqe_matlab) ''''''',''''''' psitbx_str ''''''')']); + if liuqe_matlab==0 + q_rho.dim{1} = sqrt(linspace(0,1,numel(q_rho.dim{1}))); + end + phi_tor.dim = q_rho.dim; + phi_tor.dimunits = q_rho.dimunits; + for it=1:size(q_rho.data,2) + ij=find(isfinite(q_rho.data(:,it))); + if ~isempty(ij) && numel(ij)>5 + [qfit,~,~,phi]=interpos(q_rho.dim{1}(ij),q_rho.data(ij,it),phi_tor.dim{1}); + phi_tor.data(:,it) = phi'; + end + end + end + gdat_data.data = phi_tor.data; + gdat_data.dim = phi_tor.dim; + gdat_data.dimunits = phi_tor.dimunits; + gdat_data.units = phi_tor.units; + gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; + gdat_data.x = gdat_data.dim{1}; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'psi_edge'} % psi at edge, 0 by construction in Liuqe, thus not given @@ -1473,7 +1520,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') nodenameeff=[begstr 'q_psi' substr_liuqe]; end tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || isempty(tracetdi.dim) || ~any(~isnan(tracetdi.data)) % || ischar(tracetdi.data) (to add?) + if isempty(tracetdi.data) || isempty(tracetdi.dim) || ~any(isfinite(tracetdi.data)) % || ischar(tracetdi.data) (to add?) if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end return @@ -1550,7 +1597,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') return end for it=1:size(q_rho.data,2) - ij=find(~isnan(q_rho.data(:,it))); + ij=find(isfinite(q_rho.data(:,it))); if ~isempty(ij) [qfit,~,~,phi]=interpos(q_rho.dim{1}(ij).^2,q_rho.data(ij,it),rhoequal.^2); dataeff = sqrt(phi .* psi_axis.data(it) ./ b0tpsi(it) ./ pi) ; % Delta_psi = -psi_axis @@ -1569,11 +1616,22 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') params_eff = gdat_data.gdat_params; params_eff.data_request='phi_tor'; phi_tor=gdat_tcv([],params_eff); +% $$$ if ~any(any(isfinite(phi_tor.data))) +% $$$ % not yet implemented, compute phi_tor +% $$$ q_rho = tdi(['tcv_eq(''''''' liuqefortran2liuqematlab('q',1,liuqe_matlab) ''''''',''''''' psitbx_str ''''''')']); +% $$$ for it=1:size(q_rho.data,2) +% $$$ ij=find(isfinite(q_rho.data(:,it))); +% $$$ if ~isempty(ij) && numel(ij)>5 +% $$$ [qfit,~,~,phi]=interpos(q_rho.dim{1}(ij),q_rho.data(ij,it),phi_tor.dim{1}); +% $$$ phi_tor.data(:,it) = phi; +% $$$ end +% $$$ end +% $$$ end params_eff = gdat_data.gdat_params; params_eff.data_request='b0'; b0=gdat_tcv([],params_eff); gdat_data.t = phi_tor.t; - ij=find(~isnan(b0.data)); + ij=find(isfinite(b0.data)); gdat_data.b0 = interpos(b0.t(ij),b0.data(ij),gdat_data.t); if strcmp(data_request_eff,'rhotor_edge') gdat_data.data = sqrt(phi_tor.data(end,:)./pi./reshape(gdat_data.b0,1,numel(gdat_data.b0))); @@ -1611,7 +1669,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if liuqe_matlab==0 nodenameeff=['\results::psitbx:vol']; if liuqe_version_eff > 1 - disp('needs to construct volume') + disp('needs to construct volume'); return end else @@ -1667,7 +1725,6 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') return end end - mapping_for_tcv.gdat_timedim gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2118,7 +2175,7 @@ else return end -if ~isempty(tracefirrat.data) && ~ischar(tracefirrat.data) && any(~isnan(tracefirrat.data)) ... +if ~isempty(tracefirrat.data) && ~ischar(tracefirrat.data) && any(isfinite(tracefirrat.data)) ... && ~isempty(tracefirrat.dim) && ~isempty(tracefirrat.dim{1}) firthomratio = interp1(tracefirrat.dim{1},tracefirrat.data,timebase); end @@ -2181,7 +2238,7 @@ if strcmp(data_request_eff(1:2),'ne') gdat_data.error_bar_raw = gdat_data.error_bar; gdat_data.error_bar = gdat_data.error_bar_raw * diag(tracefirrat_data); gdat_data.data_fullpath=[gdat_data.data_fullpath '; fir_thom_rat ; _raw without firrat']; - ij=find(~isnan(tracefirrat_data)); + ij=find(isfinite(tracefirrat_data)); if isempty(ij) gdat_data.data_fullpath=[gdat_data.data_fullpath ' WARNING use ne_raw since firrat has NaNs thus ne=NaNs; fir_thom_rat ; _raw without firrat']; disp('***********************************************************************') @@ -2246,9 +2303,9 @@ for it=1:length(gdat_data.t) it_rt_eff = it_rt(it); it_vol_eff = it_vol(it); if (nbdim_x == 1) - ii=find(~isnan(gdat_data.grids_1d.rhopolnorm)); + ii=find(isfinite(gdat_data.grids_1d.rhopolnorm)); else - ii=find(~isnan(gdat_data.grids_1d.rhopolnorm(:,it))); + ii=find(isfinite(gdat_data.grids_1d.rhopolnorm(:,it))); end if (nbdim_x == 1) if length(ii)==length(gdat_data.grids_1d.rhopolnorm) diff --git a/crpptbx/TCV/tcv_requests_mapping.m b/crpptbx/TCV/tcv_requests_mapping.m index 07d4e746..b66cef30 100644 --- a/crpptbx/TCV/tcv_requests_mapping.m +++ b/crpptbx/TCV/tcv_requests_mapping.m @@ -219,9 +219,10 @@ switch lower(data_request) case {'phi_tor', 'phitor', 'toroidal_flux'} mapping.timedim = 2; mapping.method = 'tdiliuqe'; - mapping.expression = '\results::psi_axis'; - mapping.expression = '\tcv_shot::top.results.equil_1.results:psi_axis'; mapping.expression = 'tcv_eq(''''tor_flux_tot'''',''''LIUQE.M'''')'; + % node not filled in and in any case need special case for + mapping.label = 'toroidal_flux'; + mapping.method = 'switchcase'; case 'powers' mapping.timedim = 1; mapping.label = 'various powers'; -- GitLab