IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 7, 2008, 3:31:01 PM (17 years ago)
Author:
eugene
Message:

big update from eam_branch_20081124 with updates to Opihi math

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/lib.shell/VectorOps.c

    r16887 r20936  
    11# include "opihi.h"
     2
     3// NOTE: we refer to elements.Ptr if we do not care about the actual type
    24
    35static Vector **vectors;
     
    1820
    1921  for (i = 0; i < Nvectors; i++) {
    20     free (vectors[i][0].elements);
     22    if (vectors[i][0].elements.Int) {
     23      free (vectors[i][0].elements.Int);
     24    }
    2125    free (vectors[i]);
    2226  }
     
    2832
    2933  ALLOCATE (vec, Vector, 1);
    30   ALLOCATE (vec[0].elements, float, 1);
    31   bzero (vec[0].name, 1024);
     34
     35  vec[0].type = OPIHI_FLT;    // is a float unless specified otherwise
     36  ALLOCATE (vec[0].elements.Flt, opihi_flt, 1);
     37
     38  bzero (vec[0].name, OPIHI_NAME_SIZE);
    3239  vec[0].Nelements = 0;
    3340  return (vec);
     
    5663}
    5764
     65// XXX add TYPE to arguments?
    5866Vector *SelectVector (char *name, int mode, int verbose) {
    5967
     
    95103  if (i == Nvectors) return (FALSE);
    96104
    97   free (vectors[i][0].elements);
     105  if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr);
    98106  free (vectors[i]);
    99107
     
    115123  if (i == Nvectors) return (FALSE);
    116124
    117   free (vectors[i][0].elements);
     125  if (vectors[i][0].elements.Ptr) free (vectors[i][0].elements.Ptr);
    118126  free (vectors[i]);
    119127
     
    134142  return (TRUE);
    135143}
     144
    136145int CopyVector (Vector *out, Vector *in) {
    137   free (out[0].elements);
     146  if (out[0].elements.Ptr) free (out[0].elements.Ptr);
    138147  out[0].Nelements = in[0].Nelements;
    139   ALLOCATE (out[0].elements, float, out[0].Nelements);
    140   memcpy (out[0].elements, in[0].elements, out[0].Nelements*sizeof(float));
    141   return (TRUE);
     148  if (in[0].elements.Ptr) {
     149    if (in[0].type == OPIHI_FLT) {
     150      ALLOCATE (out[0].elements.Flt, opihi_flt, out[0].Nelements);
     151      memcpy (out[0].elements.Flt, in[0].elements.Flt, out[0].Nelements*sizeof(opihi_flt));
     152      out[0].type = OPIHI_FLT;
     153    } else {
     154      ALLOCATE (out[0].elements.Int, opihi_int, out[0].Nelements);
     155      memcpy (out[0].elements.Int, in[0].elements.Int, out[0].Nelements*sizeof(opihi_int));
     156      out[0].type = OPIHI_INT;
     157    }
     158  }
     159  return (TRUE);
     160}
     161
     162int MatchVector(Vector *out, Vector *in, char type) {
     163  if (out[0].elements.Ptr) free (out[0].elements.Ptr);
     164  out[0].Nelements = in[0].Nelements;
     165  if (type == OPIHI_FLT) {
     166    ALLOCATE (out[0].elements.Flt, opihi_flt, out[0].Nelements);
     167    out[0].type = OPIHI_FLT;
     168  } else {
     169    ALLOCATE (out[0].elements.Int, opihi_int, out[0].Nelements);
     170    out[0].type = OPIHI_INT;
     171  }
     172  return (TRUE);
     173}
     174
     175// ResetVector (vecx, OPIHI_FLT, MAX (Npts, 1));
     176int ResetVector (Vector *vec, char type, int Nelements) {
     177
     178  vec[0].Nelements = Nelements;
     179  if (type == OPIHI_FLT) {
     180    REALLOCATE (vec[0].elements.Flt, opihi_flt, Nelements);
     181    vec[0].type = OPIHI_FLT;
     182  } else {
     183    REALLOCATE (vec[0].elements.Int, opihi_int, Nelements);
     184    vec[0].type = OPIHI_INT;
     185  }
     186  return TRUE;
     187}
     188
     189// SetVector (vecx, OPIHI_FLT, MAX (Npts, 1));
     190int SetVector (Vector *vec, char type, int Nelements) {
     191
     192  vec[0].Nelements = Nelements;
     193  if (type == OPIHI_FLT) {
     194    ALLOCATE (vec[0].elements.Flt, opihi_flt, Nelements);
     195    vec[0].type = OPIHI_FLT;
     196  } else {
     197    ALLOCATE (vec[0].elements.Int, opihi_int, Nelements);
     198    vec[0].type = OPIHI_INT;
     199  }
     200  return TRUE;
     201}
     202
     203// recast the vector to the specified type
     204int CastVector (Vector *vec, char type) {
     205
     206  int i;
     207
     208  // the trivial case
     209  if (vec[0].type == type) return TRUE;
     210
     211  if (type == OPIHI_FLT) {
     212    opihi_flt *temp;
     213    ALLOCATE (temp, opihi_flt, vec[0].Nelements);
     214    opihi_flt *vo = temp;
     215    opihi_int *vi = vec[0].elements.Int;
     216    for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) {
     217      *vo = *vi;
     218    }
     219    free (vec[0].elements.Int);
     220    vec[0].elements.Flt = vo;
     221    vec[0].type = OPIHI_FLT;
     222  } else {
     223    opihi_int *temp;
     224    ALLOCATE (temp, opihi_int, vec[0].Nelements);
     225    opihi_int *vo = temp;
     226    opihi_flt *vi = vec[0].elements.Flt;
     227    for (i = 0; i < vec[0].Nelements; i++, vo++, vi++) {
     228      *vo = *vi;
     229    }
     230    free (vec[0].elements.Flt);
     231    vec[0].elements.Int = vo;
     232    vec[0].type = OPIHI_INT;
     233  }
     234  return TRUE;
    142235}
    143236
     
    150243  return (TRUE);
    151244}
     245
    152246int MoveVector (Vector *out, Vector *in) {
    153247  int i, j;
    154248
    155   free (out[0].elements);
    156   out[0].Nelements = in[0].Nelements;
    157   out[0].elements =  in[0].elements;
     249  if (out[0].elements.Ptr) free (out[0].elements.Ptr);
     250  out[0].Nelements    = in[0].Nelements;
     251  out[0].elements.Ptr = in[0].elements.Ptr;
     252  out[0].type         = in[0].type;
    158253
    159254  /* delete vector entry from vector list, if it exists */
     
    184279  gprint (GP_LOG, "    N       name      size\n");
    185280  for (i = 0; i < Nvectors; i++) {
    186     gprint (GP_LOG, "%5d %10s %10d\n",
    187              i, vectors[i][0].name, vectors[i][0].Nelements);
    188   }
    189   return (TRUE);
    190 }
    191  
     281    if (vectors[i][0].type == OPIHI_FLT) {
     282      gprint (GP_LOG, "%5d %10s %10d (FLT)\n", i, vectors[i][0].name, vectors[i][0].Nelements);
     283    } else {
     284      gprint (GP_LOG, "%5d %10s %10d (INT)\n", i, vectors[i][0].name, vectors[i][0].Nelements);
     285    }
     286  }
     287  return (TRUE);
     288}
     289 
Note: See TracChangeset for help on using the changeset viewer.