Index: /trunk/psLib/src/astronomy/psAstrometry.c
===================================================================
--- /trunk/psLib/src/astronomy/psAstrometry.c	(revision 2051)
+++ /trunk/psLib/src/astronomy/psAstrometry.c	(revision 2052)
@@ -8,6 +8,6 @@
  *  @author George Gusciora, MHPCC
  *
- *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-12 01:34:09 $
+ *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-12 19:10:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -352,6 +352,12 @@
     newFPA->toTangentPlane = NULL;
     newFPA->pattern = NULL;
-    newFPA->exposure = psMemIncrRefCounter((psExposure*)exp);
-    newFPA->grommit = psGrommitAlloc(exp);
+
+    if (exp != NULL) {
+        newFPA->exposure = psMemIncrRefCounter((psExposure*)exp);
+        newFPA->grommit = psGrommitAlloc(exp);
+    } else {
+        newFPA->exposure = NULL;
+        newFPA->grommit = NULL;
+    }
 
     newFPA->colorPlus = NULL;
@@ -455,6 +461,4 @@
 psGrommit* psGrommitAlloc(const psExposure* exp)
 {
-    double* AOPRMS = psAlloc(sizeof(double)*14);
-
     if (exp == NULL) {
         psAbort(__func__, "the 'exp' parameter is NULL\n");
@@ -478,24 +482,8 @@
     double tlr = exp->observatory->tlr;
 
+    psGrommit* grommit = (psGrommit* ) psAlloc(sizeof(psGrommit));
+
     slaAoppa(date, dut, elongm, phim, hm, xp, yp,
-             tdk, pmb, rh, wl, tlr, AOPRMS);
-
-    psGrommit* grommit = (psGrommit* ) psAlloc(sizeof(psGrommit));
-    *(double *)&grommit->latitude = AOPRMS[0];
-    *(double *)&grommit->sinLat = AOPRMS[1];
-    *(double *)&grommit->cosLat = AOPRMS[2];
-    *(double *)&grommit->height = AOPRMS[3];
-    *(double *)&grommit->abberationMag = AOPRMS[4];
-    *(double *)&grommit->temperature = AOPRMS[5];
-    *(double *)&grommit->pressure = AOPRMS[6];
-    *(double *)&grommit->humidity = AOPRMS[7];
-    *(double *)&grommit->wavelength = AOPRMS[8];
-    *(double *)&grommit->lapseRate = AOPRMS[9];
-    *(double *)&grommit->refractA = AOPRMS[10];
-    *(double *)&grommit->refractB = AOPRMS[11];
-    *(double *)&grommit->longitudeOffset = AOPRMS[12];
-    *(double *)&grommit->siderealTime = AOPRMS[13];
-
-    psFree(AOPRMS);
+             tdk, pmb, rh, wl, tlr, (double*)grommit);
 
     return (grommit);
@@ -680,5 +668,5 @@
     }
 
-    slaAopqk(tpCoord->x, tpCoord->y, (double *) grommit,
+    slaAopqk(tpCoord->x, tpCoord->y, (double*)grommit,
              &AOB, &ZOB, &HOB, &outSphere->r, &outSphere->d);
 
@@ -782,4 +770,6 @@
                         const psGrommit* grommit)
 {
+    char* type = "RA";
+
     if (in == NULL) {
         psAbort(__func__, "input parameter in is NULL.");
@@ -792,5 +782,5 @@
     }
 
-    slaOapqk("RA", in->r, in->d, (double *) grommit, &tpCoord->x, &tpCoord->y);
+    slaOapqk(type, in->r, in->d, (double*)grommit, &tpCoord->x, &tpCoord->y);
 
     return(tpCoord);
Index: /trunk/psLib/src/astronomy/slalib.h
===================================================================
--- /trunk/psLib/src/astronomy/slalib.h	(revision 2051)
+++ /trunk/psLib/src/astronomy/slalib.h	(revision 2052)
@@ -7,6 +7,6 @@
 *  @author Robert DeSonia, MHPCC
 *
-*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-08-26 21:11:55 $
+*  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-10-12 19:10:00 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -19,31 +19,31 @@
 #ifdef FORTRAN_DOUBLE_UNDERSCORE_SUFFIX
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa _SLA_AOPPA__
-#define slaAopqk _SLA_AOPQK__
-#define slaOapqk _SLA_OAPQK__
+#define fslaAoppa _SLA_AOPPA__
+#define fslaAopqk _SLA_AOPQK__
+#define fslaOapqk _SLA_OAPQK__
 #else
-#define slaAoppa _sla_aoppa__
-#define slaAopqk _sla_aopqk__
-#define slaOapqk _sla_oapqk__
+#define fslaAoppa _sla_aoppa__
+#define fslaAopqk _sla_aopqk__
+#define fslaOapqk _sla_oapqk__
 #endif
 #elif FORTRAN_NO_UNDERSCORE_SUFFIX
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa _SLA_AOPPA
-#define slaAopqk _SLA_AOPQK
-#define slaOapqk _SLA_OAPQK
+#define fslaAoppa _SLA_AOPPA
+#define fslaAopqk _SLA_AOPQK
+#define fslaOapqk _SLA_OAPQK
 #else
-#define slaAoppa _sla_aoppa
-#define slaAopqk _sla_aopqk
-#define slaOapqk _sla_oapqk
+#define fslaAoppa _sla_aoppa
+#define fslaAopqk _sla_aopqk
+#define fslaOapqk _sla_oapqk
 #endif
 #else
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa _SLA_AOPPA_
-#define slaAopqk _SLA_AOPQK_
-#define slaOapqk _SLA_OAPQK_
+#define fslaAoppa _SLA_AOPPA_
+#define fslaAopqk _SLA_AOPQK_
+#define fslaOapqk _SLA_OAPQK_
 #else
-#define slaAoppa _sla_aoppa_
-#define slaAopqk _sla_aopqk_
-#define slaOapqk _sla_oapqk_
+#define fslaAoppa _sla_aoppa_
+#define fslaAopqk _sla_aopqk_
+#define fslaOapqk _sla_oapqk_
 #endif
 #endif
@@ -51,70 +51,126 @@
 #ifdef FORTRAN_DOUBLE_UNDERSCORE_SUFFIX
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa SLA_AOPPA__
-#define slaAopqk SLA_AOPQK__
-#define slaOapqk SLA_OAPQK__
+#define fslaAoppa SLA_AOPPA__
+#define fslaAopqk SLA_AOPQK__
+#define fslaOapqk SLA_OAPQK__
 #else
-#define slaAoppa sla_aoppa__
-#define slaAopqk sla_aopqk__
-#define slaOapqk sla_oapqk__
+#define fslaAoppa sla_aoppa__
+#define fslaAopqk sla_aopqk__
+#define fslaOapqk sla_oapqk__
 #endif
 #elif FORTRAN_NO_UNDERSCORE_SUFFIX
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa SLA_AOPPA
-#define slaAopqk SLA_AOPQK
-#define slaOapqk SLA_OAPQK
+#define fslaAoppa SLA_AOPPA
+#define fslaAopqk SLA_AOPQK
+#define fslaOapqk SLA_OAPQK
 #else
-#define slaAoppa sla_aoppa
-#define slaAopqk sla_aopqk
-#define slaOapqk sla_oapqk
+#define fslaAoppa sla_aoppa
+#define fslaAopqk sla_aopqk
+#define fslaOapqk sla_oapqk
 #endif
 #else
 #ifdef FORTRAN_UPPERCASE
-#define slaAoppa SLA_AOPPA_
-#define slaAopqk SLA_AOPQK_
-#define slaOapqk SLA_OAPQK_
+#define fslaAoppa SLA_AOPPA_
+#define fslaAopqk SLA_AOPQK_
+#define fslaOapqk SLA_OAPQK_
 #else
-#define slaAoppa sla_aoppa_
-#define slaAopqk sla_aopqk_
-#define slaOapqk sla_oapqk_
+#define fslaAoppa sla_aoppa_
+#define fslaAopqk sla_aopqk_
+#define fslaOapqk sla_oapqk_
 #endif
 #endif
 #endif
 
-extern void slaAoppa (
-        double date,
-        double dut,
-        double elongm,
-        double phim,
-        double him,
-        double xp,
-        double yp,
-        double tdk,
-        double pmb,
-        double rh,
-        double wl,
-        double tlr,
-        double *AOPRMS
+extern void fslaAoppa(
+        const double* date,
+        const double* dut,
+        const double* elongm,
+        const double* phim,
+        const double* him,
+        const double* xp,
+        const double* yp,
+        const double* tdk,
+        const double* pmb,
+        const double* rh,
+        const double* wl,
+        const double* tlr,
+        double* AOPRMS
     );
 
-extern void slaAopqk (
-        double RAP,
-        double DAP,
-        double *AOPRMS,
-        double *AOB,
-        double *ZOB,
-        double *HOB,
-        double *DOB,
-        double *ROB
+extern void fslaAopqk(
+        const double* RAP,
+        const double* DAP,
+        double* AOPRMS,
+        double* AOB,
+        double* ZOB,
+        double* HOB,
+        double* DOB,
+        double* ROB
     );
 
-extern void slaOapqk (
-        char *TYPE,
-        double OB1,
-        double OB2,
-        double *AOPRMS,
-        double *RAP,
-        double *DAP
+extern void fslaOapqk(
+        char* TYPE,
+        const double* OB1,
+        const double* OB2,
+        double* AOPRMS,
+        double* RAP,
+        double* DAP
     );
 
+/*
+    void slaAoppa(date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, aoprms)
+    
+    PARAMETERS
+    
+    double date
+    double dut
+    double elongm
+    double phim
+    double hm
+    double xp
+    double yp
+    double tdk
+    double pmb
+    double rh
+    double wl
+    double tlr
+    double *aoprms
+*/
+#define slaAoppa(date,dut,elongm,phim,him,xp,yp,tdk,pmb,rh,wl,tlr,AOPRMS) \
+fslaAoppa(&date,&dut,&elongm,&phim,&him,&xp,&yp,&tdk,&pmb,&rh,&wl,&tlr,AOPRMS)
+
+/*
+    void slaAopqk(rap, dap, aoprms, aob, zob, hob, dob, rob)
+    
+    PARAMETERS
+    
+    double rap
+    double dap
+    double *aoprms
+    double *aob
+    double *zob
+    double *hob
+    double *dob
+    double *rob
+*/
+
+#define slaAopqk(RAP,DAP,AOPRMS,AOB,ZOB,HOB,DOB,ROB) \
+fslaAopqk(&RAP,&DAP,AOPRMS,AOB,ZOB,HOB,DOB,ROB)
+
+/*
+    void slaOapqk(type, ob1, ob2, aoprms, rap, dap)
+    
+    PARAMETERS
+    
+    char *type
+    double ob1
+    double ob2
+    double *aoprms
+    double *rap
+    double *dap
+*/
+
+#define slaOapqk(TYPE, OB1, OB2, AOPRMS, RAP, DAP) \
+fslaOapqk(TYPE, &OB1, &OB2, AOPRMS, RAP, DAP)
+
 #endif
Index: /trunk/psLib/test/astronomy/tst_psAstrometry.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psAstrometry.c	(revision 2051)
+++ /trunk/psLib/test/astronomy/tst_psAstrometry.c	(revision 2052)
@@ -5,6 +5,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-12 01:34:09 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-12 19:10:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -20,5 +20,5 @@
 static int testObservatoryAlloc(void);
 static int testFPAAlloc(void);
-// static int testGrommitAlloc(void);
+static int testChipAlloc(void);
 
 testDescription tests[] = {
@@ -26,4 +26,5 @@
                               {testObservatoryAlloc,736,"psObservatoryAlloc",0,false},
                               {testFPAAlloc,739,"psFPAAlloc",0,false},
+                              {testChipAlloc,740,"psChipAlloc",0,false},
                               {NULL}
                           };
@@ -319,5 +320,150 @@
     psFree(exp);
     psFree(obs);
+    psFree(now);
 
     return 0;
 }
+
+static int testChipAlloc(void)
+{
+    char* name = "The Kaiser Royal Observatory";
+
+    psTime* now = psTimeGetTime(PS_TIME_UTC);
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7*M_PI/180.0, 156.3*M_PI/180.0, 3055.0, 0.0065f);
+
+    psExposure* exp = psExposureAlloc(1.0, 2.0, 3.0, 4.0, 5.0,
+                                      now, 6.0f, 260.0f, 1013.0f, 0.7f, 10.0f, 0.650f, obs);
+
+    psFPA* fpa = psFPAAlloc(8, exp);
+
+    // N.B. psFPAAlloc made made a reference to any of these that it is
+    // referencing, so these don't necessary are actually freed here.  Just
+    // these references to the buffers are freed.
+    psFree(exp);
+    psFree(obs);
+    psFree(now);
+
+    /*
+        1. invoke psChipAlloc with nCells > 0 and parentFPA non-NULL. Verify 
+           that:
+        a. the cells array is of the size nCells and all elements are NULL.
+        b. parent attribute is set to parentFPA parameter and the ref. count 
+           was incremented.
+        c. all other attributes are initialized to NULL or 0.
+    */
+
+    psChip* chip = psChipAlloc(8, fpa);
+
+    if (chip == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 1;
+    }
+
+    if (chip->cells->n != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 2;
+    }
+
+    for (int lcv=0; lcv < 8; lcv++) {
+        if (chip->cells->data[lcv] != NULL) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psChipAlloc did not set cell %d to NULL.", lcv);
+            return 3;
+        }
+    }
+
+    if (chip->parent != fpa) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent properly.");
+        return 4;
+    }
+
+    if (psMemGetRefCounter(fpa) != 2) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not increment reference counter for parent FPA.");
+        return 5;
+    }
+
+    if (chip->metadata != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set metadata to NULL.");
+        return 6;
+    }
+
+    if (chip->toFPA != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set toFPA to NULL.");
+        return 7;
+    }
+
+    if (chip->fromFPA != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set fromFPA to NULL.");
+        return 8;
+    }
+
+    /*
+        2. invoke psChipAlloc with nCells = 0. Verify that:
+        a. execution does not halt
+        b. the cells array is of the size of zero.    
+    */
+
+    psChip* chip2 = psChipAlloc(0,fpa);
+
+    if (chip2 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 11;
+    }
+
+    if (chip2->cells->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 12;
+    }
+
+    if (chip2->parent != fpa) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent properly.");
+        return 14;
+    }
+
+    if (psMemGetRefCounter(fpa) != 3) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not increment reference counter for parent FPA.");
+        return 15;
+    }
+
+    /*
+        3. invoke psChipAlloc with parentFPA = NULL. Verify that parent 
+           attribute is NULL and no error is generated.
+    */
+
+    psChip* chip3 = psChipAlloc(8,NULL);
+
+    if (chip3 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 21;
+    }
+
+    if (chip3->cells->n != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 22;
+    }
+
+    if (chip3->parent != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent to NULL.");
+        return 24;
+    }
+
+    psFree(chip);
+    psFree(chip2);
+    psFree(chip3);
+    psFree(fpa);
+
+    return 0;
+}
