Skip to content
Snippets Groups Projects
tsg_accuracy.m 3.09 KiB
function [minerror] = tsg_accuracy(hMainFig, PARA, dtTsg)
%
% Give the accuracy of TSG salinity/temperature measurement based on
% SeaBird specifications, to use as the minimum error on measurements
% see http://www.seabird.com/products/spec_sheets/38data.htm
%     http://www.seabird.com/products/spec_sheets/3Sdata.htm
%     http://www.seabird.com/products/spec_sheets/21data.htm
%     http://www.seabird.com/products/spec_sheets/45data.htm
%

% Get the tsg and sample structures from the application
% ------------------------------------------------------
tsg    = getappdata( hMainFig, 'tsg_data');

if strcmp( PARA, 'SSTP')
    if strcmp( tsg.TYPE_TINT, 'SBE38') | strcmp( tsg.TYPE_TINT, 'SBE3S')
        % Accuracy of intake temperature is 0.001�C for SBE38/SBE3S sensors
        minerror=0.001;
    else
        % Assume the same for other sensors
        minerror=0.001;
    end
end

if strcmp( PARA, 'SSJT')
    if strcmp( tsg.TYPE_TSG, 'SBE45')
        % Accuracy of jacket temperature is 0.002�C for SBE45 TSG
        minerror=0.002;
    else
        % Accuracy of jacket temperature is 0.01�C for SBE21 TSG
        minerror=0.01;
    end
end

if strcmp( PARA, 'SSPS')
    
    if strcmp( tsg.TYPE_TSG, 'SBE45')
        % Accuracy of temperature/conductivity is 0.002�C/0.005mS/cm for SBE45 TSG
        errT=0.002;
        errC=0.005;
    else
        % Accuracy of temperature/conductivity is 0.01�C/0.01mS/cm for SBE21 TSG
        errT=0.01;
        errC=0.01;
    end

    if ~isempty( tsg.SSJT_CAL)
        T = tsg.SSJT_CAL(dtTsg);
    else
        T = tsg.SSJT(dtTsg);
    end
    if ~isempty( tsg.CNDC_CAL)
        C = tsg.CNDC_CAL(dtTsg);
    else
        C = tsg.CNDC(dtTsg);
    end

    % salinity error is computed from temperature/conductivity errors
    % by error propagation in the salinity equation
    % see Emery and Thomson, Data analysis methods in phys. oceano., p.273
    
    R=C/sw_c3515();
    rt = sw_salrt(T);
    Rt=R./rt;

    %Rt is a function of C,T
    %error on Rt : err(Rt)^2=(d(Rt)/dC*errC)^2+(d(Rt)/dT*errT)^2

    dRtdC=1./(rt*sw_c3515());
    c68 = 1.00024;
    c0 =  0.6766097;
    c1 =  2.00564e-2;
    c2 =  1.104259e-4;
    c3 = -6.9698e-7;
    c4 =  1.0031e-9;
    dRtdT=c68*R.*(c1+(2*c2+(3*c3+4*c4*T).*T*c68).*T*c68)./(rt.^2);

    errRt=sqrt((dRtdC*errC).^2+(dRtdT*errT).^2);

    %S is a function of Rt,T
    %error on S: err(S)^2=(dS/dRt*errRt)^2+(dS/dT*errT)^2

    del_T68 = T * 1.00024 - 15;
    Rtx   = sqrt(Rt);
    a0 =  0.0080;
    a1 = -0.1692;
    a2 = 25.3851;
    a3 = 14.0941;
    a4 = -7.0261;
    a5 =  2.7081;
    b0 =  0.0005;
    b1 = -0.0056;
    b2 = -0.0066;
    b3 = -0.0375;
    b4 =  0.0636;
    b5 = -0.0144;
    k  =  0.0162;
    dSdRt=(a1+(2*a2+(3*a3+(4*a4+5*a5*Rtx).*Rtx).*Rtx).*Rtx)./(2*Rtx)...
        +(del_T68./(1+k*del_T68)).*(b1+(2*b2+(3*b3+(4*b4+5*b5*Rtx).*Rtx).*Rtx).*Rtx)./(2*Rtx);

    dSdT=(b0+(b1+(b2+(b3+(b4+b5.*Rtx).*Rtx).*Rtx).*Rtx).*Rtx)./((1+k*del_T68).^2);

    errS=sqrt((dSdRt.*errRt).^2+(dSdT.*errT).^2);

    minerror=errS;
    
end

end