/**
*  @file themis_esa2nc.c
*  @brief Stand alone executable to tranform Themis (Burst & Reduced modes) CDF to DD netCDF
*  @version $Id: themis_esa2nc.c,v 1.5 2013/11/29 14:11:56 budnik Exp $
*/
 /**************************************************************/
 /*  THEMIS ESA ION AND ELECTRON Burst & Reduced CDF -> DD netCDF      */
 /*                                                                    */
 /*                    Energy in  info  file                           */
 /*    New CDF with peib & peir and new params                         */
 /*    04.01.2008 - 2 files (sp & mom) for peir[b] & peer[b] modes    */
 /**************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <netcdf.h>
#include <cdf.h>
#include <DD.h>
#include <string.h>
#include <time.h>
#include <math.h>

#define TimeGap  3600.0
#define Source "themis@cdpp2"
#define MAX_FILE_NAME_LEN  250                   // Max. file name length
#define MAX_VARS           250                   // Max # of VARS in CDF


/*************************************
   Global variables and structures
**************************************/
long   CDFDims,                                         // Number of dimensions in a CDF file
       CDFVars,                                            // Number of variables in a CDF file
       CDFDimSizes[CDF_MAX_DIMS],      // Dimension Sizes in a CDF file
       CDFencoding,                                    // Data encoding
       CDFmajority,                                      // Variable majority
       CDFmaxRec,                                     // max Record number
       CDFAttrs;                                          // number of CDF Attributes


struct cdfvar {                              // CDF variable structure
     char name[CDF_VAR_NAME_LEN+1];
     long num;                                //variable number
     long datatype;
     long numElem;                     // variable dimensionality
     long recVariance;                 // variable rec Variance
     long dimVariances[CDF_MAX_DIMS];  // # of data values in dimSizes
} cdfVar[MAX_VARS];

char mode[4];
int  ncID, ncSpID;
char ncFile[] = "peir000000000.nc";
char ncSpFile[] = "speir000000000.nc";
int TimeDimID, TimeLengthID, DataID, DataSpID, Data2ID;
int TimeDimSpID, TimeLengthSpID, FluxDimID;                 // ID of netCDF dimensions
int TimeDimVector[2], DataDimVector[2],  Data2DimVector[2], FluxDimVector[2];      // netCDF Dim vectors
int TimeDimSpVector[2], DataDimSpVector[2]; 
size_t Start[2] = {0L,0L};
size_t TimeCount[2] = {1L,TIMELENGTH};
size_t Data1Count[2] = {1L,1L};
size_t DataCount[2] = {1L,3L};
size_t Data2Count[2] = {1L,6L};
size_t FluxCount[2] = {1L,32L};

CDFstatus   cstatus;           // CDF status code

char Version[]="v01";
char ThemisID[]="tha\0";
char ThemisTime[]="tha_peif_time";
char PAR0[]="tha_peif_delta_time";
char PAR1[]="tha_peif_mode";
char PAR2[]="tha_peif_density";
char PAR3[]="tha_peif_velocity_gse";
char PAR4[]="tha_peif_t3";  // Diagonilized Temperature
char PAR5[]="tha_peif_en_eflux";
char PAR6[]="tha_peif_en_eflux_yaxis";
char PAR7[]="tha_peif_avgtemp"; // trace of t3 divided by 3
char PAR8[]="tha_peif_vthermal";
char PAR9[]="tha_peif_sc_pot";
char PAR10[]="tha_peif_sc_current";
char PAR11[]="tha_peif_magt3"; // Temperature in Mag Field frame
char PAR12[]="tha_peif_ptens"; // Pressure Tensor DSL
char PAR13[]="tha_peif_mftens"; // Momentum Flux Tensor DSL
char PAR14[]="tha_peif_flux"; // particle flux
char PAR15[]="tha_peif_symm"; // Direction of pressure tensor symmetry in DSL
char PAR16[]="tha_peif_symm_ang"; // Angle between Direction of pressure tensor symmetry  and B


int StartTimeID, StopTimeID;
int StartTimeSpID, StopTimeSpID;
int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID;                   // 1D
int MfTempID, TempID, ModeID, ModeSpID, VelID, Flux2ID, SymmID;                               // 2D -> 3
int prTenID, mfTenID;                                                               // 2D -> 6
int FluxID;                                                                   // 2D -> 32
int TimeID;                                                                         // Time netCDF variable
int TimeSpID; 
  
char StartT[TIMELENGTH]; // Start time from  data
char StopT[TIMELENGTH];  // Stop time from  data
/**************************
   Function prototypes
**************************/
void usage();
void cdf_handle_error (CDFstatus);
void nc_handle_error (int);
void removeFilepath();
void removeCDFext();
void removeVers();
void ncdefine();
/*--------------------------------------------------------------------------*/
void usage()
{
   printf ("\nDescription:\n");
   printf ("    This program converts a themis CDF file into a netCDF file.\n");
   printf ("\n");
   printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n");
   printf ("\n");
   printf ("Example: esa2nc testfile tha peif\n");
   printf ("\n");
   exit(1);
}
/*--------------------------------------------------------------------------
 *  Handles a CDF error.
 *--------------------------------------------------------------------------*/
void cdf_handle_error(CDFstatus status)
{

  char  message[CDF_STATUSTEXT_LEN+1];

   CDFerror (status, message);              /* Get the appropriate message */
   fprintf  (stderr, "CDF: %s\n", message);
//   exit(1);
}
/*--------------------------------------------------------------------------
 *  Handles a netCDF error.
 *--------------------------------------------------------------------------*/
void nc_handle_error(int status)
{
  fprintf(stderr, "%s\n", nc_strerror(status));
  exit(1);
}

/*--------------------------------------------------------------------------
 *  NetCDF File Definition  *
 *--------------------------------------------------------------------------*/
 void ncdefine(double Time)
 {
    char *s;
    time_t p;
    int status;
    char *STime;

/*********************** Create netCDF file *****************************/
      memcpy(&(ncFile[0]),&(mode[0]), 4);
      STime = Double2DD_Time(Time);
      memcpy(&(ncFile[4]),&(STime[2]), 9);
      if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR)
                                                      nc_handle_error(status);
/******************netCDF Dimensions *******************************/
        nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID);
        nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID);
        nc_def_dim (ncID, "Data",3L, &DataID); 
        nc_def_dim (ncID, "Data2",6L, &Data2ID);

/********************netCDF Variables ******************/
       TimeDimVector[0] = TimeDimID;       
       DataDimVector[0] = TimeDimID;
       Data2DimVector[0] = TimeDimID;
       TimeDimVector[1] = TimeLengthID;
       DataDimVector[1] = DataID;  
       Data2DimVector[1] = Data2ID;

//
       nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID);
      
       nc_def_var (ncID, "DeltaT", NC_DOUBLE, 1, &TimeDimID, &DeltaTID);
       nc_def_var (ncID, "Mode", NC_FLOAT, 2, DataDimVector, &ModeID);
      
       nc_def_var (ncID, "Density", NC_DOUBLE, 1, &TimeDimID, &DensID);
       nc_def_var (ncID, "AvTemp", NC_DOUBLE, 1, &TimeDimID, &AvTempID);
       nc_def_var (ncID, "Potential", NC_DOUBLE, 1, &TimeDimID, &PotID);
       nc_def_var (ncID, "Current", NC_DOUBLE, 1, &TimeDimID, &CurrID);
       nc_def_var (ncID, "SymAngle", NC_DOUBLE, 1, &TimeDimID, &SymAngID);
       nc_def_var (ncID, "V_thermal", NC_DOUBLE, 1, &TimeDimID, &ThVelID);
       nc_def_var (ncID, "Velocity", NC_DOUBLE, 2, DataDimVector, &VelID);
       nc_def_var (ncID, "Temperature", NC_DOUBLE, 2, DataDimVector, &TempID);
       nc_def_var (ncID, "B_Temperature", NC_DOUBLE, 2, DataDimVector, &MfTempID);
       nc_def_var (ncID, "Flux_tot", NC_DOUBLE, 2, DataDimVector, &Flux2ID);
       nc_def_var (ncID, "Symm", NC_DOUBLE, 2, DataDimVector, &SymmID);  
       nc_def_var (ncID, "tensor_p", NC_DOUBLE, 2, Data2DimVector, &prTenID);
       nc_def_var (ncID, "tensor_mf", NC_DOUBLE, 2, Data2DimVector, &mfTenID);
  
       nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID);
       nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID);
     

       

       nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID);
       nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source);
       nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3");
       nc_put_att_text(ncID, TempID, "Units", 2, "eV"); 
       nc_put_att_text(ncID, TempID, "Frame", 2, "FA"); 
       nc_put_att_text(ncID, TempID, "Order", 16, "perp1,perp2,para");
       nc_put_att_text(ncID, MfTempID, "Units", 2, "eV");
       nc_put_att_text(ncID, MfTempID, "Frame", 2, "FA");
       nc_put_att_text(ncID, MfTempID, "Order", 16, "perp1,perp2,para");
       nc_put_att_text(ncID, AvTempID, "Units", 2, "eV");  
       nc_put_att_text(ncID, prTenID, "Units", 2, "eV");
       nc_put_att_text(ncID, prTenID, "Frame", 3, "DSL");
       nc_put_att_text(ncID, prTenID, "Order", 17, "xx,xy,xz,yy,zz,yz");
       nc_put_att_text(ncID, mfTenID, "Units", 2, "eV");
       nc_put_att_text(ncID, mfTenID, "Frame", 3, "DSL");
       nc_put_att_text(ncID, mfTenID, "Order", 17, "xx,xy,xz,yy,zz,yz");
       nc_put_att_text(ncID, Flux2ID, "Units", 9, "#/sec/cm2");
       nc_put_att_text(ncID, PotID, "Units", 1, "V");
       nc_put_att_text(ncID, SymmID, "Frame", 3, "DSL");
       nc_put_att_text(ncID, CurrID, "Units", 7, "Unknown");
       nc_put_att_text(ncID, SymAngID, "Units", 7, "degrees");
       nc_put_att_text(ncID, VelID, "Units", 4, "km/s");
       nc_put_att_text(ncID, ThVelID, "Units", 4, "km/s");
       nc_put_att_text(ncID, VelID, "Frame", 3, "GSE");
      
      
 
       time(&p);
       s = ctime(&p);
       nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); 
         
       

       memcpy(&(ncSpFile[1]),&(mode[0]), 4);
       STime = Double2DD_Time(Time);
       memcpy(&(ncSpFile[5]),&(STime[2]), 9);
       if ((status = nc_create(ncSpFile, NC_CLOBBER, &ncSpID)) != NC_NOERR)
                                                      nc_handle_error(status);

        status = nc_def_dim (ncSpID, "Time", NC_UNLIMITED, &TimeDimSpID);
        status = nc_def_dim (ncSpID, "TimeLength", TIMELENGTH, &TimeLengthSpID);
        status = nc_def_dim (ncSpID, "Data",3L, &DataSpID);
        status = nc_def_dim (ncSpID, "Flux",32L, &FluxDimID);

       FluxDimVector[0] = TimeDimSpID;  
       FluxDimVector[1] = FluxDimID;

//ModeID, DensID, VelID, TempID;
     
        status =  nc_def_var (ncSpID, "Time", NC_CHAR, 2, TimeDimVector, &TimeSpID);
        status =  nc_def_var (ncSpID, "Mode", NC_FLOAT, 2, DataDimVector, &ModeSpID);
        status =  nc_def_var (ncSpID, "Flux", NC_DOUBLE, 2, FluxDimVector, &FluxID);
 
        status =  nc_def_var (ncSpID, "StartTime", NC_CHAR, 1, &TimeLengthSpID, &StartTimeSpID);
        status = nc_def_var (ncSpID, "StopTime", NC_CHAR, 1, &TimeLengthSpID , &StopTimeSpID);
  
        status = nc_put_att_text(ncSpID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)");
        status = nc_put_att_text(ncSpID, NC_GLOBAL, "Created", 24, s);
         
        status = nc_enddef(ncID); 
        status = nc_enddef(ncSpID);

         nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time));
         nc_put_vara_text(ncSpID, StartTimeSpID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time));
  
 }

 void put_double(RecStart, RecCount, ParCDF, ParNC) {


    long RecInt = 1;
    long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1};
    
    double *value;

    value = (double *)malloc(sizeof(double)*RecCount);
    if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF,
                                zVAR_RECNUMBER_, RecStart ,
                                zVAR_RECCOUNT_, RecCount,
                                zVAR_RECINTERVAL_, RecInt,
                                zVAR_DIMINDICES_, indices,
                                zVAR_DIMCOUNTS_, counts,
                                zVAR_DIMINTERVALS_, intervals,
                                GET_, zVAR_HYPERDATA_, value, NULL_))
                                              != CDF_OK)  cdf_handle_error(cstatus);
      nc_put_var_double(ncID, ParNC, value);

    free(value);
 }

 void put_double3(RecStart, RecCount, ParCDF, ParNC) {
    
    long RecInt = 1;
    long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3};
    double *value;

    value = (double *)malloc(sizeof(double)*RecCount*3);
    if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF,
                                zVAR_RECNUMBER_, RecStart ,
                                zVAR_RECCOUNT_, RecCount,
                                zVAR_RECINTERVAL_, RecInt,
                                zVAR_DIMINDICES_, indices,
                                zVAR_DIMCOUNTS_, counts,
                                zVAR_DIMINTERVALS_, intervals,
                                GET_, zVAR_HYPERDATA_, value, NULL_))
                                              != CDF_OK)  cdf_handle_error(cstatus);
    nc_put_var_double(ncID, ParNC, value);

    free(value);
  }

void put_double6(RecStart, RecCount, ParCDF, ParNC) {
    
    long RecInt = 1;
    long indices[2] = {0,6}, intervals[1] = {1}, counts[1] = {6};
    double *value;

    value = (double *)malloc(sizeof(double)*RecCount*6);
    if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF,
                                zVAR_RECNUMBER_, RecStart ,
                                zVAR_RECCOUNT_, RecCount,
                                zVAR_RECINTERVAL_, RecInt,
                                zVAR_DIMINDICES_, indices,
                                zVAR_DIMCOUNTS_, counts,
                                zVAR_DIMINTERVALS_, intervals,
                                GET_, zVAR_HYPERDATA_, value, NULL_))
                                              != CDF_OK)  cdf_handle_error(cstatus);
    nc_put_var_double(ncID, ParNC, value);

    free(value);
  }

 void put_mode(RecStart, RecCount, ParCDF, ParNC, ParSpNC) {
  
    float *value;
    long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3};
    long RecInt = 1;

    value = (float *)malloc(sizeof(float) * RecCount *3);
    if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF,
                                zVAR_RECNUMBER_, RecStart ,
                                zVAR_RECCOUNT_, RecCount,
                                zVAR_RECINTERVAL_, RecInt,
                                zVAR_DIMINDICES_, indices,
                                zVAR_DIMCOUNTS_, counts,
                                zVAR_DIMINTERVALS_, intervals,
                                GET_, zVAR_HYPERDATA_, value, NULL_))
                                              != CDF_OK)  cdf_handle_error(cstatus);
        nc_put_var_float(ncID, ParNC, value);
        nc_put_var_float(ncSpID, ParSpNC, value);
    free(value);
 }

void put_spectra(RecStart, RecCount, ParCDF, ParNC) {
  
    double *value;
    long indices[2] = {0,32}, intervals[1] = {1}, counts[1] = {32};
    long RecInt = 1;

    value = (double *)malloc(sizeof(double)*RecCount*32);
    if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF,
                                zVAR_RECNUMBER_, RecStart ,
                                zVAR_RECCOUNT_, RecCount,
                                zVAR_RECINTERVAL_, RecInt,
                                zVAR_DIMINDICES_, indices,
                                zVAR_DIMCOUNTS_, counts,
                                zVAR_DIMINTERVALS_, intervals,
                                GET_, zVAR_HYPERDATA_, value, NULL_))
                                              != CDF_OK)  cdf_handle_error(cstatus);      
        nc_put_var_double(ncSpID, ParNC, value);
    free(value);
 }
/*--------------------------------------------------------------------------*/
int main(int argc, char *argv[])
{
    long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec;
    long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1};
    long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32};
    double *value;
    float *value_f;
    size_t numElem;
    long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16;
    
    CDFid id;
    int i, j, status;
    char  fileName[MAX_FILE_NAME_LEN];
    dd_tmstr_t *dtm;
    int First = 1;
    double par[3], parr[6], doubleVal, parD[32];
    float parF[32], par_f[3], parr_f[6], floatVal;
    double DayOld;
  

    char *UT;
    char data_set[8]="thx_pexx";
/*-------------------------------- Arguments Decoding ----------------------------------------*/
     if (argc <= 3) usage();       // CDF input file name and THEMIS Number not specified
     else
     {
           strcpy(fileName, argv[1]);
           strncpy(ThemisID,argv[2],3);
           strncpy(mode,argv[3],4);
      }
      
/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/
         
        memcpy(&(data_set[2]),&(ThemisID[2]),1);
        memcpy(&(data_set[6]),&(mode[2]),2);

        memcpy(&(ThemisTime[0]),&(data_set[0]),8);
        memcpy(&(PAR0[0]),&(data_set[0]),8); 
        memcpy(&(PAR1[0]),&(data_set[0]),8); 
        memcpy(&(PAR2[0]),&(data_set[0]),8); 
        memcpy(&(PAR3[0]),&(data_set[0]),8); 
        memcpy(&(PAR4[0]),&(data_set[0]),8); 
        memcpy(&(PAR5[0]),&(data_set[0]),8); 
        memcpy(&(PAR6[0]),&(data_set[0]),8); 
        memcpy(&(PAR7[0]),&(data_set[0]),8);
        memcpy(&(PAR8[0]),&(data_set[0]),8);
        memcpy(&(PAR9[0]),&(data_set[0]),8);
        memcpy(&(PAR10[0]),&(data_set[0]),8); 
        memcpy(&(PAR11[0]),&(data_set[0]),8);
        memcpy(&(PAR12[0]),&(data_set[0]),8);
        memcpy(&(PAR13[0]),&(data_set[0]),8);
        memcpy(&(PAR14[0]),&(data_set[0]),8);
        memcpy(&(PAR15[0]),&(data_set[0]),8);
        memcpy(&(PAR16[0]),&(data_set[0]),8);
 
/*********************** Open CDF file *****************************/
     if ((cstatus = CDFopen(fileName, &id))  != CDF_OK)
                                      cdf_handle_error(cstatus);
     printf(" THEMIS  %s %s\n", ThemisID, mode);

/*********** treat all vars as zVars with eliminated false dimensionality **********/
    
     if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK)
                                                   cdf_handle_error (cstatus);

/************************ Get CDF Data  ************************************/

   cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_);
   cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_);
 
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_);    
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); 
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); 
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR11, &par11, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR12, &par12, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR13, &par13, NULL_);
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR14, &par14, NULL_); 
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR15, &par15, NULL_);   
   cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR16, &par16, NULL_);

      RecCount = (long)(MaxRec+1);
      printf(" Max Rec %d\n", MaxRec);
      
       if (MaxRec <= 0) exit(0);

       value = (double *)malloc(sizeof(double)* RecCount);
       if ((cstatus = CDFlib (SELECT_,
		     zVAR_, varN,
		     zVAR_RECNUMBER_, RecStart ,
		     zVAR_RECCOUNT_, RecCount,
		     zVAR_RECINTERVAL_, RecInt,
		     zVAR_DIMINDICES_, indices,
		     zVAR_DIMCOUNTS_, countsE,
	             zVAR_DIMINTERVALS_, intervals,
                     GET_, zVAR_HYPERDATA_, value,  NULL_) )
                                             != CDF_OK) cdf_handle_error(cstatus);

         for (i = 0; i < RecCount; i++) {

                      
                    UT = Double2DD_Time(value[i]); 

                    if ((First == 0) && (value[i] - DayOld) > TimeGap) {
 
                        printf("GAP %f\n",(value[i] - DayOld)/60.0);                                              
                        put_double(RecStart, (long)i - RecStart, par0, DeltaTID);
                        put_mode(RecStart, (long)i - RecStart, par1, ModeID, ModeSpID);
                        put_double(RecStart, (long)i - RecStart, par2, DensID);
                        put_double3(RecStart, (long)i - RecStart, par3, VelID);
                        put_double3(RecStart,(long)i - RecStart, par4, TempID);
                        put_double3(RecStart, (long)i - RecStart, par11, MfTempID);
                        put_double3(RecStart, (long)i - RecStart, par14, Flux2ID);
                        put_double3(RecStart, (long)i - RecStart, par15, SymmID);
                        put_double6(RecStart, (long)i - RecStart, par12, prTenID);
                        put_double6(RecStart, (long)i - RecStart, par13, mfTenID);
                        put_double(RecStart, (long)i - RecStart, par7, AvTempID);
                        put_double(RecStart, (long)i - RecStart, par8, ThVelID);
                        put_double(RecStart, (long)i - RecStart, par9, PotID);
                        put_double(RecStart, (long)i - RecStart, par16, SymAngID);
                        put_spectra(RecStart, (long)i - RecStart, par5, FluxID);

                        nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld)); 
                        nc_put_vara_text(ncSpID,StopTimeSpID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld));

                        if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); 
                        if ((status = nc_close(ncSpID)) != NC_NOERR) nc_handle_error(status);
                        First = 1;
                        RecStart = (long)i;
                        UT = Double2DD_Time(value[i]);
                    }
                    
                    dtm =  ReadTime(UT); 
                    if (First == 1) { 
                       ncdefine(dtm->times);

                       First = 0;
                       Start[0] = 0;
                    
                     }   
                    nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT);
                    nc_put_vara_text(ncSpID, TimeSpID, Start, TimeCount, UT);
                    Start[0]++;
                    DayOld = value[i];

         }
         free(value);
         nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); 
         nc_put_vara_text(ncSpID,StopTimeSpID, &Start[1], &TimeCount[1], UT);
    
         
         put_double(RecStart, RecCount - RecStart, par0, DeltaTID);
         put_mode(RecStart, RecCount - RecStart, par1, ModeID, ModeSpID);
         put_double(RecStart, RecCount - RecStart, par2, DensID);
         put_double3(RecStart, RecCount - RecStart, par3, VelID);
         put_double3(RecStart, RecCount - RecStart, par4, TempID);
         put_double3(RecStart, RecCount - RecStart, par11, MfTempID);
         put_double3(RecStart, RecCount - RecStart, par14, Flux2ID);
         put_double3(RecStart, RecCount - RecStart, par15, SymmID);
         put_double6(RecStart, RecCount - RecStart, par12, prTenID);
         put_double6(RecStart, RecCount - RecStart, par13, mfTenID);  
         put_double(RecStart, RecCount - RecStart, par7, AvTempID);
         put_double(RecStart, RecCount - RecStart, par8, ThVelID);
         put_double(RecStart, RecCount - RecStart, par9, PotID);
         put_double(RecStart, RecCount - RecStart, par16, SymAngID);
         put_spectra(RecStart, RecCount - RecStart, par5, FluxID);
 
/********************Close Files******************/
       if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK)
                            cdf_handle_error (cstatus);
       if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); 
       if ((status = nc_close(ncSpID)) != NC_NOERR) nc_handle_error(status);
}