xref: /petsc/src/dm/dt/tests/ex12.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
106ad1575SMatthew G. Knepley static char help[] = "Tests for PetscWeakForm.\n\n";
206ad1575SMatthew G. Knepley 
306ad1575SMatthew G. Knepley #include <petscds.h>
406ad1575SMatthew G. Knepley 
506ad1575SMatthew G. Knepley static void f0(PetscInt dim, PetscInt Nf, PetscInt NfAux,
606ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
706ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
806ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
906ad1575SMatthew G. Knepley {
1006ad1575SMatthew G. Knepley   f0[0] = 0.0;
1106ad1575SMatthew G. Knepley }
1206ad1575SMatthew G. Knepley 
1306ad1575SMatthew G. Knepley static void f1(PetscInt dim, PetscInt Nf, PetscInt NfAux,
1406ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
1506ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
1606ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
1706ad1575SMatthew G. Knepley {
1806ad1575SMatthew G. Knepley   f0[0] = 0.0;
1906ad1575SMatthew G. Knepley }
2006ad1575SMatthew G. Knepley 
2106ad1575SMatthew G. Knepley static void f2(PetscInt dim, PetscInt Nf, PetscInt NfAux,
2206ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
2306ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
2406ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
2506ad1575SMatthew G. Knepley {
2606ad1575SMatthew G. Knepley   f0[0] = 0.0;
2706ad1575SMatthew G. Knepley }
2806ad1575SMatthew G. Knepley 
2906ad1575SMatthew G. Knepley static void f3(PetscInt dim, PetscInt Nf, PetscInt NfAux,
3006ad1575SMatthew G. Knepley                const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
3106ad1575SMatthew G. Knepley                const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
3206ad1575SMatthew G. Knepley                PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
3306ad1575SMatthew G. Knepley {
3406ad1575SMatthew G. Knepley   f0[0] = 0.0;
3506ad1575SMatthew G. Knepley }
3606ad1575SMatthew G. Knepley 
3706ad1575SMatthew G. Knepley static PetscErrorCode CheckResidual(PetscWeakForm wf, PetscFormKey key, PetscInt in0, PetscPointFunc if0[], PetscInt in1, PetscPointFunc if1[])
3806ad1575SMatthew G. Knepley {
3906ad1575SMatthew G. Knepley   PetscPointFunc *f0, *f1;
4006ad1575SMatthew G. Knepley   PetscInt        n0, n1, i;
4106ad1575SMatthew G. Knepley   PetscErrorCode  ierr;
4206ad1575SMatthew G. Knepley 
4306ad1575SMatthew G. Knepley   PetscFunctionBegin;
4406ad1575SMatthew G. Knepley   ierr = PetscWeakFormGetResidual(wf, key.label, key.value, key.field, key.part, &n0, &f0, &n1, &f1);CHKERRQ(ierr);
45*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(n0 != in0,PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Found %D f0 functions != %D functions input", n0, in0);
46*2c71b3e2SJacob Faibussowitsch   for (i = 0; i < n0; ++i) {PetscCheckFalse(f0[i] != if0[i],PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "f0[%D] != input f0[%D]", i, i);}
47*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(n1 != in1,PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Found %D f1 functions != %D functions input", n0, in0);
48*2c71b3e2SJacob Faibussowitsch   for (i = 0; i < n1; ++i) {PetscCheckFalse(f1[i] != if1[i],PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "f1[%D] != input f1[%D]", i, i);}
4906ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
5006ad1575SMatthew G. Knepley }
5106ad1575SMatthew G. Knepley 
5206ad1575SMatthew G. Knepley static PetscErrorCode TestSetIndex(PetscWeakForm wf)
5306ad1575SMatthew G. Knepley {
5406ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3};
5506ad1575SMatthew G. Knepley   DMLabel          label;
5606ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
5706ad1575SMatthew G. Knepley   PetscFormKey key;
5806ad1575SMatthew G. Knepley   PetscInt         i, j, k, l;
5906ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
6006ad1575SMatthew G. Knepley 
6106ad1575SMatthew G. Knepley   PetscFunctionBegin;
6206ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
6306ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
6406ad1575SMatthew G. Knepley   /* Check f0 */
6506ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
6606ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
6706ad1575SMatthew G. Knepley       if (j == i) continue;
6806ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
6906ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
7006ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
7106ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
7206ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], 0, NULL);CHKERRQ(ierr);
7306ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], 0, NULL);CHKERRQ(ierr);
7406ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], 0, NULL);CHKERRQ(ierr);
7506ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], 0, NULL);CHKERRQ(ierr);
7606ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
7706ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
7806ad1575SMatthew G. Knepley         }
7906ad1575SMatthew G. Knepley       }
8006ad1575SMatthew G. Knepley     }
8106ad1575SMatthew G. Knepley   }
8206ad1575SMatthew G. Knepley   /* Check f1 */
8306ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
8406ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
8506ad1575SMatthew G. Knepley       if (j == i) continue;
8606ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
8706ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
8806ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
8906ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
9006ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, i, f[i]);CHKERRQ(ierr);
9106ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, j, f[j]);CHKERRQ(ierr);
9206ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, k, f[k]);CHKERRQ(ierr);
9306ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, l, f[l]);CHKERRQ(ierr);
9406ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
9506ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
9606ad1575SMatthew G. Knepley         }
9706ad1575SMatthew G. Knepley       }
9806ad1575SMatthew G. Knepley     }
9906ad1575SMatthew G. Knepley   }
10006ad1575SMatthew G. Knepley   /* Check f0 and f1 */
10106ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
10206ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
10306ad1575SMatthew G. Knepley       if (j == i) continue;
10406ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
10506ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
10606ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
10706ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
10806ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], i, f[i]);CHKERRQ(ierr);
10906ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], j, f[j]);CHKERRQ(ierr);
11006ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], k, f[k]);CHKERRQ(ierr);
11106ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], l, f[l]);CHKERRQ(ierr);
11206ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 4, f);CHKERRQ(ierr);
11306ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
11406ad1575SMatthew G. Knepley         }
11506ad1575SMatthew G. Knepley       }
11606ad1575SMatthew G. Knepley     }
11706ad1575SMatthew G. Knepley   }
11806ad1575SMatthew G. Knepley   /* Check f0 and f1 in different orders */
11906ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
12006ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
12106ad1575SMatthew G. Knepley       if (j == i) continue;
12206ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
12306ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
12406ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
12506ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
12606ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, l, f[l], i, f[i]);CHKERRQ(ierr);
12706ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, k, f[k], j, f[j]);CHKERRQ(ierr);
12806ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, j, f[j], k, f[k]);CHKERRQ(ierr);
12906ad1575SMatthew G. Knepley           ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, i, f[i], l, f[l]);CHKERRQ(ierr);
13006ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, f, 4, f);CHKERRQ(ierr);
13106ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
13206ad1575SMatthew G. Knepley         }
13306ad1575SMatthew G. Knepley       }
13406ad1575SMatthew G. Knepley     }
13506ad1575SMatthew G. Knepley   }
13606ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
13706ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
13806ad1575SMatthew G. Knepley }
13906ad1575SMatthew G. Knepley 
14006ad1575SMatthew G. Knepley static PetscErrorCode TestAdd(PetscWeakForm wf)
14106ad1575SMatthew G. Knepley {
14206ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3}, fp[4];
14306ad1575SMatthew G. Knepley   DMLabel          label;
14406ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
14506ad1575SMatthew G. Knepley   PetscFormKey key;
14606ad1575SMatthew G. Knepley   PetscInt         i, j, k, l;
14706ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
14806ad1575SMatthew G. Knepley 
14906ad1575SMatthew G. Knepley   PetscFunctionBegin;
15006ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
15106ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
15206ad1575SMatthew G. Knepley   /* Check f0 */
15306ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
15406ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
15506ad1575SMatthew G. Knepley       if (j == i) continue;
15606ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
15706ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
15806ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
15906ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
16006ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[i], NULL);CHKERRQ(ierr);
16106ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[j], NULL);CHKERRQ(ierr);
16206ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[k], NULL);CHKERRQ(ierr);
16306ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[l], NULL);CHKERRQ(ierr);
16406ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
16506ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, fp, 0, NULL);CHKERRQ(ierr);
16606ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
16706ad1575SMatthew G. Knepley         }
16806ad1575SMatthew G. Knepley       }
16906ad1575SMatthew G. Knepley     }
17006ad1575SMatthew G. Knepley   }
17106ad1575SMatthew G. Knepley   /* Check f1 */
17206ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
17306ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
17406ad1575SMatthew G. Knepley       if (j == i) continue;
17506ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
17606ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
17706ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
17806ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
17906ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[i]);CHKERRQ(ierr);
18006ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[j]);CHKERRQ(ierr);
18106ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[k]);CHKERRQ(ierr);
18206ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[l]);CHKERRQ(ierr);
18306ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
18406ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 0, NULL, 4, fp);CHKERRQ(ierr);
18506ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
18606ad1575SMatthew G. Knepley         }
18706ad1575SMatthew G. Knepley       }
18806ad1575SMatthew G. Knepley     }
18906ad1575SMatthew G. Knepley   }
19006ad1575SMatthew G. Knepley   /* Check f0 and f1 */
19106ad1575SMatthew G. Knepley   for (i = 0; i < 4; ++i) {
19206ad1575SMatthew G. Knepley     for (j = 0; j < 4; ++j) {
19306ad1575SMatthew G. Knepley       if (j == i) continue;
19406ad1575SMatthew G. Knepley       for (k = 0; k < 4; ++k) {
19506ad1575SMatthew G. Knepley         if ((k == i) || (k == j)) continue;
19606ad1575SMatthew G. Knepley         for (l = 0; l < 4; ++l) {
19706ad1575SMatthew G. Knepley           if ((l == i) || (l == j) || (l == k)) continue;
19806ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[i], f[i]);CHKERRQ(ierr);
19906ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[j], f[j]);CHKERRQ(ierr);
20006ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[k], f[k]);CHKERRQ(ierr);
20106ad1575SMatthew G. Knepley           ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[l], f[l]);CHKERRQ(ierr);
20206ad1575SMatthew G. Knepley           fp[0] = f[i]; fp[1] = f[j]; fp[2] = f[k]; fp[3] = f[l];
20306ad1575SMatthew G. Knepley           ierr = CheckResidual(wf, key, 4, fp, 4, fp);CHKERRQ(ierr);
20406ad1575SMatthew G. Knepley           ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
20506ad1575SMatthew G. Knepley         }
20606ad1575SMatthew G. Knepley       }
20706ad1575SMatthew G. Knepley     }
20806ad1575SMatthew G. Knepley   }
20906ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
21006ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
21106ad1575SMatthew G. Knepley }
21206ad1575SMatthew G. Knepley 
21306ad1575SMatthew G. Knepley static PetscErrorCode TestSetIndexAdd(PetscWeakForm wf)
21406ad1575SMatthew G. Knepley {
21506ad1575SMatthew G. Knepley   PetscPointFunc   f[4] = {f0, f1, f2, f3};
21606ad1575SMatthew G. Knepley   DMLabel          label;
21706ad1575SMatthew G. Knepley   const PetscInt   value = 3, field = 1, part = 2;
21806ad1575SMatthew G. Knepley   PetscFormKey key;
21906ad1575SMatthew G. Knepley   PetscErrorCode   ierr;
22006ad1575SMatthew G. Knepley 
22106ad1575SMatthew G. Knepley   PetscFunctionBegin;
22206ad1575SMatthew G. Knepley   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test", &label);CHKERRQ(ierr);
22306ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = field; key.part = part;
22406ad1575SMatthew G. Knepley   /* Check f0 */
22506ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
22606ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 1, f[1], 0, NULL);CHKERRQ(ierr);
22706ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
22806ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[3], NULL);CHKERRQ(ierr);
22906ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
23006ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
23106ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
23206ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
23306ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 2, f[2], 0, NULL);CHKERRQ(ierr);
23406ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[3], NULL);CHKERRQ(ierr);
23506ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
23606ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
23706ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, f[0], 0, NULL);CHKERRQ(ierr);
23806ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
23906ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
24006ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
24106ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
24206ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
24306ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[0], NULL);CHKERRQ(ierr);
24406ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 1, f[1], 0, NULL);CHKERRQ(ierr);
24506ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[2], NULL);CHKERRQ(ierr);
24606ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
24706ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
24806ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
24906ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[0], NULL);CHKERRQ(ierr);
25006ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, f[1], NULL);CHKERRQ(ierr);
25106ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 2, f[2], 0, NULL);CHKERRQ(ierr);
25206ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 3, f[3], 0, NULL);CHKERRQ(ierr);
25306ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 4, f, 0, NULL);CHKERRQ(ierr);
25406ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
25506ad1575SMatthew G. Knepley   /* Check f1 */
25606ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
25706ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 1, f[1]);CHKERRQ(ierr);
25806ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
25906ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[3]);CHKERRQ(ierr);
26006ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
26106ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
26206ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
26306ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
26406ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 2, f[2]);CHKERRQ(ierr);
26506ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[3]);CHKERRQ(ierr);
26606ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
26706ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
26806ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 0, f[0]);CHKERRQ(ierr);
26906ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
27006ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
27106ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
27206ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
27306ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
27406ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[0]);CHKERRQ(ierr);
27506ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 1, f[1]);CHKERRQ(ierr);
27606ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[2]);CHKERRQ(ierr);
27706ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
27806ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
27906ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
28006ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[0]);CHKERRQ(ierr);
28106ad1575SMatthew G. Knepley   ierr = PetscWeakFormAddResidual(wf, key.label, key.value, key.field, key.part, NULL, f[1]);CHKERRQ(ierr);
28206ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 2, f[2]);CHKERRQ(ierr);
28306ad1575SMatthew G. Knepley   ierr = PetscWeakFormSetIndexResidual(wf, key.label, key.value, key.field, key.part, 0, NULL, 3, f[3]);CHKERRQ(ierr);
28406ad1575SMatthew G. Knepley   ierr = CheckResidual(wf, key, 0, NULL, 4, f);CHKERRQ(ierr);
28506ad1575SMatthew G. Knepley   ierr = PetscWeakFormClear(wf);CHKERRQ(ierr);
28606ad1575SMatthew G. Knepley 
28706ad1575SMatthew G. Knepley   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
28806ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
28906ad1575SMatthew G. Knepley }
29006ad1575SMatthew G. Knepley 
29106ad1575SMatthew G. Knepley int main(int argc,char **argv)
29206ad1575SMatthew G. Knepley {
29306ad1575SMatthew G. Knepley   PetscWeakForm  wf;
29406ad1575SMatthew G. Knepley   PetscErrorCode ierr;
29506ad1575SMatthew G. Knepley 
29606ad1575SMatthew G. Knepley   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
29706ad1575SMatthew G. Knepley   ierr = PetscWeakFormCreate(PETSC_COMM_SELF, &wf);CHKERRQ(ierr);
29806ad1575SMatthew G. Knepley   ierr = TestSetIndex(wf);CHKERRQ(ierr);
29906ad1575SMatthew G. Knepley   ierr = TestAdd(wf);CHKERRQ(ierr);
30006ad1575SMatthew G. Knepley   ierr = TestSetIndexAdd(wf);CHKERRQ(ierr);
30106ad1575SMatthew G. Knepley   ierr = PetscWeakFormDestroy(&wf);CHKERRQ(ierr);
30206ad1575SMatthew G. Knepley   ierr = PetscFinalize();
30306ad1575SMatthew G. Knepley   return ierr;
30406ad1575SMatthew G. Knepley }
30506ad1575SMatthew G. Knepley 
30606ad1575SMatthew G. Knepley /*TEST
30706ad1575SMatthew G. Knepley 
30806ad1575SMatthew G. Knepley   test:
30906ad1575SMatthew G. Knepley     suffix: 0
31006ad1575SMatthew G. Knepley 
31106ad1575SMatthew G. Knepley TEST*/
312