海洋环流—地转流 已知温盐深求流速

clc;
clear;
addpath(genpath('netcdf_tools'));
addpath('D:\othercolor\')
file=dir('C:\Users\\09FA20010524*.nc');
% ncdump;
for n=69:129 
   
    filename=['C:\',file(n).name];
    lon=ncread(filename,'longitude');
    lat=ncread(filename,'latitude');
      p=ncread(filename,'pressure');%decibar
    t=ncread(filename,'temperature');%(ITS-90)
    s=ncread(filename,'salinity');%PSS-78
    k=find(p<1001);  %深度最大只取1000
    pp=p(k);
    tt=t(k);
    ss=s(k);
    k2=find((ss>30&ss<40)&tt~=0);
    pp=pp(k2);
    tt=t(k2);
    ss=s(k2);
 des=sw_dens(ss,tt,pp);

    for i=1:length(k2)             %!!!这里特别注意,由于数据不全,这里找到k的实际值
  des0(i)=sw_dens(35,0,pp(i));
    end


a=1./des*100000000;   %密度的倒数
a0=1./des0*100000000;
e=a'-a0;       
for j=1:20
%     for i=1:501
%         ee(j)=mean(e(1,1+(j-1)*25:25+(j-1)*25));%平均
%       q(20,25)=0;
      q=find((1+(j-1)*50       ee(j)=mean(e(q));
%     end
  end
  u=ee.*50/10000;    %平均*压强差
  uu(1)=sum(u);
  for i=2:20
  uu(i)=sum(u)-sum(u(1:i-1));
  end
      lo(n-68,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
    la(n-68,:)=lat;
  uuu(n-68,:)=uu;  
  eeenan(n-68,:)=ee;
  clear des0      
end

%差值
%   
%   lo(n,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
%   la(n,:)=lat;
%   eee(n,:)=ee;
%   clear des0           % 注意这里一定要清楚一下,否则有些des0大 有些小,造成数组不能赋值

[la,index]=sort(la);
% index=flipud(index);
uuu=uuu(index,:);          %la不是严格排序的,调整顺序
% la=flipud(la);                %由于这里的代码是后来修改的 实际上不用反复反转,但是我下面的代码是逆序写的


laa=la.*(pi/180);    %其实也可以直接用sind函数


for i=1:60
f(i)=2*7.29*0.00001*sin(laa(i));
kkk=(pi/180)*(6378136*(1-0.006694470));
LL(i)=(1-0.006694470*(sin(laa(i)))^2)^(2/3);
L(i)=(la(i+1)-la(i))*kkk;
LLL(i)=abs(L(i)./LL(i));                   %上述几行只是公式,为了求L
vnan(60,21)=0;
vnan(i,1:20)=(uuu(i+1,:)-uuu(i,:))./(f(i).*LLL(i)); %向东为正
index2=[1:60];
% minan(i)=max(abs(vnan(i,1:20)));       %剔除一些异常数据(主要由于纬度间距过小)
% index2=find(minan<3.01);
% kkkk=(uuu(49,:)-uuu(48,:))/LLL(1);
% v(i,1:20)=abs(kkkk./f(i));
end
for i=1:59
    minan(i)=max(abs(vnan(i,1:20)));       %剔除一些异常数据 不剔除赤道的(主要由于纬度间距过小)
index2=find(minan<2);
end
% for i=50:58
%     f(i)=2*7.29*0.00001*sin(laa(i))+2*7.29*10^(-5)*cos(laa(i))*0.5;%对靠近赤道的做一个处理
% end
index2(1,46)=60;   %补充赤道处 
v_nan=vnan(index2',:);


% la2=flipud(la(2:49));
% la2=la2(index2');
la2=la(1:60);
la2_nan=la2(index2');


addpath(genpath('netcdf_tools'));
addpath('D:\风轻叶落\2021.6.17 新的生活\学习\海洋环流\地转流计算\othercolor\')
file=dir('C:\Users\风轻叶落\Desktop\临时\北\北\p15nb*.nc');
% ncdump;
for n=1:49  %数据刚好是高纬到低纬,第50个小于0
   
    filename=['C:\Users\风轻叶落\Desktop\临时\北\北\',file(n).name];
    lon=ncread(filename,'longitude');
    lat=ncread(filename,'latitude');
% ncdisp
    p=ncread(filename,'pressure');%decibar
    t=ncread(filename,'temperature');%(ITS-90)
    s=ncread(filename,'salinity');%PSS-78
    k=find(p<1001);  %深度最大只取1000
    pp=p(k);
    tt=t(k);
    ss=s(k);
    k2=find((ss>30&ss<40)&tt~=0);
    pp=pp(k2);
    tt=t(k2);
    ss=s(k2);
 des=sw_dens(ss,tt,pp);
%     s0(501)=35;
%     t0(501)=0;
for i=1:length(k2)             %!!!这里特别注意,由于数据不全,这里找到k的实际值
  des0(i)=sw_dens(35,0,pp(i));
end


a=1./des*100000000;   %密度的倒数
a0=1./des0*100000000;
e=a'-a0;              %差值
  for j=1:20
%     for i=1:501
%         ee(j)=mean(e(1,1+(j-1)*25:25+(j-1)*25));%平均
%       q(20,25)=0;
      q=find((1+(j-1)*50       ee(j)=mean(e(q));
%     end
  end
  u=ee.*50/10000;    %平均*压强差
  uu(1)=sum(u);
  for i=2:20
  uu(i)=sum(u)-sum(u(1:i-1));
  end
  uuu(n,:)=uu;  
  lo(n,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
  la(n,:)=lat;
  eee(n,:)=ee;
  clear des0           % 注意这里一定要清楚一下,否则有些des0大 有些小,造成数组不能赋值
end
[la,index]=sort(la);
index=flipud(index);
uuu=uuu(index,:);          %la不是严格排序的,调整顺序
la=flipud(la);                %由于这里的代码是后来修改的 实际上不用反复反转,但是我下面的代码是逆序写的


laa=la.*(pi/180);    %其实也可以直接用sind函数

% for i=1:15
%     f(i)=2*7.29*0.00001*sin(laa(50-i))+2*7.29*10^(-5)*cos(laa(50-i))*0.5;%对靠近赤道的做一个处理
% end
for i=1:48
f(i)=2*7.29*0.00001*sin(laa(50-i));
kkk=(pi/180)*(6378136*(1-0.006694470));
LL(i)=(1-0.006694470*(sin(laa(50-i)))^2)^(2/3);
L(i)=(la(50-i)-la(49-i))*kkk;
LLL(i)=abs(L(i)./LL(i));                   %上述几行只是公式,为了求L
vbei(48,21)=0;
vbei(i,1:20)=(uuu(50-i,:)-uuu(49-i,:))./(f(i).*LLL(i)); %向东为正
% index2=[1:48];
% mibei(i)=max(abs(vbei(i,1:20)))      %剔除一些异常数据(主要由于纬度间距过小)
% index2=find(mibei<2);
% kkkk=(uuu(49,:)-uuu(48,:))/LLL(1);
% v(i,1:20)=abs(kkkk./f(i));
end
for i=2:48
    mibei(i)=max(abs(vbei(i,1:20)))      %剔除一些异常数据 不剔除赤道的(主要由于纬度间距过小)
index2=find(mibei<2);
end

v_bei=vbei(index2',:);
% v_bei(2,:)=abs(v_bei(2,:));

la2=flipud(la(2:49));
la2_bei=la2(index2');

lanew(length(la2_nan)+length(la2_bei),1)=0;
lanew(1:length(la2_nan))=la2_nan;
lanew(length(la2_nan)+1:length(la2_nan)+length(la2_bei))=la2_bei;
v(length(la2_nan)+length(la2_bei),21)=0;

v(1:length(la2_nan),:)=v_nan;
v(length(la2_nan)+1:length(la2_nan)+length(la2_bei),:)=v_bei;

[xlatt,dep]=meshgrid(lanew,linspace(0,1000,21));   %注意这里纬度不能等间距,必须用真实值
% [c.h]=contourf(xlatt',dep',v,[-1,0,1],"ShowText","on");
% contourf(xlatt',dep',v,[-1 0 1],"ShowText","on");
% colorbar;
  pcolor(xlatt',dep',v);
shading interp
% colormap(othercolor('RdYlBu6'));
% colormap(othercolor('Spectral9'));
colormap(othercolor('BuOr_8'));
xlabel('纬度(°N)');
ylabel('深度(m)');
title('地转流流速断面分布图');
% colorbar;
caxis([-0.5 0.5]);
% colormap([0 0 1;0 0.2 1;0 0.4 1;0 0.6 1;0 0.8 1;0 1 1;1 1 0;1 0.8 0;1 0.6 0;1 0.4 0;1 0.2 0;1 0 0]);
    c=colorbar;
    set(c,'tickdir','out')  % 朝外
    set(c,'YTick',-0.6:0.1:0.6); %色标值范围及显示间隔
    set(c,'YTickLabel',{'-0.6','-0.5','-0.4','-0.3','-0.2','-0.1','0','0.1','0.2','0.3','0.4','0.5','0.6'}) %具体刻度赋值
    caxis([-0.6 0.6])
set(gcf,'position',[200,300,800,300]);
hold on;
x=zeros(1000,1);
y=linspace(1000,0,1000);
plot(x,y)
x1=ones(1000,1);
x2(1:1000,1)=-1;
% plot(x1,y);
% plot(x2,y);
% plot([0,0],0:1000)
ax=gca;
set(gca,'YDir','reverse');

clc;
clear;
addpath(genpath('netcdf_tools'));
addpath('D:\风轻叶落\2021.6.17 新的生活\学习\海洋环流\地转流计算\othercolor\')
file=dir('C:\Users\风轻叶落\Desktop\临时\南\南\09FA20010524*.nc');
% ncdump;
for n=69:129 
   
    filename=['C:\Users\风轻叶落\Desktop\临时\南\南\',file(n).name];
    lon=ncread(filename,'longitude');
    lat=ncread(filename,'latitude');
      p=ncread(filename,'pressure');%decibar
    t=ncread(filename,'temperature');%(ITS-90)
    s=ncread(filename,'salinity');%PSS-78
    k=find(p<1001);  %深度最大只取1000
    pp=p(k);
    tt=t(k);
    ss=s(k);
    k2=find((ss>30&ss<40)&tt~=0);
    pp=pp(k2);
    tt=t(k2);
    ss=s(k2);
 des=sw_dens(ss,tt,pp);

    for i=1:length(k2)             %!!!这里特别注意,由于数据不全,这里找到k的实际值
  des0(i)=sw_dens(35,0,pp(i));
    end


a=1./des*100000000;   %密度的倒数
a0=1./des0*100000000;
e=a'-a0;       
for j=1:20
%     for i=1:501
%         ee(j)=mean(e(1,1+(j-1)*25:25+(j-1)*25));%平均
%       q(20,25)=0;
      q=find((1+(j-1)*50       ee(j)=mean(e(q));
%     end
  end
  u=ee.*50/10000;    %平均*压强差
  uu(1)=sum(u);
  for i=2:20
  uu(i)=sum(u)-sum(u(1:i-1));
  end
      lo(n-68,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
    la(n-68,:)=lat;
  uuu(n-68,:)=uu;  
  eeenan(n-68,:)=ee;
  clear des0      
end

%差值
%   
%   lo(n,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
%   la(n,:)=lat;
%   eee(n,:)=ee;
%   clear des0           % 注意这里一定要清楚一下,否则有些des0大 有些小,造成数组不能赋值

[la,index]=sort(la);
% index=flipud(index);
uuu=uuu(index,:);          %la不是严格排序的,调整顺序
% la=flipud(la);                %由于这里的代码是后来修改的 实际上不用反复反转,但是我下面的代码是逆序写的


laa=la.*(pi/180);    %其实也可以直接用sind函数


for i=1:60
f(i)=2*7.29*0.00001*sin(laa(i));
kkk=(pi/180)*(6378136*(1-0.006694470));
LL(i)=(1-0.006694470*(sin(laa(i)))^2)^(2/3);
L(i)=(la(i+1)-la(i))*kkk;
LLL(i)=abs(L(i)./LL(i));                   %上述几行只是公式,为了求L
vnan(60,21)=0;
vnan(i,1:20)=(uuu(i+1,:)-uuu(i,:))./(f(i).*LLL(i)); %向东为正
index2=[1:60];
% minan(i)=max(abs(vnan(i,1:20)));       %剔除一些异常数据(主要由于纬度间距过小)
% index2=find(minan<3.01);
% kkkk=(uuu(49,:)-uuu(48,:))/LLL(1);
% v(i,1:20)=abs(kkkk./f(i));
end
for i=1:59
    minan(i)=max(abs(vnan(i,1:20)));       %剔除一些异常数据 不剔除赤道的(主要由于纬度间距过小)
index2=find(minan<2);
end
% for i=50:58
%     f(i)=2*7.29*0.00001*sin(laa(i))+2*7.29*10^(-5)*cos(laa(i))*0.5;%对靠近赤道的做一个处理
% end
index2(1,46)=60;   %补充赤道处 
v_nan=vnan(index2',:);


% la2=flipud(la(2:49));
% la2=la2(index2');
la2=la(1:60);
la2_nan=la2(index2');


addpath(genpath('netcdf_tools'));
addpath('D:\风轻叶落\2021.6.17 新的生活\学习\海洋环流\地转流计算\othercolor\')
file=dir('C:\Users\风轻叶落\Desktop\临时\北\北\p15nb*.nc');
% ncdump;
for n=1:49  %数据刚好是高纬到低纬,第50个小于0
   
    filename=['C:\Users\风轻叶落\Desktop\临时\北\北\',file(n).name];
    lon=ncread(filename,'longitude');
    lat=ncread(filename,'latitude');
% ncdisp
    p=ncread(filename,'pressure');%decibar
    t=ncread(filename,'temperature');%(ITS-90)
    s=ncread(filename,'salinity');%PSS-78
    k=find(p<1001);  %深度最大只取1000
    pp=p(k);
    tt=t(k);
    ss=s(k);
    k2=find((ss>30&ss<40)&tt~=0);
    pp=pp(k2);
    tt=t(k2);
    ss=s(k2);
 des=sw_dens(ss,tt,pp);
%     s0(501)=35;
%     t0(501)=0;
for i=1:length(k2)             %!!!这里特别注意,由于数据不全,这里找到k的实际值
  des0(i)=sw_dens(35,0,pp(i));
end


a=1./des*100000000;   %密度的倒数
a0=1./des0*100000000;
e=a'-a0;              %差值
  for j=1:20
%     for i=1:501
%         ee(j)=mean(e(1,1+(j-1)*25:25+(j-1)*25));%平均
%       q(20,25)=0;
      q=find((1+(j-1)*50       ee(j)=mean(e(q));
%     end
  end
  u=ee.*50/10000;    %平均*压强差
  uu(1)=sum(u);
  for i=2:20
  uu(i)=sum(u)-sum(u(1:i-1));
  end
  uuu(n,:)=uu;  
  lo(n,:)=lon;%已经把所有的密度对压强积分求出(不同深度)
  la(n,:)=lat;
  eee(n,:)=ee;
  clear des0           % 注意这里一定要清楚一下,否则有些des0大 有些小,造成数组不能赋值
end
[la,index]=sort(la);
index=flipud(index);
uuu=uuu(index,:);          %la不是严格排序的,调整顺序
la=flipud(la);                %由于这里的代码是后来修改的 实际上不用反复反转,但是我下面的代码是逆序写的


laa=la.*(pi/180);    %其实也可以直接用sind函数

% for i=1:15
%     f(i)=2*7.29*0.00001*sin(laa(50-i))+2*7.29*10^(-5)*cos(laa(50-i))*0.5;%对靠近赤道的做一个处理
% end
for i=1:48
f(i)=2*7.29*0.00001*sin(laa(50-i));
kkk=(pi/180)*(6378136*(1-0.006694470));
LL(i)=(1-0.006694470*(sin(laa(50-i)))^2)^(2/3);
L(i)=(la(50-i)-la(49-i))*kkk;
LLL(i)=abs(L(i)./LL(i));                   %上述几行只是公式,为了求L
vbei(48,21)=0;
vbei(i,1:20)=(uuu(50-i,:)-uuu(49-i,:))./(f(i).*LLL(i)); %向东为正
% index2=[1:48];
% mibei(i)=max(abs(vbei(i,1:20)))      %剔除一些异常数据(主要由于纬度间距过小)
% index2=find(mibei<2);
% kkkk=(uuu(49,:)-uuu(48,:))/LLL(1);
% v(i,1:20)=abs(kkkk./f(i));
end
for i=2:48
    mibei(i)=max(abs(vbei(i,1:20)))      %剔除一些异常数据 不剔除赤道的(主要由于纬度间距过小)
index2=find(mibei<2);
end

v_bei=vbei(index2',:);
% v_bei(2,:)=abs(v_bei(2,:));

la2=flipud(la(2:49));
la2_bei=la2(index2');

lanew(length(la2_nan)+length(la2_bei),1)=0;
lanew(1:length(la2_nan))=la2_nan;
lanew(length(la2_nan)+1:length(la2_nan)+length(la2_bei))=la2_bei;
v(length(la2_nan)+length(la2_bei),21)=0;

v(1:length(la2_nan),:)=v_nan;
v(length(la2_nan)+1:length(la2_nan)+length(la2_bei),:)=v_bei;

[xlatt,dep]=meshgrid(lanew,linspace(0,1000,21));   %注意这里纬度不能等间距,必须用真实值
% [c.h]=contourf(xlatt',dep',v,[-1,0,1],"ShowText","on");
% contourf(xlatt',dep',v,[-1 0 1],"ShowText","on");
% colorbar;
  pcolor(xlatt',dep',v);
shading interp
% colormap(othercolor('RdYlBu6'));
% colormap(othercolor('Spectral9'));
colormap(othercolor('BuOr_8'));
xlabel('纬度(°N)');
ylabel('深度(m)');
title('地转流流速断面分布图');
% colorbar;
caxis([-0.5 0.5]);
% colormap([0 0 1;0 0.2 1;0 0.4 1;0 0.6 1;0 0.8 1;0 1 1;1 1 0;1 0.8 0;1 0.6 0;1 0.4 0;1 0.2 0;1 0 0]);
    c=colorbar;
    set(c,'tickdir','out')  % 朝外
    set(c,'YTick',-0.6:0.1:0.6); %色标值范围及显示间隔
    set(c,'YTickLabel',{'-0.6','-0.5','-0.4','-0.3','-0.2','-0.1','0','0.1','0.2','0.3','0.4','0.5','0.6'}) %具体刻度赋值
    caxis([-0.6 0.6])
set(gcf,'position',[200,300,800,300]);
hold on;
x=zeros(1000,1);
y=linspace(1000,0,1000);
plot(x,y)
x1=ones(1000,1);
x2(1:1000,1)=-1;
% plot(x1,y);
% plot(x2,y);
% plot([0,0],0:1000)
ax=gca;
set(gca,'YDir','reverse');海洋环流—地转流 已知温盐深求流速_第1张图片

 

你可能感兴趣的:(matlab,海洋环流,matlab)