xref: /petsc/src/dm/dt/tests/ex12.c (revision 06ad157546d036f7e09b18c4984a823580aab6f1)
1*06ad1575SMatthew G. Knepley static char help[] = "Tests for PetscWeakForm.\n\n";
2*06ad1575SMatthew G. Knepley 
3*06ad1575SMatthew G. Knepley #include <petscds.h>
4*06ad1575SMatthew G. Knepley 
5*06ad1575SMatthew G. Knepley static void f0(PetscInt dim, PetscInt Nf, PetscInt NfAux,
6*06ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
7*06ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
8*06ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
9*06ad1575SMatthew G. Knepley {
10*06ad1575SMatthew G. Knepley   f0[0] = 0.0;
11*06ad1575SMatthew G. Knepley }
12*06ad1575SMatthew G. Knepley 
13*06ad1575SMatthew G. Knepley static void f1(PetscInt dim, PetscInt Nf, PetscInt NfAux,
14*06ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
15*06ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
16*06ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
17*06ad1575SMatthew G. Knepley {
18*06ad1575SMatthew G. Knepley   f0[0] = 0.0;
19*06ad1575SMatthew G. Knepley }
20*06ad1575SMatthew G. Knepley 
21*06ad1575SMatthew G. Knepley static void f2(PetscInt dim, PetscInt Nf, PetscInt NfAux,
22*06ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
23*06ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
24*06ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
25*06ad1575SMatthew G. Knepley {
26*06ad1575SMatthew G. Knepley   f0[0] = 0.0;
27*06ad1575SMatthew G. Knepley }
28*06ad1575SMatthew G. Knepley 
29*06ad1575SMatthew G. Knepley static void f3(PetscInt dim, PetscInt Nf, PetscInt NfAux,
30*06ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
31*06ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
32*06ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
33*06ad1575SMatthew G. Knepley {
34*06ad1575SMatthew G. Knepley   f0[0] = 0.0;
35*06ad1575SMatthew G. Knepley }
36*06ad1575SMatthew G. Knepley 
37*06ad1575SMatthew G. Knepley static PetscErrorCode CheckResidual(PetscWeakForm wf, PetscFormKey key, PetscInt in0, PetscPointFunc if0[], PetscInt in1, PetscPointFunc if1[])
38*06ad1575SMatthew G. Knepley {
39*06ad1575SMatthew G. Knepley   PetscPointFunc *f0, *f1;
40*06ad1575SMatthew G. Knepley   PetscInt        n0, n1, i;
41*06ad1575SMatthew G. Knepley   PetscErrorCode  ierr;
42*06ad1575SMatthew G. Knepley 
43*06ad1575SMatthew G. Knepley   PetscFunctionBegin;
44*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormGetResidual(wf, key.label, key.value, key.field, key.part, &n0, &f0, &n1, &f1);CHKERRQ(ierr);
45*06ad1575SMatthew G. Knepley   if (n0 != in0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Found %D f0 functions != %D functions input", n0, in0);
46*06ad1575SMatthew G. Knepley   for (i = 0; i < n0; ++i) {if (f0[i] != if0[i]) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "f0[%D] != input f0[%D]", i, i);}
47*06ad1575SMatthew G. Knepley   if (n1 != in1) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Found %D f1 functions != %D functions input", n0, in0);
48*06ad1575SMatthew G. Knepley   for (i = 0; i < n1; ++i) {if (f1[i] != if1[i]) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "f1[%D] != input f1[%D]", i, i);}
49*06ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
50*06ad1575SMatthew G. Knepley }
51*06ad1575SMatthew G. Knepley 
52*06ad1575SMatthew G. Knepley static PetscErrorCode TestSetIndex(PetscWeakForm wf)
53*06ad1575SMatthew G. Knepley {
54*06ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3};
55*06ad1575SMatthew G. Knepley   DMLabel          label;
56*06ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
57*06ad1575SMatthew G. Knepley   PetscFormKey key;
58*06ad1575SMatthew G. Knepley   PetscInt         i, j, k, l;
59*06ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
60*06ad1575SMatthew G. Knepley 
61*06ad1575SMatthew G. Knepley   PetscFunctionBegin;
62*06ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
63*06ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
64*06ad1575SMatthew G. Knepley   /* Check f0 */
65*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
66*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
67*06ad1575SMatthew G. Knepley       if (j == i) continue;
68*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
69*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
70*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
71*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
72*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], 0, NULL);CHKERRQ(ierr);
73*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], 0, NULL);CHKERRQ(ierr);
74*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], 0, NULL);CHKERRQ(ierr);
75*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], 0, NULL);CHKERRQ(ierr);
76*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
77*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
78*06ad1575SMatthew G. Knepley         }
79*06ad1575SMatthew G. Knepley       }
80*06ad1575SMatthew G. Knepley     }
81*06ad1575SMatthew G. Knepley   }
82*06ad1575SMatthew G. Knepley   /* Check f1 */
83*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
84*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
85*06ad1575SMatthew G. Knepley       if (j == i) continue;
86*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
87*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
88*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
89*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
90*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, i, f[i]);CHKERRQ(ierr);
91*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, j, f[j]);CHKERRQ(ierr);
92*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, k, f[k]);CHKERRQ(ierr);
93*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, l, f[l]);CHKERRQ(ierr);
94*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
95*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
96*06ad1575SMatthew G. Knepley         }
97*06ad1575SMatthew G. Knepley       }
98*06ad1575SMatthew G. Knepley     }
99*06ad1575SMatthew G. Knepley   }
100*06ad1575SMatthew G. Knepley   /* Check f0 and f1 */
101*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
102*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
103*06ad1575SMatthew G. Knepley       if (j == i) continue;
104*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
105*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
106*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
107*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
108*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], i, f[i]);CHKERRQ(ierr);
109*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], j, f[j]);CHKERRQ(ierr);
110*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], k, f[k]);CHKERRQ(ierr);
111*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], l, f[l]);CHKERRQ(ierr);
112*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 4, f);CHKERRQ(ierr);
113*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
114*06ad1575SMatthew G. Knepley         }
115*06ad1575SMatthew G. Knepley       }
116*06ad1575SMatthew G. Knepley     }
117*06ad1575SMatthew G. Knepley   }
118*06ad1575SMatthew G. Knepley   /* Check f0 and f1 in different orders */
119*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
120*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
121*06ad1575SMatthew G. Knepley       if (j == i) continue;
122*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
123*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
124*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
125*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
126*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], i, f[i]);CHKERRQ(ierr);
127*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], j, f[j]);CHKERRQ(ierr);
128*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], k, f[k]);CHKERRQ(ierr);
129*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], l, f[l]);CHKERRQ(ierr);
130*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 4, f);CHKERRQ(ierr);
131*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
132*06ad1575SMatthew G. Knepley         }
133*06ad1575SMatthew G. Knepley       }
134*06ad1575SMatthew G. Knepley     }
135*06ad1575SMatthew G. Knepley   }
136*06ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
137*06ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
138*06ad1575SMatthew G. Knepley }
139*06ad1575SMatthew G. Knepley 
140*06ad1575SMatthew G. Knepley static PetscErrorCode TestAdd(PetscWeakForm wf)
141*06ad1575SMatthew G. Knepley {
142*06ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3}, fp[4];
143*06ad1575SMatthew G. Knepley   DMLabel          label;
144*06ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
145*06ad1575SMatthew G. Knepley   PetscFormKey key;
146*06ad1575SMatthew G. Knepley   PetscInt         i, j, k, l;
147*06ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
148*06ad1575SMatthew G. Knepley 
149*06ad1575SMatthew G. Knepley   PetscFunctionBegin;
150*06ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
151*06ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
152*06ad1575SMatthew G. Knepley   /* Check f0 */
153*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
154*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
155*06ad1575SMatthew G. Knepley       if (j == i) continue;
156*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
157*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
158*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
159*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
160*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[i], NULL);CHKERRQ(ierr);
161*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[j], NULL);CHKERRQ(ierr);
162*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[k], NULL);CHKERRQ(ierr);
163*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[l], NULL);CHKERRQ(ierr);
164*06ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
165*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, fp, 0, NULL);CHKERRQ(ierr);
166*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
167*06ad1575SMatthew G. Knepley         }
168*06ad1575SMatthew G. Knepley       }
169*06ad1575SMatthew G. Knepley     }
170*06ad1575SMatthew G. Knepley   }
171*06ad1575SMatthew G. Knepley   /* Check f1 */
172*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
173*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
174*06ad1575SMatthew G. Knepley       if (j == i) continue;
175*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
176*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
177*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
178*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
179*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[i]);CHKERRQ(ierr);
180*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[j]);CHKERRQ(ierr);
181*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[k]);CHKERRQ(ierr);
182*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[l]);CHKERRQ(ierr);
183*06ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
184*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 0, NULL, 4, fp);CHKERRQ(ierr);
185*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
186*06ad1575SMatthew G. Knepley         }
187*06ad1575SMatthew G. Knepley       }
188*06ad1575SMatthew G. Knepley     }
189*06ad1575SMatthew G. Knepley   }
190*06ad1575SMatthew G. Knepley   /* Check f0 and f1 */
191*06ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
192*06ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
193*06ad1575SMatthew G. Knepley       if (j == i) continue;
194*06ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
195*06ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
196*06ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
197*06ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
198*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[i], f[i]);CHKERRQ(ierr);
199*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[j], f[j]);CHKERRQ(ierr);
200*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[k], f[k]);CHKERRQ(ierr);
201*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[l], f[l]);CHKERRQ(ierr);
202*06ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
203*06ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, fp, 4, fp);CHKERRQ(ierr);
204*06ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
205*06ad1575SMatthew G. Knepley         }
206*06ad1575SMatthew G. Knepley       }
207*06ad1575SMatthew G. Knepley     }
208*06ad1575SMatthew G. Knepley   }
209*06ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
210*06ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
211*06ad1575SMatthew G. Knepley }
212*06ad1575SMatthew G. Knepley 
213*06ad1575SMatthew G. Knepley static PetscErrorCode TestSetIndexAdd(PetscWeakForm wf)
214*06ad1575SMatthew G. Knepley {
215*06ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3};
216*06ad1575SMatthew G. Knepley   DMLabel          label;
217*06ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
218*06ad1575SMatthew G. Knepley   PetscFormKey key;
219*06ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
220*06ad1575SMatthew G. Knepley 
221*06ad1575SMatthew G. Knepley   PetscFunctionBegin;
222*06ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
223*06ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
224*06ad1575SMatthew G. Knepley   /* Check f0 */
225*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
226*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 1, f[1], 0, NULL);CHKERRQ(ierr);
227*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
228*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[3], NULL);CHKERRQ(ierr);
229*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
230*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
231*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
232*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
233*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 2, f[2], 0, NULL);CHKERRQ(ierr);
234*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[3], NULL);CHKERRQ(ierr);
235*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
236*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
237*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
238*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
239*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
240*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
241*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
242*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
243*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[0], NULL);CHKERRQ(ierr);
244*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 1, f[1], 0, NULL);CHKERRQ(ierr);
245*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
246*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
247*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
248*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
249*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[0], NULL);CHKERRQ(ierr);
250*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
251*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 2, f[2], 0, NULL);CHKERRQ(ierr);
252*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
253*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
254*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
255*06ad1575SMatthew G. Knepley   /* Check f1 */
256*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
257*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 1, f[1]);CHKERRQ(ierr);
258*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
259*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[3]);CHKERRQ(ierr);
260*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
261*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
262*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
263*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
264*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 2, f[2]);CHKERRQ(ierr);
265*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[3]);CHKERRQ(ierr);
266*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
267*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
268*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
269*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
270*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
271*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
272*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
273*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
274*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[0]);CHKERRQ(ierr);
275*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 1, f[1]);CHKERRQ(ierr);
276*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
277*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
278*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
279*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
280*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[0]);CHKERRQ(ierr);
281*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
282*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 2, f[2]);CHKERRQ(ierr);
283*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
284*06ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
285*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
286*06ad1575SMatthew G. Knepley 
287*06ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
288*06ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
289*06ad1575SMatthew G. Knepley }
290*06ad1575SMatthew G. Knepley 
291*06ad1575SMatthew G. Knepley int main(int argc,char **argv)
292*06ad1575SMatthew G. Knepley {
293*06ad1575SMatthew G. Knepley   PetscWeakForm  wf;
294*06ad1575SMatthew G. Knepley   PetscErrorCode ierr;
295*06ad1575SMatthew G. Knepley 
296*06ad1575SMatthew G. Knepley   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
297*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormCreate(PETSC_COMM_SELF, &wf);CHKERRQ(ierr);
298*06ad1575SMatthew G. Knepley   ierr = TestSetIndex(wf);CHKERRQ(ierr);
299*06ad1575SMatthew G. Knepley   ierr = TestAdd(wf);CHKERRQ(ierr);
300*06ad1575SMatthew G. Knepley   ierr = TestSetIndexAdd(wf);CHKERRQ(ierr);
301*06ad1575SMatthew G. Knepley   ierr = PetscWeakFormDestroy(&wf);CHKERRQ(ierr);
302*06ad1575SMatthew G. Knepley   ierr = PetscFinalize();
303*06ad1575SMatthew G. Knepley   return ierr;
304*06ad1575SMatthew G. Knepley }
305*06ad1575SMatthew G. Knepley 
306*06ad1575SMatthew G. Knepley /*TEST
307*06ad1575SMatthew G. Knepley 
308*06ad1575SMatthew G. Knepley   test:
309*06ad1575SMatthew G. Knepley     suffix: 0
310*06ad1575SMatthew G. Knepley 
311*06ad1575SMatthew G. Knepley TEST*/
312