Mercurial > hg > ltpda
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/c_sources/Vector.c Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,334 @@ + +#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); +} + + + + + + + + + + + + + + + + + + +