view src/c_sources/Vector.c @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line source


#include "Vector.h"

/*
 *
 *
 * Ingo Diepholz 08-06-2011
 *
 * $Id: Vector.c,v 1.1 2011/06/14 10:40:52 ingo Exp $
 */

/*****************************************************************************/
/***                                 PLUS                                  ***/
/*****************************************************************************/

Vector *vec_plus_s(Vector *v, double s) {
  plus_internal(v, s);
  return v;
}

Vector *s_plus_vec(double s, Vector *v) {
  plus_internal(v, s);
  return v;
}

Vector *vec_plus_vec(int num, Vector *v, ...) {
  
  int      i;
  Vector *v1 = v;
  va_list  args;
  va_start (args, v);
  
  /* get first and second vector */
  
  for (i=1; i<num; i++)
  {
    Vector *v2 = va_arg(args, Vector * );
    plus_internal_v(v1, v2);
  }
  
  va_end (args);
  return v1;
}

Vector *plus_internal_v(Vector *v1, Vector *v2) {
  
  long int ii;
  if (v1==NULL) {
    v1 = ALLOCATE(Vector);
  }
  if (v2==NULL) {
    return v1;
  }
  
  if ((v1->data == NULL) && (v2->data == NULL)) {
    /* nothing to do */
  }
  else if ((v1->data != NULL) && (v2->data == NULL)) {
    /* nothing to do */
  }
  else if ((v1->data == NULL) && (v2->data != NULL)) {
    /* Copy v2 to v1 */
    v1 = copyVector(v2);
  }
  else {
    for (ii = v1->size-1; ii >= 0; ii--) v1->data[ii] += v2->data[ii];
  }
  return v1;
}

Vector *plus_internal(Vector *v, double s) {
  
  long int ii;
  if (v==NULL) {
    v = ALLOCATE(Vector);
  }
  else {
    
    if (v->data == NULL) {
      /* nothing to do */
    }
    else {
      for (ii = v->size-1; ii >= 0; ii--) v->data[ii] += s;
    }
  }
  return v;
}



/*****************************************************************************/
/***                                MINUS                                  ***/
/*****************************************************************************/

Vector *vec_minus_s(Vector *v, double s) {
  plus_internal(v, -s);
  return v;
}

Vector *s_minus_vec(double s, Vector *v) {
  plus_internal(times_internal(v, -1), s);
  return v;
}

/*****************************************************************************/
/***                                TIMES                                  ***/
/*****************************************************************************/

Vector *vec_times_s(Vector *v, double s) {
  times_internal(v, s);
  return v;
}

Vector *s_times_vec(double s, Vector *v) {
  times_internal(v, s);
  return v;
}

Vector *vec_times_vec(int num, Vector *v, ...) {
  
  int      i;
  va_list  args;
  /* get first and second vector */
  Vector *v1 = v;
  va_start (args, v);
  
  for (i=1; i<num; i++)
  {
    Vector *v2 = va_arg(args, Vector * );
    times_internal_v(v1, v2);
  }
  
  va_end (args);
  return v1;
}

Vector *times_internal_v(Vector *v1, Vector *v2) {
  
  long int ii;
  if (v1==NULL) {
    v1 = ALLOCATE(Vector);
  }
  if (v2==NULL) {
    return v1;
  }
  
  if ((v1->data == NULL) && (v2->data == NULL)) {
    /* nothing to do */
  }
  else if ((v1->data != NULL) && (v2->data == NULL)) {
    /* nothing to do */
  }
  else if ((v1->data == NULL) && (v2->data != NULL)) {
    /* Copy v2 to v1 */
    v1 = copyVector(v2);
  }
  else {
    for (ii = v1->size-1; ii >= 0; ii--) v1->data[ii] *= v2->data[ii];
  }
  return v1;
}

Vector *times_internal(Vector *v, double s) {
  
  long int ii;
  if (v==NULL) {
    v = ALLOCATE(Vector);
  }
  else {
    
    if (v->data == NULL) {
      /* nothing to do */
    }
    else {
      for (ii = v->size-1; ii >= 0; ii--) {
        v->data[ii] *= s;
      }
    }
  }
  return v;
}

/*****************************************************************************/
/***                               DIVIDE                                  ***/
/*****************************************************************************/

Vector *vec_div_s(Vector *v, double s) {
  times_internal(v, 1/s);
  return v;
}


/*****************************************************************************/
/***                        Arithmetic Operators                           ***/
/*****************************************************************************/

Vector *sin_of_vec(Vector *v) {
  long int ii;
  if (v==NULL) {
    v = ALLOCATE(Vector);
  }
  else {
    
    if (v->data == NULL) {
      /* nothing to do */
    }
    else {
      for (ii = v->size-1; ii >= 0; ii--) {
        v->data[ii] = sin(v->data[ii]);
      }
    }
  }
  return v;
}

Vector *cos_of_vec(Vector *v) {
  long int ii;
  if (v==NULL) {
    v = ALLOCATE(Vector);
  }
  else {
    
    if (v->data == NULL) {
      /* nothing to do */
    }
    else {
      for (ii = v->size-1; ii >= 0; ii--) {
        v->data[ii] = cos(v->data[ii]);
      }
    }
  }
  return v;
}



/*****************************************************************************/
/***                                 MISC                                  ***/
/*****************************************************************************/

Vector *copyVector(Vector *in) {
  
  Vector *out  = ALLOCATE(Vector);
  double *dout = ALLOCATE_ARRAY(double, in->size);
  double *din  = in->data;
  long int i;
  
  out->data = dout;
  out->size = in->size;
  
  for ( i = out->size-1; i >= 0; i-- )
    *dout++ = *din++;
  
  return out;
}

Vector *initVector(double *data, long int size) {
  Vector *v = ALLOCATE(Vector);
  v->data = data;
  v->size = size;
  return v;
}

char *toString(Vector *t) {
  
  static char retbuf[300] = "";
  long int ll;

  if (t==NULL) {
    return "NULL";
  }
  
  retbuf[0] = '\0';
  strcpy(retbuf, "[");
  for(ll=0; ll<myMin(10,t->size); ll++) {
    sprintf(retbuf, "%s%16.15e, ", retbuf, t->data[ll]);
  }
  /* Remove last blank */
  retbuf[strlen(retbuf)-2] = ']';
  retbuf[strlen(retbuf)-1] = '\0';
  
  return retbuf;
}

int myMin(long int a, long int b) {
  return ((a<b) ? a : b);
}

void freeVector(Vector *v) {
  if (v != NULL) {
    if (v->data && v->data != NULL)
      free(v->data);
    free(v);
    printMsg(DEBUG, "----------- Free !!!\n");
  }
}

void printMsg(int level, char *format, ...) {
  char buffer[400];
  char lvlMsg[10];
  va_list  args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  
  if ((level!=NONE) && (VERBOSE_LEVEL>=level)) {
    switch(level){
      case DEBUG:   strcpy(lvlMsg, "DEBUG");   break;
      case INFO:    strcpy(lvlMsg, "INFO");    break;
      case WARNING: strcpy(lvlMsg, "WARNING"); break;
    }
    
    printf("%-9s %s\n", lvlMsg, buffer);
  }
  va_end (args);
}