1 /* 2 Provides access to system related and general utility routines. 3 */ 4 #if !defined(__PETSCSYS_H) 5 #define __PETSCSYS_H 6 #include "petsc.h" 7 PETSC_EXTERN_CXX_BEGIN 8 9 EXTERN PetscErrorCode PetscGetArchType(char[],size_t); 10 EXTERN PetscErrorCode PetscGetHostName(char[],size_t); 11 EXTERN PetscErrorCode PetscGetUserName(char[],size_t); 12 EXTERN PetscErrorCode PetscGetProgramName(char[],size_t); 13 EXTERN PetscErrorCode PetscSetProgramName(const char[]); 14 EXTERN PetscErrorCode PetscGetDate(char[],size_t); 15 EXTERN PetscErrorCode PetscSetInitialDate(void); 16 EXTERN PetscErrorCode PetscGetInitialDate(char[],size_t); 17 18 EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]); 19 EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]); 20 EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]); 21 EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]); 22 EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]); 23 EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]); 24 25 EXTERN PetscErrorCode PetscSetDisplay(void); 26 EXTERN PetscErrorCode PetscGetDisplay(char[],size_t); 27 28 extern PetscCookie PETSC_RANDOM_COOKIE; 29 30 typedef enum { RANDOM_DEFAULT,RANDOM_DEFAULT_REAL, 31 RANDOM_DEFAULT_IMAGINARY } PetscRandomType; 32 33 /*S 34 PetscRandom - Abstract PETSc object that manages generating random numbers 35 36 Level: intermediate 37 38 Concepts: random numbers 39 40 .seealso: PetscRandomCreate(), PetscRandomGetValue() 41 S*/ 42 typedef struct _p_PetscRandom* PetscRandom; 43 44 EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandomType,PetscRandom*); 45 EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*); 46 EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar); 47 EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom); 48 49 EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t); 50 EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t); 51 EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t); 52 EXTERN PetscErrorCode PetscGetRealPath(char[],char[]); 53 EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t); 54 EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscTruth*); 55 EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscTruth*); 56 EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscDataType); 57 EXTERN PetscErrorCode PetscSynchronizedBinaryRead(MPI_Comm,int,void*,PetscInt,PetscDataType); 58 EXTERN PetscErrorCode PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscTruth); 59 EXTERN PetscErrorCode PetscBinaryOpen(const char[],int,int *); 60 EXTERN PetscErrorCode PetscBinaryClose(int); 61 EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscTruth *); 62 EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscTruth *); 63 EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char *,size_t); 64 EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char *,char *,size_t,PetscTruth*); 65 EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char*,size_t,PetscTruth*); 66 EXTERN PetscErrorCode PetscDLLibraryCCAAppend(MPI_Comm,PetscDLLibraryList*,const char[]); 67 68 /* 69 In binary files variables are stored using the following lengths, 70 regardless of how they are stored in memory on any one particular 71 machine. Use these rather then sizeof() in computing sizes for 72 PetscBinarySeek(). 73 */ 74 #define PETSC_BINARY_INT_SIZE (32/8) 75 #define PETSC_BINARY_FLOAT_SIZE (32/8) 76 #define PETSC_BINARY_CHAR_SIZE (8/8) 77 #define PETSC_BINARY_SHORT_SIZE (16/8) 78 #define PETSC_BINARY_DOUBLE_SIZE (64/8) 79 #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar) 80 81 /*E 82 PetscBinarySeekType - argument to PetscBinarySeek() 83 84 Level: advanced 85 86 .seealso: PetscBinarySeek(), PetscSynchronizedBinarySeek() 87 E*/ 88 typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType; 89 EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*); 90 EXTERN PetscErrorCode PetscSynchronizedBinarySeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*); 91 92 EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscTruth); 93 EXTERN PetscErrorCode PetscSetDefaultDebugger(void); 94 EXTERN PetscErrorCode PetscSetDebuggerFromString(char*); 95 EXTERN PetscErrorCode PetscAttachDebugger(void); 96 EXTERN PetscErrorCode PetscStopForDebugger(void); 97 98 EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,PetscMPIInt*,PetscMPIInt*,PetscMPIInt*); 99 EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt**,PetscMPIInt**); 100 EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscMPIInt***,MPI_Request**); 101 EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscScalar***,MPI_Request**); 102 103 EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscTruth *,PetscTruth *); 104 105 /* Parallel communication routines */ 106 /*E 107 InsertMode - Whether entries are inserted or added into vectors or matrices 108 109 Level: beginner 110 111 .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 112 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), 113 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 114 E*/ 115 typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES} InsertMode; 116 117 /*M 118 INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value 119 120 Level: beginner 121 122 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 123 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 124 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 125 126 M*/ 127 128 /*M 129 ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the 130 value into that location 131 132 Level: beginner 133 134 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 135 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 136 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 137 138 M*/ 139 140 /*M 141 MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location 142 143 Level: beginner 144 145 .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES 146 147 M*/ 148 149 /*E 150 ScatterMode - Determines the direction of a scatter 151 152 Level: beginner 153 154 .seealso: VecScatter, VecScatterBegin(), VecScatterEnd() 155 E*/ 156 typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode; 157 158 /*M 159 SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call 160 161 Level: beginner 162 163 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL, 164 SCATTER_REVERSE_LOCAL 165 166 M*/ 167 168 /*M 169 SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in 170 in the VecScatterCreate() 171 172 Level: beginner 173 174 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 175 SCATTER_REVERSE_LOCAL 176 177 M*/ 178 179 /*M 180 SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication 181 is done. Any variables that have be moved between processes are ignored 182 183 Level: developer 184 185 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD, 186 SCATTER_REVERSE_LOCAL 187 188 M*/ 189 190 /*M 191 SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in 192 in the VecScatterCreate() except NO parallel communication 193 is done. Any variables that have be moved between processes are ignored 194 195 Level: developer 196 197 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 198 SCATTER_REVERSE 199 200 M*/ 201 202 /* 203 Create and initialize a linked list 204 Input Parameters: 205 idx_start - starting index of the list 206 lnk_max - max value of lnk indicating the end of the list 207 nlnk - max length of the list 208 Output Parameters: 209 lnk - list initialized 210 bt - PetscBT (bitarray) with all bits set to false 211 */ 212 #define PetscLLCreate(idx_start,lnk_max,nlnk,lnk,bt) \ 213 (PetscMalloc(nlnk*sizeof(PetscInt),&lnk) || PetscBTCreate(nlnk,bt) || PetscBTMemzero(nlnk,bt)); lnk[idx_start] = lnk_max; 214 215 216 /* 217 Add a index set into a sorted linked list 218 Input Parameters: 219 nidx - number of input indices 220 indices - interger array 221 idx_start - starting index of the list 222 lnk - linked list(an integer array) that is created 223 bt - PetscBT (bitarray), bt[idx]=true marks idx is in lnk 224 output Parameters: 225 nlnk - number of newly added indices 226 lnk - the sorted(increasing order) linked list containing new and non-redundate entries from indices 227 bt - updated PetscBT (bitarray) 228 */ 229 #define PetscLLAdd(nidx,indices,idx_start,nlnk,lnk,bt) 0;\ 230 {\ 231 int _k,_entry,_location,_lnkdata;\ 232 nlnk = 0;\ 233 _k=nidx;\ 234 while (_k){/* assume indices are almost in increasing order, starting from its end saves computation */\ 235 _entry = indices[--_k];\ 236 if (!PetscBTLookupSet(bt,_entry)){ /* new entry */\ 237 /* search for insertion location */\ 238 _lnkdata = idx_start;\ 239 do {\ 240 _location = _lnkdata;\ 241 _lnkdata = lnk[_location];\ 242 } while (_entry > _lnkdata);\ 243 /* insertion location is found, add entry into lnk if it is new */\ 244 if (_entry < _lnkdata){/* new entry */\ 245 lnk[_location] = _entry;\ 246 lnk[_entry] = _lnkdata;\ 247 nlnk++;\ 248 }\ 249 }\ 250 }\ 251 } 252 /* 253 Copy data on the list into an array, then initialize the list 254 Input Parameters: 255 idx_start - starting index of the list 256 lnk_max - max value of lnk indicating the end of the list 257 nlnk - number of data on the list to be copied 258 lnk - linked list 259 bt - PetscBT (bitarray), bt[idx]=true marks idx is in lnk 260 output Parameters: 261 indices - array that contains the copied data 262 lnk -llinked list that is cleaned and initialize 263 bt - PetscBT (bitarray) with all bits set to false 264 */ 265 #define PetscLLClean(idx_start,lnk_max,nlnk,lnk,indices,bt) 0;\ 266 {\ 267 int _j,_idx=idx_start;\ 268 for (_j=0; _j<nlnk; _j++){\ 269 _idx = lnk[_idx];\ 270 *(indices+_j) = _idx;\ 271 PetscBTClear(bt,_idx);\ 272 }\ 273 lnk[idx_start] = lnk_max;\ 274 } 275 /* 276 Free memories used by the list 277 */ 278 #define PetscLLDestroy(lnk,bt) (PetscFree(lnk) || PetscBTDestroy(bt)) 279 280 PETSC_EXTERN_CXX_END 281 #endif /* __PETSCSYS_H */ 282