/* * Copyright 1997, Regents of the University of Minnesota * * util.c * * This function contains various utility routines * * Started 9/28/95 * George * * $Id: util.c,v 1.2 2003/07/21 17:18:54 karypis Exp $ */ #include /************************************************************************* * This function prints an error message and exits **************************************************************************/ void errexit(char *f_str,...) { va_list argp; char out1[256], out2[256]; va_start(argp, f_str); vsprintf(out1, f_str, argp); va_end(argp); sprintf(out2, "Error! %s", out1); fprintf(stdout, out2); fflush(stdout); abort(); } /************************************************************************* * This function prints an error message and exits **************************************************************************/ void myprintf(CtrlType *ctrl, char *f_str,...) { va_list argp; char out1[256], out2[256]; va_start(argp, f_str); vsprintf(out1, f_str, argp); va_end(argp); sprintf(out2, "[%2d] %s", ctrl->mype, out1); fprintf(stdout, out2); fflush(stdout); } /************************************************************************* * This function prints an error message and exits **************************************************************************/ void rprintf(CtrlType *ctrl, char *f_str,...) { va_list argp; if (ctrl->mype == 0) { va_start(argp, f_str); vfprintf(stdout, f_str, argp); va_end(argp); } fflush(stdout); MPI_Barrier(ctrl->comm); } #ifndef DMALLOC /************************************************************************* * The following function allocates an array of integers **************************************************************************/ int *imalloc(int n, char *msg) { if (n == 0) return NULL; return (int *)GKmalloc(sizeof(int)*n, msg); } /************************************************************************* * The following function allocates an array of integers **************************************************************************/ idxtype *idxmalloc(int n, char *msg) { if (n == 0) return NULL; return (idxtype *)GKmalloc(sizeof(idxtype)*n, msg); } /************************************************************************* * The following function allocates an array of float **************************************************************************/ float *fmalloc(int n, char *msg) { if (n == 0) return NULL; return (float *)GKmalloc(sizeof(float)*n, msg); } /************************************************************************* * The follwoing function allocates an array of integers **************************************************************************/ int *ismalloc(int n, int ival, char *msg) { if (n == 0) return NULL; return iset(n, ival, (int *)GKmalloc(sizeof(int)*n, msg)); } /************************************************************************* * The follwoing function allocates an array of integers **************************************************************************/ idxtype *idxsmalloc(int n, idxtype ival, char *msg) { if (n == 0) return NULL; return idxset(n, ival, (idxtype *)GKmalloc(sizeof(idxtype)*n, msg)); } /************************************************************************* * This function is my wrapper around malloc **************************************************************************/ void *GKmalloc(int nbytes, char *msg) { void *ptr; if (nbytes == 0) return NULL; ptr = (void *)malloc(nbytes); if (ptr == NULL) errexit("***Memory allocation failed for %s. Requested size: %d bytes", msg, nbytes); return ptr; } #endif /************************************************************************* * This function is my wrapper around free, allows multiple pointers **************************************************************************/ void GKfree(void **ptr1,...) { va_list plist; void **ptr; if (*ptr1 != NULL) free(*ptr1); *ptr1 = NULL; va_start(plist, ptr1); while ((ptr = va_arg(plist, void **)) != LTERM) { if (*ptr != NULL) free(*ptr); *ptr = NULL; } va_end(plist); } /************************************************************************* * These functions set the values of a vector **************************************************************************/ int *iset(int n, int val, int *x) { int i; for (i=0; i x[max] ? i : max); return max; } /************************************************************************* * These functions return the index of the minimum element in a vector **************************************************************************/ int idxamin(int n, idxtype *x) { int i, min=0; for (i=1; ikey != n2->key ? n1->key - n2->key : n1->val - n2->val); } /************************************************************************* * This function sorts an array of type KeyValueType in increasing order **************************************************************************/ void dkeyvalsort(int n, KeyValueType *nodes) { qsort((void *)nodes, (size_t)n, (size_t)sizeof(KeyValueType), DecKeyValueCmp); } /************************************************************************* * This function compares 2 KeyValueType variables for sorting in inc order **************************************************************************/ int DecKeyValueCmp(const void *v1, const void *v2) { KeyValueType *n1, *n2; n1 = (KeyValueType *)v1; n2 = (KeyValueType *)v2; return n2->key - n1->key; } /************************************************************************* * This function does a binary search on an array for a key and returns * the index **************************************************************************/ int BSearch(int n, idxtype *array, int key) { int a=0, b=n, c; while (b-a > 8) { c = (a+b)>>1; if (array[c] > key) b = c; else a = c; } for (c=a; c>1); return (a > 1 ? 0 : 1); } /************************************************************************* * This function returns the log2(x) **************************************************************************/ int log2Int(int a) { int i; for (i=1; a > 1; i++, a = a>>1); return i-1; } /************************************************************************* * These functions set the values of a vector **************************************************************************/ float *sset(int n, float val, float *x) { int i; for (i=0; i x[max] ? i : max); return max; } /************************************************************************* * These functions return the index of the maximum element in a vector **************************************************************************/ int samax_strd(int n, float *x, int incx) { int i; int max=0; n *= incx; for (i=incx; i x[max] ? i : max); return max/incx; } /************************************************************************* * These functions return the index of the maximum element in a vector **************************************************************************/ int sfamax(int n, float *x) { int i; int max=0; for (i=1; i fabs(x[max]) ? i : max); return max; } /************************************************************************* * These functions return the index of the maximum element in a vector **************************************************************************/ int samin_strd(int n, float *x, int incx) { int i; int min=0; n *= incx; for (i=incx; i x[max] ? i : max); return max/incx; } /************************************************************************* * These functions return the index of the maximum element in a vector **************************************************************************/ int idxamin_strd(int n, idxtype *x, int incx) { int i, min=0; n *= incx; for (i=incx; i x[max] ? i : max); return max; } /************************************************************************* * These functions return the index of the maximum element in a vector **************************************************************************/ int sfavg(int n, float *x) { int i; float total = 0.0; if (n == 0) return 0.0; for (i=0; i x[1]) { max1 = 0; max2 = 1; } else { max1 = 1; max2 = 0; } for (i=2; i x[max1]) { max2 = max1; max1 = i; } else if (x[i] > x[max2]) max2 = i; } return max2; } /************************************************************************* * These functions return the index of the minimum element in a vector **************************************************************************/ int samin(int n, float *x) { int i, min=0; for (i=1; i=0; n--) y[n] += x[n]; } /************************************************************************* * This function sums the entries in an array **************************************************************************/ float ssum(int n, float *x) { int i; float sum = 0.0; for (i=0; i m11) return 0; if (m22 < m12) return 1; if (m22 > m12) return 0; return sm2 < sm1; } /************************************************************************* * This is a comparison function **************************************************************************/ int myvalkeycompare(const void *fptr, const void *sptr) { KVType *first, *second; first = (KVType *)(fptr); second = (KVType *)(sptr); if (first->val > second->val) return 1; if (first->val < second->val) return -1; return 0; } /************************************************************************* * This is the inverse comparison function **************************************************************************/ int imyvalkeycompare(const void *fptr, const void *sptr) { KVType *first, *second; first = (KVType *)(fptr); second = (KVType *)(sptr); if (first->val > second->val) return -1; if (first->val < second->val) return 1; return 0; } /************************************************************************* * The following function allocates and sets an array of floats **************************************************************************/ float *fsmalloc(int n, float fval, char *msg) { if (n == 0) return NULL; return sset(n, fval, (float *)GKmalloc(sizeof(float)*n, msg)); } /************************************************************************* * This function computes a 2-norm **************************************************************************/ void saxpy2(int n, float alpha, float *x, int incx, float *y, int incy) { int i; for (i=0; i x[*first]) { *third = *second; *second = *first; *first = i; continue; } if (*second == -1 || x[i] > x[*second]) { *third = *second; *second = i; continue; } if (*third == -1 || x[i] > x[*third]) *third = i; } return; }