Commit 5998b86b authored by Dr Jeff Polton's avatar Dr Jeff Polton
Browse files

update to remote

parents 03f3733a c43e9d09
# log file for main1.sh script # log file for main1.sh script
SCRIPTS/main_output.txt SCRIPTS/main_output.txt
<<<<<<< HEAD
# netcdf files # netcdf files
*.nc *.nc
=======
# tilde files
*~
>>>>>>> c43e9d0964aee890034a33747d75d0b118debbff
These namelists have moved to EXP directories
These have moved to MY_SRC
...@@ -5,6 +5,39 @@ NEMO BoBEAS configuration ...@@ -5,6 +5,39 @@ NEMO BoBEAS configuration
** BRANCH:ashbre contains the original structure ** ** BRANCH:ashbre contains the original structure **
Getting started
===============
**Clone** this repository onto your favourite linux box:
<pre>
git clone git@github.com:NOC-MSM/BoBEAS.git
</pre>
Access **JASMIN data**. For JASMIN file structure see wiki page: JASMIN_data_storage). On your favourite linux box::
<pre>
exec ssh-agent $SHELL
ssh-add ~/.ssh/id_rsa_jasmin
</pre>
On request enter passphrase for ``/login/$USER/.ssh/id_rsa_jasmin``. Hopefully this
is accepted. Then successively log into a login node. This can not see the BoBEAS data::
<pre>
ssh -A jelt@jasmin-login1.ceda.ac.uk
</pre>
From here you can hop to a compute node, which can see the BoBEAS data::
<pre>
ssh -A jelt@jasmin-sci1.ceda.ac.uk
cd /gws/nopw/j04/campus/pseudoDropBox/BoBEAS
</pre>
File Hierarchy
==============
Each configuration directory should be laid out in the following manner, to Each configuration directory should be laid out in the following manner, to
facilitate configuration archival and sharing: facilitate configuration archival and sharing:
......
function [Variable_obc,z_obc] = COPERNICUS_INTERP(fname_data,z_data,variable_name,nbidta,nbjdta)
%variable_name='so';
%fname_data = 'Sal_16_0000.nc';
%z_data = 'domain_cfg.nc';
% This is the NEMO grid
xout=double(ncread(z_data,'nav_lon'));
yout=double(ncread(z_data,'nav_lat'));
dzout=ncread(z_data,'e3t_0');
% make x and y 3D array - this is because griddata needs it in this form
xout=repmat(xout,1,1,size(dzout,3));
yout=repmat(yout,1,1,size(dzout,3));
% Here we read in the copernicus data
Variable_in=ncread(fname_data,variable_name);
xin=double(ncread(fname_data,'longitude'));
yin=double(ncread(fname_data,'latitude'));
zin=double(ncread(fname_data,'depth'));
Variable_in=permute(Variable_in,[2 1 3]);
% Build z (e3t_0 just gives dz)
z=zeros(size(dzout,1),size(dzout,2),size(dzout,3));
for i=1:size(dzout,3)
if i==1
z(:,:,i)=dzout(:,:,i);
else
z(:,:,i)=z(:,:,i-1)+dzout(:,:,i);
end
end
zin(1)=0;
%zin(end)=max(z(:))+1;
% make COPERNICUS coordinates 3D arrays (for griddata function)
[Xin,Yin,Zin]=meshgrid(xin,yin,zin);
% We only want to feed non-nan numbers from the copernicus grid.
Xlr=Xin(~isnan(Variable_in));
Ylr=Yin(~isnan(Variable_in));
Zlr=Zin(~isnan(Variable_in));
Variable_lr=Variable_in(~isnan(Variable_in));
% Interpolate Copernicus grid (without nans) on to same grid - basically
% "flood filling", but by interpolation, not extrapolation.
Variable_in=griddata(Xlr,Ylr,Zlr,Variable_lr,Xin,Yin,Zin);
clear Variable_lr Xlr Ylr Zlr
% nans will still exists around the edges - let's find the nearest
% neighours to fill them in.
ind_nnan=~isnan(Variable_in(:));
ind_nan = isnan(Variable_in(:));
Xlnnan=Xin(ind_nnan);
Ylnnan=Yin(ind_nnan);
Zlnnan=Zin(ind_nnan);
coordnnan=[Xlnnan Ylnnan Zlnnan];
Xlnan=Xin(ind_nan);
Ylnan=Yin(ind_nan);
Zlnan=Zin(ind_nan);
coordnan=[Xlnan Ylnan Zlnan];
clear Xin Yin Zin Xlnan Ylnan Zlnan Xlnnan Ylnnan Zlnnan
% I found you!
ind=knnsearch(coordnnan,coordnan);
clear coordnan coordnnan
% tricky to read, but these 3 lines replace nans with nearest neighbours.
% Trust me.
Variable_TEMP=Variable_in(ind_nnan);
Variable_TEMP=Variable_TEMP(ind);
Variable_in(isnan(Variable_in))=Variable_TEMP;
clear Variable_TEMP ind ind_nnan ind_nan
% let's put our treated copernicus variable in NEMO space.
Variable_interp=interp3(xin,yin,zin,Variable_in,xout,yout,z);
clear Variable_in xin yin zin
for i = 1:length(nbidta)
z_obc(i,1,:) = squeeze(z(nbidta(i),nbjdta(i),:));
Variable_obc(i,1,:) = squeeze( Variable_interp(nbidta(i),nbjdta(i),:));
end
% ncid=netcdf.open(fname,'WRITE');
% varid = netcdf.inqVarID(ncid,'vosaline');
%
% netcdf.putVar(ncid,varid,Variable_interp)
end
function [Variable_interp,Variable_obc] = COPERNICUS_INTERP_SSH(fname_data,z_data,variable_name,nbidta,nbjdta)
%variable_name='so';
%fname_data = 'Sal_16_0000.nc';
%z_data = 'domain_cfg.nc';
% This is the NEMO grid
xout=double(ncread(z_data,'nav_lon'));
yout=double(ncread(z_data,'nav_lat'));
% Here we read in the copernicus data
Variable_in=ncread(fname_data,variable_name);
xin=double(ncread(fname_data,'longitude'));
yin=double(ncread(fname_data,'latitude'));
% make COPERNICUS coordinates 3D arrays (for griddata function)
[Xin,Yin]=meshgrid(xin,yin);
% We only want to feed non-nan numbers from the copernicus grid.
Xlr=Xin(~isnan(Variable_in));
Ylr=Yin(~isnan(Variable_in));
Variable_lr=Variable_in(~isnan(Variable_in));
% Interpolate Copernicus grid (without nans) on to same grid - basically
% "flood filling", but by interpolation, not extrapolation.
Variable_in=griddata(Xlr,Ylr,Variable_lr,Xin,Yin);
clear Variable_lr Xlr Ylr Zlr
% nans will still exists around the edges - let's find the nearest
% neighours to fill them in.
ind_nnan=~isnan(Variable_in(:));
ind_nan = isnan(Variable_in(:));
Xlnnan=Xin(ind_nnan);
Ylnnan=Yin(ind_nnan);
coordnnan=[Xlnnan Ylnnan];
Xlnan=Xin(ind_nan);
Ylnan=Yin(ind_nan);
coordnan=[Xlnan Ylnan];
clear Xin Yin Zin Xlnan Ylnan Zlnan Xlnnan Ylnnan Zlnnan
% I found you!
ind=knnsearch(coordnnan,coordnan);
clear coordnan coordnnan
% tricky to read, but these 3 lines replace nans with nearest neighbours.
% Trust me.
Variable_TEMP=Variable_in(ind_nnan);
Variable_TEMP=Variable_TEMP(ind);
Variable_in(isnan(Variable_in))=Variable_TEMP;
clear Variable_TEMP ind ind_nnan ind_nan
% let's put our treated copernicus variable in NEMO space.
Variable_interp=interp2(xin,yin,Variable_in,xout,yout);
clear Variable_in xin yin zin
for i = 1:length(nbidta)
Variable_obc(i,1) = squeeze( Variable_interp(nbidta(i),nbjdta(i)));
end
% ncid=netcdf.open(fname,'WRITE');
% varid = netcdf.inqVarID(ncid,'vosaline');
%
% netcdf.putVar(ncid,varid,Variable_interp)
end
These are mostly redundany and will be deleted from this branch This directory contains scripts used to generate domain_cfg.nc file, preprocess met forcing, set up paths and directories, auto-build tooling, XIOS and NEMO executables.
There were also Matlab scripts for initial conditions and boundary conditions. These are preserved on another branch, but have been replaced by python tooling.
Only the river forcing generating files have yet to be converted from matlab.
These remaining files should probably be tidied into STARTFILES under appropriate subdirectories, but there are paths that would be broken... Something for the to-do list.
clear all
clc
fname='bathy_meter.nc';
B=ncread(fname,'Bathymetry');
x=ncread(fname,'nav_lon');
y=ncread(fname,'nav_lat');
B(isnan(B))=0;
% make landsea mask
A=-B;
A(A==0)=1;
A(A<0)=0;
% put land border on east coast
A(end,:)=1;
% fill closed spaces
A1=imfill(A,'holes');
B(A1==1)=nan;
% update bathymetry
ncid=netcdf.open(fname,'WRITE');
varid = netcdf.inqVarID(ncid,'Bathymetry');
netcdf.putVar(ncid,varid,B)
clear all
clc
fname = 'initcd_vosaline.nc';
fname_data = 'Sal_16_0000.nc';
z_data = 'domain_cfg.nc';
Sin=ncread(fname_data,'so');
xin=double(ncread(fname_data,'longitude'));
yin=double(ncread(fname_data,'latitude'));
zin=double(ncread(fname_data,'depth'));
Sin=permute(Sin,[2 1 3]);
xout=double(ncread(z_data,'nav_lon'));
yout=double(ncread(z_data,'nav_lat'));
dzout=ncread(z_data,'e3t_0');
xout=repmat(xout,1,1,size(dzout,3));
yout=repmat(yout,1,1,size(dzout,3));
z=zeros(size(dzout,1),size(dzout,2),size(dzout,3));
for i=1:size(dzout,3)
if i==1
z(:,:,i)=dzout(:,:,i);
else
z(:,:,i)=z(:,:,i-1)+dzout(:,:,i);
end
end
zin(1)=0;
%zin(end)=max(z(:))+1;
[Xin,Yin,Zin]=meshgrid(xin,yin,zin);
Xlr=Xin(~isnan(Sin));
Ylr=Yin(~isnan(Sin));
Zlr=Zin(~isnan(Sin));
Slr=Sin(~isnan(Sin));
Sin=griddata(Xlr,Ylr,Zlr,Slr,Xin,Yin,Zin);
ind_nnan=~isnan(Sin(:));
ind_nan = isnan(Sin(:));
Xlnnan=Xin(ind_nnan);
Ylnnan=Yin(ind_nnan);
Zlnnan=Zin(ind_nnan);
coordnnan=[Xlnnan Ylnnan Zlnnan];
Xlnan=Xin(ind_nan);
Ylnan=Yin(ind_nan);
Zlnan=Zin(ind_nan);
coordnan=[Xlnan Ylnan Zlnan];
ind=knnsearch(coordnnan,coordnan);
S_TEMP=Sin(ind_nnan);
S_TEMP=S_TEMP(ind);
Sin(isnan(Sin))=S_TEMP;
Sinterp=interp3(xin,yin,zin,Sin,xout,yout,z);
ncid=netcdf.open(fname,'WRITE');
varid = netcdf.inqVarID(ncid,'vosaline');
netcdf.putVar(ncid,varid,Sinterp)
cd /work/n01/n01/ashbre/INDIAN_OCEAN_AUTO/BOUNDARY_FORCING/SAL16_dir
mkdir JAN
mv Sal_16_000* JAN
mv Sal_16_001* JAN
mv Sal_16_002* JAN
mv Sal_16_0030.nc JAN
mkdir FEB
mv Sal_16_003* FEB
mv Sal_16_004* FEB
mv Sal_16_005* FEB
mkdir MAR
mv Sal_16_006* MAR
mv Sal_16_007* MAR
mv Sal_16_008* MAR
mv Sal_16_0090.nc MAR
mkdir APR
mv Sal_16_009* APR
mv Sal_16_010* APR
mv Sal_16_011* APR
mv Sal_16_0120.nc APR
mkdir MAY
mv Sal_16_012* MAY
mv Sal_16_013* MAY
mv Sal_16_014* MAY
mv Sal_16_0150.nc MAY
mv Sal_16_0151.nc MAY
mkdir JUN
mv Sal_16_015* JUN
mv Sal_16_016* JUN
mv Sal_16_017* JUN
mv Sal_16_0180.nc JUN
mv Sal_16_0181.nc JUN
mkdir JUL
mv Sal_16_018* JUL
mv Sal_16_019* JUL
mv Sal_16_020* JUL
mv Sal_16_0210.nc JUL
mv Sal_16_0211.nc JUL
mv Sal_16_0212.nc JUL
mkdir AUG
mv Sal_16_021* AUG
mv Sal_16_022* AUG
mv Sal_16_023* AUG
mv Sal_16_0240.nc AUG
mv Sal_16_0241.nc AUG
mv Sal_16_0242.nc AUG
mv Sal_16_0243.nc AUG
mkdir SEP
mv Sal_16_024* SEP
mv Sal_16_025* SEP
mv Sal_16_026* SEP
mv Sal_16_0270.nc SEP
mv Sal_16_0271.nc SEP
mv Sal_16_0272.nc SEP
mv Sal_16_0273.nc SEP
mkdir OCT
mv Sal_16_027* OCT
mv Sal_16_028* OCT
mv Sal_16_029* OCT
mv Sal_16_0300.nc OCT
mv Sal_16_0301.nc OCT
mv Sal_16_0302.nc OCT
mv Sal_16_0303.nc OCT
mv Sal_16_0304.nc OCT
mkdir NOV
mv Sal_16_030* NOV
mv Sal_16_031* NOV
mv Sal_16_032* NOV
mv Sal_16_0330.nc NOV
mv Sal_16_0331.nc NOV
mv Sal_16_0332.nc NOV
mv Sal_16_0333.nc NOV
mv Sal_16_0334.nc NOV
mkdir DEC
mv Sal_16_03* DEC
cd ..
cd /work/n01/n01/ashbre/INDIAN_OCEAN_AUTO/BOUNDARY_FORCING/V017_dir
mkdir JAN
mv V0_17_000* JAN
mv V0_17_001* JAN
mv V0_17_002* JAN
mv V0_17_0030.nc JAN
mkdir FEB
mv V0_17_003* FEB
mv V0_17_004* FEB
mv V0_17_0050.nc FEB
mv V0_17_0051.nc FEB
mv V0_17_0052.nc FEB
mv V0_17_0053.nc FEB
mv V0_17_0054.nc FEB
mv V0_17_0055.nc FEB
mv V0_17_0056.nc FEB
mv V0_17_0057.nc FEB
mv V0_17_0058.nc FEB
mkdir MAR
mv V0_17_005* MAR
mv V0_17_006* MAR
mv V0_17_007* MAR
mv V0_17_008* MAR
mkdir APR
mv V0_17_009* APR
mv V0_17_010* APR
mv V0_17_011* APR
mkdir MAY
mv V0_17_012* MAY
mv V0_17_013* MAY
mv V0_17_014* MAY
mv V0_17_0150.nc MAY
mkdir JUN
mv V0_17_015* JUN
mv V0_17_016* JUN
mv V0_17_017* JUN
mv V0_17_0180.nc JUN
mkdir JUL
mv V0_17_018* JUL
mv V0_17_019* JUL
mv V0_17_020* JUL
mv V0_17_0210.nc JUL
mv V0_17_0211.nc JUL
mkdir AUG
mv V0_17_021* AUG
mv V0_17_022* AUG
mv V0_17_023* AUG
mv V0_17_0240.nc AUG
mv V0_17_0241.nc AUG
mv V0_17_0242.nc AUG
mkdir SEP
mv V0_17_024* SEP
mv V0_17_025* SEP
mv V0_17_026* SEP
mv V0_17_0270.nc SEP
mv V0_17_0271.nc SEP
mv V0_17_0272.nc SEP
mkdir OCT
mv V0_17_027* OCT
mv V0_17_028* OCT
mv V0_17_029* OCT
mv V0_17_0300.nc OCT
mv V0_17_0301.nc OCT
mv V0_17_0302.nc OCT
mv V0_17_0303.nc OCT
mkdir NOV
mv V0_17_030* NOV
mv V0_17_031* NOV
mv V0_17_032* NOV
mv V0_17_0330.nc NOV
mv V0_17_0331.nc NOV
mv V0_17_0332.nc NOV
mv V0_17_0333.nc NOV
mkdir DEC
mv V0_17_03* DEC
cd ..
cd /work/n01/n01/ashbre/INDIAN_OCEAN_AUTO/BOUNDARY_FORCING/SAL18_dir
mkdir JAN
mv Sal_18_000* JAN
mv Sal_18_001* JAN
mv Sal_18_002* JAN
mv Sal_18_0030.nc JAN
mkdir FEB
mv Sal_18_003* FEB
mv Sal_18_004* FEB
mv Sal_18_005* FEB
mkdir MAR
mv Sal_18_006* MAR
mv Sal_18_007* MAR
mv Sal_18_008* MAR
mv Sal_18_0090.nc MAR
mkdir APR
mv Sal_18_009* APR
mv Sal_18_010* APR
mv Sal_18_011* APR
mv Sal_18_0120.nc APR
mkdir MAY
mv Sal_18_012* MAY
mv Sal_18_013* MAY
mv Sal_18_014* MAY
mv Sal_18_0150.nc MAY
mv Sal_18_0151.nc MAY
mkdir JUN
mv Sal_18_015* JUN
mv Sal_18_016* JUN
mv Sal_18_017* JUN
mv Sal_18_0180.nc JUN
mv Sal_18_0181.nc JUN
mkdir JUL
mv Sal_18_018* JUL
mv Sal_18_019* JUL
mv Sal_18_020* JUL
mv Sal_18_0210.nc JUL
mv Sal_18_0211.nc JUL
mv Sal_18_0212.nc JUL
mkdir AUG
mv Sal_18_021* AUG
mv Sal_18_022* AUG
mv Sal_18_023* AUG
mv Sal_18_0240.nc AUG
mv Sal_18_0241.nc AUG
mv Sal_18_0242.nc AUG
mv Sal_18_0243.nc AUG
mkdir SEP
mv Sal_18_024* SEP
mv Sal_18_025* SEP
mv Sal_18_026* SEP
mv Sal_18_0270.nc SEP
mv Sal_18_0271.nc SEP
mv Sal_18_0272.nc SEP
mv Sal_18_0273.nc SEP
mkdir OCT
mv Sal_18_027* OCT
mv Sal_18_028* OCT
mv Sal_18_029* OCT
mv Sal_18_0300.nc OCT
mv Sal_18_0301.nc OCT
mv Sal_18_0302.nc OCT
mv Sal_18_0303.nc OCT
mv Sal_18_0304.nc OCT
mkdir NOV
mv Sal_18_030* NOV
mv Sal_18_031* NOV
mv Sal_18_032* NOV
mv Sal_18_0330.nc NOV
mv Sal_18_0331.nc NOV
mv Sal_18_0332.nc NOV
mv Sal_18_0333.nc NOV
mv Sal_18_0334.nc NOV
mkdir DEC
mv Sal_18_03* DEC
cd ..
cd /work/n01/n01/ashbre/INDIAN_OCEAN_AUTO/BOUNDARY_FORCING/SAL19_dir
mkdir JAN
mv Sal_19_000* JAN
mv Sal_19_001* JAN
mv Sal_19_002* JAN
mv Sal_19_0030.nc JAN
mkdir FEB
mv Sal_19_003* FEB
mv Sal_19_004* FEB
mv Sal_19_005* FEB
mkdir MAR
mv Sal_19_006* MAR
mv Sal_19_007* MAR
mv Sal_19_008* MAR
mv Sal_19_0090.nc MAR
mkdir APR
mv Sal_19_009* APR
mv Sal_19_010* APR
mv Sal_19_011* APR
mv Sal_19_0120.nc APR
mkdir MAY
mv Sal_19_012* MAY
mv Sal_19_013* MAY
mv Sal_19_014* MAY
mv Sal_19_0150.nc MAY
mv Sal_19_0151.nc MAY
mkdir JUN
mv Sal_19_015* JUN
mv Sal_19_016* JUN
mv Sal_19_017* JUN
mv Sal_19_0180.nc JUN
mv Sal_19_0181.nc JUN
mkdir JUL
mv Sal_19_018* JUL
mv Sal_19_019* JUL
mv Sal_19_020* JUL
mv Sal_19_0210.nc JUL
mv Sal_19_0211.nc JUL
mv Sal_19_0212.nc JUL
mkdir AUG
mv Sal_19_021* AUG
mv Sal_19_022* AUG
mv Sal_19_023* AUG
mv Sal_19_0240.nc AUG
mv Sal_19_0241.nc AUG
mv Sal_19_0242.nc AUG
mv Sal_19_0243.nc AUG
mkdir SEP
mv Sal_19_024* SEP
mv Sal_19_025* SEP
mv Sal_19_026* SEP
mv Sal_19_0270.nc SEP
mv Sal_19_0271.nc SEP
mv Sal_19_0272.nc SEP
mv Sal_19_0273.nc SEP
mkdir OCT
mv Sal_19_027* OCT
mv Sal_19_028* OCT
mv Sal_19_029* OCT
mv Sal_19_0300.nc OCT
mv Sal_19_0301.nc OCT
mv Sal_19_0302.nc OCT
mv Sal_19_0303.nc OCT
mv Sal_19_0304.nc OCT
mkdir NOV
mv Sal_19_030* NOV
mv Sal_19_031* NOV
mv Sal_19_032* NOV
mv Sal_19_0330.nc NOV
mv Sal_19_0331.nc NOV
mv Sal_19_0332.nc NOV
mv Sal_19_0333.nc NOV
mv Sal_19_0334.nc NOV
mkdir DEC
mv Sal_19_03* DEC
cd ..
clear all
clc
% This programme takes Temperature from an input grid, treats it so all
% nans are replaced by interpolated or nearest neighbour values and then
% interpolates this on to the NEMO grid
% Note, interpolation around land is a dark art - this may not give a
% stable solution, but it at least works for me.
% 24/04/19 - Ashley Brereton
fname = 'initcd_vosaline.nc'; % name of output file
fname_data = 'Sal_16_0000.nc'; % name of input file
z_data = 'domain_cfg.nc'; % grid file
% The input data is a regular grid. The co-ordinates are 1D vectors and the
% variable is F(x,y,z,t). Later in this code, we make our co-ordinates each
% a function of F(x,y,z) with meshgrid. If your data is in NEMO format,
% replicate how (xout,yout,zout) are made for (xin,yin,zin).
% Read in input variables
Sin=ncread(fname_data,'so');
xin=double(ncread(fname_data,'longitude'));
yin=double(ncread(fname_data,'latitude'));
zin=double(ncread(fname_data,'depth'));
Sin=permute(Sin,[2 1 3]);
% Read output grid information
xout=double(ncread(z_data,'nav_lon'));
yout=double(ncread(z_data,'nav_lat'));
dzout=ncread(z_data,'e3t_0');
% need all grid variables as F(x,y,z) as this is what is needed by griddata
xout=repmat(xout,1,1,size(dzout,3));
yout=repmat(yout,1,1,size(dzout,3));
% pre-allocate matrix
zout=zeros(size(dzout,1),size(dzout,2),size(dzout,3));
% Build z from dz given in grid file
for i=1:size(dzout,3)
if i==1
zout(:,:,i)=dzout(:,:,i);
else
zout(:,:,i)=zout(:,:,i-1)+dzout(:,:,i);
end
end
% fix surface depth to 0
zin(1)=0;
% make all input grid information F(x,y,z)
[Xin,Yin,Zin]=meshgrid(xin,yin,zin);
% Remove all nan points.
Xlr=Xin(~isnan(Sin));
Ylr=Yin(~isnan(Sin));
Zlr=Zin(~isnan(Sin));
Tlr=Sin(~isnan(Sin));
% Interpolate input on to whole input grid - getting rid of nans
Sin=griddata(Xlr,Ylr,Zlr,Tlr,Xin,Yin,Zin);
% All the nans that couldn't be filled on the input grid, we replace with
% nearest neighbours.
ind_nnan=~isnan(Sin(:));
ind_nan = isnan(Sin(:));
Xlnnan=Xin(ind_nnan);
Ylnnan=Yin(ind_nnan);
Zlnnan=Zin(ind_nnan);
coordnnan=[Xlnnan Ylnnan Zlnnan];
Xlnan=Xin(ind_nan);
Ylnan=Yin(ind_nan);
Zlnan=Zin(ind_nan);
coordnan=[Xlnan Ylnan Zlnan];
ind=knnsearch(coordnnan,coordnan);
T_TEMP=Sin(ind_nnan);
T_TEMP=T_TEMP(ind);
Sin(isnan(Sin))=T_TEMP;
% Then we interpolate fully treated input grid on to our domain.
Sinterp=interp3(xin,yin,zin,Sin,xout,yout,zout);
% converts days since 1900 to seconds since 1950...
time=ncread( fname_data , 'time');
time_counter = (time + 18262*24)*3600; % 18262 days between 1900 and 1950
% write all the variables to file
delete(fname)
nccreate(fname,'nav_lon',...
'Dimensions',{'x',size(xout,1),'y',size(yout,2)},...
'Format','netcdf4_classic');
ncwrite(fname,'nav_lon',nav_lon);
nccreate(fname,'nav_lat',...
'Dimensions',{'x',size(xout,1),'y',size(yout,2)},...
'Format','netcdf4_classic');
ncwrite(fname,'nav_lat',nav_lat);
nccreate(fname,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(fname,'time_counter',time_counter);
nccreate(fname,'gdept',...
'Dimensions',{'x',size(zout,1),'y',size(zout,2),'z',size(zout,3)},...
'Format','netcdf4_classic');
ncwrite(fname,'gdept',z);
nccreate(fname,'vosaline',...
'Dimensions',{'x',size(zout,1),'y',size(zout,2),'z',size(zout,3),'time_counter',1},...
'Format','netcdf4_classic');
ncwrite(fname,'votemper',Sinterp);
clear all
clc
% This programme takes Temperature from an input grid, treats it so all
% nans are replaced by interpolated or nearest neighbour values and then
% interpolates this on to the NEMO grid
% Note, interpolation around land is a dark art - this may not give a
% stable solution, but it at least works for me.
% 24/04/19 - Ashley Brereton
fname = 'initcd_votemper.nc'; % name of output file
fname_data = 'Temp_16_0000.nc'; % name of input file
z_data = 'domain_cfg.nc'; % grid file
% The input data is a regular grid. The co-ordinates are 1D vectors and the
% variable is F(x,y,z,t). Later in this code, we make our co-ordinates each
% a function of F(x,y,z) with meshgrid. If your data is in NEMO format,
% replicate how (xout,yout,zout) are made for (xin,yin,zin).
% Read in input variables
Tin=ncread(fname_data,'thetao');
xin=double(ncread(fname_data,'longitude'));
yin=double(ncread(fname_data,'latitude'));
zin=double(ncread(fname_data,'depth'));
Tin=permute(Tin,[2 1 3]);
% Read output grid information
xout=double(ncread(z_data,'nav_lon'));
yout=double(ncread(z_data,'nav_lat'));
dzout=ncread(z_data,'e3t_0');
% need all grid variables as F(x,y,z) as this is what is needed by griddata
xout=repmat(xout,1,1,size(dzout,3));
yout=repmat(yout,1,1,size(dzout,3));
% pre-allocate matrix
zout=zeros(size(dzout,1),size(dzout,2),size(dzout,3));
% Build z from dz given in grid file
for i=1:size(dzout,3)
if i==1
zout(:,:,i)=dzout(:,:,i);
else
zout(:,:,i)=zout(:,:,i-1)+dzout(:,:,i);
end
end
% fix surface depth to 0
zin(1)=0;
% make all input grid information F(x,y,z)
[Xin,Yin,Zin]=meshgrid(xin,yin,zin);
% Remove all nan points.
Xlr=Xin(~isnan(Tin));
Ylr=Yin(~isnan(Tin));
Zlr=Zin(~isnan(Tin));
Tlr=Tin(~isnan(Tin));
% Interpolate input on to whole input grid - getting rid of nans
Tin=griddata(Xlr,Ylr,Zlr,Tlr,Xin,Yin,Zin);
% All the nans that couldn't be filled on the input grid, we replace with
% nearest neighbours.
ind_nnan=~isnan(Tin(:));
ind_nan = isnan(Tin(:));
Xlnnan=Xin(ind_nnan);
Ylnnan=Yin(ind_nnan);
Zlnnan=Zin(ind_nnan);
coordnnan=[Xlnnan Ylnnan Zlnnan];
Xlnan=Xin(ind_nan);
Ylnan=Yin(ind_nan);
Zlnan=Zin(ind_nan);
coordnan=[Xlnan Ylnan Zlnan];
ind=knnsearch(coordnnan,coordnan);
T_TEMP=Tin(ind_nnan);
T_TEMP=T_TEMP(ind);
Tin(isnan(Tin))=T_TEMP;
% Then we interpolate fully treated input grid on to our domain.
Tinterp=interp3(xin,yin,zin,Tin,xout,yout,zout);
% converts days since 1900 to seconds since 1950...
time=ncread( fname_data , 'time');
time_counter = (time + 18262*24)*3600; % 18262 days between 1900 and 1950
% write all the variables to file
delete(fname)
nccreate(fname,'nav_lon',...
'Dimensions',{'x',size(xout,1),'y',size(yout,2)},...
'Format','netcdf4_classic');
ncwrite(fname,'nav_lon',nav_lon);
nccreate(fname,'nav_lat',...
'Dimensions',{'x',size(xout,1),'y',size(yout,2)},...
'Format','netcdf4_classic');
ncwrite(fname,'nav_lat',nav_lat);
nccreate(fname,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(fname,'time_counter',time_counter);
nccreate(fname,'gdept',...
'Dimensions',{'x',size(zout,1),'y',size(zout,2),'z',size(zout,3)},...
'Format','netcdf4_classic');
ncwrite(fname,'gdept',z);
nccreate(fname,'votemper',...
'Dimensions',{'x',size(zout,1),'y',size(zout,2),'z',size(zout,3),'time_counter',1},...
'Format','netcdf4_classic');
ncwrite(fname,'votemper',Tinterp);
clear all
clc
% This programme reads in Salinity data, interpolates on to the NEMO grid
% that you provide and outputs the points on the open boundaries, which you
% will also provide.
% Ingedients needed:
% 1) domain_cfg.nc % Your NEMO grid
% 2) bathy_meter.nc % Your bathymetry file
% 3) coordinates.bdy.nc % Your coordinates file, generated when tides
% you make tides
% 4) Daily parent data. This has struction ./SAL16_dir/JAN/Sal_16_0000.nc
% This code uses the parallel toolbox. This might have memory restrictions
% based on the computer you are using. If you want this to run quickly, use
% the following syntax: parpool(N) with N = 16 or N=31 if you have the
% resources.
% Note this is adapted only for Copernicus data but can easily adapted for
% other datasets. Email a.brereton@liverpool.ac.uk for help.
% we want to make the current directory visible so we can use subroutines
addpath(pwd)
% Control variables - make sure
prefix='INDIAN_bdy_'; % prefix to output filename
output_name='sossheig'; % output variable name
variable_name='zos'; % variable from input file
filename_prefix='SSH'; % e.g. 'INDIAN_bdy_TEMP...'
Input_directory='SSH17_dir'; % Input file directory
year = '2017'; % e.g. 'INDIAN_bdy_TEMP_y2017...'
grid_data = 'domain_cfg.nc'; % NEMO grid information
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
Input_month_suf{1}='01.nc';
Input_month_suf{2}='02.nc';
Input_month_suf{3}='03.nc';
Input_month_suf{4}='04.nc';
Input_month_suf{5}='05.nc';
Input_month_suf{6}='06.nc';
Input_month_suf{7}='07.nc';
Input_month_suf{8}='08.nc';
Input_month_suf{9}='09.nc';
Input_month_suf{10}='10.nc';
Input_month_suf{11}='11.nc';
Input_month_suf{12}='12.nc';
% Input directory month names e.g. ...../SAL16_dir/JAN/
Input_month{1}='JAN';
Input_month{2}='FEB';
Input_month{3}='MAR';
Input_month{4}='APR';
Input_month{5}='MAY';
Input_month{6}='JUN';
Input_month{7}='JUL';
Input_month{8}='AUG';
Input_month{9}='SEP';
Input_month{10}='OCT';
Input_month{11}='NOV';
Input_month{12}='DEC';
% x co-ordinate indice of boundary
nbidta = ncread('coordinates.bdy.nc','nbit'); % (yb, xb)
% y co-ordinate indice of boundary
nbjdta = ncread('coordinates.bdy.nc','nbjt'); % (yb,xb)
% rim level, this code is only set up for a rimwidth of 1.
nbrdta = nbidta*0+1; % (yb,xb)
% nav_lon - we have this in domain_cfg (y,x)
% nav_lat - we have this in domain_cfg (y,x)
nav_lon = ncread(grid_data,'nav_lon');
nav_lat = ncread(grid_data,'nav_lat');
% create a land-sea mask from bathymetry
B=ncread('bathy_meter.nc','Bathymetry');
B(B>0)=1; % 1 is Water
B(isnan(B))=0; % 0 is Land
bdy_msk=B;
for month=1:12
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
output_filename = [prefix , filename_prefix , '_y',year,'m',Input_month_suf{month}];
% cd into the data directory
cd(Input_directory)
cd(Input_month{month})
filenames=dir('*.nc');
% This loops through daily files, interpolating onto NEMO grid and
% getting boundary points for the data.
parfor j=1:length(filenames)
[~,Variable_obc] = COPERNICUS_INTERP_SSH(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
NEMO_variable_obc(:,:,j)=Variable_obc;
% deptht - this is the depths at the boundary points (z, yb, xb)
% votemper (etc) - (time_counter, z, yb, xb)
time(j)=ncread( filenames(j).name , 'time');
time_counter(j) = (time(j) + 18262*24)*3600; % 18262 days between 1900 and 1950
end
cd ../..
% Write out all the relevant variables to monthly file
delete(output_filename)
nccreate(output_filename,'nbrdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbrdta',nbrdta);
nccreate(output_filename,'nbidta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbidta',nbidta);
nccreate(output_filename,'nbjdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbjdta',nbjdta);
nccreate(output_filename,'nav_lon',...
'Dimensions',{'x',size(nav_lon,1),'y',size(nav_lon,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lon',nav_lon);
nccreate(output_filename,'nav_lat',...
'Dimensions',{'x',size(nav_lat,1),'y',size(nav_lat,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lat',nav_lat);
nccreate(output_filename,'bdy_msk',...
'Dimensions',{'x',size(bdy_msk,1),'y',size(bdy_msk,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'bdy_msk',bdy_msk);
nccreate(output_filename,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(output_filename,'time_counter',time_counter);
nccreate(output_filename,output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'time_counter',size(NEMO_variable_obc,3)},...
'Format','netcdf4_classic');
ncwrite(output_filename,output_name,NEMO_variable_obc);
end
\ No newline at end of file
clear all
clc
% This programme reads in Salinity data, interpolates on to the NEMO grid
% that you provide and outputs the points on the open boundaries, which you
% will also provide.
% Ingedients needed:
% 1) domain_cfg.nc % Your NEMO grid
% 2) bathy_meter.nc % Your bathymetry file
% 3) coordinates.bdy.nc % Your coordinates file, generated when tides
% you make tides
% 4) Daily parent data. This has struction ./SAL16_dir/JAN/Sal_16_0000.nc
% This code uses the parallel toolbox. This might have memory restrictions
% based on the computer you are using. If you want this to run quickly, use
% the following syntax: parpool(N) with N = 16 or N=31 if you have the
% resources.
% Note this is adapted only for Copernicus data but can easily adapted for
% other datasets. Email a.brereton@liverpool.ac.uk for help.
% we want to make the current directory visible so we can use subroutines
addpath(pwd)
% Control variables - make sure
prefix='INDIAN_bdy_'; % prefix to output filename
output_name='vosaline'; % output variable name
variable_name='so'; % variable from input file
filename_prefix='SAL'; % e.g. 'INDIAN_bdy_SAL...'
Input_directory='SAL17_dir'; % Input file directory
year = '2017'; % e.g. 'INDIAN_bdy_SAL_y2017...'
grid_data = 'domain_cfg.nc'; % NEMO grid information
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
Input_month_suf{1}='01.nc';
Input_month_suf{2}='02.nc';
Input_month_suf{3}='03.nc';
Input_month_suf{4}='04.nc';
Input_month_suf{5}='05.nc';
Input_month_suf{6}='06.nc';
Input_month_suf{7}='07.nc';
Input_month_suf{8}='08.nc';
Input_month_suf{9}='09.nc';
Input_month_suf{10}='10.nc';
Input_month_suf{11}='11.nc';
Input_month_suf{12}='12.nc';
% Input directory month names e.g. ...../SAL16_dir/JAN/
Input_month{1}='JAN';
Input_month{2}='FEB';
Input_month{3}='MAR';
Input_month{4}='APR';
Input_month{5}='MAY';
Input_month{6}='JUN';
Input_month{7}='JUL';
Input_month{8}='AUG';
Input_month{9}='SEP';
Input_month{10}='OCT';
Input_month{11}='NOV';
Input_month{12}='DEC';
% x co-ordinate indice of boundary
nbidta = ncread('coordinates.bdy.nc','nbit'); % (yb, xb)
% y co-ordinate indice of boundary
nbjdta = ncread('coordinates.bdy.nc','nbjt'); % (yb,xb)
% rim level, this code is only set up for a rimwidth of 1.
nbrdta = nbidta*0+1; % (yb,xb)
% nav_lon - we have this in domain_cfg (y,x)
% nav_lat - we have this in domain_cfg (y,x)
nav_lon = ncread(grid_data,'nav_lon');
nav_lat = ncread(grid_data,'nav_lat');
% create a land-sea mask from bathymetry
B=ncread('bathy_meter.nc','Bathymetry');
B(B>0)=1; % 1 is Water
B(isnan(B))=0; % 0 is Land
bdy_msk=B;
for month=1:12
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
output_filename = [prefix , filename_prefix , '_y',year,'m',Input_month_suf{month}];
% cd into the data directory
cd(Input_directory)
cd(Input_month{month})
filenames=dir('*.nc');
% This loops through daily files, interpolating onto NEMO grid and
% getting boundary points for the data.
parfor j=1:length(filenames)
if j==1
[Variable_obc,z_obc] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
deptht(:,:,:,j) = z_obc;
else
[Variable_obc,~] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
end
NEMO_variable_obc(:,:,:,j)=Variable_obc;
% Get time information. NEMO wants seconds since 1950. Copernicus data
% comes in hours since 1900.
time(j)=ncread( filenames(j).name , 'time');
time_counter(j) = (time(j) + 18262*24)*3600; % 18262 days between 1900 and 1950
end
cd ../..
% Write out all the relevant variables to monthly file
delete(output_filename)
nccreate(output_filename,'nbrdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbrdta',nbrdta);
nccreate(output_filename,'nbidta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbidta',nbidta);
nccreate(output_filename,'nbjdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbjdta',nbjdta);
nccreate(output_filename,'nav_lon',...
'Dimensions',{'x',size(nav_lon,1),'y',size(nav_lon,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lon',nav_lon);
nccreate(output_filename,'nav_lat',...
'Dimensions',{'x',size(nav_lat,1),'y',size(nav_lat,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lat',nav_lat);
nccreate(output_filename,'bdy_msk',...
'Dimensions',{'x',size(bdy_msk,1),'y',size(bdy_msk,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'bdy_msk',bdy_msk);
nccreate(output_filename,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(output_filename,'time_counter',time_counter);
nccreate(output_filename,'deptht',...
'Dimensions',{'xb',size(deptht,1),'yb',1,'z',size(deptht,3)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'deptht',deptht);
nccreate(output_filename,output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'z',size(NEMO_variable_obc,3),'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,output_name,NEMO_variable_obc);
end
clear all
clc
% This programme reads in Salinity data, interpolates on to the NEMO grid
% that you provide and outputs the points on the open boundaries, which you
% will also provide.
% Ingedients needed:
% 1) domain_cfg.nc % Your NEMO grid
% 2) bathy_meter.nc % Your bathymetry file
% 3) coordinates.bdy.nc % Your coordinates file, generated when tides
% you make tides
% 4) Daily parent data. This has struction ./SAL16_dir/JAN/Sal_16_0000.nc
% This code uses the parallel toolbox. This might have memory restrictions
% based on the computer you are using. If you want this to run quickly, use
% the following syntax: parpool(N) with N = 16 or N=31 if you have the
% resources.
% Note this is adapted only for Copernicus data but can easily adapted for
% other datasets. Email a.brereton@liverpool.ac.uk for help.
% we want to make the current directory visible so we can use subroutines
addpath(pwd)
% Control variables - make sure
prefix='INDIAN_bdy_'; % prefix to output filename
output_name='votemper'; % output variable name
variable_name='thetao'; % variable from input file
filename_prefix='TEMP'; % e.g. 'INDIAN_bdy_TEMP...'
Input_directory='TEMP17_dir'; % Input file directory
year = '2017'; % e.g. 'INDIAN_bdy_TEMP_y2017...'
grid_data = 'domain_cfg.nc'; % NEMO grid information
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
Input_month_suf{1}='01.nc';
Input_month_suf{2}='02.nc';
Input_month_suf{3}='03.nc';
Input_month_suf{4}='04.nc';
Input_month_suf{5}='05.nc';
Input_month_suf{6}='06.nc';
Input_month_suf{7}='07.nc';
Input_month_suf{8}='08.nc';
Input_month_suf{9}='09.nc';
Input_month_suf{10}='10.nc';
Input_month_suf{11}='11.nc';
Input_month_suf{12}='12.nc';
% Input directory month names e.g. ...../SAL16_dir/JAN/
Input_month{1}='JAN';
Input_month{2}='FEB';
Input_month{3}='MAR';
Input_month{4}='APR';
Input_month{5}='MAY';
Input_month{6}='JUN';
Input_month{7}='JUL';
Input_month{8}='AUG';
Input_month{9}='SEP';
Input_month{10}='OCT';
Input_month{11}='NOV';
Input_month{12}='DEC';
% x co-ordinate indice of boundary
nbidta = ncread('coordinates.bdy.nc','nbit'); % (yb, xb)
% y co-ordinate indice of boundary
nbjdta = ncread('coordinates.bdy.nc','nbjt'); % (yb,xb)
% rim level, this code is only set up for a rimwidth of 1.
nbrdta = nbidta*0+1; % (yb,xb)
% nav_lon - we have this in domain_cfg (y,x)
% nav_lat - we have this in domain_cfg (y,x)
nav_lon = ncread(grid_data,'nav_lon');
nav_lat = ncread(grid_data,'nav_lat');
% create a land-sea mask from bathymetry
B=ncread('bathy_meter.nc','Bathymetry');
B(B>0)=1; % 1 is Water
B(isnan(B))=0; % 0 is Land
bdy_msk=B;
for month=1:12
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
output_filename = [prefix , filename_prefix , '_y',year,'m',Input_month_suf{month}];
% cd into the data directory
cd(Input_directory)
cd(Input_month{month})
filenames=dir('*.nc');
% This loops through daily files, interpolating onto NEMO grid and
% getting boundary points for the data.
parfor j=1:length(filenames)
if j==1
[Variable_obc,z_obc] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
deptht(:,:,:,j) = z_obc;
else
[Variable_obc,~] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
end
NEMO_variable_obc(:,:,:,j)=Variable_obc;
% Get time information. NEMO wants seconds since 1950. Copernicus data
% comes in hours since 1900.
time(j)=ncread( filenames(j).name , 'time');
time_counter(j) = (time(j) + 18262*24)*3600; % 18262 days between 1900 and 1950
end
cd ../..
% Write out all the relevant variables to monthly file
delete(output_filename)
nccreate(output_filename,'nbrdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbrdta',nbrdta);
nccreate(output_filename,'nbidta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbidta',nbidta);
nccreate(output_filename,'nbjdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbjdta',nbjdta);
nccreate(output_filename,'nav_lon',...
'Dimensions',{'x',size(nav_lon,1),'y',size(nav_lon,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lon',nav_lon);
nccreate(output_filename,'nav_lat',...
'Dimensions',{'x',size(nav_lat,1),'y',size(nav_lat,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lat',nav_lat);
nccreate(output_filename,'bdy_msk',...
'Dimensions',{'x',size(bdy_msk,1),'y',size(bdy_msk,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'bdy_msk',bdy_msk);
nccreate(output_filename,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(output_filename,'time_counter',time_counter);
nccreate(output_filename,'deptht',...
'Dimensions',{'xb',size(deptht,1),'yb',1,'z',size(deptht,3)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'deptht',deptht);
nccreate(output_filename,output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'z',size(NEMO_variable_obc,3),'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,output_name,NEMO_variable_obc);
end
clear all
clc
% This programme reads in Salinity data, interpolates on to the NEMO grid
% that you provide and outputs the points on the open boundaries, which you
% will also provide.
% Ingedients needed:
% 1) domain_cfg.nc % Your NEMO grid
% 2) bathy_meter.nc % Your bathymetry file
% 3) coordinates.bdy.nc % Your coordinates file, generated when tides
% you make tides
% 4) Daily parent data. This has struction ./U016_dir/JAN/Sal_16_0000.nc
% This code uses the parallel toolbox. This might have memory restrictions
% based on the computer you are using. If you want this to run quickly, use
% the following syntax: parpool(N) with N = 16 or N=31 if you have the
% resources.
% Note this is adapted only for Copernicus data but can easily adapted for
% other datasets. Email a.brereton@liverpool.ac.uk for help.
% we want to make the current directory visible so we can use subroutines
addpath(pwd)
% Control variables - make sure
prefix='INDIAN_bdy_'; % prefix to output filename
output_name='vozocrtx'; % output variable name (3D)
mean_output_name='vobtcrtx'; % output variable name (2D)
input_name='uo'; % variable from input file
filename_prefix='U'; % e.g. 'INDIAN_bdy_U...'
Input_directory='U017_dir'; % Input file directory
year = '2017'; % e.g. 'INDIAN_bdy_U_y2017...'
grid_data = 'domain_cfg.nc'; % NEMO grid information
% e.g. 'INDIAN_bdy_U_y2017m01.nc'
Input_month_suf{1}='01.nc';
Input_month_suf{2}='02.nc';
Input_month_suf{3}='03.nc';
Input_month_suf{4}='04.nc';
Input_month_suf{5}='05.nc';
Input_month_suf{6}='06.nc';
Input_month_suf{7}='07.nc';
Input_month_suf{8}='08.nc';
Input_month_suf{9}='09.nc';
Input_month_suf{10}='10.nc';
Input_month_suf{11}='11.nc';
Input_month_suf{12}='12.nc';
% Input directory month names e.g. ...../SAL16_dir/JAN/
Input_month{1}='JAN';
Input_month{2}='FEB';
Input_month{3}='MAR';
Input_month{4}='APR';
Input_month{5}='MAY';
Input_month{6}='JUN';
Input_month{7}='JUL';
Input_month{8}='AUG';
Input_month{9}='SEP';
Input_month{10}='OCT';
Input_month{11}='NOV';
Input_month{12}='DEC';
% x co-ordinate indice of boundary
nbidta = ncread('coordinates.bdy.nc','nbit'); % (yb, xb)
% y co-ordinate indice of boundary
nbjdta = ncread('coordinates.bdy.nc','nbjt'); % (yb,xb)
% rim level, this code is only set up for a rimwidth of 1.
nbrdta = nbidta*0+1; % (yb,xb)
% nav_lon - we have this in domain_cfg (y,x)
% nav_lat - we have this in domain_cfg (y,x)
nav_lon = ncread(grid_data,'nav_lon');
nav_lat = ncread(grid_data,'nav_lat');
% create a land-sea mask from bathymetry
B=ncread('bathy_meter.nc','Bathymetry');
B(B>0)=1; % 1 is Water
B(isnan(B))=0; % 0 is Land
bdy_msk=B;
for month=1:12
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
output_filename = [prefix , filename_prefix , '_y',year,'m',Input_month_suf{month}];
% cd into the data directory
cd(Input_directory)
cd(Input_month{month})
filenames=dir('*.nc');
% This loops through daily files, interpolating onto NEMO grid and
% getting boundary points for the data.
parfor j=1:length(filenames)
if j==1
[Variable_obc,z_obc] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
deptht(:,:,:,j) = z_obc;
else
[Variable_obc,~] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
end
NEMO_variable_obc(:,:,:,j)=Variable_obc;
% Get time information. NEMO wants seconds since 1950. Copernicus data
% comes in hours since 1900.
time(j)=ncread( filenames(j).name , 'time');
time_counter(j) = (time(j) + 18262*24)*3600; % 18262 days between 1900 and 1950
end
cd ../..
for j=1:size(NEMO_variable_obc,4)
for i=1:size(NEMO_variable_obc,1)
zz=squeeze(deptht(i,1,:));
UU=squeeze( NEMO_variable_obc(i,1,:,j));
mean_NEMO_variable_obc(i,1,j) = trapz(zz,UU)/max(zz);
end
end
nccreate(output_filename,'nbrdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbrdta',nbrdta);
nccreate(output_filename,'nbidta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbidta',nbidta);
nccreate(output_filename,'nbjdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbjdta',nbjdta);
nccreate(output_filename,'nav_lon',...
'Dimensions',{'x',size(nav_lon,1),'y',size(nav_lon,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lon',nav_lon);
nccreate(output_filename,'nav_lat',...
'Dimensions',{'x',size(nav_lat,1),'y',size(nav_lat,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lat',nav_lat);
nccreate(output_filename,'bdy_msk',...
'Dimensions',{'x',size(bdy_msk,1),'y',size(bdy_msk,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'bdy_msk',bdy_msk);
nccreate(output_filename,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(output_filename,'time_counter',time_counter);
nccreate(output_filename,'deptht',...
'Dimensions',{'xb',size(deptht,1),'yb',1,'z',size(deptht,3)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'deptht',deptht);
nccreate(output_filename,output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'z',size(NEMO_variable_obc,3),'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,output_name,NEMO_variable_obc);
nccreate(output_filename,mean_output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,mean_output_name,mean_NEMO_variable_obc);
end
\ No newline at end of file
clear all
clc
% This programme reads in Salinity data, interpolates on to the NEMO grid
% that you provide and outputs the points on the open boundaries, which you
% will also provide.
% Ingedients needed:
% 1) domain_cfg.nc % Your NEMO grid
% 2) bathy_meter.nc % Your bathymetry file
% 3) coordinates.bdy.nc % Your coordinates file, generated when tides
% you make tides
% 4) Daily parent data. This has struction ./U016_dir/JAN/Sal_16_0000.nc
% This code uses the parallel toolbox. This might have memory restrictions
% based on the computer you are using. If you want this to run quickly, use
% the following syntax: parpool(N) with N = 16 or N=31 if you have the
% resources.
% Note this is adapted only for Copernicus data but can easily adapted for
% other datasets. Email a.brereton@liverpool.ac.uk for help.
% we want to make the current directory visible so we can use subroutines
addpath(pwd)
% Control variables - make sure
prefix='INDIAN_bdy_'; % prefix to output filename
output_name='vomecrty'; % output variable name (3D)
mean_output_name='vobtcrty'; % output variable name (2D)
input_name='vo'; % variable from input file
filename_prefix='V'; % e.g. 'INDIAN_bdy_U...'
Input_directory='V017_dir'; % Input file directory
year = '2017'; % e.g. 'INDIAN_bdy_U_y2017...'
grid_data = 'domain_cfg.nc'; % NEMO grid information
% e.g. 'INDIAN_bdy_U_y2017m01.nc'
Input_month_suf{1}='01.nc';
Input_month_suf{2}='02.nc';
Input_month_suf{3}='03.nc';
Input_month_suf{4}='04.nc';
Input_month_suf{5}='05.nc';
Input_month_suf{6}='06.nc';
Input_month_suf{7}='07.nc';
Input_month_suf{8}='08.nc';
Input_month_suf{9}='09.nc';
Input_month_suf{10}='10.nc';
Input_month_suf{11}='11.nc';
Input_month_suf{12}='12.nc';
% Input directory month names e.g. ...../SAL16_dir/JAN/
Input_month{1}='JAN';
Input_month{2}='FEB';
Input_month{3}='MAR';
Input_month{4}='APR';
Input_month{5}='MAY';
Input_month{6}='JUN';
Input_month{7}='JUL';
Input_month{8}='AUG';
Input_month{9}='SEP';
Input_month{10}='OCT';
Input_month{11}='NOV';
Input_month{12}='DEC';
% x co-ordinate indice of boundary
nbidta = ncread('coordinates.bdy.nc','nbit'); % (yb, xb)
% y co-ordinate indice of boundary
nbjdta = ncread('coordinates.bdy.nc','nbjt'); % (yb,xb)
% rim level, this code is only set up for a rimwidth of 1.
nbrdta = nbidta*0+1; % (yb,xb)
% nav_lon - we have this in domain_cfg (y,x)
% nav_lat - we have this in domain_cfg (y,x)
nav_lon = ncread(grid_data,'nav_lon');
nav_lat = ncread(grid_data,'nav_lat');
% create a land-sea mask from bathymetry
B=ncread('bathy_meter.nc','Bathymetry');
B(B>0)=1; % 1 is Water
B(isnan(B))=0; % 0 is Land
bdy_msk=B;
for month=1:12
% e.g. 'INDIAN_bdy_SAL_y2017m01.nc'
output_filename = [prefix , filename_prefix , '_y',year,'m',Input_month_suf{month}];
% cd into the data directory
cd(Input_directory)
cd(Input_month{month})
filenames=dir('*.nc');
% This loops through daily files, interpolating onto NEMO grid and
% getting boundary points for the data.
parfor j=1:length(filenames)
if j==1
[Variable_obc,z_obc] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
deptht(:,:,:,j) = z_obc;
else
[Variable_obc,~] = COPERNICUS_INTERP(filenames(j).name,grid_data,variable_name,nbidta,nbjdta);
end
NEMO_variable_obc(:,:,:,j)=Variable_obc;
% Get time information. NEMO wants seconds since 1950. Copernicus data
% comes in hours since 1900.
time(j)=ncread( filenames(j).name , 'time');
time_counter(j) = (time(j) + 18262*24)*3600; % 18262 days between 1900 and 1950
end
cd ../..
for j=1:size(NEMO_variable_obc,4)
for i=1:size(NEMO_variable_obc,1)
zz=squeeze(deptht(i,1,:));
UU=squeeze( NEMO_variable_obc(i,1,:,j));
mean_NEMO_variable_obc(i,1,j) = trapz(zz,UU)/max(zz);
end
end
nccreate(output_filename,'nbrdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbrdta',nbrdta);
nccreate(output_filename,'nbidta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbidta',nbidta);
nccreate(output_filename,'nbjdta',...
'Dimensions',{'xb',length(nbidta),'yb',1},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nbjdta',nbjdta);
nccreate(output_filename,'nav_lon',...
'Dimensions',{'x',size(nav_lon,1),'y',size(nav_lon,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lon',nav_lon);
nccreate(output_filename,'nav_lat',...
'Dimensions',{'x',size(nav_lat,1),'y',size(nav_lat,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'nav_lat',nav_lat);
nccreate(output_filename,'bdy_msk',...
'Dimensions',{'x',size(bdy_msk,1),'y',size(bdy_msk,2)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'bdy_msk',bdy_msk);
nccreate(output_filename,'time_counter',...
'Dimensions',{'time_counter',Inf},...
'Format','netcdf4_classic');
ncwrite(output_filename,'time_counter',time_counter);
nccreate(output_filename,'deptht',...
'Dimensions',{'xb',size(deptht,1),'yb',1,'z',size(deptht,3)},...
'Format','netcdf4_classic');
ncwrite(output_filename,'deptht',deptht);
nccreate(output_filename,output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'z',size(NEMO_variable_obc,3),'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,output_name,NEMO_variable_obc);
nccreate(output_filename,mean_output_name,...
'Dimensions',{'xb',size(NEMO_variable_obc,1),'yb',1,'time_counter',size(NEMO_variable_obc,4)},...
'Format','netcdf4_classic');
ncwrite(output_filename,mean_output_name,mean_NEMO_variable_obc);
end
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment