Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add wind to buoy validation #49

Open
JessicaMeixner-NOAA opened this issue Mar 19, 2024 · 0 comments
Open

Add wind to buoy validation #49

JessicaMeixner-NOAA opened this issue Mar 19, 2024 · 0 comments

Comments

@JessicaMeixner-NOAA
Copy link
Collaborator

For buoys where we have observed wind, we should add this information to the output. Moreover, we should also have the wind from the wave model as well. The wind values are included in the *.spec format files.

I could not find any python code I had where I saw the spec files being read in. Although I'm sure some exists somewhere.

Here's a quick description of the spec files (copied from: https://polar.ncep.noaa.gov/waves/buoy_files_info.txt):

3) The buoy_spec files contain:

- File ID in quotes, number of frequencies, directions and points,
and grid name in quotes
- Bin frequencies in Hz for all bins.
- Bin directions in radians for all bins (Oceanographic conv.).
Then loop over times:
- Time in yyyymmdd hhmmss format
  Loop over points:
  - Point name (C*10), lat, lon, d, U10 and
    direction, current speed and direction
  - E(f,theta)

I did find this matlab code:

function b = read_ww3sp(filename)

% M-file to read in data from a 2D spectral file in WW3 V2.22 format
% J. Henrique Alves, March, 2000
% Modified into a function form by A Chawla, June 2011

 if (exist(filename,'file'))
    fid=fopen(filename);
 else
    fprintf(1,'ERROR : File Not found !!');
    return;
 end;
  
% Scan basic properties of spectra from file
 dum=fscanf(fid,'%c',[23]);
 NF =fscanf(fid,'%g',[1]);
 ND =fscanf(fid,'%g',[1]);
 dum=fscanf(fid,'%s',[1]);
 dum=fscanf(fid,'%c',[33]);
 f=fscanf(fid,'%g',NF);
 dir=fscanf(fid,'%g',ND);
 fprop=f(2)/f(1);
 fdum=[f(1)/fprop;f];
 df=diff(fdum);
 dtheta=abs(dir(2)-dir(1));

 b.f = f;
 b.dir = dir;

 dir(end+1) = dir(1); % Closing for circular integral

% Loop over times
 index = 0;

 b.time = [];
 b.espt = [];
 b.U10 = [];
 b.Udir=[];
 b.cU=[];
 b.cdir=[];
 b.sp1d = [];
 b.hs = [];
 b.dp = [];
 b.fp = [];
 while ~feof(fid)

    dumdate=fscanf(fid,'%g',2);
    if numel(dumdate)
        year = floor(dumdate(1)/10000);
        month = floor(dumdate(1)/100) - year*100;
        day = dumdate(1) - year*10000 - month*100; 
        hr = floor(dumdate(2)/10000);
        mn = floor(dumdate(2)/100) - hr*100;
        sc = dumdate(2) - hr*10000 - mn*100;
   
        b.time(index+1) = datenum(year,month,day,hr,mn,sc); 

        stn=fscanf(fid,'%c',13); 
        poslat=fscanf(fid,'%g',1);
        poslon=fscanf(fid,'%g',1);
        depth=fscanf(fid,'%g',1);
        U10=fscanf(fid,'%g',1);
        Udir=fscanf(fid,'%g',1);
        cU = fscanf(fid,'%g',1);
        cdir = fscanf(fid,'%g',1);
        sp2d=fscanf(fid,'%g',[NF,ND]);
        if (index == 0)
            b.name = stn;
            b.lat = poslat;
            b.lon = poslon;
            b.depth = depth;
        end;
        b.U10(index+1) = U10;
        b.Udir(index+1) = Udir;
        b.cU(index+1) = cU;
        b.cdir(index+1) = cdir;
 
        b.espt{index+1} = sp2d;
        b.sp1d{index+1} = sum(sp2d')*dtheta;
        b.hs(index+1) = 4*sqrt(trapz(f,b.sp1d{index+1}));

        % Computing peak direction
        sp2d(:,end+1)=sp2d(:,1);
        [~,loc]=max(b.sp1d{index+1});
        b1=trapz(dir,sin(dir)'.*sp2d(loc,:));
        a1=trapz(dir,cos(dir)'.*sp2d(loc,:));
        theta_m = atan2(b1,a1);
        if (theta_m < 0)
           theta_m = theta_m + 2*pi;
        end;
        b.dp(index+1) = theta_m;
        b.fp(index+1) = f(loc);

        index = index+1;
    end;
 end;
 
 fclose(fid);
 return;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant