function [x,y,data]=oct_read_data_tpxo(datafile,dataname,itide,lon,lat,type,dl)
%
%  Read in a tide TPXO file
% 
%  Further Information:  
%  http://www.croco-ocean.org
%  
%  This file is part of CROCOTOOLS
%
%  CROCOTOOLS is free software; you can redistribute it and/or modify
%  it under the terms of the GNU General Public License as published
%  by the Free Software Foundation; either version 2 of the License,
%  or (at your option) any later version.
%
%  CROCOTOOLS is distributed in the hope that it will be useful, but
%  WITHOUT ANY WARRANTY; without even the implied warranty of
%  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%  GNU General Public License for more details.
%
%  You should have received a copy of the GNU General Public License
%  along with this program; if not, write to the Free Software
%  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
%  MA  02111-1307  USA
%
%  Copyright (c) 2001-2006 by Pierrick Penven 
%  e-mail:Pierrick.Penven@ird.fr  
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
lonmin=min(min(lon))-dl;
lonmax=max(max(lon))+dl;
latmin=min(min(lat))-dl;
latmax=max(max(lat))+dl;
%
% Open the data file
%
nciddat = netcdf.open(datafile, 'NC_NOWRITE');
%
%
% Get attributes
%
add_offset=netcdf.getAtt(nciddat, netcdf.inqVarID(nciddat, dataname), 'add_offset');
scale_factor=netcdf.getAtt(nciddat, netcdf.inqVarID(nciddat, dataname), 'scale_factor');
ndims=length(dim(nciddat{dataname}));
%
% Get data lon,lat
%
X=netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, ['lon_',type']));
Y=netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, ['lat_',type']));
%
% get a subgrid
%
j=find(Y>=latmin & Y<=latmax);
i1=find(X-360>=lonmin & X-360<=lonmax);
i2=find(X>=lonmin & X<=lonmax);
i3=find(X+360>=lonmin & X+360<=lonmax);
x=cat(1,X(i1)-360,X(i2),X(i3)+360);
y=Y(j);
%
%  Read data
%
if ~isempty(i2)
  if ndims==2
    data=squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname)));
  elseif ndims==3
    data=squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname)));
  elseif ndims==4
    data=squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname)));
  else
    error(['Bad dimension number ',num2str(ndims)])
  end
else
  data=[];
end
if ~isempty(i1)
  if ndims==2
    data=cat(2,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))),data);
  elseif ndims==3
    data=cat(2,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))),data);
  elseif ndims==4
    data=cat(2,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))),data);
  else
    error(['Bad dimension number ',num2str(ndims)])
  end
end
if ~isempty(i3)
  if ndims==2
    data=cat(2,data,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))));
  elseif ndims==3
    data=cat(2,data,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))));
  elseif ndims==4
    data=cat(2,data,squeeze(netcdf.getVar(nciddat, netcdf.inqVarID(nciddat, dataname))));
  else
    error(['Bad dimension number ',num2str(ndims)])
  end
end
netcdf.close(nciddat);
%
% Apply offset
%
if ~isempty(add_offset)
  data=add_offset+data*scale_factor;
end
%
[x,y]=meshgrid(x,y);
%
