NOAA Satellite and Information
 Services banner
National Oceanographic Data Center left side banner image NODC Home Page
right side banner image with search and contact buttons Search NODC Contact Customer Service
You are here: NODC Home > OCL Home > OCL Products > WOA94

World Ocean Atlas 1994 Frequently Asked Questions (v.4)


Question 1:

Do you have a QuickBASIC program which will read the WOA profile data?

Answer:

The following is a program written by Norman Hall (NODC Liasion officer at Scripps). The program works well in the DOS environment when compiled with the Microsoft compiler. In order to work with the program in the QB environment, MAXLEVEL needs to be reduced to 600 from the recommended 6000. By using the command-line BASIC compiler (bc.exe) and specifying the use of far memory and dynamic data arrays (use the /ah compiler option), MAXLEVEL may be raised back to 6000, to handle the largest records. Please refer any questions about this program to: Norman.Hall@noaa.gov

' ----------------------------------------------------
' PROFILE.BAS
 
DIM MAXLEVEL AS INTEGER, MAXPARM AS INTEGER
MAXLEVEL = 600
MAXPARM = 15
  ' OCL recommends MAXLEVEL = 6000 for very large records
  ' In QuickBASIC, MAXLEVEL = 6000 is possible using dynamic arrays
  '    and command-line compilation
  ' To do this, be sure to DIM arrays with variables, not constants
  '    Then compile using /ah compiler option.
 
  '   cc = country code
  '   ctime = GM time
  '   nfile = input file name
  ' ARRAYS: 
  '   dat = data
  '   depth = observed level depths
  '   dz = standard level depths (33 levels)
  '   ierror = whole profile flag (function of parameter)
  '   iderror = individual observation flag (function of depth and parameter)
  '   ip2 = parameter number
 
  
  DIM dat(MAXLEVEL, (MAXPARM + 1) / 2) AS SINGLE, depth(MAXLEVEL) AS SINGLE
  DIM i AS INTEGER, j AS INTEGER, n  AS INTEGER
  DIM nparm AS INTEGER, isoor AS INTEGER, numlevels  AS INTEGER
  DIM cc AS STRING * 2, icruise AS STRING * 5, rlat AS STRING * 7
  DIM rlon  AS STRING * 8, iyear AS STRING * 4, month AS STRING * 2
  DIM iday AS STRING * 2, nfile AS STRING
  DIM ctime AS STRING * 6, nprofile AS STRING * 8
 
  DIM ij  AS INTEGER, ierror(MAXPARM) AS INTEGER
  DIM ip2(16) AS INTEGER
  DIM iderror(MAXLEVEL, (MAXPARM + 1) / 2) AS INTEGER
  DIM dz(32)
  
  ' For use in subroutine
  DIM readtmp AS STRING * 10, cholder AS STRING * 81
  
  ' Standard depths
  DATA 0.,10.,20.,30.,50.,75.,100.,125.,150.,200.,250.,300.,400.,500.
  DATA 600.,700.,800.,900.,1e3,1100.,1200.,1300.,1400.,1500.,1750.
  DATA 2e3,2500.,3e3,3500.,4e3,4500.,5e3,5500.
  FOR n = 0 TO 32: READ dz(n): NEXT n
  
  
  ' if the filename wasn't specified on the cmd line, prompt for it
  nfile = COMMAND$
  IF LEN(nfile) = 0 THEN INPUT "Input File Name"; nfile
  OPEN nfile FOR INPUT AS #1
 
  ' Begin loop to read and write 20 profiles
ij = 1
WHILE NOT EOF(1) AND ij <= 20
  
 ' read profile data
 GOSUB oclread
  
 IF NOT EOF(1) THEN
   ' If data is standard level, then define the standard level depths
   IF (isoor = 1 AND ij = 1) THEN
    FOR i = 0 TO 32
     depth(i + 1) = dz(i)
    NEXT i
   END IF
 
   ' Print header information (parameters identified in oclread)
  
   PRINT "cc cruis     lat       lon year mm dd    time  ";
   PRINT "profile  z #p PF PF PF PF PF PF"
   F1$ = "& & &  & & & &  & "
   F2$ = "& ##  #" 
   PRINT USING F1$; cc; icruise; rlat; rlon; iyear; month; iday; ctime;
   PRINT USING F2$; nprofile; numlevels; nparm;
   FOR i = 1 TO nparm
    PRINT USING " #"; ip2(i);
    PRINT USING "#"; ierror(ip2(i) - 1);
   NEXT i
   PRINT : PRINT
   PRINT "         F    ";
   FOR i = 1 TO nparm
    PRINT USING "   # F    "; ip2(i);
   NEXT i
  PRINT 
  
   FOR n = 1 TO numlevels
    PRINT USING " #####.# # "; depth(n); iderror(n, 0);
    FOR j = 1 TO nparm
     PRINT USING "###.### "; dat(n, ip2(j));
     PRINT USING "# "; iderror(n, ip2(j));
    NEXT j
    PRINT 
   NEXT n
   PRINT : PRINT
   ij = ij + 1
 END IF
WEND
CLOSE
END
     
oclread:  
  '     Header Information:
  '        cc - NODC country code, see country code list
  '        icruise - NODC cruise code (NODC files only)
  '        rlat - latitude in degrees down to thousandths
  '        rlon - longitude in degrees down to thousandths
  '        NOTE: negative latitudes are south, negative longitudes are west
  '        iyear - year of profile
  '        month - month of profile
  '        iday - day of profile
  '        ctime - 6 characters representing time
  '                in hours, down to thousandths
  '                blanks mean time not recorded
  '        nprofile - OCL profile number
  '        numlevels - number of recorded levels
  '        isoor - 1 for standard levels 0 for observed levels
  '        nparm - number of parameters recorded in this entry
  '        
  '     Parameter File Information 
  '        data - data array
  '        depth - observed depths
  '        maxlevel - maximum number of levels (6000 recommended)
  '        maxparm - maximum number of parameters (15 recommended)
  '        ierror - whole parameter flags
  '        iderror - individual depth parameter flags
  '        ip2 - parameter codes
  '        These are the codes presently used
  '        Parameters  #Code
  '        Temperature  1
  '        Salinity     2
  '        Oxygen       3
  '        Phosphate    4
  '        Silicate     6
  '        Nitrate      8
  '        
  '        
  ' Character data
  '  cc - country codes
  '  cholder - temporary character data string
  '  ctime - GM time
  '        
  ' Array data
  '  dat - data
  '  iderror - flag for the entire profile (see flags.txt for a description)
  '  depth - observed or standard depths
  '  ierror - parameter flag (see flags.txt for a description)
  '  ip2 - requested parameter number
  
  ' Read header data
  cc = INPUT$(2, 1) 
  icruise = INPUT$(5, 1)
  rlat = INPUT$(7, 1)
  rlon = INPUT$(8, 1)
  iyear = INPUT$(4, 1)
  month = INPUT$(2, 1)
  iday = INPUT$(2, 1)
  ctime = INPUT$(6, 1)
  nprofile = INPUT$(8, 1)
  
  ' read char strs into a temp var then convert
  readtmp = INPUT$(4, 1)
  numlevels = INT(VAL(readtmp))
  
  readtmp = INPUT$(1, 1)
  isoor = INT(VAL(readtmp))
  
  readtmp = INPUT$(2, 1)
  nparm = INT(VAL(readtmp))
  
  FOR i = 1 TO nparm
   readtmp = INPUT$(2, 1)
   ip2(i) = INT(VAL(readtmp))  
   readtmp = INPUT$(1, 1)
  nparm = INT(VAL(readtmp))
  
  FOR i = 1 TO nparm
   readtmp = INPUT$(2, 1)
   ip2(i) = INT(VAL(readtmp))  
   readtmp = INPUT$(1, 1)
   ierror(ip2(i)) = INT(VAL(readtmp))
  NEXT i
  
  '  Calculate number of lines in the profile (nlines)
  '  isoor is zero for observed levels, one for standard levels.
  '  isoor2 has the opposite value from isoor.
  '  iaddline is set to one if the number of distinct parameters
  '  written out is not divisible by ten.  The number of distinct
  '  parameters is the number of levels recorded in the profile
  '  multiplied by the number of parameters recorded (plus one for
  '  depth if this is observed level data.  If the number of distinct
  '  parameters is not divisible by ten, there will be a last, partial
  '  (less than eighty character) line at the end of the profile.  The
  '  division by ten is because each parameter occupies eight
  '  characters on an eighty character line
  
  isoor2 = 0
  iaddline = 0
  IF (isoor = 0) THEN isoor2 = 1
  nlines = (nparm + isoor2) * numlevels
 
  IF (nlines MOD 10 > 0) THEN iaddline = 1
  nlines = nlines / 10 + iaddline
  
  '  Read in data as character
  '  The number of levels read in (levels) is set to zero.  When
  '  this number equals the number of levels recorded for the
  '  profile, the last recorded level of the profile has been reached.
  '
  '  mread is the number of parameters (including depth) read in
  '  from a level.  When this number equals the number of parameters
  '  recorded for this profile, one is added to number of levels
  '  read (levels).  It is initially set to the number of parameters
  '  recorded so that variable levels will be one to begin.
  '  
  '  iend is set to one if the last level in the profile is being read.
  
  levels = 0
  mread = nparm
  iend = 0
  
  FOR l = 1 TO nlines
   ' skip to newline
   cholder = " "
   WHILE ASC(cholder) <> 10
    cholder = INPUT$(1, 1)
   WEND
   FOR n = 1 TO 10
    '  If the number of parameters read in equals the number
    '  of parameters recorded on each level, check if this is
    '  the last level.  If not add one to number of levels read,
    '  reset mread and set idp to one to denote that depth needs
    '  to be read in( for observed levels).
    IF mread = nparm THEN
     IF levels = numlevels THEN
      iend = 1
     ELSE
      levels = levels + 1
      mread = 0
      idp = 1
     END IF
    END IF
    
    IF iend = 0 THEN
     '  Read in depth and depth flag if appropriate
     '  Depth is the only parameter read in 'f7.1'.  All
     '  other parameters are read in 'f7.3'.
     '  Reset idp to zero
     IF (idp = 1 AND isoor = 0) THEN
      readtmp = INPUT$(7, 1)
      depth(levels) = VAL(readtmp)
      readtmp = INPUT$(1, 1)
      iderror(levels, 0) = INT(VAL(readtmp))
      idp = 0
     ELSE
      '  Add one to mread
      '  Read in the next parameter into data array.
      '  Read error flag into iderror array.
      '  ip2(mread) is the parameter code.
      mread = mread + 1
      readtmp = INPUT$(7, 1)
      '   dat(levels + ip2(mread) * MAXLEVEL) = VAL(readtmp)
      dat(levels, ip2(mread)) = VAL(readtmp)
      readtmp = INPUT$(1, 1)
      '   iderror(levels + ip2(mread) * MAXLEVEL) = VAL(readtmp)
      iderror(levels, ip2(mread)) = VAL(readtmp)
     END IF
    END IF
   NEXT n
  NEXT l
 ' skip to next line, this is where eof will be seen first
  cholder = " "
 WHILE ASC(cholder) <> 10 AND NOT EOF(1)
   cholder = INPUT$(1, 1)   
  WEND
RETURN
END

Question 2:

The quality of the analyzed fields in the Arctic Ocean is very questionable.
Why is there such a problem in this area?

Answer:

One major problem in this area (and all high latitudes) is the lack of sufficient data. There are extreme temperature and salinity values in the WOA for the Arctic which result in unrealistic analyzed fields. As more data become available and we receive more input from the scientific community, both our quality control procedures and the analyzed fields will be more representative of the processes occuring in the Arctic Ocean. Please note that for all files there is an accompanying mask file. This file is used in plotting routines to "mask" or cover up areas with three or less observations.


Question 3:

There are many problems associated with XBT data from 1992.
Is there a reason for this?

Answer:

The vast majority of data from 1992 is from the Global Temperature and Salinity Pilot Project (GTSPP). This program has provided valuable temperature data from all parts of the globe. Unfortunately, the data is mostly data relayed directly from shipboard by radio. As such, there are an unusually high number of errors due to transmission problems. Errors in the temperature readings are flagged in our data set. Errors in geography are not.


Question 4:

How was the drop rate correction applied to the XBT data?

Answer:

The information for doing this was not easily at hand in the NODC archives. T4, T6, and T7 XBTs contain the drop rate error, T5s contain a smaller (within instrument reading error) error, so it is important to know which type of XBT was used. Since this information was not recorded for most XBTs in the archive, we corrected all XBTs that recorded to less than 775 meters. Even with wire stretch, this would for the most part only exclude T5 probes which record down to 1500 meters. Byte 74 of the NODC code is supposed to contain information on XBT type, but this was recorded in less than 2% of all profiles.


Question 5:

Why are there so few high resolution CTD data in the WOA?

Answer:

NODC has two CTD data sets, a high resolution data set and a low resolution CTD dataset. Due to many errors in the NODC high resolution dataset, we chose to use only the NODC low resolution dataset (C022).


Question 6:

My FORTRAN compiler has a problem reading the format for the profile data.
Is there another way to read the data?

Answer:

The FORTRAN program included is an EXAMPLE of how to read the data. The following is a simple loop which should work correctly and on any FORTRAN compiler:

     do 100 j0=1,jdim/10
      j1 = (j0 -1) * 10 + 1
 
      do 200 i0=1,idim/10
       i1 = (i0 -1) * 10 + 1
   
       do 300 j=j1,j1+9
        do 400 i=i1,i1+9
         read(2,100) data(i,j)
400     continue
300    continue
      
200   continue
100  continue


Question 7:

The program analyzed.for assumes there are 33 depth levels (kdim=33).
Aren't there only 19 levels in the monthly files?

Answer:

Yes, there are only 19 levels in the temperature and salinity monthly files. The program analyzed.for was only intended to be used as an example of how to read the data and it could cause problems if the number of depth levels is not properly adjusted when reading the monthly files.


Question 8:

Does the profile header information contain cruise numbers or station numbers?

Answer:

The header information for the profile data used in the World Ocean Atlas '94 does not have a station number. The profile number is an OCL assigned profile number, sequential with date. This is provided in case there are any problems with a particular profile, the user can quickly identify that profile to us. The cruise number is the NODC assigned cruise number. If you need more information on a particular cruise number or all cruise numbers, please contact user services. In future versions of the WOA, station number as well as a number of other parameters (such as platform used) will be included.


Question 9:

Are the CTD data listed as depth or pressure units?

Answer:

The CTD data are listed as depths. The NODC CTD file uses depth as the unit, therefore no conversions were necessary. Any additional data which was received in pressure units was converted to depth based on Fofonoff's (1976) method (Deep-Sea Res. 23:109-111).


Question 10:

The precision of standard level silicate profiles is to three decimal places even though Table 1 in the documentation lists the maximum precision to one decimal place.

Answer: The difference in precision is due to the interpolation to standard levels. Even though a parameter is listed to three decimal places, the value of the parameter is significant only to the precision listed in Table 1 of the documentation. This applies to all the parameters in the World Ocean Atlas CD-ROMs.


Question 11:

Why does the output of the objectively analyzed fields, when examined in the vertical, result in inconsistencies?

Answer:

The problem is due to the objective analysis being done in the horizontal, with each level possibly having slightly different amounts of input.


Question 12:

How do I relate the WOA94 cruise numbers to information about a cruise?

Answer:

Download cruise numbers, ship codes, and institute codes for the WOA94 CTD MBT SD XBT data.

The information in the files is ordered as follows:

 
Column 1: NODC country code
Column 2: NODC cruise code
Column 3: NODC institute code
Column 4: NODC ship code
Column 5: Number of stations
Column 6: WMO square where data are located
Column 7: Beginning cruise date
Column 8: Ending cruise date

Question 13:

How do I match a latitude-longitude point with the appropriate gridpoint in the analyzed data?

Answer:

The following is a FORTRAN program which converts latitude and longitude to gridpoint numbers. NOTE: the formulas in the program analyzed.for are incorrect.

 
      SUBROUTINE GRID(rlat,rlon,lat,lon,space)
 
C    CALCULATES GRID NUMBERS FROM INPUT LATITUDE AND LONGITUDE
 
c************************************************************
c
c    Passed Variables:
c
c     rlat,rlon - actual latitude and longitude
c     lat,lon - calculated grid box numbers
c     space - grid spacing (1.0 is a 1 degree latitude
c             by one degree longitude grid box)
c
c***********************************************************
 
c**********************************************************
c    
c     Calculate latitude grid number:
c      1. add 90 to actual latitude, since actual latitudes
c         run from -90 to 90, and grid numbers run from
c         1 to 180.
c
c      2. Divide by spacing.  The additional 1E-6 is to
c         insure that any latitude right on the line between
c         two grid boxes will be included in the smaller   
c         number grid box.
c
c      3. Add one, since a grid number for actual latitude
c         -90 would be 0 otherwise.
c        
c**********************************************************
 
      lat=int((rlat+90.)/(space+1.E-6))+1
 
c**********************************************************
c    Calculate longitude grid number
c
c     1. Longitude grid numbers run from 1 to 360 while
c        actual longitudes run from -180 to 180.  The difference
c        from latitude is that negative values are converted
c        to the larger end of longitude grid numbers.
c        They are converted to the values 181 to 360.
c
c**********************************************************
 
      if (rlon.le.0) then
       lon=int((rlon+360.)/(space+1.E-6))+1
      else
       lon=int(rlon/(space+1.E-6))+1
      endif
 
      return
      end

Question 14:

On the WOA94 there are two types of CTD data files, *.CTD and *.CTD2, which files are the ATLAS-CTD-RPL data replacing?

About one third of the data in the NODC CTD files, *CTD.OL and *CTD.SL were truncated in the CD-ROMs due to a programming error. The replacement CTD data, found in www.nodc.noaa.gov/pub/WOA94/ATLAS-CTD-RPL, are for the NODC files (*.CTD.*) only, not the *.CTD2.* files.


Question 15:

There are numerous profiles in the CTD2 files which contain erroneous depths. These data have a country code of 90 (Russia). How many profiles have this problem?

Answer:

Russian CTD data from the Pacific Institute of Oceanology contain an error in the depth. The decimal place was shifted one place to the right. This error is found in ALL data in the '*.CTD2.*' files for the Pacific Ocean which have a country code of '90'. There are 4,249 profiles with this error. This is a systematic error, so it can easily be corrected by dividing the depth by 10. These data are all flagged and were not used in the data analyses.


Question 16:

What is meant by observed data and standard data?

Answer:

Standard data is data which has been interpolated to standard levels (as defined in WOA '94 atlases 1-5 and NOAA Tech Reports 79 and 81) using a four point Reiniger-Ross scheme where possible, a three point Lagrangian scheme where Reiniger-Ross was not feasible, and linear interpolation where no other scheme was possible. Please see the Tech Reports for more details.

Observed data is a bit of a misnomer. The observed data files contain data on the depths as we received them. For the most part, this means the depths at which the different parameters were measured. In a few cases this means that the originator of the data has done some type of interpolation to their own standard levels. We placed this data in the observed file to differentiate it from data which we ourselves have interpolated. However, since this data does not need to be interpolated, the standard file will contain the same data as the observed file where the standard depths match.

The only whole data set which we are aware of as being interpolated to standard levels before being submitted to us is the station data from the Alfred Wegener Institute for Polar Studies, which was linear interpolated. We have encountered many problems with this data, but originally decided to include it since we have so little data in the Southern Ocean. To exclude this data from use, exclude all profiles (temperature, salinity, and oxygen) which are in the files marked (bot2) which have a country code of '99'.


Thanks to Jim Carton, Gary Meyers, Eric Beals, Greg Holloway, George Heimerdinger, Norman Hall, Laurence Crosnier, Michael Peters, Ricardo Locarnini

Date last modified: Thu, 6-Jun-2002 17:11 UTC Website problems? Contact the webmaster
small NOAA logo
  NOAA-NESDIS-National Oceanographic Data Center