| |
| #ifndef hypre_UTILITIES_HEADER |
| #define hypre_UTILITIES_HEADER |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /*BHEADER********************************************************************** |
| * Copyright (c) 2006 The Regents of the University of California. |
| * Produced at the Lawrence Livermore National Laboratory. |
| * Written by the HYPRE team, UCRL-CODE-222953. |
| * All rights reserved. |
| * |
| * This file is part of HYPRE (see http://www.llnl.gov/CASC/hypre/). |
| * Please see the COPYRIGHT_and_LICENSE file for the copyright notice, |
| * disclaimer and the GNU Lesser General Public License. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License (as published by the Free |
| * Software Foundation) version 2.1 dated February 1999. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the terms and conditions of the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with this program; if not, write to the Free Software Foundation, |
| * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * $Revision: 2.24 $ |
| ***********************************************************************EHEADER*/ |
| |
| /****************************************************************************** |
| * |
| * General structures and values |
| * |
| *****************************************************************************/ |
| |
| #ifndef hypre_GENERAL_HEADER |
| #define hypre_GENERAL_HEADER |
| |
| /*-------------------------------------------------------------------------- |
| * Define various functions |
| *--------------------------------------------------------------------------*/ |
| |
| #ifndef hypre_max |
| #define hypre_max(a,b) (((a)<(b)) ? (b) : (a)) |
| #endif |
| #ifndef hypre_min |
| #define hypre_min(a,b) (((a)<(b)) ? (a) : (b)) |
| #endif |
| |
| #ifndef hypre_round |
| #define hypre_round(x) ( ((x) < 0.0) ? ((int)(x - 0.5)) : ((int)(x + 0.5)) ) |
| #endif |
| |
| #endif |
| /*BHEADER********************************************************************** |
| * Copyright (c) 2006 The Regents of the University of California. |
| * Produced at the Lawrence Livermore National Laboratory. |
| * Written by the HYPRE team, UCRL-CODE-222953. |
| * All rights reserved. |
| * |
| * This file is part of HYPRE (see http://www.llnl.gov/CASC/hypre/). |
| * Please see the COPYRIGHT_and_LICENSE file for the copyright notice, |
| * disclaimer and the GNU Lesser General Public License. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License (as published by the Free |
| * Software Foundation) version 2.1 dated February 1999. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the terms and conditions of the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with this program; if not, write to the Free Software Foundation, |
| * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * $Revision: 2.24 $ |
| ***********************************************************************EHEADER*/ |
| |
| /****************************************************************************** |
| * |
| * Header file for memory management utilities |
| * |
| *****************************************************************************/ |
| |
| #ifndef hypre_MEMORY_HEADER |
| #define hypre_MEMORY_HEADER |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /*-------------------------------------------------------------------------- |
| * Use "Debug Malloc Library", dmalloc |
| *--------------------------------------------------------------------------*/ |
| |
| #ifdef HYPRE_MEMORY_DMALLOC |
| |
| #define hypre_InitMemoryDebug(id) hypre_InitMemoryDebugDML(id) |
| #define hypre_FinalizeMemoryDebug() hypre_FinalizeMemoryDebugDML() |
| |
| #define hypre_TAlloc(type, count) \ |
| ( (type *)hypre_MAllocDML((unsigned int)(sizeof(type) * (count)),\ |
| __FILE__, __LINE__) ) |
| |
| #define hypre_CTAlloc(type, count) \ |
| ( (type *)hypre_CAllocDML((unsigned int)(count), (unsigned int)sizeof(type),\ |
| __FILE__, __LINE__) ) |
| |
| #define hypre_TReAlloc(ptr, type, count) \ |
| ( (type *)hypre_ReAllocDML((char *)ptr,\ |
| (unsigned int)(sizeof(type) * (count)),\ |
| __FILE__, __LINE__) ) |
| |
| #define hypre_TFree(ptr) \ |
| ( hypre_FreeDML((char *)ptr, __FILE__, __LINE__), ptr = NULL ) |
| |
| /*-------------------------------------------------------------------------- |
| * Use standard memory routines |
| *--------------------------------------------------------------------------*/ |
| |
| #else |
| |
| #define hypre_InitMemoryDebug(id) |
| #define hypre_FinalizeMemoryDebug() |
| |
| #define hypre_TAlloc(type, count) \ |
| ( (type *)hypre_MAlloc((unsigned int)(sizeof(type) * (count))) ) |
| |
| #define hypre_CTAlloc(type, count) \ |
| ( (type *)hypre_CAlloc((unsigned int)(count), (unsigned int)sizeof(type)) ) |
| |
| #define hypre_TReAlloc(ptr, type, count) \ |
| ( (type *)hypre_ReAlloc((char *)ptr, (unsigned int)(sizeof(type) * (count))) ) |
| |
| #define hypre_TFree(ptr) \ |
| ( hypre_Free((char *)ptr), ptr = NULL ) |
| |
| #endif |
| |
| |
| #ifdef HYPRE_USE_PTHREADS |
| |
| #define hypre_SharedTAlloc(type, count) \ |
| ( (type *)hypre_SharedMAlloc((unsigned int)(sizeof(type) * (count))) ) |
| |
| |
| #define hypre_SharedCTAlloc(type, count) \ |
| ( (type *)hypre_SharedCAlloc((unsigned int)(count),\ |
| (unsigned int)sizeof(type)) ) |
| |
| #define hypre_SharedTReAlloc(ptr, type, count) \ |
| ( (type *)hypre_SharedReAlloc((char *)ptr,\ |
| (unsigned int)(sizeof(type) * (count))) ) |
| |
| #define hypre_SharedTFree(ptr) \ |
| ( hypre_SharedFree((char *)ptr), ptr = NULL ) |
| |
| #else |
| |
| #define hypre_SharedTAlloc(type, count) hypre_TAlloc(type, (count)) |
| #define hypre_SharedCTAlloc(type, count) hypre_CTAlloc(type, (count)) |
| #define hypre_SharedTReAlloc(type, count) hypre_TReAlloc(type, (count)) |
| #define hypre_SharedTFree(ptr) hypre_TFree(ptr) |
| |
| #endif |
| |
| /*-------------------------------------------------------------------------- |
| * Prototypes |
| *--------------------------------------------------------------------------*/ |
| |
| /* hypre_memory.c */ |
| int hypre_OutOfMemory( int size ); |
| char *hypre_MAlloc( int size ); |
| char *hypre_CAlloc( int count , int elt_size ); |
| char *hypre_ReAlloc( char *ptr , int size ); |
| void hypre_Free( char *ptr ); |
| char *hypre_SharedMAlloc( int size ); |
| char *hypre_SharedCAlloc( int count , int elt_size ); |
| char *hypre_SharedReAlloc( char *ptr , int size ); |
| void hypre_SharedFree( char *ptr ); |
| double *hypre_IncrementSharedDataPtr( double *ptr , int size ); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |
| |
| /*BHEADER********************************************************************** |
| * Copyright (c) 2006 The Regents of the University of California. |
| * Produced at the Lawrence Livermore National Laboratory. |
| * Written by the HYPRE team, UCRL-CODE-222953. |
| * All rights reserved. |
| * |
| * This file is part of HYPRE (see http://www.llnl.gov/CASC/hypre/). |
| * Please see the COPYRIGHT_and_LICENSE file for the copyright notice, |
| * disclaimer and the GNU Lesser General Public License. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License (as published by the Free |
| * Software Foundation) version 2.1 dated February 1999. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the terms and conditions of the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with this program; if not, write to the Free Software Foundation, |
| * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * $Revision: 2.24 $ |
| ***********************************************************************EHEADER*/ |
| |
| |
| #ifndef hypre_THREADING_HEADER |
| #define hypre_THREADING_HEADER |
| |
| #if defined(HYPRE_USING_OPENMP) || defined (HYPRE_USING_PGCC_SMP) |
| |
| int hypre_NumThreads( void ); |
| |
| #else |
| |
| #define hypre_NumThreads() 1 |
| |
| #endif |
| |
| |
| /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ |
| /* The pthreads stuff needs to be reworked */ |
| |
| #ifdef HYPRE_USE_PTHREADS |
| |
| #ifndef MAX_QUEUE |
| #define MAX_QUEUE 256 |
| #endif |
| |
| #include <pthread.h> |
| |
| /* hypre_work_proc_t typedef'd to be a pointer to a function with a void* |
| argument and a void return type */ |
| typedef void (*hypre_work_proc_t)(void *); |
| |
| typedef struct hypre_workqueue_struct { |
| pthread_mutex_t lock; |
| pthread_cond_t work_wait; |
| pthread_cond_t finish_wait; |
| hypre_work_proc_t worker_proc_queue[MAX_QUEUE]; |
| int n_working; |
| int n_waiting; |
| int n_queue; |
| int inp; |
| int outp; |
| void *argqueue[MAX_QUEUE]; |
| } *hypre_workqueue_t; |
| |
| void hypre_work_put( hypre_work_proc_t funcptr, void *argptr ); |
| void hypre_work_wait( void ); |
| int HYPRE_InitPthreads( int num_threads ); |
| void HYPRE_DestroyPthreads( void ); |
| void hypre_pthread_worker( int threadid ); |
| int ifetchadd( int *w, pthread_mutex_t *mutex_fetchadd ); |
| int hypre_fetch_and_add( int *w ); |
| void hypre_barrier(pthread_mutex_t *mpi_mtx, int unthreaded); |
| int hypre_GetThreadID( void ); |
| |
| pthread_t initial_thread; |
| pthread_t hypre_thread[hypre_MAX_THREADS]; |
| pthread_mutex_t hypre_mutex_boxloops; |
| pthread_mutex_t talloc_mtx; |
| pthread_mutex_t worker_mtx; |
| hypre_workqueue_t hypre_qptr; |
| pthread_mutex_t mpi_mtx; |
| pthread_mutex_t time_mtx; |
| volatile int hypre_thread_release; |
| |
| #ifdef HYPRE_THREAD_GLOBALS |
| int hypre_NumThreads = 4; |
| #else |
| extern int hypre_NumThreads; |
| #endif |
| |
| #endif |
| /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ |
| |
| #endif |
| |
| /*BHEADER********************************************************************** |
| * Copyright (c) 2006 The Regents of the University of California. |
| * Produced at the Lawrence Livermore National Laboratory. |
| * Written by the HYPRE team, UCRL-CODE-222953. |
| * All rights reserved. |
| * |
| * This file is part of HYPRE (see http://www.llnl.gov/CASC/hypre/). |
| * Please see the COPYRIGHT_and_LICENSE file for the copyright notice, |
| * disclaimer and the GNU Lesser General Public License. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License (as published by the Free |
| * Software Foundation) version 2.1 dated February 1999. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the terms and conditions of the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with this program; if not, write to the Free Software Foundation, |
| * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * $Revision: 2.24 $ |
| ***********************************************************************EHEADER*/ |
| |
| |
| #ifndef hypre_ERROR_HEADER |
| #define hypre_ERROR_HEADER |
| |
| /*-------------------------------------------------------------------------- |
| * HYPRE error codes |
| *--------------------------------------------------------------------------*/ |
| |
| #define HYPRE_ERROR_GENERIC 1 /* generic error */ |
| #define HYPRE_ERROR_MEMORY 2 /* unable to allocate memory */ |
| #define HYPRE_ERROR_ARG 4 /* argument error */ |
| /* bits 4-8 are reserved for the index of the argument error */ |
| #define HYPRE_ERROR_CONV 256 /* method did not converge as expected */ |
| |
| /*-------------------------------------------------------------------------- |
| * Global variable used in hypre error checking |
| *--------------------------------------------------------------------------*/ |
| |
| extern int hypre__global_error; |
| #define hypre_error_flag hypre__global_error |
| |
| /*-------------------------------------------------------------------------- |
| * HYPRE error macros |
| *--------------------------------------------------------------------------*/ |
| |
| void hypre_error_handler(char *filename, int line, int ierr); |
| #define hypre_error(IERR) hypre_error_handler(__FILE__, __LINE__, IERR) |
| #define hypre_error_in_arg(IARG) hypre_error(HYPRE_ERROR_ARG | IARG<<3) |
| #ifdef NDEBUG |
| #define hypre_assert(EX) |
| #else |
| #define hypre_assert(EX) if (!(EX)) {fprintf(stderr,"hypre_assert failed: %s\n", #EX); hypre_error(1);} |
| #endif |
| /*-------------------------------------------------------------------------- |
| * HYPRE error user functions |
| *--------------------------------------------------------------------------*/ |
| |
| /* Return the current hypre error flag */ |
| int HYPRE_GetError(); |
| |
| /* Check if the given error flag contains the given error code */ |
| int HYPRE_CheckError(int hypre_ierr, int hypre_error_code); |
| |
| /* Return the index of the argument (counting from 1) where |
| argument error (HYPRE_ERROR_ARG) has occured */ |
| int HYPRE_GetErrorArg(); |
| |
| /* Describe the given error flag in the given string */ |
| void HYPRE_DescribeError(int hypre_ierr, char *descr); |
| |
| |
| #endif |
| |
| #endif |