xref: /petsc/include/petscsys.h (revision e005ede52eafe2fed2813abb7a7eb3df04d5f886)
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