Index: /trunk/psLib/src/types/psMetadata.c
===================================================================
--- /trunk/psLib/src/types/psMetadata.c	(revision 6547)
+++ /trunk/psLib/src/types/psMetadata.c	(revision 6548)
@@ -12,6 +12,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.100 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-03-07 03:03:33 $
+ *  @version $Revision: 1.101 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-03-08 21:09:16 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -47,5 +47,4 @@
 /** Maximum size of a string */
 #define MAX_STRING_LENGTH 1024
-#define HASH_SIZE 256
 
 /******************************************************************************/
@@ -328,5 +327,5 @@
     // Allocate metadata's internal containers
     list = (psList*) psListAlloc(NULL);
-    hash = (psHash*) psHashAlloc(HASH_SIZE);
+    hash = (psHash*) psHashAlloc(10);
 
     metadata->list = list;
@@ -1151,2 +1150,225 @@
 }
 
+psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder)
+{
+
+    bool status;
+    char keyword[80];
+
+    // get polynomial orders
+    // XXX add status failures tests
+    int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
+    int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
+
+    psPolynomial2D *poly = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXorder, nYorder);
+
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            sprintf (keyword, "VAL_X%02d_Y%02d", nx, ny);
+            poly->coeff[nx][ny] = psMetadataLookupF64 (&status, folder, keyword);
+            if (!status)
+                poly->mask[nx][ny] = 1;
+
+            sprintf (keyword, "ERR_X%02d_Y%02d", nx, ny);
+            poly->coeffErr[nx][ny] = psMetadataLookupF64 (&status, folder, keyword);
+        }
+    }
+    return (poly);
+}
+
+// XXX : these may need F64, or %g format for output
+bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...)
+{
+
+    int Nbyte;
+    char tmp;
+    char *root;
+    va_list argp;
+
+    va_start (argp, format);
+    Nbyte = vsnprintf (&tmp, 0, format, argp);
+    va_end (argp);
+
+    if (!Nbyte)
+        return false;
+
+    va_start (argp, format);
+    root = (char *) psAlloc (Nbyte + 1);
+    memset (root, 0, Nbyte + 1);
+    vsnprintf (root, Nbyte + 1, format, argp);
+    va_end (argp);
+
+    psMetadata *folder = psMetadataAlloc ();
+    psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 2D polynomial", folder);
+    psFree (root);
+
+    // specify the polynomial orders
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
+
+    // place polynomial entries on folder
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            if (poly->mask[nx][ny])
+                continue;
+            psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d", PS_DATA_F64, "polynomial coefficient", poly->coeff[nx][ny], nx, ny);
+            psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d", PS_DATA_F64, "polynomial coefficient error", poly->coeffErr[nx][ny], nx, ny);
+        }
+    }
+    return true;
+}
+
+psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder)
+{
+
+    bool status;
+    char keyword[80];
+
+    // get polynomial orders
+    // XXX add status failures tests
+    int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
+    int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
+    int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");
+
+    psPolynomial3D *poly = psPolynomial3DAlloc (PS_POLYNOMIAL_ORD, nXorder, nYorder, nZorder);
+
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            for (int nz = 0; nz < poly->nZ + 1; nz++) {
+                sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d", nx, ny, nz);
+                poly->coeff[nx][ny][nz] = psMetadataLookupF64 (&status, folder, keyword);
+                if (!status)
+                    poly->mask[nx][ny][nz] = 1;
+
+                sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d", nx, ny, nz);
+                poly->coeffErr[nx][ny][nz] = psMetadataLookupF64 (&status, folder, keyword);
+            }
+        }
+    }
+    return (poly);
+}
+
+bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...)
+{
+
+    int Nbyte;
+    char tmp;
+    char *root;
+    va_list argp;
+
+    va_start (argp, format);
+    Nbyte = vsnprintf (&tmp, 0, format, argp);
+    va_end (argp);
+
+    if (!Nbyte)
+        return false;
+
+    va_start (argp, format);
+    root = (char *) psAlloc (Nbyte + 1);
+    memset (root, 0, Nbyte + 1);
+    vsnprintf (root, Nbyte + 1, format, argp);
+    va_end (argp);
+
+    psMetadata *folder = psMetadataAlloc ();
+    psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 3D polynomial", folder);
+    psFree (root);
+
+    // specify the polynomial orders
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);
+
+    // place polynomial entries on folder
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            for (int nz = 0; nz < poly->nZ + 1; nz++) {
+                if (poly->mask[nx][ny][nz])
+                    continue;
+                psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d", PS_DATA_F64, "polynomial coefficient", poly->coeff[nx][ny][nz], nx, ny, nz);
+                psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d", PS_DATA_F64, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz], nx, ny, nz);
+            }
+        }
+    }
+    return true;
+}
+
+
+psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder)
+{
+
+    bool status;
+    char keyword[80];
+
+    // get polynomial orders
+    // XXX add status failures tests
+    int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
+    int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
+    int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");
+    int nTorder = psMetadataLookupS32 (&status, folder, "NORDER_T");
+
+    psPolynomial4D *poly = psPolynomial4DAlloc (PS_POLYNOMIAL_ORD, nXorder, nYorder, nZorder, nTorder);
+
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            for (int nz = 0; nz < poly->nZ + 1; nz++) {
+                for (int nt = 0; nt < poly->nT + 1; nt++) {
+                    sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);
+                    poly->coeff[nx][ny][nz][nt] = psMetadataLookupF64 (&status, folder, keyword);
+                    if (!status)
+                        poly->mask[nx][ny][nz][nt] = 1;
+
+                    sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);
+                    poly->coeffErr[nx][ny][nz][nt] = psMetadataLookupF64 (&status, folder, keyword);
+                }
+            }
+        }
+    }
+    return (poly);
+}
+
+bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...)
+{
+
+    int Nbyte;
+    char tmp;
+    char *root;
+    va_list argp;
+
+    va_start (argp, format);
+    Nbyte = vsnprintf (&tmp, 0, format, argp);
+    va_end (argp);
+
+    if (!Nbyte)
+        return false;
+
+    va_start (argp, format);
+    root = (char *) psAlloc (Nbyte + 1);
+    memset (root, 0, Nbyte + 1);
+    vsnprintf (root, Nbyte + 1, format, argp);
+    va_end (argp);
+
+    psMetadata *folder = psMetadataAlloc ();
+    psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 4D polynomial", folder);
+    psFree (root);
+
+    // specify the polynomial orders
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);
+    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_T", PS_DATA_S32, "number of z orders", poly->nT);
+
+    // place polynomial entries on folder
+    for (int nx = 0; nx < poly->nX + 1; nx++) {
+        for (int ny = 0; ny < poly->nY + 1; ny++) {
+            for (int nz = 0; nz < poly->nZ + 1; nz++) {
+                for (int nt = 0; nt < poly->nT + 1; nt++) {
+                    if (poly->mask[nx][ny][nz][nt])
+                        continue;
+                    psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F64, "polynomial coefficient", poly->coeff[nx][ny][nz][nt], nx, ny, nz, nt);
+                    psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F64, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz][nt], nx, ny, nz, nt);
+                }
+            }
+        }
+    }
+    return true;
+}
