Actual source code: init.cxx
1: #include <petscdmda.h>
2: #include <adolc/adalloc.h>
4: /*
5: REQUIRES configuration of PETSc with option --download-adolc.
7: For documentation on ADOL-C, see
8: $PETSC_ARCH/externalpackages/ADOL-C-2.6.0/ADOL-C/doc/adolc-manual.pdf
9: */
11: /*
12: Wrapper function for allocating contiguous memory in a 2d array
14: Input parameters:
15: m,n - number of rows and columns of array, respectively
17: Output parameter:
18: A - pointer to array for which memory is allocated
20: Note: Only arrays of doubles are currently accounted for in ADOL-C's myalloc2 function.
21: */
22: template <class T>
23: PetscErrorCode AdolcMalloc2(PetscInt m, PetscInt n, T **A[])
24: {
25: PetscFunctionBegin;
26: *A = myalloc2(m, n);
27: PetscFunctionReturn(PETSC_SUCCESS);
28: }
30: /*
31: Wrapper function for freeing memory allocated with AdolcMalloc2
33: Input parameter:
34: A - array to free memory of
36: Note: Only arrays of doubles are currently accounted for in ADOL-C's myfree2 function.
37: */
38: template <class T>
39: PetscErrorCode AdolcFree2(T **A)
40: {
41: PetscFunctionBegin;
42: myfree2(A);
43: PetscFunctionReturn(PETSC_SUCCESS);
44: }
46: /*
47: Shift indices in an array of type T to endow it with ghost points.
48: (e.g. This works for arrays of adoubles or arrays (of structs) thereof.)
50: Input parameters:
51: da - distributed array upon which variables are defined
52: cgs - contiguously allocated 1-array with as many entries as there are
53: interior and ghost points, in total
55: Output parameter:
56: array - contiguously allocated array of the appropriate dimension with
57: ghost points, pointing to the 1-array
58: */
59: template <class T>
60: PetscErrorCode GiveGhostPoints(DM da, T *cgs, void *array)
61: {
62: PetscInt dim;
64: PetscFunctionBegin;
65: PetscCall(DMDAGetInfo(da, &dim, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
66: if (dim == 1) {
67: PetscCall(GiveGhostPoints1d(da, (T **)array));
68: } else if (dim == 2) {
69: PetscCall(GiveGhostPoints2d(da, cgs, (T ***)array));
70: } else PetscCheck(dim != 3, PetscObjectComm((PetscObject)da), PETSC_ERR_SUP, "GiveGhostPoints3d not yet implemented"); // TODO
71: PetscFunctionReturn(PETSC_SUCCESS);
72: }
74: /*
75: Shift indices in a 1-array of type T to endow it with ghost points.
76: (e.g. This works for arrays of adoubles or arrays (of structs) thereof.)
78: Input parameters:
79: da - distributed array upon which variables are defined
81: Output parameter:
82: a1d - contiguously allocated 1-array
83: */
84: template <class T>
85: PetscErrorCode GiveGhostPoints1d(DM da, T *a1d[])
86: {
87: PetscInt gxs;
89: PetscFunctionBegin;
90: PetscCall(DMDAGetGhostCorners(da, &gxs, NULL, NULL, NULL, NULL, NULL));
91: *a1d -= gxs;
92: PetscFunctionReturn(PETSC_SUCCESS);
93: }
95: /*
96: Shift indices in a 2-array of type T to endow it with ghost points.
97: (e.g. This works for arrays of adoubles or arrays (of structs) thereof.)
99: Input parameters:
100: da - distributed array upon which variables are defined
101: cgs - contiguously allocated 1-array with as many entries as there are
102: interior and ghost points, in total
104: Output parameter:
105: a2d - contiguously allocated 2-array with ghost points, pointing to the
106: 1-array
107: */
108: template <class T>
109: PetscErrorCode GiveGhostPoints2d(DM da, T *cgs, T **a2d[])
110: {
111: PetscInt gxs, gys, gxm, gym;
113: PetscFunctionBegin;
114: PetscCall(DMDAGetGhostCorners(da, &gxs, &gys, NULL, &gxm, &gym, NULL));
115: for (PetscInt j = 0; j < gym; j++) (*a2d)[j] = cgs + j * gxm - gxs;
116: *a2d -= gys;
117: PetscFunctionReturn(PETSC_SUCCESS);
118: }
120: /*
121: Create a rectangular sub-identity of the m x m identity matrix, as an array.
123: Input parameters:
124: n - number of (adjacent) rows to take in slice
125: s - starting row index
127: Output parameter:
128: S - resulting n x m submatrix
129: */
130: template <class T>
131: PetscErrorCode Subidentity(PetscInt n, PetscInt s, T **S)
132: {
133: PetscInt i;
135: PetscFunctionBegin;
136: for (i = 0; i < n; i++) S[i][i + s] = 1.;
137: PetscFunctionReturn(PETSC_SUCCESS);
138: }
140: /*
141: Create an identity matrix, as an array.
143: Input parameter:
144: n - number of rows/columns
145: I - n x n array with memory pre-allocated
146: */
147: template <class T>
148: PetscErrorCode Identity(PetscInt n, T **I)
149: {
150: PetscFunctionBegin;
151: PetscCall(Subidentity(n, 0, I));
152: PetscFunctionReturn(PETSC_SUCCESS);
153: }