%LOADGRID load principle gridfiles for a given FEM domain
% LOADGRID loads grid files for a given FEM domain and returns
% a fem_grid_struct to the local workspace.  The returned
% structure contains atleast the minimum grid components
% for boundary plotting, contouring, etc.  Additionally,
% if land description files exist (.lnd, .lbe), the land
% description arrays are attached to the structure as well.
%
%  Input: gridname - name of domain to load grid files
%
% Output: LOADGRID returns a fem_grid_struct containing (atleast)
%         the following fields:
%         1)  .name   name of FEM domain
%         2)  .e      node connectivity array (cols 2-4 of .ele file )
%         3)  .x      x-horizontal node list  (col 2 of .nod file )
%         4)  .y      y-horizontal node list  (col 3 of .nod file )
%         5)  .z      bathymetry list	      (col 2 of .bat) file
%         6)  .bnd    boundary node/pair list (.bnd file )
%
% LOADGRID with no input gridname checks to see if the global
% variable DOMAIN has been set.  If so, LOADGRID uses this
% name to load files for.  If DOMAIN does NOT exist or is
% empty, the input gridname must be specified.
%
% If the boundary list (.bnd) exists locally, LOADGRID
% attempts to load the remaining files locally.  If the .bnd
% file does NOT exist locally, LOADGRID searches the
% GRIDS and GRIDDIRS global variables for the grid data.
%
% If any of the principle grids files does not exist, LOADGRID
% displays the appropriate message and exits, returning a
% partially filled fem_grid_struct WHICH IS INVALID.  The
% returned structure CANNOT be passed to any subsequent
% OPNML/MATLAB function expecting a valid fem_grid_struct.
% NOTE THIS EXCEPTION: the function GRIDINFO will take any
% fem_grid_struct and describe the field contents.
%
% EXAMPLE CALL:
% >> mcbo=loadgrid('mcbo')
%
% This returns a fem_grid_struct into the local workspace
% named "mcbo" which contains the following minimum fields:
%
%    mcbo =
%	 name: 'mcbo'
%	    e: [727x3 double]
%	    x: [444x1 double]
%	    y: [444x1 double]
%	    z: [444x1 double]
%	  bnd: [161x2 double]
%
% Written  by : Brian O. Blanton
% Summer 1997
%

function fem_grid_struct=loadgrid(gridname)

% make sure this is atleast MATLAB version5.0.0
%
vers=version;
if vers(1)<5
   disp('??? Error using ==>> LOADGRID ');
   disp('This version of LOADGRID REQUIRES!! MATLAB version 5.0.0 or later.');
   disp('Sorry, but this is terminal.');
   return
end 
    
% DEFINE ERROR STRINGS
err1=str2mat('You must specify 1 output argument; call LOADGRID',...
      'as grid_struct=loadgrid(gridname)');
err2=['gridname not supplied and global DOMAIN is empty'];

global DOMAIN GRIDS GRIDDIRS

if nargout ~=1
   disp('??? Error using ==> loadgrid');
   disp(err1);
   return
end

if ~exist('gridname')
   if isempty(DOMAIN)
      error(err2); 
   else
      gridname=DOMAIN;
   end
else
   slashes=findstr(gridname,'/');
   if length(slashes)==0
      fpath=[];
   else
      lastslash=slashes(length(slashes));
      fpath=gridname(1:lastslash);
      gridname=gridname(lastslash+1:length(gridname));
   end
   DOMAIN=gridname;
end

% Is there a dot in the gridname?
%
dots=findstr(gridname,'.');
if length(dots)~=0
   lastdot=dots(length(dots));
   dotname=gridname(1:lastdot-1);
end      
   
% check current working directory or fpath/cwd for principle gridfiles
%
if isempty(fpath)
   disp('Searching locally ...');
else
   disp([ 'Searching ' fpath]);
end

bndname=[deblank(gridname) '.bnd'];
nodname=[deblank(gridname) '.nod'];
elename=[deblank(gridname) '.ele'];
batname=[deblank(gridname) '.bat'];

gsum=0;
if exist([fpath bndname])==2 
   loadfn=['load ' fpath bndname];
   eval(loadfn);
   if ~isempty(dots)
      bnd=eval(dotname);
   else
      bnd=eval(gridname);
   end
   bndfound=1;
   gsum=gsum+1;
   disp(['Got ' bndname])
else
   bndfound=0;
   bnd=[];
end

if exist([fpath nodname])==2
   loadfn=['load ' fpath nodname];
   eval(loadfn);
   if ~isempty(dots)
      nodes=eval(dotname);
   else
      nodes=eval(gridname);
   end
   x=nodes(:,2);
   y=nodes(:,3);
   nodfound=1;
   gsum=gsum+1;
   disp(['Got ' nodname])
else   
   nodfound=0;
   x=[];
   y=[];
end
   
if exist([fpath elename])==2
   loadfn=['load ' fpath elename];
   eval(loadfn);
   if ~isempty(dots)
      ele=eval(dotname);
   else
      ele=eval(gridname);
   end
   ele=ele(:,2:4);
   elefound=1;
   gsum=gsum+1;
   disp(['Got ' elename])
else
   elefound=0;
   ele=[];
end

if exist([fpath batname])==2
   loadfn=['load ' fpath batname];
   eval(loadfn);
   if ~isempty(dots)
      z=eval(dotname);
   else
      z=eval(gridname);
   end
   z=z(:,2);
   batfound=1;
   gsum=gsum+1;
   disp(['Got ' batname])
else
   batfound=0;
   z=[];
end

% If all gridfiles found locally, return
if gsum==4
   lnod=length(x);
   lbat=length(z);
   maxe=max(max(ele));
   if lnod~=lbat,disp(['WARNING!! Lengths of node list and depth list'...
   ' are NOT equal']),end
   if lnod~=maxe,disp(['WARNING!! Max node number in element list does NOT'...
   ' equal length of node list']),end
   % Load up return structure
   fem_grid_struct.name=gridname;
   fem_grid_struct.e=ele;
   fem_grid_struct.x=x;
   fem_grid_struct.y=y;
   fem_grid_struct.z=z;
   fem_grid_struct.bnd=bnd;
   %
   % Attach areas
   temp=el_areas(fem_grid_struct);
   fem_grid_struct.ar=temp.ar;
   % Check for land description files locally.
   lndname=[deblank(gridname) '.lnd'];
   lbename=[deblank(gridname) '.lbe'];
   if exist([fpath lndname])==2 & exist([fpath lbename])==2
      loadfn=['load ' fpath lndname];
      eval(loadfn);
      if ~isempty(dots)
         lnd=eval(dotname);
      else
         lnd=eval(gridname);
      end
      disp(['Got ' lndname])
      loadfn=['load ' fpath lbename];
      eval(loadfn);
      if ~isempty(dots)
         lbe=eval(dotname);
      else
         lbe=eval(gridname);
      end
      disp(['Got ' lbename])
      fem_grid_struct.lbe=lbe;
      fem_grid_struct.lnd=lnd(:,2:3);
   else
      disp('No land description files found locally')
   end   
   return
elseif bndfound==0&elefound==1&gsum==3
   disp(['   ' bndname ' not found; computing from ' elename '.'])
   bnd=detbndy(ele);
   % Load up return structure
   fem_grid_struct.name=gridname;
   fem_grid_struct.e=ele;
   fem_grid_struct.x=x;
   fem_grid_struct.y=y;
   fem_grid_struct.z=z;
   fem_grid_struct.bnd=bnd;
   %
   % Check for land description files locally.
   lndname=[deblank(gridname) '.lnd'];
   lbename=[deblank(gridname) '.lbe'];
   if exist([fpath lndname])==2 & exist([fpath lbename])==2
      loadfn=['load ' fpath lndname];
      eval(loadfn);
      if ~isempty(dots)
         lnd=eval(dotname);
      else
         lnd=eval(gridname);
      end
      disp(['Got ' lndname])
      loadfn=['load ' fpath lbename];
      eval(loadfn);
      if ~isempty(dots)
         lbe=eval(dotname);
      else
         lbe=eval(gridname);
      end
      disp(['Got ' lbename])
      fem_grid_struct.lbe=lbe;
      fem_grid_struct.lnd=lnd(:,2:3);
   else
      disp('No land description files found locally')
   end   
   % Attach areas
   temp=el_areas(fem_grid_struct);
   fem_grid_struct.ar=temp.ar;
   return
elseif gsum~=0
   disp(' ')
   disp('   NOT ALL FILES FOUND LOCALLY.')
   if ~nodfound,disp(['   ' nodname ' not found locally.']),end
   if ~elefound,disp(['   ' elename ' not found locally.']),end
   if ~batfound,disp(['   ' batname ' not found locally.']),end
   str=str2mat(' ','   This is a problem.  The files ',...
               ['   ' nodname ' ' elename ' & ' batname],...
               '   must all exist locally or all in one of',...
               '   the following directories (as set in ',...
               '   the global GRIDDIRS):',...
               GRIDDIRS,...
               ' ');
   disp(str);
%   DOMAIN=[];
   return
end

if isempty(fpath)
   disp(['Gridfiles not found in ' pwd])
else
   disp(['Gridfiles not found in ' fpath])
end

if isempty(GRIDDIRS)
   disp('No places in GRIDDIRS to search.');
   return
else
   disp('Searching GRIDS for gridname match.');
end

% Check GRIDS list for gridname
%
if ~isempty(GRIDS)
   igrid=0;
   [m,n]=size(GRIDS); 
   for i=1:m
      if strcmp(deblank(GRIDS(i,:)),gridname)==1
         igrid=i;
      end
   end
end
if ~igrid
   disp([gridname ' not in GRIDS list']);
   DOMAIN=[];
   return
end
disp('Got it.') 

% gridname found in GRIDS.  Now, check GRIDDIRS for gridfiles
%
fpath=deblank(GRIDDIRS(igrid,:));  
      
bn=[fpath '/' gridname '.bnd'];
nn=[fpath '/' gridname '.nod'];
en=[fpath '/' gridname '.ele'];
zn=[fpath '/' gridname '.bat'];

if ~exist(nn)
    disp([nn ' does not exist.']);
   return
end
disp(['Got ' nodname])
loadfn=['load ' nn];
eval(loadfn);
if ~isempty(dots)
   nodes=eval(dotname);
else
   nodes=eval(gridname);
end
x=nodes(:,2);
y=nodes(:,3);

if ~exist(en)
   disp([en ' does not exist.']);
   return
end
disp(['Got ' elename])
loadfn=['load ' en];
eval(loadfn);
if ~isempty(dots)
   ele=eval(dotname);
else
   ele=eval(gridname);
end
ele=ele(:,2:4);

if ~exist(zn)
   disp([zn ' does not exist.']);
   return
end
disp(['Got ' batname])
loadfn=['load ' zn];
eval(loadfn);
if ~isempty(dots)
   z=eval(dotname);
else
   z=eval(gridname);
end
z=z(:,2);

if exist(bn)
   disp(['Got ' bndname])
   loadfn=['load ' bn];
   eval(loadfn);
   if ~isempty(dots)
      bnd=eval(dotname);
   else
      bnd=eval(gridname);
   end
else
   disp([bn ' does not exist.  Computing from ' elename]);
   bnd=detbndy(ele);
end

% Load up return structure
fem_grid_struct.name=gridname;
fem_grid_struct.e=ele;
fem_grid_struct.x=x;
fem_grid_struct.y=y;
fem_grid_struct.z=z;
fem_grid_struct.bnd=bnd;

%
% Attach areas
temp=el_areas(fem_grid_struct);
fem_grid_struct.ar=temp.ar;

% Check for land description files locally.
lndname=[fpath '/' gridname '.lnd'];
lbename=[fpath '/' gridname '.lbe'];
if exist(lndname)==2 & exist(lbename)==2
   loadfn=['load ' lndname];
   eval(loadfn);
   if ~isempty(dots)
      lnd=eval(dotname);
   else
      lnd=eval(gridname);
   end
   disp(['Got ' lndname])
   loadfn=['load ' lbename];
   eval(loadfn);
   if ~isempty(dots)
      lbe=eval(dotname);
   else
      lbe=eval(gridname);
   end
   disp(['Got ' lbename])
   fem_grid_struct.lbe=lbe;
   fem_grid_struct.lnd=lnd;
else
   disp('No land description files found locally')
end   


return;
%
%        Brian O. Blanton
%        Department of Marine Sciences
%        15-1A Venable Hall
%        CB# 3300
%        University of North Carolina
%        Chapel Hill, NC
%                 27599-3300
%
%        919-962-4466
%        blanton@marine.unc.edu
%
%        Summer 1997
%

