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 PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscMPIInt**,PetscMPIInt**,PetscMPIInt**); 101 EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscInt***,MPI_Request**); 102 EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscScalar***,MPI_Request**); 103 104 EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscTruth *,PetscTruth *); 105 106 /* Parallel communication routines */ 107 /*E 108 InsertMode - Whether entries are inserted or added into vectors or matrices 109 110 Level: beginner 111 112 .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 113 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), 114 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 115 E*/ 116 typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES} InsertMode; 117 118 /*M 119 INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value 120 121 Level: beginner 122 123 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 124 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 125 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 126 127 M*/ 128 129 /*M 130 ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the 131 value into that location 132 133 Level: beginner 134 135 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(), 136 VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES, 137 MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd() 138 139 M*/ 140 141 /*M 142 MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location 143 144 Level: beginner 145 146 .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES 147 148 M*/ 149 150 /*E 151 ScatterMode - Determines the direction of a scatter 152 153 Level: beginner 154 155 .seealso: VecScatter, VecScatterBegin(), VecScatterEnd() 156 E*/ 157 typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode; 158 159 /*M 160 SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call 161 162 Level: beginner 163 164 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL, 165 SCATTER_REVERSE_LOCAL 166 167 M*/ 168 169 /*M 170 SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in 171 in the VecScatterCreate() 172 173 Level: beginner 174 175 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 176 SCATTER_REVERSE_LOCAL 177 178 M*/ 179 180 /*M 181 SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication 182 is done. Any variables that have be moved between processes are ignored 183 184 Level: developer 185 186 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD, 187 SCATTER_REVERSE_LOCAL 188 189 M*/ 190 191 /*M 192 SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in 193 in the VecScatterCreate() except NO parallel communication 194 is done. Any variables that have be moved between processes are ignored 195 196 Level: developer 197 198 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 199 SCATTER_REVERSE 200 201 M*/ 202 203 /* 204 Create and initialize a linked list 205 Input Parameters: 206 idx_start - starting index of the list 207 lnk_max - max value of lnk indicating the end of the list 208 nlnk - max length of the list 209 Output Parameters: 210 lnk - list initialized 211 bt - PetscBT (bitarray) with all bits set to false 212 */ 213 #define PetscLLCreate(idx_start,lnk_max,nlnk,lnk,bt) \ 214 (PetscMalloc(nlnk*sizeof(PetscInt),&lnk) || PetscBTCreate(nlnk,bt) || PetscBTMemzero(nlnk,bt)); lnk[idx_start] = lnk_max; 215 216 217 /* 218 Add a index set into a sorted linked list 219 Input Parameters: 220 nidx - number of input indices 221 indices - interger array 222 idx_start - starting index of the list 223 lnk - linked list(an integer array) that is created 224 bt - PetscBT (bitarray), bt[idx]=true marks idx is in lnk 225 output Parameters: 226 nlnk - number of newly added indices 227 lnk - the sorted(increasing order) linked list containing new and non-redundate entries from indices 228 bt - updated PetscBT (bitarray) 229 */ 230 #define PetscLLAdd(nidx,indices,idx_start,nlnk,lnk,bt) 0;\ 231 {\ 232 int _k,_entry,_location,_lnkdata;\ 233 nlnk = 0;\ 234 _k=nidx;\ 235 while (_k){/* assume indices are almost in increasing order, starting from its end saves computation */\ 236 _entry = indices[--_k];\ 237 if (!PetscBTLookupSet(bt,_entry)){ /* new entry */\ 238 /* search for insertion location */\ 239 _lnkdata = idx_start;\ 240 do {\ 241 _location = _lnkdata;\ 242 _lnkdata = lnk[_location];\ 243 } while (_entry > _lnkdata);\ 244 /* insertion location is found, add entry into lnk if it is new */\ 245 if (_entry < _lnkdata){/* new entry */\ 246 lnk[_location] = _entry;\ 247 lnk[_entry] = _lnkdata;\ 248 nlnk++;\ 249 }\ 250 }\ 251 }\ 252 } 253 /* 254 Copy data on the list into an array, then initialize the list 255 Input Parameters: 256 idx_start - starting index of the list 257 lnk_max - max value of lnk indicating the end of the list 258 nlnk - number of data on the list to be copied 259 lnk - linked list 260 bt - PetscBT (bitarray), bt[idx]=true marks idx is in lnk 261 output Parameters: 262 indices - array that contains the copied data 263 lnk -llinked list that is cleaned and initialize 264 bt - PetscBT (bitarray) with all bits set to false 265 */ 266 #define PetscLLClean(idx_start,lnk_max,nlnk,lnk,indices,bt) 0;\ 267 {\ 268 int _j,_idx=idx_start;\ 269 for (_j=0; _j<nlnk; _j++){\ 270 _idx = lnk[_idx];\ 271 *(indices+_j) = _idx;\ 272 PetscBTClear(bt,_idx);\ 273 }\ 274 lnk[idx_start] = lnk_max;\ 275 } 276 /* 277 Free memories used by the list 278 */ 279 #define PetscLLDestroy(lnk,bt) (PetscFree(lnk) || PetscBTDestroy(bt)) 280 281 PETSC_EXTERN_CXX_END 282 #endif /* __PETSCSYS_H */ 283