xref: /petsc/include/petscsys.h (revision fff829cf019b5079f7f709086c75661a07a2e190)
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 
16 EXTERN PetscErrorCode  PetscSortInt(PetscInt,PetscInt[]);
17 EXTERN PetscErrorCode  PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]);
18 EXTERN PetscErrorCode  PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]);
19 EXTERN PetscErrorCode  PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]);
20 EXTERN PetscErrorCode  PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]);
21 EXTERN PetscErrorCode  PetscSortReal(PetscInt,PetscReal[]);
22 EXTERN PetscErrorCode  PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]);
23 
24 EXTERN PetscErrorCode  PetscSetDisplay(void);
25 EXTERN PetscErrorCode  PetscGetDisplay(char[],size_t);
26 
27 extern PetscCookie PETSC_RANDOM_COOKIE;
28 
29 typedef enum { RANDOM_DEFAULT,RANDOM_DEFAULT_REAL,
30                RANDOM_DEFAULT_IMAGINARY } PetscRandomType;
31 
32 /*S
33      PetscRandom - Abstract PETSc object that manages generating random numbers
34 
35    Level: intermediate
36 
37   Concepts: random numbers
38 
39 .seealso:  PetscRandomCreate(), PetscRandomGetValue()
40 S*/
41 typedef struct _p_PetscRandom*   PetscRandom;
42 
43 EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandomType,PetscRandom*);
44 EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*);
45 EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar);
46 EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom);
47 
48 EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t);
49 EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t);
50 EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t);
51 EXTERN PetscErrorCode PetscGetRealPath(char[],char[]);
52 EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t);
53 EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscTruth*);
54 EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscTruth*);
55 EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscDataType);
56 EXTERN PetscErrorCode PetscSynchronizedBinaryRead(MPI_Comm,int,void*,PetscInt,PetscDataType);
57 EXTERN PetscErrorCode PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscTruth);
58 EXTERN PetscErrorCode PetscBinaryOpen(const char[],int,int *);
59 EXTERN PetscErrorCode PetscBinaryClose(int);
60 EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscTruth *);
61 EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscTruth *);
62 EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char *,size_t);
63 EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char *,char *,size_t,PetscTruth*);
64 EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char*,size_t,PetscTruth*);
65 EXTERN PetscErrorCode PetscDLLibraryCCAAppend(MPI_Comm,PetscDLLibraryList*,const char[]);
66 
67 /*
68    In binary files variables are stored using the following lengths,
69   regardless of how they are stored in memory on any one particular
70   machine. Use these rather then sizeof() in computing sizes for
71   PetscBinarySeek().
72 */
73 #define PETSC_BINARY_INT_SIZE    (32/8)
74 #define PETSC_BINARY_FLOAT_SIZE  (32/8)
75 #define PETSC_BINARY_CHAR_SIZE    (8/8)
76 #define PETSC_BINARY_SHORT_SIZE  (16/8)
77 #define PETSC_BINARY_DOUBLE_SIZE (64/8)
78 #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar)
79 
80 /*E
81   PetscBinarySeekType - argument to PetscBinarySeek()
82 
83   Level: advanced
84 
85 .seealso: PetscBinarySeek(), PetscSynchronizedBinarySeek()
86 E*/
87 typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType;
88 EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*);
89 EXTERN PetscErrorCode PetscSynchronizedBinarySeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*);
90 
91 EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscTruth);
92 EXTERN PetscErrorCode PetscSetDefaultDebugger(void);
93 EXTERN PetscErrorCode PetscSetDebuggerFromString(char*);
94 EXTERN PetscErrorCode PetscAttachDebugger(void);
95 EXTERN PetscErrorCode PetscStopForDebugger(void);
96 
97 EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,PetscMPIInt*,PetscMPIInt*,PetscMPIInt*);
98 EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt**,PetscMPIInt**);
99 EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscMPIInt**,PetscMPIInt**,PetscMPIInt**);
100 EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,PetscMPIInt*,PetscMPIInt*,PetscInt***,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,0))
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 /* Routines below are used for incomplete matrix factorization */
281 /*
282   Create and initialize a linked list and its levels
283   Input Parameters:
284     idx_start - starting index of the list
285     lnk_max   - max value of lnk indicating the end of the list
286     nlnk      - max length of the list
287   Output Parameters:
288     lnk       - list initialized
289     lnk_lvl   - array of size nlnk for storing levels of lnk
290     bt        - PetscBT (bitarray) with all bits set to false
291 */
292 #define PetscLLCreate_PermutedLeveled(idx_start,lnk_max,nlnk,lnk,lnk_lvl,bt)\
293   (PetscMalloc(2*nlnk*sizeof(PetscInt),&lnk) || PetscBTCreate(nlnk,bt) || PetscBTMemzero(nlnk,bt) || (lnk[idx_start] = lnk_max,lnk_lvl = lnk + nlnk,0))
294 
295 /*
296   Add a index set into a sorted linked list
297   Input Parameters:
298     nidx      - number of input indices
299     indices   - interger array used for storing column indices
300     level     - level of fill, e.g., ICC(level)
301     indices_lvl - level of indices
302     idx_start - starting index of the list
303     perm      - permutation
304     lnk       - linked list(an integer array) that is created
305     lnk_lvl   - levels of lnk
306     bt        - PetscBT (bitarray), bt[idx]=true marks idx is in lnk
307   output Parameters:
308     nlnk      - number of newly added indices
309     lnk       - the sorted(increasing order) linked list containing new and non-redundate entries from indices
310     lnk_lvl   - levels of lnk
311     bt        - updated PetscBT (bitarray)
312 */
313 #define PetscLLAdd_PermutedLeveled(nidx,indices,level,indices_lvl,idx_start,perm,nlnk,lnk,lnk_lvl,bt) 0;\
314 {\
315   int _k,_entry,_location,_lnkdata,_incrlev;\
316   nlnk = 0;\
317   _k   = nidx;\
318   while (_k){/* assume indices are almost in increasing order, starting from its end saves computation */\
319     _incrlev = indices_lvl[_k-1] + 1;\
320     if (_incrlev > level) { --_k; continue;} \
321     _entry = indices[--_k];\
322     if (!PetscBTLookupSet(bt,_entry)){  /* new entry */\
323       /* search for insertion location */\
324       _lnkdata  = idx_start;\
325       do {\
326         _location = _lnkdata;\
327         _lnkdata  = lnk[_location];\
328       } while (_entry > _lnkdata);\
329       /* insertion location is found, add entry into lnk if it is new */\
330       if (_entry <  _lnkdata){/* new entry */\
331         lnk[_location] = _entry;\
332         lnk[_entry]    = _lnkdata;\
333         nlnk++;\
334         lnk_lvl[_entry] = _incrlev;\
335       }\
336     } else { /* existing entry: update lnk_lvl */\
337       if (lnk_lvl[_entry] > _incrlev) lnk_lvl[_entry] = _incrlev;\
338     }\
339   }\
340 }
341 /*
342   Copy data on the list into an array, then initialize the list
343   Input Parameters:
344     idx_start - starting index of the list
345     lnk_max   - max value of lnk indicating the end of the list
346     nlnk      - number of data on the list to be copied
347     lnk       - linked list
348     lnk_lvl   - level of lnk
349     bt        - PetscBT (bitarray), bt[idx]=true marks idx is in lnk
350   output Parameters:
351     indices   - array that contains the copied data
352     lnk       -llinked list that is cleaned and initialize
353     lnk_lvl   - level of lnk that is reinitialized
354     bt        - PetscBT (bitarray) with all bits set to false
355 */
356 #define PetscLLClean_PermutedLeveled(idx_start,lnk_max,nlnk,lnk,lnk_lvl,indices,indices_lvl,bt) 0;\
357 {\
358   int _j,_idx=idx_start;\
359   for (_j=0; _j<nlnk; _j++){\
360     _idx = lnk[_idx];\
361     *(indices+_j) = _idx;\
362     *(indices_lvl+_j) = lnk_lvl[_idx];\
363     lnk_lvl[_idx] = -1;\
364     PetscBTClear(bt,_idx);\
365   }\
366   lnk[idx_start] = lnk_max;\
367 }
368 /*
369   Free memories used by the list
370 */
371 #define PetscLLDestroy_PermutedLeveled(lnk,lnk_lvl,bt) \
372 (PetscFree(lnk) || PetscBTDestroy(bt))
373 
374 PETSC_EXTERN_CXX_END
375 #endif /* __PETSCSYS_H */
376