You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sdap.apache.org by le...@apache.org on 2017/10/27 22:40:15 UTC

[38/51] [partial] incubator-sdap-nexus git commit: SDAP-1 Import all code under the SDAP SGA

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/gaussInterp_f.f
----------------------------------------------------------------------
diff --git a/climatology/clim/gaussInterp_f.f b/climatology/clim/gaussInterp_f.f
new file mode 100644
index 0000000..9366870
--- /dev/null
+++ b/climatology/clim/gaussInterp_f.f
@@ -0,0 +1,219 @@
+c
+c     gaussInterp routine -- Gaussian weighted smoothing in lat, lon, and time
+c
+c Based on Ed Armstrong's routines. Designed to be called from python using f2py.
+c
+c
+c Gaussian weighting = exp( vfactor * (((x - x0)/sx)^2 + ((y - y0)/sy)^2 + ((t - t0)/st)^2 ))
+c
+c where deltas are distances in lat, lon and time and sx, sy, st are one e-folding sigmas.
+c
+c Cutoffs for neighbors allowed in the interpolation are set by distance in lat/lon (see wlat/wlon);
+c for time all epochs are included.
+
+
+      subroutine gaussInterp_f(var, mask,
+     &                         time, lat, lon,
+     &                         outlat, outlon,
+     &                         wlat, wlon,
+     &                         slat, slon, stime,
+     &                         vfactor,
+     &                         missingValue,
+     &                         verbose,
+     &                         vinterp, vweight, status,
+     &                         ntime, nlat, nlon, noutlat, noutlon)
+
+      implicit none
+      integer*4 ntime, nlat, nlon
+c                 ! prepared 3D array of variable data over time, lon, & lat
+      real*4    var(ntime, nlat, nlon)
+c                 ! variable to be interpolated, over ntime epochs
+      integer*1 mask(ntime, nlat, nlon)
+c                 ! pixel quality mask
+      integer*4 time(ntime)
+c                 ! time epochs to gaussian-interpolate over
+      real*4 lat(nlat)
+                  ! latitude corrdinate vector
+      real*4 lon(nlon)
+                  ! longitude corrdinate vector
+cf2py intent(in) var, mask, time, lat, lon        !! annotations for f2py processor
+      integer*4 noutlat, noutlon
+      real*4 outlat(noutlat), outlon(noutlon)
+c                 ! lat/lon grid to interpolate to
+cf2py intent(in) outlat, outlon
+      real*4 wlat, wlon
+c                 ! window of lat/lon neighbors to gaussian weight, expressed in delta lat (degrees)
+c                 ! if an integer, then it is the number of neighbors on EACH side
+cf2py intent(in) wlat, wlon
+      real*4 slat, slon, stime
+c                 ! sigma for gaussian downweighting with distance in lat, lon, & time
+cf2py intent(in) slat, slon, stime
+      real*4 vfactor
+c                 ! factor in front of gaussian expression
+      real*4 missingValue
+c                 ! value to mark missing values in interp result
+      integer*4 verbose
+c                 ! integer to set verbosity level
+cf2py intent(in) vfactor, missingValue
+      real*4 vinterp(noutlat, noutlon)
+c                 ! interpolated variable using gaussians, missing values not counted
+      real*4 vweight(noutlat, noutlon)
+c                 ! weight of values interpolated (can be zero), if so should become missing value
+      integer*4 status
+c                 ! negative status indicates error
+cf2py intent(out) vinterp, vweight, status
+
+      integer*4 clamp
+      integer*4 imin, imax, jmin, jmax, itmp
+      integer*4 iin, jin, kin
+      integer*4 iMidTime
+      integer*4 i, j, iwlat, iwlon
+
+      real*4 wlat2, wlon2, lat1, lon1, dlat, dlon, fac
+      real*4 varmin, varmax, val
+      real*8 midTime
+      logical*1 nLatNeighbors, nLonNeighbors
+
+      write(6, *) 'Echoing inputs ...'
+      write(6, *) 'ntime, nlat, nlon:', ntime, nlat, nlon
+      write(6, *) 'noutlat, noutlon:', noutlat, noutlon
+      write(6, *) 'wlat, wlon:', wlat, wlon
+      write(6, *) 'slat, slon, stime:', slat, slon, stime
+      write(6, *) 'vfactor:', vfactor
+      write(6, *) 'missingValue:', missingValue
+
+      status = 0
+      if (int(wlat) .eq. wlat) then
+         iwlat = int(wlat)
+         nLatNeighbors = .TRUE.
+         write(6, *) 'Using', iwlat,
+     &      'neighbors on each side in the lat direction.'
+      else
+         nLatNeighbors = .FALSE.
+      end if
+      if (int(wlon) .eq. wlon) then
+         iwlon = int(wlon)
+         nLonNeighbors = .TRUE.
+         write(6, *) 'Using', iwlon,
+     &      'neighbors on each side in the lon direction.'
+      else
+         nLonNeighbors = .FALSE.
+      end if
+
+      wlat2 = wlat / 2.
+      wlon2 = wlon / 2.
+      lat1 = lat(1)
+      lon1 = lon(1)
+      dlat = lat(2) - lat(1)
+      dlon = lon(2) - lon(1)
+      iMidTime = int(ntime/2 + 0.5)
+      midTime = time(iMidTime)
+
+      if (verbose .gt. 3) then
+          write(6, *) 'time:', time
+          write(6, *) 'lat:', lat
+          write(6, *) 'lon:', lon
+          write(6, *) 'outlat:', outlat
+          write(6, *) 'outlon:', outlon
+c          write(6, *) 'mask(iMidTime):', mask(iMidTime,:,:)
+          write(6, *) 'var(iMidTime):', var(iMidTime,:,:)
+      end if
+
+      do i = 1, noutlat
+         if (verbose .gt. 1) write(6, *) outlat(i)
+         do j = 1, noutlon
+            vinterp(i,j) = 0.0
+            vweight(i,j) = 0.0
+            if (verbose .gt. 3) then
+               write(6, *) '(i,j) = ', i, j
+               write(6, *) '(outlat,outlon) = ', outlat(i), outlon(j)
+            end if
+
+            if (nLatNeighbors) then
+               imin = clamp(i - iwlat, 1, nlat)
+               imax = clamp(i + iwlat, 1, nlat)
+            else
+               imin = clamp(int((outlat(i) - wlat2 - lat1)/dlat + 0.5),
+     &                      1, nlat)
+               imax = clamp(int((outlat(i) + wlat2 - lat1)/dlat + 0.5),
+     &                      1, nlat)
+            end if
+            if (imin .gt. imax) then
+c              ! input latitudes descending, so swap
+               itmp = imin
+               imin = imax
+               imax = itmp
+            end if
+
+            if (nLonNeighbors) then
+               jmin = clamp(j - iwlon, 1, nlon)
+               jmax = clamp(j + iwlon, 1, nlon)
+            else
+               jmin = clamp(int((outlon(j) - wlon2 - lon1)/dlon + 0.5),              
+     &                      1, nlon)     
+               jmax = clamp(int((outlon(j) + wlon2 - lon1)/dlon + 0.5),
+     &                      1, nlon)
+            end if
+
+            if (verbose .gt. 2) then
+               write(6, *) '(imin,imax,minlat,maxlat) = ',
+     &               imin, imax, lat(imin), lat(imax)
+               write(6, *) '(jmin,jmax,minlon,maxlon) = ',
+     &               jmin, jmax, lon(jmin), lon(jmax)
+            end if
+
+            if (verbose .gt. 4 .and. i .eq. noutlat/2
+     &             .and. j .eq. noutlon/2) then
+               write(6, *) 'Echoing factors ...'
+            end if
+
+            do kin = 1, ntime
+               varmin = 0.
+               varmax = 0.
+               do iin = imin, imax
+                  do jin = jmin, jmax
+                     if (mask(kin,iin,jin) .eq. 0) then
+                        fac = exp( vfactor *
+     &                         (((outlat(i) - lat(iin))/slat)**2
+     &                        + ((outlon(j) - lon(jin))/slon)**2
+     &                        + ((midTime   - time(kin))/stime)**2))
+
+                        val = var(kin,iin,jin)
+                        if (verbose .gt. 4 .and. i .eq. noutlat/2
+     &                         .and. j .eq. noutlon/2) then
+                           write(6, *) kin, iin, jin, time(kin),
+     &                           lat(iin), lon(jin), val, fac, val*fac
+                        end if
+
+                        vinterp(i,j) = vinterp(i,j) + val * fac
+                        vweight(i,j) = vweight(i,j) + fac
+                        if (verbose .gt. 3) then
+                           varmin = min(varmin, val)
+                           varmax = max(varmax, val)
+                        end if
+                     end if
+                  end do
+               end do
+               if (verbose .gt. 3) then
+                  write(6, *) '(itime, varmin, varmax) = ',
+     &                           kin, varmin, varmax
+               end if
+            end do
+            if (vweight(i,j).ne. 0.0) then
+               vinterp(i,j) = vinterp(i,j) / vweight(i,j)
+            else
+               vinterp(i,j) = missingValue
+            end if
+         end do
+      end do
+      return
+      end
+
+
+      integer*4 function clamp(i, n, m)
+      integer*4 i, n, m
+      clamp = i
+      if (i .lt. n) clamp = n
+      if (i .gt. m) clamp = m
+      end
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/gaussInterp_f.mk
----------------------------------------------------------------------
diff --git a/climatology/clim/gaussInterp_f.mk b/climatology/clim/gaussInterp_f.mk
new file mode 100644
index 0000000..548ce33
--- /dev/null
+++ b/climatology/clim/gaussInterp_f.mk
@@ -0,0 +1 @@
+f2py -c -m gaussInterp_f gaussInterp_f.f

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/gaussInterp_slow.py
----------------------------------------------------------------------
diff --git a/climatology/clim/gaussInterp_slow.py b/climatology/clim/gaussInterp_slow.py
new file mode 100644
index 0000000..6a7bb8f
--- /dev/null
+++ b/climatology/clim/gaussInterp_slow.py
@@ -0,0 +1,130 @@
+#
+#     gaussInterp_slow routine -- Gaussian weighted smoothing in lat, lon, and time
+#
+# Based on Ed Armstrong's routines. Pure python implementation.
+#
+#
+# Gaussian weighting = exp( vfactor * (((x - x0)/sx)^2 + ((y - y0)/sy)^2 + ((t - t0)/st)^2 ))
+#
+# where deltas are distances in lat, lon and time and sx, sy, st are one e-folding sigmas.
+#
+# Cutoffs for neighbors allowed in the interpolation are set by distance in lat/lon (see dlat/dlon);
+# for time all epochs are included.
+#
+
+import sys
+import numpy as np
+from math import exp
+from numba import jit, int32
+
+VERBOSE = 0
+
+
+def gaussInterp_slow(var,                # bundle of input arrays: masked variable, coordinates
+                varNames,                # list of names in order: primary variable, coordinates in order lat, lon, time
+                outlat, outlon,          # output lat/lon coordinate vectors
+                wlat, wlon,              # window of lat/lon neighbors to gaussian weight, expressed in delta lat (degrees)
+                slat, slon, stime,       # sigma for gaussian downweighting with distance in lat, lon (deg), & time (days)
+                vfactor=-0.6931,         # factor in front of gaussian expression
+                missingValue=-9999.,     # value to mark missing values in interp result
+                verbose=VERBOSE,         # integer to set verbosity level
+                optimization='python'):  # Mode of optimization, using 'fortran' or 'cython' or 'python'
+    '''Gaussian interpolate in lat, lon, and time to a different lat/lon grid, and over a time window to the center time.
+Bundle of arrays (var) contains a 3D masked variable and coordinate arrays for lat, lon, and time read from netdf/hdf files.
+Returns the 2D interpolated variable (masked) and a status for failures. 
+    '''
+    v = var[varNames[0]][:]
+    vmask = np.ma.getmask(v)[:]
+    vtime = var[varNames[1]][:]
+    lat = var[varNames[2]][:]
+    lon = var[varNames[3]][:]
+
+    vinterp, vweight, status = \
+         gaussInterp_(v, vmask, vtime, lat, lon,
+                      outlat, outlon, wlat, wlon, slat, slon, stime, vfactor, missingValue)
+
+    vinterp = np.ma.masked_where(vweight == 0.0, vinterp)
+    return (vinterp, vweight, status)
+
+#@jit(nopython=False)
+def gaussInterp_(var,     # variable & mask arrays with dimensions of time, lon, lat
+                 vmask,         
+                 vtime,    # coordinate vectors for inputs
+                 lat,
+                 lon,     
+                 outlat,  # coordinate vectors for grid to interpolate to
+                 outlon,
+                 wlat, wlon,           # window of lat/lon neighbors to gaussian weight, expressed in delta lat (degrees)
+                 slat, slon, stime,    # sigma for gaussian downweighting with distance in lat, lon (deg), & time (days)
+                 vfactor,              # factor in front of gaussian expression
+                 missingValue):        # value to mark missing values in interp result
+    '''Gaussian interpolate in lat, lon, and time to a different lat/lon grid, and over a time window to the center time.
+Returns the 2D interpolated variable (masked), the weight array, and a status for failures.
+    '''
+    vinterp = np.zeros( (outlat.shape[0], outlon.shape[0]), dtype=var.dtype )  # interpolated variable, missing values not counted
+    vweight = np.zeros( (outlat.shape[0], outlon.shape[0]), dtype=var.dtype )  # weight of values interpolated (can be zero)
+    status = 0     # negative status indicates error
+
+    ntime = vtime.shape[0]
+    nlat = lat.shape[0]
+    nlon = lon.shape[0]
+
+    noutlat = outlat.shape[0]
+    noutlon = outlon.shape[0]
+
+    midTime = vtime[int(ntime/2 + 0.5)]
+    wlat2 = wlat / 2.
+    wlon2 = wlon / 2.
+    lat0 = lat[0]
+    lon0 = lon[0]
+    dlat = lat[1] - lat[0]
+    dlon = lon[1] - lon[0]
+
+    for i in xrange(noutlat):
+        print >>sys.stderr, outlat[i]
+        for j in xrange(noutlon):
+           if VERBOSE: print >>sys.stderr, '\n(i,j) = %d, %d' % (i, j)
+           if VERBOSE: print >>sys.stderr, '\n(outlat,outlon) = %f, %f' % (outlat[i], outlon[j])
+
+           imin = clamp(int((outlat[i] - wlat2 - lat0)/dlat + 0.5), 0, nlat-1)
+           imax = clamp(int((outlat[i] + wlat2 - lat0)/dlat + 0.5), 0, nlat-1)
+           if imin > imax: (imin, imax) = (imax, imin)                            # input latitudes could be descending
+           if VERBOSE: print >>sys.stderr, '(imin, imax) = %d, %d' % (imin, imax)
+           if VERBOSE: print >>sys.stderr, '(minlat, maxlat) = %f, %f' % (lat[imin], lat[imax])
+           jmin = clamp(int((outlon[j] - wlon2 - lon0)/dlon + 0.5), 0, nlon-1)
+           jmax = clamp(int((outlon[j] + wlon2 - lon0)/dlon + 0.5), 0, nlon-1)
+           if VERBOSE: print >>sys.stderr, '(jmin, jmax) = %d, %d' % (jmin, jmax)
+           if VERBOSE: print >>sys.stderr, '(minlon, maxlon) = %f, %f' % (lon[jmin], lon[jmax])
+#           stencil = np.zeros( (ntime, imax-imin+1, jmax-jmin+1) )
+
+           for kin in xrange(ntime):
+               for iin in xrange(imin, imax+1):
+                   for jin in xrange(jmin, jmax+1):
+                       if not vmask[kin,iin,jin]:
+                           fac = exp( vfactor *
+                                     (((outlat[i] - lat[iin])/slat)**2
+                                    + ((outlon[j] - lon[jin])/slon)**2
+                                    + ((midTime   - vtime[kin])/stime)**2))
+#                           stencil[kin, iin-imin, jin-jmin] = fac
+                           val = var[kin, iin, jin]
+                           if VERBOSE > 1: print >>sys.stderr,  kin, iin, jin, vtime[kin], lat[iin], lon[jin], val, fac, val*fac
+
+                           vinterp[i,j] = vinterp[i,j] + val * fac
+                           vweight[i,j] = vweight[i,j] + fac
+
+
+           if vweight[i,j] != 0.0:
+               vinterp[i,j] = vinterp[i,j] / vweight[i,j]
+#               if VERBOSE > 1: print >>sys.stderr, 'stencil:\n', stencil
+#               if VERBOSE: print >>sys.stderr, 'stencil max:\n', np.max(np.max(stencil))
+#               if VERBOSE: print >>sys.stderr, 'stencil min:\n', np.min(np.min(stencil))
+           else:
+               vinterp[i,j] = missingValue
+
+    return (vinterp, vweight, status)
+
+#@jit( int32(int32,int32,int32), nopython=False)
+def clamp(i, n, m):
+    if i < n: return n
+    if i > m: return m
+    return i

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/interp.f
----------------------------------------------------------------------
diff --git a/climatology/clim/interp.f b/climatology/clim/interp.f
new file mode 100644
index 0000000..8977798
--- /dev/null
+++ b/climatology/clim/interp.f
@@ -0,0 +1,302 @@
+#include "interp.h"
+c $Revision: 2.12 $
+c subprogram interp.f
+c reads hdf file, extract data, call bisum(), calculates
+c and writes out interpolated maps
+
+
+      subroutine interp( temp, sst_inter, sst_seq, sl, 
+     &		  x, y, z, f,
+     &            xx, yy, zz, vsum, ixmin, ixmax,
+     &		  iymin, iymax, izmin, izmax, ndatamax,
+     &		  x_length, y_length, imax, jmax, kmax )
+
+      integer x_length,y_length
+      integer dummy
+
+c-- dimension the arrays
+      real*4 temp(x_length,y_length)
+      real*4 sl(imax,jmax,kmax)
+      real*4 sst_inter(kmax), sst_seq(imax)
+      real*4 x(ndatamax),y(ndatamax),z(ndatamax),f(ndatamax)
+      real*4 xx(imax),yy(jmax),zz(kmax)
+      real*4 vsum(2,imax,jmax,kmax)
+      real*4 ULlon, ULlat, LRlon, LRlat
+      integer*4 ixmin(ndatamax),ixmax(ndatamax)
+      integer*4 iymin(ndatamax),iymax(ndatamax)
+      integer*4 izmin(ndatamax),izmax(ndatamax)
+
+c-- hdf data array must be hardwired, no dync alloc :(
+      byte in_data( XSIZE, YSIZE )
+
+      character*80 plabel
+      character*50 infile
+      character*30 outfile
+      character*150 datafile
+      character*30 basename
+      character*35 tmpfile
+      character*10 mapformat
+      character*15 outformat
+      character*3 cday
+      character*4 cyr
+      character*200 zcatcmd
+
+      common /parms/ imin,jmin,kmin,
+     &               xwin2,ywin2,zwin2,
+     &               xh,yh,zh,
+     &               dx,dy,dz,
+     &               xlo,xhi,ylo,yhi,zlo,
+     &               dxd,dyd
+
+      common /fileio/ infile,outfile,istart,
+     &	              iend,mapformat,outformat	
+
+      common /hdfindex/ icolLeft,icolRight,irowUpper,irowLower
+
+      common /basefile/ basename
+
+c-- open output file
+      open(unit=20,status='new',form=outformat,file=outfile,
+     &     err=1000,iostat=ierr )
+      plabel='sst interpolation'
+
+c-- initialize vsum to '0's
+      do k1=1,2
+        do k2=1,kmax
+          do k3=1,jmax
+            do k4=1,imax
+               vsum(k1,k4,k3,k2)=0.
+            enddo
+          enddo
+        enddo
+      enddo
+
+c-- initialize arrays of long, lat and time intervals
+      do ii=imin,imax
+          xx(ii)=xlo+float(ii-1)*dx  ! Long to interpolate to
+      enddo
+      do jj=jmin,jmax
+          yy(jj)=ylo+float(jj-1)*dy  ! Lat to interpolate to
+      enddo
+      do kk=kmin,kmax
+          zz(kk)=zlo+float(kk-1)*dz  ! Time to interpolate to
+      enddo
+
+      do n=1,ndatamax
+          x(n)=0.0
+          y(n)=0.0
+          z(n)=0.0
+          f(n)=0.0
+	  ixmin(n) = 0
+	  ixmax(n) = 0
+	  iymin(n) = 0
+	  iymax(n) = 0
+	  izmin(n) = 0
+	  izmax(n) = 0
+      enddo
+
+c-- slope (cal) and offset to convert DN to SST
+      cal= 0.15
+      offset = 3.0
+
+c-- Open input file list
+      open(unit=15,status='old',file=infile,access='direct',
+     &  recl=RECSIZE,form='formatted',err=1500,iostat=ierr)
+
+c--  read a infile one record at a time and process . . .
+      do k=istart,iend
+         ipts=0
+         read( 15,'(a)',rec=k ) datafile
+c	 print *, datafile
+
+        icompress = 0 
+c--  hack to get trailing 'Z' (if compressed)
+c	do islash = 150, 1, -1
+c	    if ( datafile(islash:islash) .eq. 'Z' ) then
+c		icompress = 1 
+c	        goto 101	
+c	    endif
+c	enddo
+c101     continue
+
+c-- 12/27/99: C call for basename implemented
+c-- variable basename returned via common statement
+        call getbase( datafile ) 
+	print *,'\n file: ',  basename
+
+c--  cyr and cday parsed from basename 
+c--  (e.g., parsed from '1988332h54dd-gdm.hdf')
+         cday=basename( 5:7 )
+         cyr=basename( 1:4 )
+
+c-- if unix compressed, zcat to a temporary filename
+        if( basename(22:22) .eq. 'Z' ) then
+	    icompress = 1
+	    tmpfile = '/tmp/' // basename(1:20)
+	    zcatcmd = 'zcat ' // datafile( 1:len(datafile)-1 ) 
+     &                        // ' > ' // tmpfile
+	    call system( zcatcmd )
+	    datafile = tmpfile
+	endif
+
+c--  convert iday character to integer
+         read(cday,'(i3)') iday
+         read(cyr,'(i4)') iyr
+c         write(6,*)'cday = ',cday
+c         write(6,*)'cyr = ',cyr
+          
+c***> HDF call: d8gimg() 
+         retn=d8gimg(datafile,in_data,x_length,
+     &               y_length,dummy)
+
+c--  read hdf DN values and convert to SST
+         do  i=icolLeft, icolRight
+            do j=irowUpper, irowLower
+                xlat=-89.75+dyd*float(j-1)
+
+c-- center output in Pacific Ocean 
+c                if( i .lt. x_length ) ix = i-(x_length/2)
+c                if( i .le. (x_length/2) ) ix =  i+(x_length/2)
+
+c-- center output in Atlantic (default)
+                ix = i
+
+c--  convert signed byte to float
+c                if ( in_data(i,j) .lt. 0 .and. abs(xlat) .lt. 70. ) then
+                if ( in_data(i,j).lt. 0 ) then
+                    temp(ix,j)=float( in_data(i,j) ) + 256
+                else
+                    temp(ix,j)=float( in_data(i,j) )
+                endif
+
+
+
+C MULTIPLY THE PATHFINDER DIGITAL NUMBER BY THE CALIBRATION NUMBER (0.15)
+C AND ADD THE OFFSET (-3.0) TO GET DEGREES CELSIUS
+
+                 if ( temp(ix,j).gt.0 ) then
+                     ipts=ipts+1
+                     f(ipts)=( cal*temp(ix,j) ) - offset
+                     x(ipts) = ( dxd*float(ix-1) ) - 180. + dxd/2 
+                     y(ipts) = ( 90. - (dyd*float(j-1)) ) - dyd/2
+                     z(ipts)=float(iday)+float(iyr-1985)*365.
+                     if(iyr.gt.1988) z(ipts)=z(ipts)+1
+                     if(iyr.gt.1992) z(ipts)=z(ipts)+1
+                     if(iyr.gt.1996) z(ipts)=z(ipts)+1
+                     if(iyr.gt.2000) z(ipts)=z(ipts)+1
+                     if(iyr.gt.2004) z(ipts)=z(ipts)+1
+                 endif
+            enddo
+         enddo
+
+         nfnew=ipts
+         print *, ' no of pts in file ',' = ', nfnew
+
+c-- calculate interpolation weights and vsum 
+c-- arrays passed directly... a common statement 
+c-- does not seem to work.
+        call  binsum( nfnew, x, y, z, f, 
+     &                xx, yy, zz, vsum,
+     &                ixmin, ixmax, iymin,
+     &                iymax, izmin, izmax, 
+     &                imax, jmax, kmax, ndatamax )
+
+        if( icompress .eq. 1 ) call system( 'rm -f ' // tmpfile )
+c-- ..... read next hdf file from infile
+      enddo
+
+c-- all input files processed; calculate interpolated SST   
+      do kk=1,kmax
+        do jj=1,jmax
+          do ii=1,imax
+            sl(ii,jj,kk)=0.
+            if (vsum(2,ii,jj,kk).gt.0) then
+                sl(ii,jj,kk)=vsum(1,ii,jj,kk)/vsum(2,ii,jj,kk)
+            endif
+          enddo
+        enddo
+      enddo
+
+c-- write output as map "interleaved" or map "sequential"
+c-- "interleaved" is the original implementation
+c-- both formats preceded by header 
+
+c-- "interleaved" refers to each row in the output
+c-- file representing a unique lon, lat position with columns 
+c-- of associated sst values (maps) 
+c-- i.e. row one: lon1 lat1 sst1 sst2 sst3....lastsst
+c--      row two: lon2 lat1 sst1 sst2 sst3....lastsst
+
+c-- "sequential" refers to each map written as rows and
+c-- columns of lat, lon with the array element representing the
+c-- sst at that geo-position for that map.
+c-- each map is written sequentially in the file 
+
+c-- geo-positions of UL and LR corners
+          ULlon = -(180 - ( ((icolLeft-1) * dxd) + dxd/2 ))  
+	  ULlat = (90 - ( ((irowUpper-1) * dyd) + dyd/2 ))
+          LRlon = -(180 - ( (icolRight * dxd) - dxd/2 ))  
+	  LRlat = (90 - ( (irowLower * dyd) - dyd/2 ))
+
+c-- version number, "f" refers to fortran version
+      version = 'f2.9' 
+
+c-- write the 3 record header
+      if( outformat .eq. 'formatted' ) then
+          write(20,'(a)'), plabel
+          write(20,*) imax,jmax,kmax
+          write(20,*) dx,dy,dz 
+	  write(20,*) ULlon,ULlat,LRlon,LRlat
+      elseif( outformat .eq. 'unformatted' ) then
+          write(20) imax,jmax,kmax
+          write(20) dx,dy,dz
+	  write(20) ULlon,ULlat,LRlon,LRlat
+      endif
+
+      if( mapformat .eq. 'interleave' ) then
+        print *, '\n map output is interleave'
+        do jj=1,jmax
+          do ii=1,imax
+            do kk=1,kmax
+                sst_inter(kk)=sl(ii,jj,kk)
+            enddo
+            if( outformat .eq. 'formatted' ) then
+		write(20,*) ii,jj,sst_inter
+            else 
+	        write(20) ( sst_inter(i), i=1,kmax ) 
+            endif
+          enddo
+        enddo
+
+      else if( mapformat .eq. 'sequential' ) then
+        print *, '\n map output is sequential'
+        do kk=1,kmax
+          do jj=1,jmax
+            do ii=1,imax
+               sst_seq(ii)=sl(ii,jj,kk)
+             enddo
+             if( outformat .eq. 'formatted' ) then
+		 write(20,*) jj,kk,sst_seq
+             else
+		 write(20) ( sst_seq(i), i=1,imax )
+             endif
+          enddo
+        enddo
+      endif
+
+      print *,  '\ndone. . . '
+      close( 15,status='keep',err=2000,iostat=ierr )
+      close( 20,status='keep',err=2500,iostat=ierr )
+      stop
+
+ 1000 print *, 'Error opening output: ', outfile, 'error num: ', ierr
+      goto 102
+ 1500 print *, 'Error opening input: ', infile, 'error num: ', ierr
+      goto 102
+ 2000 print *, 'Error closing input: ', infile, 'error num: ', ierr
+      goto 102
+ 2500 print *, 'Error closing output: ', outfile, 'error num: ', ierr
+      goto 102
+ 102  continue
+
+      end

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/jobClimatology2.py
----------------------------------------------------------------------
diff --git a/climatology/clim/jobClimatology2.py b/climatology/clim/jobClimatology2.py
new file mode 100644
index 0000000..4b3933e
--- /dev/null
+++ b/climatology/clim/jobClimatology2.py
@@ -0,0 +1,22 @@
+#
+# jobClimatology2.py -- mrjob class for computing climatologies by gaussian interpolation
+#
+
+from mrjob.job import MRJob
+from climatology2 import climByAveragingPeriods
+
+
+class MRClimatologyByGaussInterp(MRJob):
+
+    def mapper(self, _, line):
+        yield "chars", len(line)
+        yield "words", len(line.split())
+        yield "lines", 1
+
+    def reducer(self, key, values):
+        yield key, sum(values)
+
+
+if __name__ == '__main__':
+    MRWordFrequencyCount.run()
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/jobTest.py
----------------------------------------------------------------------
diff --git a/climatology/clim/jobTest.py b/climatology/clim/jobTest.py
new file mode 100644
index 0000000..5b1b0f7
--- /dev/null
+++ b/climatology/clim/jobTest.py
@@ -0,0 +1,18 @@
+
+from mrjob.job import MRJob
+
+
+class MRWordFrequencyCount(MRJob):
+
+    def mapper(self, _, line):
+        yield "chars", len(line)
+        yield "words", len(line.split())
+        yield "lines", 1
+
+    def reducer(self, key, values):
+        yield key, sum(values)
+
+
+if __name__ == '__main__':
+    MRWordFrequencyCount.run()
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/README
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/README b/climatology/clim/orig/C/README
new file mode 100644
index 0000000..7e50ce0
--- /dev/null
+++ b/climatology/clim/orig/C/README
@@ -0,0 +1,6 @@
+2 Mar 00
+
+`test1-100day' was produced by gaussinterp (C version) using /sst/vol7/PATHFINDER/avhrrlists/test.list
+and /sst/vol7/PATHFINDER/parmfiles/interp.test.parms. First 100 files in test.list were processed.
+
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/binsum.c
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/binsum.c b/climatology/clim/orig/C/binsum.c
new file mode 100644
index 0000000..724245c
--- /dev/null
+++ b/climatology/clim/orig/C/binsum.c
@@ -0,0 +1,125 @@
+/* $Revision: 1.6 $ */
+/*  calculate interpolation weights and vsum */
+
+#include <math.h>
+#include "interp.h"
+
+#define min(x,y)  ( (x) < (y) ? (x) : (y) )
+#define max(x,y)  ( (x) > (y) ? (x) : (y) )
+#define XFAC -0.6931
+
+ binsum( int nf ) {
+
+  register int i, ii, jj, kk, n;
+  int lon_180_index;  
+  float fac;
+  float long_diff_deg, long_diff_rad;
+  float west_long_endpoint, east_long_endpoint;
+
+  /* index in array xx (longitude interp  bins) for long. 180 
+     in extended portion of array beyond imax */
+  if( all_zones )
+      lon_180_index = parms.imax + long_extend / 2;
+  
+  /* determine spatial/temporal interpolation bins for every point */
+  for( n=0; n < nf; n++ ) {
+
+      /* longitude bins ranges */
+      /* Check for the discontinuities along long. 180. If crossing long. 180
+         set ixmin and ixmax to reflect indicies in "extended" portion of 
+	 longitude bins in array xx */
+      
+      west_long_endpoint = x[n] - parms.xwin2;
+      east_long_endpoint = x[n] + parms.xwin2;  
+
+      ixmin[n] = (int) floorf( (x[n]-parms.xwin2-parms.xlo)/parms.dx );
+      ixmax[n] = (int) floorf( (x[n]+parms.xwin2-parms.xlo)/parms.dx ); 
+
+      /* crossing west of 180 in search and global interp */
+      if( west_long_endpoint < -180. && east_long_endpoint > -180. &&
+          all_zones ) { 
+         
+          ixmin[n] = lon_180_index - abs( ixmin[n] );
+          ixmax[n] = lon_180_index + ixmax[n];
+/* printf( " ixmin, ixmax %d %d in extended array\n", ixmin[n], ixmax[n] ); */
+      }
+
+      /* crossing east of 180 in search and global interp */
+      else if( west_long_endpoint < 180. && east_long_endpoint > 180. &&
+	       all_zones ) {
+        
+         ixmin[n] = lon_180_index - ( parms.imax - ixmin[n] );
+         ixmax[n] = lon_180_index + abs( parms.imax - ixmax[n] );
+/* printf( "ixmin, ixmax %d %d in extended array\n", ixmin[n], ixmax[n] ); */
+      }
+      
+      /* no crossing of 180 in search */
+      else {         
+	 ixmin[n] = max( (int) floorf( (x[n]-parms.xwin2-parms.xlo)/parms.dx ), 0 );
+         ixmax[n] = min( (int) floorf( (x[n]+parms.xwin2-parms.xlo)/parms.dx ), parms.imax - 1 );
+     }
+
+      /* lat bin ranges */
+      iymin[n] = max( (int) floorf( (y[n]-parms.ywin2-parms.ylo)/parms.dy ), 0 );
+      iymax[n] = min( (int) floorf( (y[n]+parms.ywin2-parms.ylo)/parms.dy ), parms.jmax - 1 ); 
+   
+      /* temporal bin ranges */
+      izmin[n] = max( (int) floorf( (z[n]-parms.zwin2-parms.zlo)/parms.dz ), 0 );
+      izmax[n] = min( (int) floorf( (z[n]+parms.zwin2-parms.zlo)/parms.dz ), parms.kmax - 1 ); 
+
+  }
+
+ 
+  /* weight the SST and sum */
+  for( n=0; n < nf; n++ ) {
+    for( kk=izmin[n]; kk <= izmax[n]; kk++ ) {
+      for( jj=iymin[n]; jj <= iymax[n]; jj++ ) {
+        for( i=ixmin[n]; i <= ixmax[n]; i++ ) {
+             
+  	/* Derive the guassian weights. Because
+	   longitudes can cross 180, e.g., the ranges
+	   can be 175 to -175, use the acos(cos( long_diff ))) */
+            long_diff_deg = x[n] - xx[i];
+            long_diff_rad = acos( cos(deg2rad(long_diff_deg)) );
+
+	    fac = exp( XFAC * ( pow( (rad2deg(long_diff_rad)
+                                      /parms.xh),2 ) 
+	                    +   pow( ((y[n]-yy[jj])/parms.yh),2 )
+    	                    +   pow( ((z[n]-zz[kk])/parms.zh),2 ) ));
+
+            /* if crossing long. 180 must drop weighted SST 
+               in correct longitude bin between 0 and imax */        
+
+	    /* range crossing east of 180 */  
+            if( i >= lon_180_index && all_zones ) {
+                    ii =  i - lon_180_index; 
+             
+/* printf(" orig bin is %d, correct bin is %d\n", i, ii ); */
+            }
+            /* range crossing west of 180 */
+            else if( (i < lon_180_index && i >= parms.imax)  && all_zones ) {
+                    ii = i - long_extend / 2;
+
+/* printf(" orig bin is %d, correct bin is %d\n", i, ii ); */
+            }
+            /* no crossing */
+            else {
+	        ii = i;
+            }
+                 
+            vsum[0][ii][jj][kk] += f[n]*fac;
+            vsum[1][ii][jj][kk] += fac;
+        }
+      }
+    }
+  }
+ }
+
+
+
+
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/clouderosion.c
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/clouderosion.c b/climatology/clim/orig/C/clouderosion.c
new file mode 100644
index 0000000..6dec692
--- /dev/null
+++ b/climatology/clim/orig/C/clouderosion.c
@@ -0,0 +1,33 @@
+/* $Revision:$ */
+/* Apply the Casey cloud erosion to the satellite data.
+   This algorithm flags as cloudy all data with one 
+   nearest neighbor of a Pathfinder flagged cloud pixel. */
+
+#include "interp.h"
+#include "hdf.h"
+
+clouderosion( float in_data, int i, int j ) {
+    int row, col;
+
+    /* for each image pixel loop over
+       nearest neighbors; if any neightbor is
+       a cloud, set temp[j][i] to cloud value (0)
+    */
+    for( col = i-1; col <= i+1; col++ ) {
+        for( row = j-1; row <= j+1; row++ ) {
+	    printf( "col is %d, row is %d\n", col, row );
+	    /* make sure we are searching within image array bounds */
+	    if( col >= 0 && col < parms.x_length &&  
+		row >= 0 && row < parms.y_length ) {
+	    printf( "valid col is %d, valid row is %d\n\n", col, row );
+		if( in_data[col][row] == 0 ) {
+		    temp[j][i] = 0.;
+		    printf( "in_data[%d][%d] is %c\n", col, row, in_data[col][row] );
+		    printf( " setting temp[%d][%d] to zero\n\n\n", j,i );
+		    break;
+                }
+            }
+         }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/gaussinterp.readme
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/gaussinterp.readme b/climatology/clim/orig/C/gaussinterp.readme
new file mode 100644
index 0000000..4a0e017
--- /dev/null
+++ b/climatology/clim/orig/C/gaussinterp.readme
@@ -0,0 +1,159 @@
+05 Oct 00
+ed armstrong	NASA/JPL/Caltech
+
+`gaussinterp' is a program designed to spatially and temporally
+interpolate SST pathfinder data using gaussian methodology. This
+description is for the C version. To run the program from the command
+line:
+
+% gaussinterp <infile> <beg_rec> <parmfile> <outfile> 
+
+where
+	infile = file containing list of files to process 
+	(ascii; fixed length records; temporally sorted from 
+	old to recent)
+	beg_rec = first record (file) in infile processed
+	parmfile = input parameter file
+	outfile = interpolated output file (ascii or binary)
+
+
+`infile' must be ascii with a fixed record length of 150 bytes. Use
+`pad.pl' to convert variable or other fixed record length files to
+150.  `infile' records should be in monotonically ascending in time
+(year and julian day). beg_rec is the record number of the temporal
+start of the interpolation. The day for the file corresponding to this
+record number is also the first map center date. The next map center is
+'first_map_center' + time_step (parameter dz; see parameter file
+description) and so forth.  `outfile' can be either an ascii or binary
+file, sequential or interleaved format; see below for more
+information.  `parmfile' is an ascii file read by the program that
+contains many interpolation and output parameters.
+
+
+** Parameter file description **
+
+~~~~ example of parameter file: ~~~~~
+200000
+720 360
+10
+3.0 3.0 20.0
+1.0 1.0 10.0
+1.0 1.0  8.0
+-180. 180. 
+-90. 90.
+sequential
+unformatted
+1
+1
+6
+~~~~ end example ~~~~
+
+record 1: ndatamax = maximum points in each file
+       2: xlength, y_length = HDF data array: cols and rows
+       3: kmax = number of "maps" or time "steps"  
+       4: xwin2, ywin2, zwin2 = longitude, latitude "search" 
+	  range (decimal degrees), time search range (days)
+       5: xh, yh, zh = e folding scaling for long, lat (decimal
+		       degrees) and time (days) 
+       6: dx, dy, dz = longitude, latitude interpolation 
+	  	       step (decimal degrees), and 
+		       time step (days)
+       7: xlo, xhi = minimum, maximum longitude (-180 to 180 decimal degrees)
+       8: ylo, yhi = minimum, maximum latitude (-90 to 90 decimal degrees)
+       9: 'interleave' or 'sequential' map format 
+      10: 'formatted' (ascii) or 'unformatted' (binary) output file
+      11: cloud erosion flag: 1=cloud erosion; 0=no cloud erosion
+      12: all pixel data flag: 1="all pixel data"; 0="best pixel" data
+      13: quality flag value: quality flag value (0-7) to use for "all pixel" data; 
+			    ignored if "best pixel" data used
+
+
+Some notes on the parameter file: 
+
+	* ndatamax should be x_length*y_length but in reality is much
+	less since much of the data are missing due to clouds.
+
+	* the user can subset into the image array by choosing proper
+	xlo, xhi, ylo, yhi. xlo must always be less than xhi; the same
+	for ylo and yhi.
+
+	* interleave format refers to each row in the output file
+	representing a unique lon, lat position with columns of
+	associated sst values (maps) 
+	i.e. row one: lon1 lat1 sst1 sst2 sst3....lastsst 
+	     row two: lon2 lat1 sst1 sst2 sst3....lastsst
+
+	* sequential format refers to each map written as rows and
+	columns of lat, lon with the array element representing the sst
+	at that geo-position for that map. Each map is written
+	sequentially in the output file.
+
+	* generally unformatted (binary) output should be chosen as
+	this results in a smaller output file size. Using binary format
+	each pixel is written as a 1 byte char (0-255).
+
+	* cloud erosion refers to the Casey cloud erosion algorithm
+	used in the NSIPP (Casey) Pathfinder climatology. 
+
+
+** Header description **
+
+For each output format a header is written:
+     	ASCII format:
+	record 1: some text
+	record 2: imax, jmax, kmax
+		imax = width of output in pixels
+		jmax = height of output in pixels 
+		kmax = number of "maps" or images
+        record 3: xwin2, ywin2, zwin2
+		spatial and temporal search "radii" 
+		in decimal degrees and days
+        record 4: xh, yh, zh
+		e folding scales in decimal degrees
+	record 5: dx,dy,dz
+		interpolation intervals
+		in decimal degrees
+	record 6: ULx, ULy, LRx, LRy
+		upper left and lower right longitude
+		and latitudes in decimal degrees
+        record 7: date.startdate, date.enddate
+		first and last map center dates in
+		YYYYDDD (e.g., 1995010)
+
+        BINARY (C) [word is 4 bytes, types are indicated]: 
+		word 1 [char]: magic number
+		words 2-4 [int]: imax, jmax, kmax
+		words 5-7 [float]: xwin2, ywin2, zwin2
+		words 8-10 [float]: xh, yh, zh
+		words 11-13 [float]: dx,dy,dz
+		words 14-17 [float]: ULx, ULy, LRx, LRy
+		word 18 [int]: first map center date
+		word 19 [int]: last map center date
+		[total header size is 76 bytes]
+
+** Additional information **
+
+- The parameter file can be edited to change/update all entries but
+care must be taken to avoid typos. The program is compiled for a fixed
+record length for the input datafile. These can be modified in
+`interp.h' and the program recompiled.
+
+- In the case of global interpolation where xlo=-180 and xhi=180, the
+program will correctly interpolate across longitude 180 East (all_zones
+is true). That is, there is no "cutoff" in the interpolation if the
+search window for a particular satellite pixel crosses this longitude.
+In all other cases this is not so.  For example, if xlo=-180 and
+xhi=-150, interpolations in the vicinity of longitude -180 are "cutoff"
+at this boundary, i.e., points west of -180 do not contribute to the
+interpolation.  Since this is a regional subset, the interpolations are
+also "cutoff" in the vicinity of longitude -150 (data east of -150 do
+not contribute). By extension this is also true for a subset in
+latitude.
+
+- The first line in the usage dump (type gaussinterp with no arguments)
+will specify if the executable is from Fortran or C code.
+
+- Sample parameter files can be found in
+/sst/vol7/PATHFINDER/interp/parmfiles .  Datafile lists can be found in
+/sst/vol7/PATHFINDER/interp/avhrrlists .
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/gaussinterp_C_code.tar
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/gaussinterp_C_code.tar b/climatology/clim/orig/C/gaussinterp_C_code.tar
new file mode 100644
index 0000000..5db4b0e
Binary files /dev/null and b/climatology/clim/orig/C/gaussinterp_C_code.tar differ

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/interp.c
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/interp.c b/climatology/clim/orig/C/interp.c
new file mode 100644
index 0000000..c057875
--- /dev/null
+++ b/climatology/clim/orig/C/interp.c
@@ -0,0 +1,448 @@
+/* $Revision: 1.20 $ */
+
+/* SYNOPSIS
+   called by setupinterp(). This subroutine reads each
+   HDF file, passes data to binsum() for interpolation
+   calculation and writes output image(s).
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <libgen.h>
+#include <hdf.h>
+#include "interp.h"
+
+/* C binary file id = 3890345459 (0xE7E1F5F3) */
+#define MAGIC 3890345459L
+
+ interp() {
+  uint8 in_data[parms.y_length][parms.x_length];   
+  uint8 quality_data[parms.y_length][parms.x_length];   
+  uint8 aerosol_corr[parms.y_length][parms.x_length];   
+
+  intn retn, haspal;
+  int32 width, height;
+
+  float ULlon, ULlat, LRlon, LRlat;
+  float cal, offset, xlat;
+  int k1,k2,k3,k4,ii,jj,kk,n,i,j,k;
+  int ipts, iyr, iday;
+  int jj_reverse;
+  int row, col;
+  unsigned long int magic_num; 
+
+  FILE *fid_infile, *fid_outfile, *fid_datafile;
+  FILE *fid_aerosol_list, *fid_aerosol_file;
+
+  char plabel[40];
+  char datafile[RECSIZE];
+  char aerosol_file[200];
+  char *basefile;
+  char cday[3];
+  char cyr[4];
+  char tmpstr[22]; 
+  char aerosol_tmpstr[30];
+  char tmpfile[35];
+  char aerosol_tmpfile[45];
+  char zcatcmd[200];
+  char rmcmd[45];
+  char compress[1];
+  char version[4];
+  char sstDN;
+  /* short int sstDN; */
+
+  /* open output file */
+  fid_outfile = fopen( fileio.outfile, "w" );
+
+
+  /* Set arrays of interpolation bins.
+     Long and lat bin centers set to 1/2 
+     interpolation step */
+
+  /*  Long to interpolate to:
+      1st for loop sets interpolation bins
+      between the ranges of xlo to xhi.
+      If all_zones is true, 2nd and 3rd for 
+      loops set bins for those "extended" interpolations 
+      that must cross longitude 180. */
+  for( ii=parms.imin; ii < parms.imax; ii++ )
+      xx[ii] = parms.xlo + (float)(ii)*parms.dx + parms.dx/2;
+
+  if( all_zones ) {
+      /* west of long. 180 */
+      for( ii=0; ii < long_extend/2; ii++ )
+          xx[ii+parms.imax] = 180 - (long_extend/2 * parms.dx) + (float)(ii)*parms.dx 
+                              + parms.dx/2;
+
+      /* east of long. 180; sets center point */
+      for( ii=0; ii <= long_extend/2; ii++ )
+         xx[ii+parms.imax+long_extend/2] = -180 + (float)(ii)*parms.dx 
+                                           + parms.dx/2;
+  }
+
+  /* for( ii = 0; ii <=  parms.imax + long_extend; ii++) 
+    printf( " ii: %d xx[ii] = %f \n", ii, xx[ii] ); */
+ 
+  
+  /* Lat to interpolate to */
+  for( jj=parms.jmin; jj < parms.jmax; jj++ )
+      yy[jj] = parms.ylo + (float)(jj)*parms.dy + parms.dy/2;
+
+  /* Time to interpolate to */ 
+  for( kk=parms.kmin; kk < parms.kmax; kk++ )
+      zz[kk] = parms.zlo + (float)(kk)*parms.dz;	
+
+  /* slope (cal) and offset to convert DN to SST */
+  cal = 0.15;
+  offset = 3.0;
+
+  /* open input data file list */
+  if( (fid_infile = fopen( fileio.infile, "r" )) == NULL ){
+      printf( "\nCan not open %s\n", fileio.infile );
+      exit(1);
+  }
+
+  /* position to proper record in file */
+  fseek( fid_infile, ( (fileio.istart-1)*RECSIZE ), 0 );
+
+
+
+  /* open input aerosol file list if necessary */
+  if(aerosol) {
+      if( (fid_aerosol_list = fopen( fileio.aerosol_list, "r" )) == NULL ){
+          printf( "\nCan not open %s\n", fileio.aerosol_list );
+          exit(1);
+      }
+      /* position to proper record in file */
+      fseek( fid_aerosol_list, ( (fileio.istart-1)*RECSIZE ), 0 ); 
+
+  }
+
+
+  /* read infile one record at a time and process . . . */
+  for( k=fileio.istart; k <= fileio.iend; k++ ){
+
+      ipts = 0; 
+      strcpy( compress, " " );
+      strcpy( tmpstr, "                      " );
+
+      fgets( datafile, sizeof(datafile)+1, fid_infile ); 
+
+      /* strip off newline if necessary */
+      if( datafile[ strlen(datafile) ] == '\n' ){ 
+          datafile[ strlen(datafile) ] = '\0';
+      }
+      /* printf("datafile is %s \n", datafile ); */
+
+      /* check to make sure datafile actually exists 
+         if not ..... quit program  */
+      fid_datafile = fopen( datafile, "r" ); 
+      if( fid_datafile == NULL ) {
+	  printf( "could not open:\n" );
+	  printf( "%s \n", datafile );
+	  printf( ". . . quitting program \n" );
+	  exit(2);
+      }
+      fclose( fid_datafile ); 
+
+      basefile = basename( &datafile[0] );
+      printf( "\nfile: %s\n", basefile );
+
+ /* e.g, parse year and jul day from 1985004h54dd-gdm.hdf */
+      strcpy( tmpstr, basefile ); 
+      strncpy( cyr, &tmpstr[0], 4 ); 
+      iyr = atoi( cyr );
+      strncpy( cday, &tmpstr[4], 3 );
+      iday = atoi( cday );
+   /* printf(" iday is %d\n", iday ); 
+      printf("iyr is %d\n", iyr ); 
+   */
+
+ /* if unix compressed, zcat to a temporary filename */
+     strncpy( compress, &tmpstr[21], 1 );
+     if( strcmp( compress, "Z" ) == 0 ) {
+         strcpy( tmpstr, basefile );
+         strcpy( tmpfile, "/tmp/" ); 
+	 strncat( tmpfile, &tmpstr[0], 20 ); 
+
+	 strcpy( zcatcmd, "zcat ");
+	 strcat( zcatcmd, datafile );
+	 strcat( zcatcmd, " > " );
+	 strcat( zcatcmd, tmpfile );
+
+         (void)  system( zcatcmd );
+	 strcpy( datafile,  tmpfile );
+     }
+
+     /* do the same for the aerosol file if necessary */
+     if( aerosol ) {
+      strcpy( compress, " " );
+      strcpy( aerosol_tmpstr, "                             " );
+
+      fgets( aerosol_file, sizeof(aerosol_file)+1, fid_aerosol_list ); 
+      /* printf("aerosol_file is %s \n", aerosol_file ); */
+
+      /* strip off newline if necessary  */
+      if( aerosol_file[ strlen(aerosol_file) ] == '\n' ){ 
+          aerosol_file[ strlen(aerosol_file) ] = '\0';
+      }
+
+
+      basefile = basename( &aerosol_file[0] );
+      strcpy( aerosol_tmpstr, basefile ); 
+      printf( "aerosol file: %s\n", basefile ); 
+
+
+     /* if unix compressed, zcat to a temporary filename  */
+     strncpy( compress, &aerosol_tmpstr[27], 1 );
+     if( strcmp( compress, "Z" ) == 0 ) {
+         strcpy( aerosol_tmpstr, basefile );
+         strcpy( aerosol_tmpfile, "/tmp/" ); 
+	 strncat( aerosol_tmpfile, &aerosol_tmpstr[0], 26 ); 
+
+	 strcpy( zcatcmd, "zcat ");
+	 strcat( zcatcmd, aerosol_file );
+	 strcat( zcatcmd, " > " );
+	 strcat( zcatcmd, aerosol_tmpfile );
+
+         (void)  system( zcatcmd );
+	 strcpy( aerosol_file,  aerosol_tmpfile );
+     }
+     }
+
+         /* read the aerosol file into an array */
+	 if( aerosol ) { 
+	     fid_aerosol_file = fopen( aerosol_file, "r" );
+             fread( aerosol_corr, sizeof(uint8), parms.y_length * parms.x_length, fid_aerosol_file );
+	     fclose( fid_aerosol_file );
+	 }
+
+         /* read HDF SST data dimensions */
+	 retn = DFR8getdims( datafile, &width, &height, &haspal );
+	 /* printf( "HDF width and height: %d %d \n", width, height ); */
+
+	 if( width != parms.x_length || height != parms.y_length ) {
+	     printf( "\nbounds mismatch after reading HDF file dimensions !!\n" );
+	     printf( "width: %d, parms.x_length: %d \n", width, parms.x_length ); 
+	     printf( "height: %d, parms.y_length: %d \n", height, parms.y_length ); 
+	     printf( "skipping %s . . . \n\n", datafile );
+	     continue;
+         }
+
+ /* ------------------------------------------------- */
+ /* Read the SST image of the HDF file.
+    HDF call: DFR8getimage()  */
+ /* ------------------------------------------------- */
+
+	 retn=DFR8getimage(datafile, (VOIDP)in_data, parms.x_length, 
+			   parms.y_length, NULL);
+
+ /* ------------------------------------------------- */
+ /* If "all pixel" data choosen read the quality  
+    flag image */
+ /* ------------------------------------------------- */
+	
+	if( sst_type )  
+	   retn=DFR8getimage(datafile, (VOIDP)quality_data, 
+			   parms.x_length, parms.y_length, NULL);
+
+
+
+ /* ------------------------------------------------- */
+ /* Read hdf file DN values and convert to SST.
+    If "all pixel" data read only those pixels 
+    with a quality flag greater than or equal to 
+    quality_flag */
+ /* ------------------------------------------------- */
+
+        for( i=hdf.icolLeft; i <= hdf.icolRight; i++ ) {
+	  for( j=hdf.irowUpper; j <= hdf.irowLower; j++ ) {
+
+              /* only conider aerosol correction greater than 5 cnt */
+	      if( aerosol && aerosol_corr[j][i] > 5  && in_data[j][i] > 0 )
+		  in_data[j][i] = in_data[j][i] + aerosol_corr[j][i];
+
+	      /* perform Casey cloud erosion on non-zero SST data */
+	      /* if nearest neighbor is a cloud, set pixel to cloud (0) */
+	      if( in_data[j][i] > 0 && cloud_erosion ) {
+                  for( col = i-1; col <= i+1; col++ ) {
+                     for( row = j-1; row <= j+1; row++ ) { 
+	             /* make sure we are searching within 
+		     image array bounds */
+	              if( col >= 0 && col < parms.x_length &&  
+		          row >= 0 && row < parms.y_length && 
+		          in_data[row][col] == 0 ) {
+		            in_data[j][i] = 0;
+			    goto end_erosion;
+                      }
+                    }
+                  }
+	      }
+	      end_erosion:
+
+
+              /* if all_pixel (sst_type = 1) filter for quality level, 
+		 or if best_sst accept data values greater than 0  */
+		  
+		  /*printf( "quality flag is %d \n", quality_flag);
+		  printf (" sst_type is %d \n", sst_type);
+		  */
+
+	      if( (sst_type && quality_data[j][i] >= quality_flag) || 
+		  (!sst_type && in_data[j][i] > 0) ) {
+		  /* printf (" quality_data = %d  \n", quality_data[j][i]); */
+
+                  f[ipts] = cal * (float)in_data[j][i]  - offset;
+                  x[ipts] = -180. + parms.dxd * (float)(i) + parms.dxd/2;
+                  y[ipts] = 90. - parms.dyd * (float)(j) - parms.dyd/2;
+                  z[ipts] = (float)( iday+( (iyr-1985)*365 ) );
+
+                  if(iyr > 1988) z[ipts]=z[ipts]+1;
+                  if(iyr > 1992) z[ipts]=z[ipts]+1;
+                  if(iyr > 1996) z[ipts]=z[ipts]+1;
+                  if(iyr > 2000) z[ipts]=z[ipts]+1;
+                  if(iyr > 2004) z[ipts]=z[ipts]+1;
+                  if(iyr > 2008) z[ipts]=z[ipts]+1;
+		  ipts++;
+	      }
+	  }
+        } 
+
+ /* calculate interpolation weights and vsum  */
+
+	  printf(" num of pts in file: %d \n", ipts );
+	  binsum( ipts );
+
+        if( strcmp( compress, "Z" ) == 0 ) {
+	    strcpy( rmcmd, "rm -f " );
+	    strcat( rmcmd, tmpfile );
+	    system( rmcmd ); 
+	    if( aerosol ) {
+	        strcpy( rmcmd, "rm -f " );
+	        strcat( rmcmd, aerosol_tmpfile );
+	        system( rmcmd ); 
+            }
+        }
+ /* ..... read next hdf file from infile */
+
+  }
+  fclose( fid_infile );
+  if( aerosol )
+      fclose( fid_aerosol_list );
+
+ /* all input files processed; calculate interpolated SST maps */
+      for( kk=0; kk < parms.kmax; kk++ ) {
+        for( jj=0; jj < parms.jmax; jj++ ) {
+          for( ii=0; ii < parms.imax; ii++ ) {
+            if ( vsum[1][ii][jj][kk] > 0 ) {  
+
+		/* reverse jj indicies to flip N to S */
+		jj_reverse = parms.jmax - jj - 1;
+                sl[ii][jj_reverse][kk] = 
+		vsum[0][ii][jj][kk] / vsum[1][ii][jj][kk];
+            }
+          }
+        }
+      }
+
+ /* write output as map "interleaved" or map "sequential".
+    both formats preceded by header.
+    see gaussinterp.readme for more info.
+ */
+
+ /* geo-positions of UL and LR corners */
+      ULlon = parms.xlo + parms.dx/2;
+      ULlat = parms.yhi - parms.dy/2;
+      LRlon = parms.xhi - parms.dx/2;
+      LRlat = parms.ylo + parms.dy/2;
+
+ /* version number, "c" refers to C version */
+      strcpy( version, "c1.3" );
+      strcpy( plabel, "sst interpolation");
+
+ /*  write the header */
+      if( strcmp( fileio.outformat, "formatted" ) == 0 ) { 
+	  fprintf( fid_outfile, "%s -- %s\n ", version, plabel );
+	  fprintf( fid_outfile, "%d %d %d\n", 
+		   parms.imax,parms.jmax,parms.kmax );
+	  fprintf( fid_outfile, "%f %f %f\n", 
+		   parms.xwin2,parms.ywin2,parms.zwin2 );
+	  fprintf( fid_outfile, "%f %f %f\n", 
+		   parms.xh,parms.yh,parms.zh );
+	  fprintf( fid_outfile, "%f %f %f\n", 
+		   parms.dx,parms.dy,parms.dz );
+	  fprintf( fid_outfile, "%f %f %f %f\n", 
+	  	   ULlon,ULlat,LRlon,LRlat );
+          fprintf( fid_outfile, "%ld %ld\n",
+                   date.startdate, date.enddate );
+      }
+      else if( strcmp( fileio.outformat,  "unformatted" ) == 0 ) { 
+	  magic_num = MAGIC;
+	  fwrite( &magic_num, sizeof(magic_num),1,fid_outfile ); 
+	  fwrite( &parms.imax, sizeof(parms.imax),1,fid_outfile );
+	  fwrite( &parms.jmax, sizeof(parms.jmax),1,fid_outfile );
+	  fwrite( &parms.kmax, sizeof(parms.kmax),1,fid_outfile );
+	  fwrite( &parms.xwin2, sizeof(parms.xwin2),1,fid_outfile );
+	  fwrite( &parms.ywin2, sizeof(parms.ywin2),1,fid_outfile );
+	  fwrite( &parms.zwin2, sizeof(parms.zwin2),1,fid_outfile );
+	  fwrite( &parms.xh, sizeof(parms.xh),1,fid_outfile );
+	  fwrite( &parms.yh, sizeof(parms.yh),1,fid_outfile );
+	  fwrite( &parms.zh, sizeof(parms.zh),1,fid_outfile );
+	  fwrite( &parms.dx, sizeof(parms.dx),1,fid_outfile );
+	  fwrite( &parms.dy, sizeof(parms.dy),1,fid_outfile );
+	  fwrite( &parms.dz, sizeof(parms.dz),1,fid_outfile );
+	  fwrite( &ULlon, sizeof(ULlon),1,fid_outfile );
+	  fwrite( &ULlat, sizeof(ULlat),1,fid_outfile );
+	  fwrite( &LRlon, sizeof(LRlon),1,fid_outfile );
+	  fwrite( &LRlat, sizeof(LRlat),1,fid_outfile );
+          fwrite( &date.startdate, sizeof(date.startdate),1,fid_outfile);
+	  fwrite( &date.enddate, sizeof(date.enddate),1,fid_outfile);
+	  /* binary header is 76 bytes */
+      }
+
+ /*  write the maps */
+      if( strcmp( fileio.mapformat, "interleave" ) == 0 ) {
+        printf( "\n map output is interleave\n" );
+        for( jj=0; jj < parms.jmax; jj++ ) {
+          for( ii=0; ii < parms.imax; ii++ ) {
+            for( kk=0; kk < parms.kmax; kk++ ) {
+                sst_inter[kk] = sl[ii][jj][kk]; 
+
+		/* scale sst back to 0-255 DNs */
+		if( sst_inter[kk] != 0 ) 
+		    sstDN = (char) nint( (sst_inter[kk] + offset) / cal );
+                else
+		    sstDN = 0;	/* O's in array sst_inter are missing data */ 
+
+	        if( strcmp( fileio.outformat, "formatted" ) == 0 ) 
+		    fprintf( fid_outfile, "%d ", sstDN ); 
+                else 
+		    fwrite( &sstDN, sizeof(char),1,fid_outfile ); 
+
+             }
+          }
+        }
+      } else if( strcmp( fileio.mapformat, "sequential" ) == 0 ) {
+        printf( "\n map output is sequential\n" );
+        for( kk=0; kk < parms.kmax; kk++ ) {
+          for( jj=0; jj < parms.jmax; jj++ ) {
+            for( ii=0; ii < parms.imax; ii++ ) {
+               sst_seq[ii] = sl[ii][jj][kk]; 
+
+		/* scale sst back to 0-255 DNs */
+	       if( sst_seq[ii] != 0 ) 
+	           sstDN = (char) nint( (sst_seq[ii] + offset) / cal );
+               else
+		   sstDN = 0;	/* O's in array sst_seq are missing data */ 
+
+               if( strcmp( fileio.outformat, "formatted" ) == 0 ) 
+	           fprintf( fid_outfile, "%d ", sstDN ); 
+               else 
+	     	   fwrite( &sstDN, sizeof(char),1,fid_outfile );
+
+	    }
+          }
+        }
+      }
+  fclose( fid_outfile );
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/makefile
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/makefile b/climatology/clim/orig/C/makefile
new file mode 100644
index 0000000..ab004b3
--- /dev/null
+++ b/climatology/clim/orig/C/makefile
@@ -0,0 +1,33 @@
+# makefile for guassinterp (C version). 
+
+# C compiler 
+CC  =  cc
+#HDF = /usr/local/hdf
+HDF = /usr/local/hdf4.1r3-n32
+
+CFLAGS =  -n32 -I$(HDF)/include  -O -w
+#LIBS    = -L$(HDF)/lib -lmfhdf -ldf -ljpeg -lz -lgen -lm 
+LIBS    = -L$(HDF)/lib  -ldf -ljpeg -lz -lgen -lm 
+BIN = /sst/vol7/PATHFINDER/bin/sgi
+PGM = gaussinterp
+
+SRC = setupinterp.c interp.c binsum.c 
+OBJ = setupinterp.o interp.o binsum.o 
+
+$(PGM):	$(OBJ)
+	$(CC) $(CFLAGS) -o $(PGM) $(OBJ) $(LIBS) 
+
+setupinterp.o: 
+	$(CC) $(CFLAGS) $(DEFINE) -c setupinterp.c
+interp.o:
+	$(CC) $(CFLAGS) $(DEFINE) -c interp.c
+binsum.o:
+	$(CC) $(CFLAGS) $(DEFINE) -c binsum.c
+
+
+install: $(PGM)
+	 cp  $(PGM) $(BIN)
+
+clean:
+	 rm -f $(OBJ) $(PGM)
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/C/setupinterp.c
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/C/setupinterp.c b/climatology/clim/orig/C/setupinterp.c
new file mode 100644
index 0000000..9ca67b3
--- /dev/null
+++ b/climatology/clim/orig/C/setupinterp.c
@@ -0,0 +1,431 @@
+/* NAME gaussinterp (C version)
+   16 Jan 00    earmstrong      NASA/JPL
+   $Revision: 1.16 $
+
+  DESCRIPTION
+  Gaussian interpolation program modified to map SST (HDF) data.
+  This program is a C port of the fortran version of gaussinterp.
+
+  SYNOPSIS
+  setupinterp() allocates space for arrays, calls interp()
+  which does the interpolation
+
+  USAGE
+  % gaussinterp <infile> <beg_rec> <parmfile> <outfile> */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <math.h>
+#include "interp.h"
+/* see interp.h for global structs and arrays */
+      
+main( int argc, char *argv[] ) {
+
+      int iday, iyr, calloc_bytes, rec_step;
+      long max_infile_size;
+
+      int value;
+      FILE *fid_infile, *fid_parm;
+
+      char datafile[RECSIZE];
+      char *basefile;
+      char *parmfile;
+      char *startrec, *endrec;
+      char cday[3], cyr[4], cdate[7];
+      char *cstartdate;
+      char *cenddate;
+      char tmpline[80];
+
+/* check command line arguments */
+      if( argc != 5 && argc != 6 ) {
+	  usage();
+	  exit(1);
+      }
+      fileio.infile = argv[1];
+      startrec = argv[2];
+      parmfile = argv[3];
+      fileio.outfile = argv[4];
+      if( argc == 6 )
+          fileio.aerosol_list = argv[5];  
+
+      /* open parameter file and read line by line */
+      if( (fid_parm = fopen( parmfile, "r" )) == NULL ){
+	  printf( "\nCan not open %s\n", parmfile ); 
+	  exit(1);
+      }
+
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &parms.ndatamax ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d %d", &parms.x_length, &parms.y_length ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &parms.kmax ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%f %f %f", &parms.xwin2, &parms.ywin2, &parms.zwin2 ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%f %f %f", &parms.xh, &parms.yh, &parms.zh ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%f %f %f", &parms.dx, &parms.dy, &parms.dz ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%f %f", &parms.xlo, &parms.xhi ); 
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%f %f", &parms.ylo, &parms.yhi ); 
+      fgets( fileio.mapformat, sizeof(fileio.mapformat), fid_parm );
+      fgets( fileio.outformat, sizeof(fileio.outformat), fid_parm );
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &cloud_erosion );
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &sst_type );
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &quality_flag );
+      fgets( tmpline, sizeof(tmpline), fid_parm );
+      sscanf( tmpline, "%d", &aerosol );
+
+      fileio.mapformat[ strlen(fileio.mapformat)-1 ] = '\0';
+      fileio.outformat[ strlen(fileio.outformat)-1 ] = '\0';
+
+      fclose( fid_parm );
+      
+      if( strcmp(fileio.mapformat, "interleave") != 0  &&   
+          strcmp(fileio.mapformat, "sequential") != 0 ) {
+	   printf( "check parameter file for interleave or sequential maps !\n" );
+	   exit(1);
+      } 
+      if( strcmp(fileio.outformat, "formatted") != 0  &&   
+          strcmp(fileio.outformat, "unformatted") != 0 ) {
+	   printf( "check parameter file for formatted or unformatted output !\n" );
+	   exit(1);
+      }
+
+    /* Calculate number of interpolation "steps" based on
+       long and lat ranges divided by interpolation interval.
+       Origin is at lon=-180, lat=90 */
+      parms.imax = floorf((parms.xhi + 180) / parms.dx) - floorf((parms.xlo + 180) / parms.dx );
+      parms.jmax = floorf((parms.yhi - 90) / parms.dy) - floorf((parms.ylo - 90) / parms.dy );
+      printf( "imax, jmax, kmax: %d %d %d \n", 
+		parms.imax, parms.jmax, parms.kmax );
+
+      parms.imin = 0;
+      parms.jmin = 0;
+      parms.kmin = 0;
+
+    /* calculate degrees per grid point */
+      parms.dxd =  360. / (float)parms.x_length;
+      parms.dyd =  180. / (float)parms.y_length;
+
+    /* find columns and rows for subsetting into hdf image array 
+       remember @ hdfarray(0,0) -->  lon=-180, lat=90 */
+      hdf.icolLeft  = floorf( (parms.xlo + 180.) / parms.dxd );
+      hdf.icolRight = floorf( ((parms.xhi + 180.) / parms.dxd) - 1. );
+      hdf.irowUpper = floorf( fabsf(parms.yhi - 90.) / parms.dyd );
+      hdf.irowLower = floorf( (fabsf(parms.ylo - 90.) / parms.dyd) - 1. );
+
+      /* printf( "array corners: %d %d %d %d \n", hdf.icolLeft, hdf.irowUpper, 
+		  hdf.icolRight ,hdf.irowLower); */
+
+   /* set global interpolation flag if necessary */
+      if( parms.xlo == -180. && parms.xhi == 180. ) {
+          all_zones = 1;  /* true */
+          printf( "all_zones is true: interpolating across -180 West\n" );
+      }
+
+      if( cloud_erosion )
+	  printf( "performing cloud erosion filtering on SST data \n" );
+      if( sst_type )
+	  printf( "working with 'all pixel' data: quality flag is %d \n", quality_flag );
+      if( aerosol )
+	  printf( "performing aerosol correction \n" );
+
+   /* allocate space for arrays  */
+      calloc_bytes = 0;
+      if( (temp = fmal2d(  parms.x_length, parms.y_length )) == NULL ) 
+	  printf( "not enough memory for array temp\n" ), exit(-1);
+      else calloc_bytes = parms.x_length * parms.y_length * sizeof(float);  
+
+      if( (in_data = cmal2d( parms.x_length, parms.y_length )) == NULL ) 
+	  printf( "not enough memory for array in_data\n" ), exit(-1);
+      else calloc_bytes += parms.x_length * parms.y_length * sizeof(char);  
+
+      if( (quality_data = cmal2d( parms.x_length, parms.y_length )) == NULL ) 
+	  printf( "not enough memory for array quality_data\n" ), exit(-1);
+      else calloc_bytes += parms.x_length * parms.y_length * sizeof(char);  
+
+       if( (sl = fmal3d( parms.imax, parms.jmax, parms.kmax )) == NULL )
+	  printf( "not enough memory for array sl\n" ), exit(-1);
+      else calloc_bytes += parms.imax * parms.jmax * parms.kmax * sizeof(float);  
+
+      if( (vsum = fmal4d( 2, parms.imax, parms.jmax, parms.kmax )) == NULL )
+	  printf( "not enough memory for array vsum\n" ), exit(-1);
+      else calloc_bytes += parms.imax * parms.jmax * parms.kmax * 2 * sizeof(float);  
+    
+      if( (sst_seq = (float *)calloc( parms.imax, sizeof(float) )) == NULL ) 
+	  printf( "not enough memory for array sst_seq\n" ), exit(-1);
+      else calloc_bytes += parms.imax * sizeof(float);  
+
+      if( (sst_inter = (float *)calloc( parms.kmax, sizeof(float) )) == NULL )
+	  printf( "not enough memory for array sst_inter\n" ), exit(-1);
+      else calloc_bytes += parms.kmax * sizeof(float);  
+
+      if( (x = (float *)calloc( parms.ndatamax, sizeof(float) )) == NULL ) 
+	  printf( "not enough memory for array x\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(float);  
+
+      if( (y = (float *)calloc( parms.ndatamax, sizeof(float) )) == NULL )
+	  printf( "not enough memory for array y\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(float);  
+
+      if( (z = (float *)calloc( parms.ndatamax, sizeof(float) )) == NULL )
+	  printf( "not enough memory for array z\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(float);  
+
+      if( (f = (float *)calloc( parms.ndatamax, sizeof(float) )) == NULL )
+	  printf( "not enough memory for array f\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(float);  
+
+      /* Extend array xx by long_extend to handle crossing
+	 longitude 180 during global interpolation.
+         Extend by 4*search radius (plus 1 in xx dimension
+         for -180 West crossing point */
+      if( all_zones ) {
+          long_extend = nint( 4 * parms.xwin2 / parms.dx );
+          /* make sure long_extend is even for equal number of
+	     bins on either side of -180 W  */
+          if( long_extend % 2 != 0 )
+              long_extend++;
+          if( (xx = (float *)calloc( parms.imax + long_extend + 1, sizeof(float) )) == NULL )
+	      printf( "not enough memory for array xx\n" ), exit(-1);
+          else calloc_bytes += (parms.imax + long_extend + 1) * sizeof(float);
+      } else {
+             if( (xx = (float *)calloc( parms.imax, sizeof(float) )) == NULL )
+	         printf( "not enough memory for array xx\n" ), exit(-1);
+             else calloc_bytes += parms.imax * sizeof(float);
+      }  
+ 
+      if( (yy = (float *)calloc( parms.jmax, sizeof(float) )) == NULL)
+	  printf( "not enough memory for array yy\n" ), exit(-1);
+      else calloc_bytes += parms.jmax * sizeof(float);  
+
+      if( (zz = (float *)calloc( parms.kmax, sizeof(float) )) == NULL )
+	  printf( "not enough memory for array zz\n" ), exit(-1);
+      else calloc_bytes += parms.kmax * sizeof(float);  
+
+      if( (ixmin = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array ixmin\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+      if( (ixmax = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array ixmax\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+      if( (iymin = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array iymin\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+      if( (iymax = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array iymax\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+      if( (izmin = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array izmin\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+      if( (izmax = (int *)calloc( parms.ndatamax, sizeof(int) )) == NULL ) 
+	  printf( "not enough memory for array izmax\n" ), exit(-1);
+      else calloc_bytes += parms.ndatamax * sizeof(int);  
+
+
+      printf( "done calloc arrays\n" );  
+      printf( "total bytes used: %d (%5.1f Mb)\n\n", calloc_bytes, calloc_bytes/1e6 ); 
+
+
+      /* Determine zlo which corresponds to record number in infile for
+	 first map center and number of days since 1 Jan 1985 */
+      fileio.istart = atoi( startrec );
+ 
+      /* Open input file list and read first record */
+      if( (fid_infile = fopen( fileio.infile, "r" )) == NULL ){
+	  printf( "\nCan not open %s\n", fileio.infile ); 
+	  exit(1);
+      }
+
+      /* position to proper record in file */
+      fseek( fid_infile, (fileio.istart-1)*RECSIZE, SEEK_SET );
+      fgets( datafile, sizeof(datafile), fid_infile );
+      fclose( fid_infile );
+      basefile = basename( &datafile[0] );
+
+      strcpy( cday, "   " );  /* initialize strings */
+      strcpy( cyr, "    " ); 
+      /* e.g, parse year and jul day from 1985004h54dd-gdm.hdf */
+      strncpy( cyr, &basefile[0], 4 );
+      iyr = atoi( cyr );
+      strncpy( cday, &basefile[4], 3 );
+      iday = atoi( cday );
+
+      /* set parms.zlo: days since 1 Jan 1985 */
+      parms.zlo = (float)iday+(float)(iyr-1985)*365.;
+      if(iyr > 1988) parms.zlo = parms.zlo + 1.;
+      if(iyr > 1992) parms.zlo = parms.zlo + 1.;
+      if(iyr > 1996) parms.zlo = parms.zlo + 1.;
+      if(iyr > 2000) parms.zlo = parms.zlo + 1.;
+      if(iyr > 2004) parms.zlo = parms.zlo + 1.;
+      if(iyr > 2008) parms.zlo = parms.zlo + 1.;
+      printf( " zlo is  %f\n", parms.zlo );
+      printf( " first map centered on day: %d in year: %d\n", iday, iyr );
+
+      /* Set the first center dates */
+      cstartdate = strcat( cdate, cyr );
+      cstartdate = strcat( cdate, cday );
+      date.startdate = atoi( cstartdate );
+      printf( " start date is %d \n", date.startdate );
+
+      /* reopen file to determine last map center date */
+      fopen( fileio.infile, "r" );
+      fileio.iend = fileio.istart + (parms.kmax-1) * parms.dz;
+      fseek(fid_infile, (fileio.iend-1)*RECSIZE, SEEK_SET );
+      fgets( datafile, sizeof(datafile), fid_infile );
+      fclose( fid_infile );
+      basefile = basename( &datafile[0] );
+  
+      /* parse year and jul day  */
+      strcpy( cdate, "" );
+      strncpy( cyr, &basefile[0], 4 );
+      strncpy( cday, &basefile[4], 3 );
+      cenddate = strcat( cdate, cyr );
+      cenddate = strcat( cdate, cday );
+      date.enddate = atoi( cenddate );
+      printf( " end date is %d\n", date.enddate );
+
+      /* Now determine temporal interpolation (record) ranges */
+      /* set istart and iend so the first and last maps will span a complete
+	 temporal interpolation range if possible. e.g., if first map is centered
+	 on 1 Jan 1986 (this is date of first record to read from the 
+	 input datafile [fileio.istart]), with a search radius of 5 days (zwin2),
+         set istart back five days to 27 Dec 1985 and iend to 6 Jan 1986 */
+
+      /* set initial step back and forward size to temporal search radius */ 
+      rec_step = (int) parms.zwin2;  
+            
+      /* reopen input datafile */
+      if( (fid_infile = fopen( fileio.infile, "r" )) == NULL ){
+	  printf( "\nCan not open %s\n", fileio.infile ); 
+	  exit(1);
+      }
+
+      /* determine max bytes in infile */  
+      fseek( fid_infile, 0L, SEEK_END );
+      max_infile_size = ftell( fid_infile );
+
+      /* step back into infile; use return of fseek() to determine if 
+         file pointer is set before beginning of file  */
+      while( fseek(fid_infile, (fileio.istart-1-rec_step)*RECSIZE, SEEK_SET) != 0 ) 
+          rec_step--;
+      fileio.istart -= rec_step;
+
+      /* step forward into infile */
+      rec_step = parms.zwin2; 
+      fseek( fid_infile, (fileio.iend-1+rec_step)*RECSIZE, SEEK_SET );
+
+      /* if the file pointer is set beyond the EOF: step back */
+      while( ftell(fid_infile) >= max_infile_size ) {
+        rec_step--;  
+	fseek( fid_infile, (fileio.iend-1+rec_step)*RECSIZE, SEEK_SET );
+      }
+      fileio.iend += rec_step;
+ 
+      printf( " records: istart %d and iend %d \n\n", fileio.istart, fileio.iend );
+      fclose( fid_infile );           
+    
+      /* call interp() */
+      interp();
+      
+      free(temp), free(sl), free(vsum), free(sst_seq), free(sst_inter);
+      free(x), free(y), free(z), free(f), free(xx), free(yy), free(zz);
+      free(ixmin), free(ixmax), free(iymin), free(iymax);
+      free(izmin), free(izmax), free(in_data), free(quality_data);
+ }
+
+/* functions to allocate space for float arrays */
+/* 2d dimension */
+float **fmal2d( int ix, int iy ){
+
+ float **ival;
+ int i;
+
+ ival = (float **)calloc( ix, sizeof(float *) );
+ for( i=0; i < ix; i++ )
+     ival[i] = (float *)calloc( iy, sizeof(float) );
+
+ return(ival);
+}
+
+ /* 3d dimension */
+ float ***fmal3d( int ix, int iy, int iz ){
+
+ float ***ival;
+ int i, j;
+
+ ival = (float ***)calloc( ix, sizeof(float **) );
+ for( i=0; i < ix; i++ )
+     ival[i] = (float **)calloc( iy, sizeof(float *) );
+
+ for( i=0; i < ix; i++ )
+     for( j=0; j < iy; j++ )
+         ival[i][j] = (float *)calloc( iz, sizeof(float) );
+ 
+ return(ival);
+ }
+
+/* 4d dimension */
+float ****fmal4d( int ix, int iy, int iz, int ia ){
+     
+    float ****ival;
+    int i, j, k;
+
+    ival = (float ****)calloc( ix, sizeof(float ***) );
+    for( i=0; i < ix; i++ )
+	ival[i] = (float ***)calloc( iy, sizeof(float **) );
+    for( i=0; i < ix; i++ )
+	for( j=0; j < iy; j++)
+	    ival[i][j] = (float **)calloc( iz, sizeof(float *) );   
+    for( i=0; i < ix; i++ )
+	for( j=0; j < iy; j++)
+	    for( k=0; k < iz; k++)
+	        ival[i][j][k] = (float *)calloc( ia, sizeof(float) );   
+
+    return(ival);
+}
+
+/* function to allocate space for char array */
+/* 2d dimension */
+char **cmal2d( int ix, int iy ) {
+
+ char **ival;
+ int i;
+
+ ival = (char **)calloc( ix, sizeof(char *) );
+ for( i=0; i < ix; i++ )
+     ival[i] = (char *)calloc( iy, sizeof(char) );
+
+ return(ival);
+}
+
+
+
+usage() {
+	  printf( "	~~ gaussian interpolation of pathfinder SST data (C version) ~~\n\n " );
+	  printf(  "USAGE:  gaussinterp <infile> <beg_rec> <parmfile> <outfile>\n" );
+	  printf(  " -- infile: file containing list to process\n" );
+	  printf(  " -- beg_rec: first record (file) in infile processed\n" );
+	  printf(  " -- parmfile: input parameter file (e.g., interp.parms)\n" );
+	  printf(  " -- outfile: interpolated output file (ascii or binary)\n" );
+	  printf(  "\n e.g.,  gaussinterp list.dat 100 interp.parms output.dat\n" );
+	  printf(  "[process records of list.dat starting from record 100; interpolated \
+result is output.dat]\n" );
+	  printf(  "note: see interp.parms for example format of parameter file\n" );
+	  printf(  "      see gaussinterp.readme for more general information\n" );
+	  return(0);
+}

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/Fortran/armstrong_interp_code.tar
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/Fortran/armstrong_interp_code.tar b/climatology/clim/orig/Fortran/armstrong_interp_code.tar
new file mode 100755
index 0000000..4e125b3
Binary files /dev/null and b/climatology/clim/orig/Fortran/armstrong_interp_code.tar differ

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/Fortran/binsum.f
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/Fortran/binsum.f b/climatology/clim/orig/Fortran/binsum.f
new file mode 100644
index 0000000..96b65af
--- /dev/null
+++ b/climatology/clim/orig/Fortran/binsum.f
@@ -0,0 +1,64 @@
+c $Revision: 2.4 $
+c     subprogram binsum
+
+c-- calculate interpolation weights and vsum
+
+      subroutine binsum( nf, x, y, z, f, 
+     &			 xx, yy, zz, vsum,
+     &			 ixmin, ixmax, iymin,
+     &			 iymax, izmin, izmax, 
+     &			 imax, jmax, kmax, ndatamax )
+
+      real*4 x(ndatamax),y(ndatamax),z(ndatamax),f(ndatamax)
+      real*4 xx(imax),yy(jmax),zz(kmax)
+      real*4 vsum(2,imax,jmax,kmax)
+      integer*4 ixmin(ndatamax),ixmax(ndatamax)
+      integer*4 iymin(ndatamax),iymax(ndatamax)
+      integer*4 izmin(ndatamax),izmax(ndatamax)
+
+      common /parms/ imin,jmin,kmin,
+     &               xwin2,ywin2,zwin2,
+     &               xh,yh,zh,
+     &               dx,dy,dz,
+     &               xlo,xhi,ylo,yhi,zlo,
+     &               dxd,dyd
+
+      data xfac/-0.6931/
+
+      do n=1,nf
+        ixmin(n)=max(nint((x(n)-xwin2-xlo+0.5*dx)/dx),1)
+        ixmax(n)=min(nint((x(n)+xwin2-xlo+0.5*dx)/dx),imax)
+        iymin(n)=max(nint((y(n)-ywin2-ylo+0.5*dy)/dy),1)
+        iymax(n)=min(nint((y(n)+ywin2-ylo+0.5*dy)/dy),jmax)
+        izmin(n)=max(nint((z(n)-zwin2-zlo+0.5*dz)/dz),1)
+        izmax(n)=min(nint((z(n)+zwin2-zlo+0.5*dz)/dz),kmax)
+c        print *, x(n),y(n),z(n), f(n)
+c	print *,' ixmin, ixmax', ixmin(n), ixmax(n)
+c	print *,' iymin, iymax', iymin(n), iymax(n)
+c	print *,' izmin, izmax', izmin(n), izmax(n)
+      enddo
+
+
+
+      do n=1,nf 
+        do kk=izmin(n),izmax(n)
+          do jj=iymin(n),iymax(n)
+            do ii=ixmin(n),ixmax(n)
+             
+c- - this is the algorithm coded for weights
+
+                fac=exp( xfac*(((x(n)-xx(ii))/xh)**2
+     &                       + ((y(n)-yy(jj))/yh)**2
+     &			     + ((z(n)-zz(kk))/zh)**2) )
+
+c            print *, 'x, xx,  y, yy,  z, zz, fac f',
+c     &        x(n), xx(ii),  y(n), yy(jj), z(n), zz(kk), fac, f(n)
+
+                vsum(1,ii,jj,kk)=vsum(1,ii,jj,kk)+f(n)*fac
+                vsum(2,ii,jj,kk)=vsum(2,ii,jj,kk)+fac
+            enddo
+          enddo
+        enddo
+      enddo
+      return
+      end

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/Fortran/interp.f
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/Fortran/interp.f b/climatology/clim/orig/Fortran/interp.f
new file mode 100644
index 0000000..8977798
--- /dev/null
+++ b/climatology/clim/orig/Fortran/interp.f
@@ -0,0 +1,302 @@
+#include "interp.h"
+c $Revision: 2.12 $
+c subprogram interp.f
+c reads hdf file, extract data, call bisum(), calculates
+c and writes out interpolated maps
+
+
+      subroutine interp( temp, sst_inter, sst_seq, sl, 
+     &		  x, y, z, f,
+     &            xx, yy, zz, vsum, ixmin, ixmax,
+     &		  iymin, iymax, izmin, izmax, ndatamax,
+     &		  x_length, y_length, imax, jmax, kmax )
+
+      integer x_length,y_length
+      integer dummy
+
+c-- dimension the arrays
+      real*4 temp(x_length,y_length)
+      real*4 sl(imax,jmax,kmax)
+      real*4 sst_inter(kmax), sst_seq(imax)
+      real*4 x(ndatamax),y(ndatamax),z(ndatamax),f(ndatamax)
+      real*4 xx(imax),yy(jmax),zz(kmax)
+      real*4 vsum(2,imax,jmax,kmax)
+      real*4 ULlon, ULlat, LRlon, LRlat
+      integer*4 ixmin(ndatamax),ixmax(ndatamax)
+      integer*4 iymin(ndatamax),iymax(ndatamax)
+      integer*4 izmin(ndatamax),izmax(ndatamax)
+
+c-- hdf data array must be hardwired, no dync alloc :(
+      byte in_data( XSIZE, YSIZE )
+
+      character*80 plabel
+      character*50 infile
+      character*30 outfile
+      character*150 datafile
+      character*30 basename
+      character*35 tmpfile
+      character*10 mapformat
+      character*15 outformat
+      character*3 cday
+      character*4 cyr
+      character*200 zcatcmd
+
+      common /parms/ imin,jmin,kmin,
+     &               xwin2,ywin2,zwin2,
+     &               xh,yh,zh,
+     &               dx,dy,dz,
+     &               xlo,xhi,ylo,yhi,zlo,
+     &               dxd,dyd
+
+      common /fileio/ infile,outfile,istart,
+     &	              iend,mapformat,outformat	
+
+      common /hdfindex/ icolLeft,icolRight,irowUpper,irowLower
+
+      common /basefile/ basename
+
+c-- open output file
+      open(unit=20,status='new',form=outformat,file=outfile,
+     &     err=1000,iostat=ierr )
+      plabel='sst interpolation'
+
+c-- initialize vsum to '0's
+      do k1=1,2
+        do k2=1,kmax
+          do k3=1,jmax
+            do k4=1,imax
+               vsum(k1,k4,k3,k2)=0.
+            enddo
+          enddo
+        enddo
+      enddo
+
+c-- initialize arrays of long, lat and time intervals
+      do ii=imin,imax
+          xx(ii)=xlo+float(ii-1)*dx  ! Long to interpolate to
+      enddo
+      do jj=jmin,jmax
+          yy(jj)=ylo+float(jj-1)*dy  ! Lat to interpolate to
+      enddo
+      do kk=kmin,kmax
+          zz(kk)=zlo+float(kk-1)*dz  ! Time to interpolate to
+      enddo
+
+      do n=1,ndatamax
+          x(n)=0.0
+          y(n)=0.0
+          z(n)=0.0
+          f(n)=0.0
+	  ixmin(n) = 0
+	  ixmax(n) = 0
+	  iymin(n) = 0
+	  iymax(n) = 0
+	  izmin(n) = 0
+	  izmax(n) = 0
+      enddo
+
+c-- slope (cal) and offset to convert DN to SST
+      cal= 0.15
+      offset = 3.0
+
+c-- Open input file list
+      open(unit=15,status='old',file=infile,access='direct',
+     &  recl=RECSIZE,form='formatted',err=1500,iostat=ierr)
+
+c--  read a infile one record at a time and process . . .
+      do k=istart,iend
+         ipts=0
+         read( 15,'(a)',rec=k ) datafile
+c	 print *, datafile
+
+        icompress = 0 
+c--  hack to get trailing 'Z' (if compressed)
+c	do islash = 150, 1, -1
+c	    if ( datafile(islash:islash) .eq. 'Z' ) then
+c		icompress = 1 
+c	        goto 101	
+c	    endif
+c	enddo
+c101     continue
+
+c-- 12/27/99: C call for basename implemented
+c-- variable basename returned via common statement
+        call getbase( datafile ) 
+	print *,'\n file: ',  basename
+
+c--  cyr and cday parsed from basename 
+c--  (e.g., parsed from '1988332h54dd-gdm.hdf')
+         cday=basename( 5:7 )
+         cyr=basename( 1:4 )
+
+c-- if unix compressed, zcat to a temporary filename
+        if( basename(22:22) .eq. 'Z' ) then
+	    icompress = 1
+	    tmpfile = '/tmp/' // basename(1:20)
+	    zcatcmd = 'zcat ' // datafile( 1:len(datafile)-1 ) 
+     &                        // ' > ' // tmpfile
+	    call system( zcatcmd )
+	    datafile = tmpfile
+	endif
+
+c--  convert iday character to integer
+         read(cday,'(i3)') iday
+         read(cyr,'(i4)') iyr
+c         write(6,*)'cday = ',cday
+c         write(6,*)'cyr = ',cyr
+          
+c***> HDF call: d8gimg() 
+         retn=d8gimg(datafile,in_data,x_length,
+     &               y_length,dummy)
+
+c--  read hdf DN values and convert to SST
+         do  i=icolLeft, icolRight
+            do j=irowUpper, irowLower
+                xlat=-89.75+dyd*float(j-1)
+
+c-- center output in Pacific Ocean 
+c                if( i .lt. x_length ) ix = i-(x_length/2)
+c                if( i .le. (x_length/2) ) ix =  i+(x_length/2)
+
+c-- center output in Atlantic (default)
+                ix = i
+
+c--  convert signed byte to float
+c                if ( in_data(i,j) .lt. 0 .and. abs(xlat) .lt. 70. ) then
+                if ( in_data(i,j).lt. 0 ) then
+                    temp(ix,j)=float( in_data(i,j) ) + 256
+                else
+                    temp(ix,j)=float( in_data(i,j) )
+                endif
+
+
+
+C MULTIPLY THE PATHFINDER DIGITAL NUMBER BY THE CALIBRATION NUMBER (0.15)
+C AND ADD THE OFFSET (-3.0) TO GET DEGREES CELSIUS
+
+                 if ( temp(ix,j).gt.0 ) then
+                     ipts=ipts+1
+                     f(ipts)=( cal*temp(ix,j) ) - offset
+                     x(ipts) = ( dxd*float(ix-1) ) - 180. + dxd/2 
+                     y(ipts) = ( 90. - (dyd*float(j-1)) ) - dyd/2
+                     z(ipts)=float(iday)+float(iyr-1985)*365.
+                     if(iyr.gt.1988) z(ipts)=z(ipts)+1
+                     if(iyr.gt.1992) z(ipts)=z(ipts)+1
+                     if(iyr.gt.1996) z(ipts)=z(ipts)+1
+                     if(iyr.gt.2000) z(ipts)=z(ipts)+1
+                     if(iyr.gt.2004) z(ipts)=z(ipts)+1
+                 endif
+            enddo
+         enddo
+
+         nfnew=ipts
+         print *, ' no of pts in file ',' = ', nfnew
+
+c-- calculate interpolation weights and vsum 
+c-- arrays passed directly... a common statement 
+c-- does not seem to work.
+        call  binsum( nfnew, x, y, z, f, 
+     &                xx, yy, zz, vsum,
+     &                ixmin, ixmax, iymin,
+     &                iymax, izmin, izmax, 
+     &                imax, jmax, kmax, ndatamax )
+
+        if( icompress .eq. 1 ) call system( 'rm -f ' // tmpfile )
+c-- ..... read next hdf file from infile
+      enddo
+
+c-- all input files processed; calculate interpolated SST   
+      do kk=1,kmax
+        do jj=1,jmax
+          do ii=1,imax
+            sl(ii,jj,kk)=0.
+            if (vsum(2,ii,jj,kk).gt.0) then
+                sl(ii,jj,kk)=vsum(1,ii,jj,kk)/vsum(2,ii,jj,kk)
+            endif
+          enddo
+        enddo
+      enddo
+
+c-- write output as map "interleaved" or map "sequential"
+c-- "interleaved" is the original implementation
+c-- both formats preceded by header 
+
+c-- "interleaved" refers to each row in the output
+c-- file representing a unique lon, lat position with columns 
+c-- of associated sst values (maps) 
+c-- i.e. row one: lon1 lat1 sst1 sst2 sst3....lastsst
+c--      row two: lon2 lat1 sst1 sst2 sst3....lastsst
+
+c-- "sequential" refers to each map written as rows and
+c-- columns of lat, lon with the array element representing the
+c-- sst at that geo-position for that map.
+c-- each map is written sequentially in the file 
+
+c-- geo-positions of UL and LR corners
+          ULlon = -(180 - ( ((icolLeft-1) * dxd) + dxd/2 ))  
+	  ULlat = (90 - ( ((irowUpper-1) * dyd) + dyd/2 ))
+          LRlon = -(180 - ( (icolRight * dxd) - dxd/2 ))  
+	  LRlat = (90 - ( (irowLower * dyd) - dyd/2 ))
+
+c-- version number, "f" refers to fortran version
+      version = 'f2.9' 
+
+c-- write the 3 record header
+      if( outformat .eq. 'formatted' ) then
+          write(20,'(a)'), plabel
+          write(20,*) imax,jmax,kmax
+          write(20,*) dx,dy,dz 
+	  write(20,*) ULlon,ULlat,LRlon,LRlat
+      elseif( outformat .eq. 'unformatted' ) then
+          write(20) imax,jmax,kmax
+          write(20) dx,dy,dz
+	  write(20) ULlon,ULlat,LRlon,LRlat
+      endif
+
+      if( mapformat .eq. 'interleave' ) then
+        print *, '\n map output is interleave'
+        do jj=1,jmax
+          do ii=1,imax
+            do kk=1,kmax
+                sst_inter(kk)=sl(ii,jj,kk)
+            enddo
+            if( outformat .eq. 'formatted' ) then
+		write(20,*) ii,jj,sst_inter
+            else 
+	        write(20) ( sst_inter(i), i=1,kmax ) 
+            endif
+          enddo
+        enddo
+
+      else if( mapformat .eq. 'sequential' ) then
+        print *, '\n map output is sequential'
+        do kk=1,kmax
+          do jj=1,jmax
+            do ii=1,imax
+               sst_seq(ii)=sl(ii,jj,kk)
+             enddo
+             if( outformat .eq. 'formatted' ) then
+		 write(20,*) jj,kk,sst_seq
+             else
+		 write(20) ( sst_seq(i), i=1,imax )
+             endif
+          enddo
+        enddo
+      endif
+
+      print *,  '\ndone. . . '
+      close( 15,status='keep',err=2000,iostat=ierr )
+      close( 20,status='keep',err=2500,iostat=ierr )
+      stop
+
+ 1000 print *, 'Error opening output: ', outfile, 'error num: ', ierr
+      goto 102
+ 1500 print *, 'Error opening input: ', infile, 'error num: ', ierr
+      goto 102
+ 2000 print *, 'Error closing input: ', infile, 'error num: ', ierr
+      goto 102
+ 2500 print *, 'Error closing output: ', outfile, 'error num: ', ierr
+      goto 102
+ 102  continue
+
+      end

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/Fortran/makefile
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/Fortran/makefile b/climatology/clim/orig/Fortran/makefile
new file mode 100644
index 0000000..a624096
--- /dev/null
+++ b/climatology/clim/orig/Fortran/makefile
@@ -0,0 +1,46 @@
+# makefile for guassinterp. 
+# choose f77 or f90 compiler 
+# and appropriate flags 
+
+# f77 compiler 
+FC  = f77
+FFLAGS = -g    
+#FFLAGS = -O -n32   
+DEFINE =  -DLANG_F77
+HDF = /usr/local/hdf
+#HDF = /usr/local/hdf4.1r3-n32
+
+# f90 compiler
+#FC = f90
+#FFLAGS = -n32 -bytereclen -cpp -extend_source
+#DEFINE =  -DLANG_F90
+
+PGM = gaussinterp
+LIBS    = -L$(HDF)/lib -ldf -ljpeg -lz -lgen
+INCLUDE = -Wf,-I/usr/local/include/hdf
+BIN = /sst/vol7/PATHFINDER/bin/sgi
+
+SRC = setupinterp.f interp.f binsum.f getbase.c passbase.f
+OBJ = setupinterp.o interp.o binsum.o getbase.o passbase.o
+
+$(PGM):	$(OBJ)
+	$(FC) $(FFLAGS) -o $(PGM) $(OBJ) $(LIBS) 
+
+setupinterp.o: 
+	$(FC) $(FFLAGS) $(DEFINE) -c setupinterp.f
+interp.o:
+#	$(FC) $(DEFINE) -c interp.f
+	$(FC) $(FFLAGS) $(DEFINE) -c interp.f
+binsum.o:
+	$(FC) $(FFLAGS) $(DEFINE) -c binsum.f
+passbase.o:
+	$(FC) $(FFLAGS) $(DEFINE) -c passbase.f
+getbase.o:
+	$(CC) $(FFLAGS) -c getbase.c
+
+install: $(PGM)
+	 cp  $(PGM) $(BIN)
+
+clean:
+	 rm -f $(OBJ) $(PGM)
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/orig/Fortran/passbase.f
----------------------------------------------------------------------
diff --git a/climatology/clim/orig/Fortran/passbase.f b/climatology/clim/orig/Fortran/passbase.f
new file mode 100644
index 0000000..79e2d8e
--- /dev/null
+++ b/climatology/clim/orig/Fortran/passbase.f
@@ -0,0 +1,9 @@
+      subroutine passbase( filename )
+
+      character*25 filename
+      character*25 basename
+      common /basefile/ basename
+
+      basename = filename
+      end
+