Probes

FVCOM has the ability for you to specify locations at which you would like to extract variables as time series.

The main model namelist has the following section to control the probes.

    &NML_PROBES
     PROBES_ON     = T
     PROBES_NUMBER = 2,
     PROBES_FILE   = 'irish_sea_v20_probes.nml'
    /

The PROBES_FILE is a separate namelist in the input directory, whose format is:

    &NML_PROBE
     PROBE_INTERVAL = "seconds=300.0",
     PROBE_LOCATION = 6724,
     PROBE_TITLE = "L4_el.dat",
     PROBE_DESCRIPTION = "Surface elevation at L4",
     PROBE_VARIABLE = "el",
     PROBE_VAR_NAME = "Surface elevation (m)"
    /

    &NML_PROBE
     PROBE_INTERVAL = "seconds=300.0",
     PROBE_LOCATION = 6724,
     PROBE_TITLE = "L4_t1.dat",
     PROBE_LEVELS = 1 20,
     PROBE_DESCRIPTION = "Temperature at L4",
     PROBE_VARIABLE = "t1",
     PROBE_VAR_NAME = "Temperature (Celsius)"
    /

This configuration has two probes (PROBES_NUMBER = 2 in the main namelist), one outputting surface elevation every five minutes, the other exporting temperature at all vertical levels every five minutes. The number of probes in the main model name list (in PROBES_NUMBER must match the number of probes in the probes namelist (PROBES_FILE).

There is a relatively limited number of variables which can be exported:

Probe variable nameDescriptionMain model netCDF variable name equivalent1D/2D
elSurface elevation (metres)zeta1D
t1Temperature (Celsius)temp2D
s1Salinity (PSU)salinity2D
rho1Density (kg m-3 )-2D
uu-velocity component (m s-1 )u2D
vv-velocity component (m s-1 )v2D
uaDepth-averaged u-velocity component (m s-1 )-1D
vaDepth-averaged v-velocity component (m s-1 )-1D
wVertical velocity (m s-1 )omega2D
wwVertical velocity on sigma levels (m s-1 )-2D
q2Turbulent kinetic energy (TKE) squared (m2 s-2 )q22D
lLength scale (m)l2D
q2lq2 scaled by the length scale (m3 s-2 )q2l2D
kmTurbulent vertical diffusivity for momentum (m2 s-1 )km2D
khTurbulent vertical diffusivity for scalars (m2 s-1 )kh2D
kqTurbulent Eddy Viscosity For q2/q2l (m2 s-1 )kq2D
aiceConcentration of ice??
viceVolume per unit area of ice (m - in mod_ice.F at line 120, but a volume as metres?…)??
uice2Ice u-velocity component (m s-1 ) (?)??
vice2Ice v-velocity component (m s-1 ) (?)??
csedSuspended sediment concentration (g L-1 ) (?)coarse_sand?1D?

A typical output file for a 1D variable (e.g. el) might be:

     Surface elevation at L4
     Surface elevation (m)

     !========MODEL START DATE==========
     !    Day #    :                 56699
     ! MicroSecond #:           40058900000
     ! (Date Time=2014-02-11T11:07:38.900000Z)
     !==========================

              K1            K2
              -1             -1
          X(M)          Y(M)            DEPTH(M)
      413731.906    5567297.000         52.880
          LON           LAT               DEPTH(M)
          -4.210         50.252         52.880

     DATA FOLLOWS:
     Time(days)    Data...
        55593.00000   -1.458
        55593.00347   -1.380
        55593.00694   -1.299
        55593.01042   -1.216
        55593.01389   -1.131
        55593.01736   -1.046
        55593.02083   -0.960
        55593.02431   -0.874
        55593.02778   -0.789
        ...

The MATLAB fvcom-toolbox can automatically write a probes namelist. The following code example creates a probes file to extract both 2 and 3D variables at a number of sites.

snippet.matlab
    Mobj.Positions % contains x, y coordinate pairs for the probe extraction.
    Mobj.Names =   % contains list of site names (must match the Positions length)
 
    % Find grid nodes within a threshold distance of the specified locations.
    if strcmpi(Mobj.nativeCoords, 'cartesian')
        Mobj = add_stations_list(Mobj, Mobj.Positions, Mobj.Names, 4000);
    elseif strcmpi(Mobj.nativeCoords, 'spherical')
        Mobj = add_stations_list(Mobj, Mobj.Positions, Mobj.Names, 0.01);
    else
        error('Unknown native coordinate type')
    end
 
    % Make the required struct for the probes function.
    for i = 1:length(Mobj.stations)
        sname = Mobj.stations{i};
        % Clean up illegal characters from the names.
        sname = regexprep(regexprep(regexprep(sname{6}, __, ''), '\.', '_'), '-', '_');
        if ~isnan(str2double(sname))
            sname = sprintf('probe_%d', str2double(sname));
        end
        Mobj.probes.(sname).file = sprintf('%s.dat', regexprep(cell2mat(Mobj.stations{i}(6)), __, ''));
        Mobj.probes.(sname).locations = regexprep(cell2mat(Mobj.stations{i}(6)), __, '');
        Mobj.probes.(sname).node = cell2mat(Mobj.stations{i}(4));
        Mobj.probes.(sname).elem = cell2mat(Mobj.stations{i}(7));
        Mobj.probes.(sname).levels = [1, length(Mobj.siglay)];
        Mobj.probes.(sname).description = {...
            sprintf('Surface elevation at %s', sname), ...
            sprintf('u-velocity component at %s', sname), ...
            sprintf('v-velocity component at %s', sname), ...
            sprintf('Vertical velocity at %s', sname), ...
            sprintf('Vertical velocity on sigma levels at %s', sname), ...
            sprintf('Density at %s', sname), ...
            sprintf('Temperature at %s', sname), ...
            sprintf('Salinity at %s', sname), ...
            };
        Mobj.probes.(sname).variable = {'el', 'u', 'v', 'ww', 'w', 'rho1', 't1', 's1'};
        Mobj.probes.(sname).longname = {'Surface elevation (m)', ...
            'u-velocity (ms^{-1})', ...
            'v-velocity (ms^{-1})',...
            'Vertical velocity (ms^{-1})', ...
            'Vertical velocity on sigma levels (ms^{-1})', ...
            'Density (kg/m^{3})', ...
            'Temperature (Celsius)', ...
            'Salinity (PSU)', ...
            };
    end