xref: /petsc/src/dm/dt/interface/dtweakform.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
16528b96dSMatthew G. Knepley #include <petsc/private/petscdsimpl.h> /*I "petscds.h" I*/
26528b96dSMatthew G. Knepley 
36528b96dSMatthew G. Knepley PetscClassId PETSCWEAKFORM_CLASSID = 0;
46528b96dSMatthew G. Knepley 
506ad1575SMatthew G. Knepley const char *const PetscWeakFormKinds[] = {"objective", "residual_f0", "residual_f1", "jacobian_g0", "jacobian_g1", "jacobian_g2", "jacobian_g3", "jacobian_preconditioner_g0", "jacobian_preconditioner_g1", "jacobian_preconditioner_g2", "jacobian_preconditioner_g3", "dynamic_jacobian_g0", "dynamic_jacobian_g1", "dynamic_jacobian_g2", "dynamic_jacobian_g3", "boundary_residual_f0", "boundary_residual_f1", "boundary_jacobian_g0", "boundary_jacobian_g1", "boundary_jacobian_g2", "boundary_jacobian_g3", "boundary_jacobian_preconditioner_g0", "boundary_jacobian_preconditioner_g1", "boundary_jacobian_preconditioner_g2", "boundary_jacobian_preconditioner_g3", "riemann_solver", "PetscWeakFormKind", "PETSC_WF_", NULL};
606ad1575SMatthew G. Knepley 
76528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferCreate(size_t unitbytes, size_t expected, PetscChunkBuffer **buffer)
86528b96dSMatthew G. Knepley {
96528b96dSMatthew G. Knepley   PetscFunctionBegin;
10*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(buffer));
11*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(expected*unitbytes, &(*buffer)->array));
126528b96dSMatthew G. Knepley   (*buffer)->size      = expected;
136528b96dSMatthew G. Knepley   (*buffer)->unitbytes = unitbytes;
146528b96dSMatthew G. Knepley   (*buffer)->alloc     = expected*unitbytes;
156528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
166528b96dSMatthew G. Knepley }
176528b96dSMatthew G. Knepley 
1845480ffeSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDuplicate(PetscChunkBuffer *buffer, PetscChunkBuffer **bufferNew)
1945480ffeSMatthew G. Knepley {
2045480ffeSMatthew G. Knepley   PetscFunctionBegin;
21*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(bufferNew));
22*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(buffer->size*buffer->unitbytes, &(*bufferNew)->array));
23*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemcpy((*bufferNew)->array, buffer->array, buffer->size*buffer->unitbytes));
2445480ffeSMatthew G. Knepley   (*bufferNew)->size      = buffer->size;
2545480ffeSMatthew G. Knepley   (*bufferNew)->unitbytes = buffer->unitbytes;
2645480ffeSMatthew G. Knepley   (*bufferNew)->alloc     = buffer->size*buffer->unitbytes;
2745480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
2845480ffeSMatthew G. Knepley }
2945480ffeSMatthew G. Knepley 
306528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDestroy(PetscChunkBuffer **buffer)
316528b96dSMatthew G. Knepley {
326528b96dSMatthew G. Knepley   PetscFunctionBegin;
33*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*buffer)->array));
34*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(*buffer));
356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
366528b96dSMatthew G. Knepley }
376528b96dSMatthew G. Knepley 
386528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferCreateChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
396528b96dSMatthew G. Knepley {
406528b96dSMatthew G. Knepley   PetscFunctionBegin;
416528b96dSMatthew G. Knepley   if ((buffer->size + size)*buffer->unitbytes > buffer->alloc) {
426528b96dSMatthew G. Knepley     char *tmp;
436528b96dSMatthew G. Knepley 
446528b96dSMatthew G. Knepley     if (!buffer->alloc) buffer->alloc = (buffer->size + size)*buffer->unitbytes;
456528b96dSMatthew G. Knepley     while ((buffer->size + size)*buffer->unitbytes > buffer->alloc) buffer->alloc *= 2;
46*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc(buffer->alloc, &tmp));
47*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMemcpy(tmp, buffer->array, buffer->size*buffer->unitbytes));
48*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(buffer->array));
496528b96dSMatthew G. Knepley     buffer->array = tmp;
506528b96dSMatthew G. Knepley   }
512baeeceeSMatthew G. Knepley   chunk->start    = buffer->size*buffer->unitbytes;
526528b96dSMatthew G. Knepley   chunk->size     = size;
536528b96dSMatthew G. Knepley   chunk->reserved = size;
546528b96dSMatthew G. Knepley   buffer->size   += size;
556528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
566528b96dSMatthew G. Knepley }
576528b96dSMatthew G. Knepley 
586528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferEnlargeChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
596528b96dSMatthew G. Knepley {
606528b96dSMatthew G. Knepley   size_t         siz = size;
616528b96dSMatthew G. Knepley 
626528b96dSMatthew G. Knepley   PetscFunctionBegin;
636528b96dSMatthew G. Knepley   if (chunk->size + size > chunk->reserved) {
646528b96dSMatthew G. Knepley     PetscChunk newchunk;
656528b96dSMatthew G. Knepley     PetscInt   reserved = chunk->size;
666528b96dSMatthew G. Knepley 
676528b96dSMatthew G. Knepley     /* TODO Here if we had a chunk list, we could update them all to reclaim unused space */
686528b96dSMatthew G. Knepley     while (reserved < chunk->size+size) reserved *= 2;
69*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(buffer, (size_t) reserved, &newchunk));
706528b96dSMatthew G. Knepley     newchunk.size = chunk->size+size;
71*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMemcpy(&buffer->array[newchunk.start], &buffer->array[chunk->start], chunk->size * buffer->unitbytes));
726528b96dSMatthew G. Knepley     *chunk = newchunk;
736528b96dSMatthew G. Knepley   } else {
746528b96dSMatthew G. Knepley     chunk->size += siz;
756528b96dSMatthew G. Knepley   }
766528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
776528b96dSMatthew G. Knepley }
786528b96dSMatthew G. Knepley 
796528b96dSMatthew G. Knepley /*@C
8006ad1575SMatthew G. Knepley   PetscFormKeySort - Sorts an array of PetscFormKey in place in increasing order.
816528b96dSMatthew G. Knepley 
826528b96dSMatthew G. Knepley   Not Collective
836528b96dSMatthew G. Knepley 
846528b96dSMatthew G. Knepley   Input Parameters:
856528b96dSMatthew G. Knepley + n - number of values
8606ad1575SMatthew G. Knepley - X - array of PetscFormKey
876528b96dSMatthew G. Knepley 
886528b96dSMatthew G. Knepley   Level: intermediate
896528b96dSMatthew G. Knepley 
906528b96dSMatthew G. Knepley .seealso: PetscIntSortSemiOrdered(), PetscSortInt()
916528b96dSMatthew G. Knepley @*/
9206ad1575SMatthew G. Knepley PetscErrorCode PetscFormKeySort(PetscInt n, PetscFormKey arr[])
936528b96dSMatthew G. Knepley {
946528b96dSMatthew G. Knepley   PetscFunctionBegin;
956528b96dSMatthew G. Knepley   if (n <= 1) PetscFunctionReturn(0);
966528b96dSMatthew G. Knepley   PetscValidPointer(arr, 2);
97*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTimSort(n, arr, sizeof(PetscFormKey), Compare_PetscFormKey_Private, NULL));
986528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
996528b96dSMatthew G. Knepley }
1006528b96dSMatthew G. Knepley 
10106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt *n, void (***func)())
1026528b96dSMatthew G. Knepley {
10306ad1575SMatthew G. Knepley   PetscFormKey   key;
1046528b96dSMatthew G. Knepley   PetscChunk     chunk;
1056528b96dSMatthew G. Knepley 
1066528b96dSMatthew G. Knepley   PetscFunctionBegin;
10706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
108*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1096528b96dSMatthew G. Knepley   if (chunk.size < 0) {*n = 0;          *func = NULL;}
1102baeeceeSMatthew G. Knepley   else                {*n = chunk.size; *func = (void (**)()) &wf->funcs->array[chunk.start];}
1116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1126528b96dSMatthew G. Knepley }
1136528b96dSMatthew G. Knepley 
1146528b96dSMatthew G. Knepley /* A NULL argument for func causes this to clear the key */
11506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt n, void (**func)())
1166528b96dSMatthew G. Knepley {
11706ad1575SMatthew G. Knepley   PetscFormKey   key;
1186528b96dSMatthew G. Knepley   PetscChunk     chunk;
1196528b96dSMatthew G. Knepley   PetscInt       i;
1206528b96dSMatthew G. Knepley 
1216528b96dSMatthew G. Knepley   PetscFunctionBegin;
12206ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1236528b96dSMatthew G. Knepley   if (!func) {
124*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDel(ht, key));
1256528b96dSMatthew G. Knepley     PetscFunctionReturn(0);
1266528b96dSMatthew G. Knepley   } else {
127*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1286528b96dSMatthew G. Knepley   }
1296528b96dSMatthew G. Knepley   if (chunk.size < 0) {
130*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, n, &chunk));
131*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1326528b96dSMatthew G. Knepley   } else if (chunk.size <= n) {
133*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, n - chunk.size, &chunk));
134*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1356528b96dSMatthew G. Knepley   }
1362baeeceeSMatthew G. Knepley   for (i = 0; i < n; ++i) ((void (**)()) &wf->funcs->array[chunk.start])[i] = func[i];
1376528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1386528b96dSMatthew G. Knepley }
1396528b96dSMatthew G. Knepley 
14006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, void (*func)())
1416528b96dSMatthew G. Knepley {
14206ad1575SMatthew G. Knepley   PetscFormKey   key;
1436528b96dSMatthew G. Knepley   PetscChunk     chunk;
1446528b96dSMatthew G. Knepley 
1456528b96dSMatthew G. Knepley   PetscFunctionBegin;
1466528b96dSMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
14706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
148*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1496528b96dSMatthew G. Knepley   if (chunk.size < 0) {
150*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, 1, &chunk));
151*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1522baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[0] = func;
1536528b96dSMatthew G. Knepley   } else {
154*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, 1, &chunk));
155*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1562baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[chunk.size-1] = func;
1576528b96dSMatthew G. Knepley   }
1586528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1596528b96dSMatthew G. Knepley }
1606528b96dSMatthew G. Knepley 
16106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (**func)())
1626528b96dSMatthew G. Knepley {
16306ad1575SMatthew G. Knepley   PetscFormKey key;
1646528b96dSMatthew G. Knepley   PetscChunk       chunk;
1656528b96dSMatthew G. Knepley 
1666528b96dSMatthew G. Knepley   PetscFunctionBegin;
16706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
168*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1696528b96dSMatthew G. Knepley   if (chunk.size < 0) {*func = NULL;}
1706528b96dSMatthew G. Knepley   else {
1712c71b3e2SJacob Faibussowitsch     PetscCheckFalse(ind >= chunk.size,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %D not in [0, %D)", ind, chunk.size);
1722baeeceeSMatthew G. Knepley     *func = ((void (**)()) &wf->funcs->array[chunk.start])[ind];
1736528b96dSMatthew G. Knepley   }
1746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1756528b96dSMatthew G. Knepley }
1766528b96dSMatthew G. Knepley 
17706ad1575SMatthew G. Knepley /* Ignore a NULL func */
17806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (*func)())
1796528b96dSMatthew G. Knepley {
18006ad1575SMatthew G. Knepley   PetscFormKey key;
1816528b96dSMatthew G. Knepley   PetscChunk       chunk;
1826528b96dSMatthew G. Knepley 
1836528b96dSMatthew G. Knepley   PetscFunctionBegin;
18406ad1575SMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
18506ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
186*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1876528b96dSMatthew G. Knepley   if (chunk.size < 0) {
188*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, ind+1, &chunk));
189*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1906528b96dSMatthew G. Knepley   } else if (chunk.size <= ind) {
191*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, ind - chunk.size + 1, &chunk));
192*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1936528b96dSMatthew G. Knepley   }
1942baeeceeSMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = func;
1956528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1966528b96dSMatthew G. Knepley }
1976528b96dSMatthew G. Knepley 
19806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind)
19906ad1575SMatthew G. Knepley {
20006ad1575SMatthew G. Knepley   PetscFormKey key;
20106ad1575SMatthew G. Knepley   PetscChunk       chunk;
20206ad1575SMatthew G. Knepley 
20306ad1575SMatthew G. Knepley   PetscFunctionBegin;
20406ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
205*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
20606ad1575SMatthew G. Knepley   if (chunk.size < 0) {
20706ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
20806ad1575SMatthew G. Knepley   } else if (!ind && chunk.size == 1) {
209*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDel(ht, key));
21006ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21106ad1575SMatthew G. Knepley   } else if (chunk.size <= ind) {
21206ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21306ad1575SMatthew G. Knepley   }
21406ad1575SMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = NULL;
21506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
21606ad1575SMatthew G. Knepley }
21706ad1575SMatthew G. Knepley 
21845480ffeSMatthew G. Knepley /*@
21945480ffeSMatthew G. Knepley   PetscWeakFormCopy - Copy the pointwise functions to another PetscWeakForm
22045480ffeSMatthew G. Knepley 
22145480ffeSMatthew G. Knepley   Not Collective
22245480ffeSMatthew G. Knepley 
22345480ffeSMatthew G. Knepley   Input Parameter:
22445480ffeSMatthew G. Knepley . wf - The original PetscWeakForm
22545480ffeSMatthew G. Knepley 
22645480ffeSMatthew G. Knepley   Output Parameter:
22745480ffeSMatthew G. Knepley . wfNew - The copy PetscWeakForm
22845480ffeSMatthew G. Knepley 
22945480ffeSMatthew G. Knepley   Level: intermediate
23045480ffeSMatthew G. Knepley 
23145480ffeSMatthew G. Knepley .seealso: PetscWeakFormCreate(), PetscWeakFormDestroy()
23245480ffeSMatthew G. Knepley @*/
23345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormCopy(PetscWeakForm wf, PetscWeakForm wfNew)
23445480ffeSMatthew G. Knepley {
23506ad1575SMatthew G. Knepley   PetscInt       f;
23645480ffeSMatthew G. Knepley 
23745480ffeSMatthew G. Knepley   PetscFunctionBegin;
23845480ffeSMatthew G. Knepley   wfNew->Nf = wf->Nf;
239*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDestroy(&wfNew->funcs));
240*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDuplicate(wf->funcs, &wfNew->funcs));
24106ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
242*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDestroy(&wfNew->form[f]));
243*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDuplicate(wf->form[f], &wfNew->form[f]));
24406ad1575SMatthew G. Knepley   }
24506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
24606ad1575SMatthew G. Knepley }
24706ad1575SMatthew G. Knepley 
24806ad1575SMatthew G. Knepley /*@
24906ad1575SMatthew G. Knepley   PetscWeakFormClear - Clear all functions from the PetscWeakForm
25006ad1575SMatthew G. Knepley 
25106ad1575SMatthew G. Knepley   Not Collective
25206ad1575SMatthew G. Knepley 
25306ad1575SMatthew G. Knepley   Input Parameter:
25406ad1575SMatthew G. Knepley . wf - The original PetscWeakForm
25506ad1575SMatthew G. Knepley 
25606ad1575SMatthew G. Knepley   Level: intermediate
25706ad1575SMatthew G. Knepley 
25806ad1575SMatthew G. Knepley .seealso: PetscWeakFormCopy(), PetscWeakFormCreate(), PetscWeakFormDestroy()
25906ad1575SMatthew G. Knepley @*/
26006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClear(PetscWeakForm wf)
26106ad1575SMatthew G. Knepley {
26206ad1575SMatthew G. Knepley   PetscInt       f;
26306ad1575SMatthew G. Knepley 
26406ad1575SMatthew G. Knepley   PetscFunctionBegin;
265*5f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormClear(wf->form[f]));
26645480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
26745480ffeSMatthew G. Knepley }
26845480ffeSMatthew G. Knepley 
26945480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormRewriteKeys_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label, PetscInt Nv, const PetscInt values[])
27045480ffeSMatthew G. Knepley {
27106ad1575SMatthew G. Knepley   PetscFormKey  *keys;
27245480ffeSMatthew G. Knepley   PetscInt       n, i, v, off = 0;
27345480ffeSMatthew G. Knepley 
27445480ffeSMatthew G. Knepley   PetscFunctionBegin;
275*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(hmap, &n));
276*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(n, &keys));
277*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetKeys(hmap, &off, keys));
27845480ffeSMatthew G. Knepley   for (i = 0; i < n; ++i) {
27945480ffeSMatthew G. Knepley     if (keys[i].label == label) {
28045480ffeSMatthew G. Knepley       PetscBool clear = PETSC_TRUE;
28145480ffeSMatthew G. Knepley       void   (**funcs)();
28245480ffeSMatthew G. Knepley       PetscInt  Nf;
28345480ffeSMatthew G. Knepley 
284*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
28545480ffeSMatthew G. Knepley       for (v = 0; v < Nv; ++v) {
286*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, values[v], keys[i].field, keys[i].part, Nf, funcs));
28745480ffeSMatthew G. Knepley         if (values[v] == keys[i].value) clear = PETSC_FALSE;
28845480ffeSMatthew G. Knepley       }
289*5f80ce2aSJacob Faibussowitsch       if (clear) CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, 0, NULL));
29045480ffeSMatthew G. Knepley     }
29145480ffeSMatthew G. Knepley   }
292*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(keys));
29345480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
29445480ffeSMatthew G. Knepley }
29545480ffeSMatthew G. Knepley 
29645480ffeSMatthew G. Knepley /*@C
29745480ffeSMatthew G. Knepley   PetscWeakFormRewriteKeys - Change any key on the given label to use the new set of label values
29845480ffeSMatthew G. Knepley 
29945480ffeSMatthew G. Knepley   Not Collective
30045480ffeSMatthew G. Knepley 
30145480ffeSMatthew G. Knepley   Input Parameters:
30245480ffeSMatthew G. Knepley + wf     - The original PetscWeakForm
30345480ffeSMatthew G. Knepley . label  - The label to change keys for
30445480ffeSMatthew G. Knepley . Nv     - The number of new label values
30545480ffeSMatthew G. Knepley - values - The set of new values to relabel keys with
30645480ffeSMatthew G. Knepley 
30745480ffeSMatthew G. Knepley   Note: This is used internally when boundary label values are specified from the command line.
30845480ffeSMatthew G. Knepley 
30945480ffeSMatthew G. Knepley   Level: intermediate
31045480ffeSMatthew G. Knepley 
311d700741fSMatthew G. Knepley .seealso: PetscWeakFormReplaceLabel(), PetscWeakFormCreate(), PetscWeakFormDestroy()
31245480ffeSMatthew G. Knepley @*/
31345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormRewriteKeys(PetscWeakForm wf, DMLabel label, PetscInt Nv, const PetscInt values[])
31445480ffeSMatthew G. Knepley {
31506ad1575SMatthew G. Knepley   PetscInt       f;
31645480ffeSMatthew G. Knepley 
31745480ffeSMatthew G. Knepley   PetscFunctionBegin;
318*5f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscWeakFormRewriteKeys_Internal(wf, wf->form[f], label, Nv, values));
31945480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
32045480ffeSMatthew G. Knepley }
32145480ffeSMatthew G. Knepley 
322d700741fSMatthew G. Knepley static PetscErrorCode PetscWeakFormReplaceLabel_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label)
323d700741fSMatthew G. Knepley {
324d700741fSMatthew G. Knepley   PetscFormKey  *keys;
325d700741fSMatthew G. Knepley   PetscInt       n, i, off = 0, maxFuncs = 0;
326d700741fSMatthew G. Knepley   void       (**tmpf)();
327d700741fSMatthew G. Knepley   const char    *name = NULL;
328d700741fSMatthew G. Knepley 
329d700741fSMatthew G. Knepley   PetscFunctionBegin;
330*5f80ce2aSJacob Faibussowitsch   if (label) CHKERRQ(PetscObjectGetName((PetscObject) label, &name));
331*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(hmap, &n));
332*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(n, &keys));
333*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetKeys(hmap, &off, keys));
334d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
335d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
336d700741fSMatthew G. Knepley     const char *lname = NULL;
337d700741fSMatthew G. Knepley 
338d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
339*5f80ce2aSJacob Faibussowitsch     if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname));
340*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(name, lname, &match));
341d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
342d700741fSMatthew G. Knepley       void  (**funcs)();
343d700741fSMatthew G. Knepley       PetscInt Nf;
344d700741fSMatthew G. Knepley 
345*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
346d700741fSMatthew G. Knepley       maxFuncs = PetscMax(maxFuncs, Nf);
347d700741fSMatthew G. Knepley     }
348d700741fSMatthew G. Knepley   }
349d700741fSMatthew G. Knepley   /* Need temp space because chunk buffer can be reallocated in SetFunction() call */
350*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(maxFuncs, &tmpf));
351d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
352d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
353d700741fSMatthew G. Knepley     const char *lname = NULL;
354d700741fSMatthew G. Knepley 
355d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
356*5f80ce2aSJacob Faibussowitsch     if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname));
357*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(name, lname, &match));
358d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
359d700741fSMatthew G. Knepley       void  (**funcs)();
360d700741fSMatthew G. Knepley       PetscInt Nf, j;
361d700741fSMatthew G. Knepley 
362*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
363d700741fSMatthew G. Knepley       for (j = 0; j < Nf; ++j) tmpf[j] = funcs[j];
364*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, label,         keys[i].value, keys[i].field, keys[i].part,  Nf,  tmpf));
365*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part,  0,   NULL));
366d700741fSMatthew G. Knepley     }
367d700741fSMatthew G. Knepley   }
368*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tmpf));
369*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(keys));
370d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
371d700741fSMatthew G. Knepley }
372d700741fSMatthew G. Knepley 
373d700741fSMatthew G. Knepley /*@C
374d700741fSMatthew G. Knepley   PetscWeakFormReplaceLabel - Change any key on a label of the same name to use the new label
375d700741fSMatthew G. Knepley 
376d700741fSMatthew G. Knepley   Not Collective
377d700741fSMatthew G. Knepley 
378d700741fSMatthew G. Knepley   Input Parameters:
379d700741fSMatthew G. Knepley + wf    - The original PetscWeakForm
380d700741fSMatthew G. Knepley - label - The label to change keys for
381d700741fSMatthew G. Knepley 
382d700741fSMatthew G. Knepley   Note: This is used internally when meshes are modified
383d700741fSMatthew G. Knepley 
384d700741fSMatthew G. Knepley   Level: intermediate
385d700741fSMatthew G. Knepley 
386d700741fSMatthew G. Knepley .seealso: PetscWeakFormRewriteKeys(), PetscWeakFormCreate(), PetscWeakFormDestroy()
387d700741fSMatthew G. Knepley @*/
388d700741fSMatthew G. Knepley PetscErrorCode PetscWeakFormReplaceLabel(PetscWeakForm wf, DMLabel label)
389d700741fSMatthew G. Knepley {
390d700741fSMatthew G. Knepley   PetscInt       f;
391d700741fSMatthew G. Knepley 
392d700741fSMatthew G. Knepley   PetscFunctionBegin;
393*5f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscWeakFormReplaceLabel_Internal(wf, wf->form[f], label));
394d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
395d700741fSMatthew G. Knepley }
396d700741fSMatthew G. Knepley 
39706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndex(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscWeakFormKind kind, PetscInt ind)
39806ad1575SMatthew G. Knepley {
39906ad1575SMatthew G. Knepley   PetscFunctionBegin;
400*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormClearIndexFunction_Private(wf, wf->form[kind], label, val, f, part, ind));
40106ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
40206ad1575SMatthew G. Knepley }
40306ad1575SMatthew G. Knepley 
40406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
4056528b96dSMatthew G. Knepley                                          void (***obj)(PetscInt, PetscInt, PetscInt,
4066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4076528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4086528b96dSMatthew G. Knepley                                                        PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4096528b96dSMatthew G. Knepley {
4106528b96dSMatthew G. Knepley   PetscFunctionBegin;
411*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (***)(void)) obj));
4126528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4136528b96dSMatthew G. Knepley }
4146528b96dSMatthew G. Knepley 
41506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n,
4166528b96dSMatthew G. Knepley                                          void (**obj)(PetscInt, PetscInt, PetscInt,
4176528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const  PetscScalar[],
4186528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4196528b96dSMatthew G. Knepley                                                       PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4206528b96dSMatthew G. Knepley {
4216528b96dSMatthew G. Knepley   PetscFunctionBegin;
422*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (**)(void)) obj));
4236528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4246528b96dSMatthew G. Knepley }
4256528b96dSMatthew G. Knepley 
42606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4276528b96dSMatthew G. Knepley                                          void (*obj)(PetscInt, PetscInt, PetscInt,
4286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4296528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4306528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4316528b96dSMatthew G. Knepley {
4326528b96dSMatthew G. Knepley   PetscFunctionBegin;
433*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, (void (*)(void)) obj));
4346528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4356528b96dSMatthew G. Knepley }
4366528b96dSMatthew G. Knepley 
43706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4386528b96dSMatthew G. Knepley                                               void (**obj)(PetscInt, PetscInt, PetscInt,
4396528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4406528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4416528b96dSMatthew G. Knepley                                                            PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4426528b96dSMatthew G. Knepley {
4436528b96dSMatthew G. Knepley   PetscFunctionBegin;
444*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (**)(void)) obj));
4456528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4466528b96dSMatthew G. Knepley }
4476528b96dSMatthew G. Knepley 
44806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4496528b96dSMatthew G. Knepley                                               void (*obj)(PetscInt, PetscInt, PetscInt,
4506528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4516528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4526528b96dSMatthew G. Knepley                                                           PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4536528b96dSMatthew G. Knepley {
4546528b96dSMatthew G. Knepley   PetscFunctionBegin;
455*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (*)(void)) obj));
4566528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4576528b96dSMatthew G. Knepley }
4586528b96dSMatthew G. Knepley 
45906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4606528b96dSMatthew G. Knepley                                         PetscInt *n0,
4616528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
4626528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4636528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4646528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4656528b96dSMatthew G. Knepley                                         PetscInt *n1,
4666528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
4676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4686528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4696528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4706528b96dSMatthew G. Knepley {
4716528b96dSMatthew G. Knepley   PetscFunctionBegin;
472*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (***)(void)) f0));
473*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (***)(void)) f1));
4746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4756528b96dSMatthew G. Knepley }
4766528b96dSMatthew G. Knepley 
47706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4786528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
4796528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4806528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4816528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4826528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
4836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4846528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4856528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4866528b96dSMatthew G. Knepley {
4876528b96dSMatthew G. Knepley   PetscFunctionBegin;
488*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, (void (*)(void)) f0));
489*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, (void (*)(void)) f1));
4906528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4916528b96dSMatthew G. Knepley }
4926528b96dSMatthew G. Knepley 
49306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4946528b96dSMatthew G. Knepley                                         PetscInt n0,
4956528b96dSMatthew G. Knepley                                         void (**f0)(PetscInt, PetscInt, PetscInt,
4966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4976528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4986528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4996528b96dSMatthew G. Knepley                                         PetscInt n1,
5006528b96dSMatthew G. Knepley                                         void (**f1)(PetscInt, PetscInt, PetscInt,
5016528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5026528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5036528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5046528b96dSMatthew G. Knepley {
5056528b96dSMatthew G. Knepley   PetscFunctionBegin;
506*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (**)(void)) f0));
507*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (**)(void)) f1));
5086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5096528b96dSMatthew G. Knepley }
5106528b96dSMatthew G. Knepley 
51106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5126528b96dSMatthew G. Knepley                                         PetscInt i0,
5136528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
5146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5166528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5176528b96dSMatthew G. Knepley                                         PetscInt i1,
5186528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
5196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5216528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5226528b96dSMatthew G. Knepley {
5236528b96dSMatthew G. Knepley   PetscFunctionBegin;
524*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, i0, (void (*)(void)) f0));
525*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, i1, (void (*)(void)) f1));
5266528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5276528b96dSMatthew G. Knepley }
5286528b96dSMatthew G. Knepley 
52906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5306528b96dSMatthew G. Knepley                                           PetscInt *n0,
5316528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
5326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5346528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5356528b96dSMatthew G. Knepley                                         PetscInt *n1,
5366528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
5376528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5396528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5406528b96dSMatthew G. Knepley {
5416528b96dSMatthew G. Knepley   PetscFunctionBegin;
542*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (***)(void)) f0));
543*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (***)(void)) f1));
5446528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5456528b96dSMatthew G. Knepley }
5466528b96dSMatthew G. Knepley 
54706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5486528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5496528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5506528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5516528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5526528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5536528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5546528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5556528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5566528b96dSMatthew G. Knepley {
5576528b96dSMatthew G. Knepley   PetscFunctionBegin;
558*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, (void (*)(void)) f0));
559*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, (void (*)(void)) f1));
5606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5616528b96dSMatthew G. Knepley }
5626528b96dSMatthew G. Knepley 
56306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5646528b96dSMatthew G. Knepley                                           PetscInt n0,
5656528b96dSMatthew G. Knepley                                           void (**f0)(PetscInt, PetscInt, PetscInt,
5666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5686528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5696528b96dSMatthew G. Knepley                                           PetscInt n1,
5706528b96dSMatthew G. Knepley                                           void (**f1)(PetscInt, PetscInt, PetscInt,
5716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5726528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5736528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5746528b96dSMatthew G. Knepley {
5756528b96dSMatthew G. Knepley   PetscFunctionBegin;
576*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (**)(void)) f0));
577*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (**)(void)) f1));
5786528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5796528b96dSMatthew G. Knepley }
5806528b96dSMatthew G. Knepley 
58106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5826528b96dSMatthew G. Knepley                                           PetscInt i0,
5836528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5856528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5866528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5876528b96dSMatthew G. Knepley                                           PetscInt i1,
5886528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5906528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5916528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5926528b96dSMatthew G. Knepley {
5936528b96dSMatthew G. Knepley   PetscFunctionBegin;
594*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, i0, (void (*)(void)) f0));
595*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, i1, (void (*)(void)) f1));
5966528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5976528b96dSMatthew G. Knepley }
5986528b96dSMatthew G. Knepley 
5996528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobian(PetscWeakForm wf, PetscBool *hasJac)
6006528b96dSMatthew G. Knepley {
6016528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
6026528b96dSMatthew G. Knepley 
6036528b96dSMatthew G. Knepley   PetscFunctionBegin;
6046528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
6056528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
606*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G0], &n0));
607*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G1], &n1));
608*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G2], &n2));
609*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G3], &n3));
6106528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
6116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6126528b96dSMatthew G. Knepley }
6136528b96dSMatthew G. Knepley 
61406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6156528b96dSMatthew G. Knepley                                         PetscInt *n0,
6166528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
6176528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6186528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6196528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6206528b96dSMatthew G. Knepley                                         PetscInt *n1,
6216528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
6226528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6236528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6246528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6256528b96dSMatthew G. Knepley                                         PetscInt *n2,
6266528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
6276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6296528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6306528b96dSMatthew G. Knepley                                         PetscInt *n3,
6316528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
6326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6346528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6356528b96dSMatthew G. Knepley {
6366528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6376528b96dSMatthew G. Knepley 
6386528b96dSMatthew G. Knepley   PetscFunctionBegin;
639*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (***)(void)) g0));
640*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (***)(void)) g1));
641*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (***)(void)) g2));
642*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (***)(void)) g3));
6436528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6446528b96dSMatthew G. Knepley }
6456528b96dSMatthew G. Knepley 
64606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6476528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
6486528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6496528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6506528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6516528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
6526528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6536528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6546528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6556528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
6566528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6576528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6586528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6596528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
6606528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6616528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6626528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6636528b96dSMatthew G. Knepley {
6646528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6656528b96dSMatthew G. Knepley 
6666528b96dSMatthew G. Knepley   PetscFunctionBegin;
667*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, (void (*)(void)) g0));
668*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, (void (*)(void)) g1));
669*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, (void (*)(void)) g2));
670*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, (void (*)(void)) g3));
6716528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6726528b96dSMatthew G. Knepley }
6736528b96dSMatthew G. Knepley 
67406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6756528b96dSMatthew G. Knepley                                         PetscInt n0,
6766528b96dSMatthew G. Knepley                                         void (**g0)(PetscInt, PetscInt, PetscInt,
6776528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6786528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6796528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6806528b96dSMatthew G. Knepley                                         PetscInt n1,
6816528b96dSMatthew G. Knepley                                         void (**g1)(PetscInt, PetscInt, PetscInt,
6826528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6846528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6856528b96dSMatthew G. Knepley                                         PetscInt n2,
6866528b96dSMatthew G. Knepley                                         void (**g2)(PetscInt, PetscInt, PetscInt,
6876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6906528b96dSMatthew G. Knepley                                         PetscInt n3,
6916528b96dSMatthew G. Knepley                                         void (**g3)(PetscInt, PetscInt, PetscInt,
6926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6936528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6946528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6956528b96dSMatthew G. Knepley {
6966528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6976528b96dSMatthew G. Knepley 
6986528b96dSMatthew G. Knepley   PetscFunctionBegin;
699*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (**)(void)) g0));
700*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (**)(void)) g1));
701*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (**)(void)) g2));
702*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (**)(void)) g3));
7036528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7046528b96dSMatthew G. Knepley }
7056528b96dSMatthew G. Knepley 
70606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7076528b96dSMatthew G. Knepley                                         PetscInt i0,
7086528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7106528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7116528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7126528b96dSMatthew G. Knepley                                         PetscInt i1,
7136528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7166528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7176528b96dSMatthew G. Knepley                                         PetscInt i2,
7186528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7216528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7226528b96dSMatthew G. Knepley                                         PetscInt i3,
7236528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7246528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7256528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7266528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7276528b96dSMatthew G. Knepley {
7286528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7296528b96dSMatthew G. Knepley 
7306528b96dSMatthew G. Knepley   PetscFunctionBegin;
731*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, i0, (void (*)(void)) g0));
732*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, i1, (void (*)(void)) g1));
733*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, i2, (void (*)(void)) g2));
734*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, i3, (void (*)(void)) g3));
7356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7366528b96dSMatthew G. Knepley }
7376528b96dSMatthew G. Knepley 
7386528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
7396528b96dSMatthew G. Knepley {
7406528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
7416528b96dSMatthew G. Knepley 
7426528b96dSMatthew G. Knepley   PetscFunctionBegin;
7436528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
7446528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
745*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP0], &n0));
746*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP1], &n1));
747*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP2], &n2));
748*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP3], &n3));
7496528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
7506528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7516528b96dSMatthew G. Knepley }
7526528b96dSMatthew G. Knepley 
75306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7546528b96dSMatthew G. Knepley                                                       PetscInt *n0,
7556528b96dSMatthew G. Knepley                                                       void (***g0)(PetscInt, PetscInt, PetscInt,
7566528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7576528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7586528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7596528b96dSMatthew G. Knepley                                                       PetscInt *n1,
7606528b96dSMatthew G. Knepley                                                       void (***g1)(PetscInt, PetscInt, PetscInt,
7616528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7626528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7636528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7646528b96dSMatthew G. Knepley                                                       PetscInt *n2,
7656528b96dSMatthew G. Knepley                                                       void (***g2)(PetscInt, PetscInt, PetscInt,
7666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7676528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7686528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7696528b96dSMatthew G. Knepley                                                       PetscInt *n3,
7706528b96dSMatthew G. Knepley                                                       void (***g3)(PetscInt, PetscInt, PetscInt,
7716528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7726528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7736528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7746528b96dSMatthew G. Knepley {
7756528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7766528b96dSMatthew G. Knepley 
7776528b96dSMatthew G. Knepley   PetscFunctionBegin;
778*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (***)(void)) g0));
779*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (***)(void)) g1));
780*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (***)(void)) g2));
781*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (***)(void)) g3));
7826528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7836528b96dSMatthew G. Knepley }
7846528b96dSMatthew G. Knepley 
78506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7866528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7906528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7916528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7936528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7946528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7956528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7976528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7986528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7996528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8006528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8016528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8026528b96dSMatthew G. Knepley {
8036528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8046528b96dSMatthew G. Knepley 
8056528b96dSMatthew G. Knepley   PetscFunctionBegin;
806*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, (void (*)(void)) g0));
807*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, (void (*)(void)) g1));
808*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, (void (*)(void)) g2));
809*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, (void (*)(void)) g3));
8106528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8116528b96dSMatthew G. Knepley }
8126528b96dSMatthew G. Knepley 
81306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8146528b96dSMatthew G. Knepley                                                       PetscInt n0,
8156528b96dSMatthew G. Knepley                                                       void (**g0)(PetscInt, PetscInt, PetscInt,
8166528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8176528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8186528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8196528b96dSMatthew G. Knepley                                                       PetscInt n1,
8206528b96dSMatthew G. Knepley                                                       void (**g1)(PetscInt, PetscInt, PetscInt,
8216528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8226528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8236528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8246528b96dSMatthew G. Knepley                                                       PetscInt n2,
8256528b96dSMatthew G. Knepley                                                       void (**g2)(PetscInt, PetscInt, PetscInt,
8266528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8276528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8286528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8296528b96dSMatthew G. Knepley                                                       PetscInt n3,
8306528b96dSMatthew G. Knepley                                                       void (**g3)(PetscInt, PetscInt, PetscInt,
8316528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8326528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8336528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8346528b96dSMatthew G. Knepley {
8356528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8366528b96dSMatthew G. Knepley 
8376528b96dSMatthew G. Knepley   PetscFunctionBegin;
838*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (**)(void)) g0));
839*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (**)(void)) g1));
840*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (**)(void)) g2));
841*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (**)(void)) g3));
8426528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8436528b96dSMatthew G. Knepley }
8446528b96dSMatthew G. Knepley 
84506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8466528b96dSMatthew G. Knepley                                                       PetscInt i0,
8476528b96dSMatthew G. Knepley                                                       void (*g0)(PetscInt, PetscInt, PetscInt,
8486528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8496528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8506528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8516528b96dSMatthew G. Knepley                                                       PetscInt i1,
8526528b96dSMatthew G. Knepley                                                       void (*g1)(PetscInt, PetscInt, PetscInt,
8536528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8546528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8556528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8566528b96dSMatthew G. Knepley                                                       PetscInt i2,
8576528b96dSMatthew G. Knepley                                                       void (*g2)(PetscInt, PetscInt, PetscInt,
8586528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8596528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8606528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8616528b96dSMatthew G. Knepley                                                       PetscInt i3,
8626528b96dSMatthew G. Knepley                                                       void (*g3)(PetscInt, PetscInt, PetscInt,
8636528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8646528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8656528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8666528b96dSMatthew G. Knepley {
8676528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8686528b96dSMatthew G. Knepley 
8696528b96dSMatthew G. Knepley   PetscFunctionBegin;
870*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, i0, (void (*)(void)) g0));
871*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, i1, (void (*)(void)) g1));
872*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, i2, (void (*)(void)) g2));
873*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, i3, (void (*)(void)) g3));
8746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8756528b96dSMatthew G. Knepley }
8766528b96dSMatthew G. Knepley 
8776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobian(PetscWeakForm wf, PetscBool *hasJac)
8786528b96dSMatthew G. Knepley {
8796528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
8806528b96dSMatthew G. Knepley 
8816528b96dSMatthew G. Knepley   PetscFunctionBegin;
8826528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
8836528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
884*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG0], &n0));
885*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG1], &n1));
886*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG2], &n2));
887*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG3], &n3));
8886528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
8896528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8906528b96dSMatthew G. Knepley }
8916528b96dSMatthew G. Knepley 
89206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8936528b96dSMatthew G. Knepley                                           PetscInt *n0,
8946528b96dSMatthew G. Knepley                                           void (***g0)(PetscInt, PetscInt, PetscInt,
8956528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8966528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8976528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8986528b96dSMatthew G. Knepley                                           PetscInt *n1,
8996528b96dSMatthew G. Knepley                                           void (***g1)(PetscInt, PetscInt, PetscInt,
9006528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9016528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9026528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9036528b96dSMatthew G. Knepley                                           PetscInt *n2,
9046528b96dSMatthew G. Knepley                                           void (***g2)(PetscInt, PetscInt, PetscInt,
9056528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9076528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9086528b96dSMatthew G. Knepley                                           PetscInt *n3,
9096528b96dSMatthew G. Knepley                                           void (***g3)(PetscInt, PetscInt, PetscInt,
9106528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9116528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9126528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9136528b96dSMatthew G. Knepley {
9146528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9156528b96dSMatthew G. Knepley 
9166528b96dSMatthew G. Knepley   PetscFunctionBegin;
917*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (***)(void)) g0));
918*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (***)(void)) g1));
919*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (***)(void)) g2));
920*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (***)(void)) g3));
9216528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9226528b96dSMatthew G. Knepley }
9236528b96dSMatthew G. Knepley 
92406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9256528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9266528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9286528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9296528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9306528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9316528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9326528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9336528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9346528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9356528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9366528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9376528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
9386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9396528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9406528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9416528b96dSMatthew G. Knepley {
9426528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9436528b96dSMatthew G. Knepley 
9446528b96dSMatthew G. Knepley   PetscFunctionBegin;
945*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, (void (*)(void)) g0));
946*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, (void (*)(void)) g1));
947*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, (void (*)(void)) g2));
948*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, (void (*)(void)) g3));
9496528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9506528b96dSMatthew G. Knepley }
9516528b96dSMatthew G. Knepley 
95206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9536528b96dSMatthew G. Knepley                                           PetscInt n0,
9546528b96dSMatthew G. Knepley                                           void (**g0)(PetscInt, PetscInt, PetscInt,
9556528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9566528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9576528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9586528b96dSMatthew G. Knepley                                           PetscInt n1,
9596528b96dSMatthew G. Knepley                                           void (**g1)(PetscInt, PetscInt, PetscInt,
9606528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9616528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9626528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9636528b96dSMatthew G. Knepley                                           PetscInt n2,
9646528b96dSMatthew G. Knepley                                           void (**g2)(PetscInt, PetscInt, PetscInt,
9656528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9676528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9686528b96dSMatthew G. Knepley                                           PetscInt n3,
9696528b96dSMatthew G. Knepley                                           void (**g3)(PetscInt, PetscInt, PetscInt,
9706528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9726528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9736528b96dSMatthew G. Knepley {
9746528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9756528b96dSMatthew G. Knepley 
9766528b96dSMatthew G. Knepley   PetscFunctionBegin;
977*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (**)(void)) g0));
978*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (**)(void)) g1));
979*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (**)(void)) g2));
980*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (**)(void)) g3));
9816528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9826528b96dSMatthew G. Knepley }
9836528b96dSMatthew G. Knepley 
98406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9856528b96dSMatthew G. Knepley                                           PetscInt i0,
9866528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9876528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9896528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9906528b96dSMatthew G. Knepley                                           PetscInt i1,
9916528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9926528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9936528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9946528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9956528b96dSMatthew G. Knepley                                           PetscInt i2,
9966528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9976528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9986528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9996528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10006528b96dSMatthew G. Knepley                                           PetscInt i3,
10016528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
10026528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10036528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10046528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10056528b96dSMatthew G. Knepley {
10066528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10076528b96dSMatthew G. Knepley 
10086528b96dSMatthew G. Knepley   PetscFunctionBegin;
1009*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, i0, (void (*)(void)) g0));
1010*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, i1, (void (*)(void)) g1));
1011*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, i2, (void (*)(void)) g2));
1012*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, i3, (void (*)(void)) g3));
10136528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10146528b96dSMatthew G. Knepley }
10156528b96dSMatthew G. Knepley 
10166528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
10176528b96dSMatthew G. Knepley {
10186528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
10196528b96dSMatthew G. Knepley 
10206528b96dSMatthew G. Knepley   PetscFunctionBegin;
10216528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
10226528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
1023*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP0], &n0));
1024*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP1], &n1));
1025*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP2], &n2));
1026*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP3], &n3));
10276528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
10286528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10296528b96dSMatthew G. Knepley }
10306528b96dSMatthew G. Knepley 
103106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10326528b96dSMatthew G. Knepley                                                         PetscInt *n0,
10336528b96dSMatthew G. Knepley                                                         void (***g0)(PetscInt, PetscInt, PetscInt,
10346528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10356528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10366528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10376528b96dSMatthew G. Knepley                                                         PetscInt *n1,
10386528b96dSMatthew G. Knepley                                                         void (***g1)(PetscInt, PetscInt, PetscInt,
10396528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10406528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10416528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10426528b96dSMatthew G. Knepley                                                         PetscInt *n2,
10436528b96dSMatthew G. Knepley                                                         void (***g2)(PetscInt, PetscInt, PetscInt,
10446528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10456528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10466528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10476528b96dSMatthew G. Knepley                                                         PetscInt *n3,
10486528b96dSMatthew G. Knepley                                                         void (***g3)(PetscInt, PetscInt, PetscInt,
10496528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10506528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10516528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10526528b96dSMatthew G. Knepley {
10536528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10546528b96dSMatthew G. Knepley 
10556528b96dSMatthew G. Knepley   PetscFunctionBegin;
1056*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (***)(void)) g0));
1057*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (***)(void)) g1));
1058*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (***)(void)) g2));
1059*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (***)(void)) g3));
10606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10616528b96dSMatthew G. Knepley }
10626528b96dSMatthew G. Knepley 
106306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10646528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
10656528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10676528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10686528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
10696528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10706528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10716528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10726528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
10736528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10746528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10756528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10766528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
10776528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10786528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10796528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10806528b96dSMatthew G. Knepley {
10816528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10826528b96dSMatthew G. Knepley 
10836528b96dSMatthew G. Knepley   PetscFunctionBegin;
1084*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, (void (*)(void)) g0));
1085*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, (void (*)(void)) g1));
1086*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, (void (*)(void)) g2));
1087*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, (void (*)(void)) g3));
10886528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10896528b96dSMatthew G. Knepley }
10906528b96dSMatthew G. Knepley 
109106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10926528b96dSMatthew G. Knepley                                                         PetscInt n0,
10936528b96dSMatthew G. Knepley                                                         void (**g0)(PetscInt, PetscInt, PetscInt,
10946528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10956528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10966528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10976528b96dSMatthew G. Knepley                                                         PetscInt n1,
10986528b96dSMatthew G. Knepley                                                         void (**g1)(PetscInt, PetscInt, PetscInt,
10996528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11006528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11016528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11026528b96dSMatthew G. Knepley                                                         PetscInt n2,
11036528b96dSMatthew G. Knepley                                                         void (**g2)(PetscInt, PetscInt, PetscInt,
11046528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11056528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11066528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11076528b96dSMatthew G. Knepley                                                         PetscInt n3,
11086528b96dSMatthew G. Knepley                                                         void (**g3)(PetscInt, PetscInt, PetscInt,
11096528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11106528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11116528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11126528b96dSMatthew G. Knepley {
11136528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11146528b96dSMatthew G. Knepley 
11156528b96dSMatthew G. Knepley   PetscFunctionBegin;
1116*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (**)(void)) g0));
1117*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (**)(void)) g1));
1118*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (**)(void)) g2));
1119*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (**)(void)) g3));
11206528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11216528b96dSMatthew G. Knepley }
11226528b96dSMatthew G. Knepley 
112306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11246528b96dSMatthew G. Knepley                                                         PetscInt i0,
11256528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
11266528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11276528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11286528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11296528b96dSMatthew G. Knepley                                                         PetscInt i1,
11306528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
11316528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11326528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11336528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11346528b96dSMatthew G. Knepley                                                         PetscInt i2,
11356528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
11366528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11376528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11386528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11396528b96dSMatthew G. Knepley                                                         PetscInt i3,
11406528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
11416528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11426528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11436528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11446528b96dSMatthew G. Knepley {
11456528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11466528b96dSMatthew G. Knepley 
11476528b96dSMatthew G. Knepley   PetscFunctionBegin;
1148*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, i0, (void (*)(void)) g0));
1149*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, i1, (void (*)(void)) g1));
1150*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, i2, (void (*)(void)) g2));
1151*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, i3, (void (*)(void)) g3));
11526528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11536528b96dSMatthew G. Knepley }
11546528b96dSMatthew G. Knepley 
11556528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasDynamicJacobian(PetscWeakForm wf, PetscBool *hasDynJac)
11566528b96dSMatthew G. Knepley {
11576528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
11586528b96dSMatthew G. Knepley 
11596528b96dSMatthew G. Knepley   PetscFunctionBegin;
11606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
11616528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasDynJac, 2);
1162*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT0], &n0));
1163*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT1], &n1));
1164*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT2], &n2));
1165*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT3], &n3));
11666528b96dSMatthew G. Knepley   *hasDynJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
11676528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11686528b96dSMatthew G. Knepley }
11696528b96dSMatthew G. Knepley 
117006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11716528b96dSMatthew G. Knepley                                         PetscInt *n0,
11726528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
11736528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11746528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11756528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11766528b96dSMatthew G. Knepley                                         PetscInt *n1,
11776528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
11786528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11796528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11806528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11816528b96dSMatthew G. Knepley                                         PetscInt *n2,
11826528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
11836528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11856528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11866528b96dSMatthew G. Knepley                                         PetscInt *n3,
11876528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
11886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11906528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11916528b96dSMatthew G. Knepley {
11926528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11936528b96dSMatthew G. Knepley 
11946528b96dSMatthew G. Knepley   PetscFunctionBegin;
1195*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (***)(void)) g0));
1196*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (***)(void)) g1));
1197*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (***)(void)) g2));
1198*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (***)(void)) g3));
11996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12006528b96dSMatthew G. Knepley }
12016528b96dSMatthew G. Knepley 
120206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12036528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
12046528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12056528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12066528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12076528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
12086528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12106528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12116528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
12126528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12136528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12146528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12156528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
12166528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12176528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12186528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12196528b96dSMatthew G. Knepley {
12206528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12216528b96dSMatthew G. Knepley 
12226528b96dSMatthew G. Knepley   PetscFunctionBegin;
1223*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, (void (*)(void)) g0));
1224*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, (void (*)(void)) g1));
1225*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, (void (*)(void)) g2));
1226*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, (void (*)(void)) g3));
12276528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12286528b96dSMatthew G. Knepley }
12296528b96dSMatthew G. Knepley 
123006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12316528b96dSMatthew G. Knepley                                                PetscInt n0,
12326528b96dSMatthew G. Knepley                                                void (**g0)(PetscInt, PetscInt, PetscInt,
12336528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12346528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12356528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12366528b96dSMatthew G. Knepley                                                PetscInt n1,
12376528b96dSMatthew G. Knepley                                                void (**g1)(PetscInt, PetscInt, PetscInt,
12386528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12396528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12406528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12416528b96dSMatthew G. Knepley                                                PetscInt n2,
12426528b96dSMatthew G. Knepley                                                void (**g2)(PetscInt, PetscInt, PetscInt,
12436528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12446528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12456528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12466528b96dSMatthew G. Knepley                                                PetscInt n3,
12476528b96dSMatthew G. Knepley                                                void (**g3)(PetscInt, PetscInt, PetscInt,
12486528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12496528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12506528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12516528b96dSMatthew G. Knepley {
12526528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12536528b96dSMatthew G. Knepley 
12546528b96dSMatthew G. Knepley   PetscFunctionBegin;
1255*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (**)(void)) g0));
1256*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (**)(void)) g1));
1257*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (**)(void)) g2));
1258*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (**)(void)) g3));
12596528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12606528b96dSMatthew G. Knepley }
12616528b96dSMatthew G. Knepley 
126206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12636528b96dSMatthew G. Knepley                                                PetscInt i0,
12646528b96dSMatthew G. Knepley                                                void (*g0)(PetscInt, PetscInt, PetscInt,
12656528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12666528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12676528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12686528b96dSMatthew G. Knepley                                                PetscInt i1,
12696528b96dSMatthew G. Knepley                                                void (*g1)(PetscInt, PetscInt, PetscInt,
12706528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12716528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12726528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12736528b96dSMatthew G. Knepley                                                PetscInt i2,
12746528b96dSMatthew G. Knepley                                                void (*g2)(PetscInt, PetscInt, PetscInt,
12756528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12766528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12776528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12786528b96dSMatthew G. Knepley                                                PetscInt i3,
12796528b96dSMatthew G. Knepley                                                void (*g3)(PetscInt, PetscInt, PetscInt,
12806528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12816528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12826528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12836528b96dSMatthew G. Knepley {
12846528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12856528b96dSMatthew G. Knepley 
12866528b96dSMatthew G. Knepley   PetscFunctionBegin;
1287*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, i0, (void (*)(void)) g0));
1288*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, i1, (void (*)(void)) g1));
1289*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, i2, (void (*)(void)) g2));
1290*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, i3, (void (*)(void)) g3));
12916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12926528b96dSMatthew G. Knepley }
12936528b96dSMatthew G. Knepley 
129406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
12956528b96dSMatthew G. Knepley                                              void (***r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
12966528b96dSMatthew G. Knepley {
12976528b96dSMatthew G. Knepley   PetscFunctionBegin;
1298*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (***)(void)) r));
12996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13006528b96dSMatthew G. Knepley }
13016528b96dSMatthew G. Knepley 
130206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13036528b96dSMatthew G. Knepley                                              PetscInt n,
13046528b96dSMatthew G. Knepley                                              void (**r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13056528b96dSMatthew G. Knepley {
13066528b96dSMatthew G. Knepley   PetscFunctionBegin;
1307*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (**)(void)) r));
13086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13096528b96dSMatthew G. Knepley }
13106528b96dSMatthew G. Knepley 
131106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13126528b96dSMatthew G. Knepley                                                   PetscInt i,
13136528b96dSMatthew G. Knepley                                                   void (*r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13146528b96dSMatthew G. Knepley {
13156528b96dSMatthew G. Knepley   PetscFunctionBegin;
1316*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, i, (void (*)(void)) r));
13176528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13186528b96dSMatthew G. Knepley }
13196528b96dSMatthew G. Knepley 
13206528b96dSMatthew G. Knepley /*@
13216528b96dSMatthew G. Knepley   PetscWeakFormGetNumFields - Returns the number of fields
13226528b96dSMatthew G. Knepley 
13236528b96dSMatthew G. Knepley   Not collective
13246528b96dSMatthew G. Knepley 
13256528b96dSMatthew G. Knepley   Input Parameter:
13266528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
13276528b96dSMatthew G. Knepley 
13286528b96dSMatthew G. Knepley   Output Parameter:
1329a5b23f4aSJose E. Roman . Nf - The number of fields
13306528b96dSMatthew G. Knepley 
13316528b96dSMatthew G. Knepley   Level: beginner
13326528b96dSMatthew G. Knepley 
13336528b96dSMatthew G. Knepley .seealso: PetscWeakFormSetNumFields(), PetscWeakFormCreate()
13346528b96dSMatthew G. Knepley @*/
13356528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormGetNumFields(PetscWeakForm wf, PetscInt *Nf)
13366528b96dSMatthew G. Knepley {
13376528b96dSMatthew G. Knepley   PetscFunctionBegin;
13386528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
13396528b96dSMatthew G. Knepley   PetscValidPointer(Nf, 2);
13406528b96dSMatthew G. Knepley   *Nf = wf->Nf;
13416528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13426528b96dSMatthew G. Knepley }
13436528b96dSMatthew G. Knepley 
13446528b96dSMatthew G. Knepley /*@
13456528b96dSMatthew G. Knepley   PetscWeakFormSetNumFields - Sets the number of fields
13466528b96dSMatthew G. Knepley 
13476528b96dSMatthew G. Knepley   Not collective
13486528b96dSMatthew G. Knepley 
13496528b96dSMatthew G. Knepley   Input Parameters:
13506528b96dSMatthew G. Knepley + wf - The PetscWeakForm object
13516528b96dSMatthew G. Knepley - Nf - The number of fields
13526528b96dSMatthew G. Knepley 
13536528b96dSMatthew G. Knepley   Level: beginner
13546528b96dSMatthew G. Knepley 
13556528b96dSMatthew G. Knepley .seealso: PetscWeakFormGetNumFields(), PetscWeakFormCreate()
13566528b96dSMatthew G. Knepley @*/
13576528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormSetNumFields(PetscWeakForm wf, PetscInt Nf)
13586528b96dSMatthew G. Knepley {
13596528b96dSMatthew G. Knepley   PetscFunctionBegin;
13606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
13616528b96dSMatthew G. Knepley   wf->Nf = Nf;
13626528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13636528b96dSMatthew G. Knepley }
13646528b96dSMatthew G. Knepley 
13656528b96dSMatthew G. Knepley /*@
13666528b96dSMatthew G. Knepley   PetscWeakFormDestroy - Destroys a PetscWeakForm object
13676528b96dSMatthew G. Knepley 
13686528b96dSMatthew G. Knepley   Collective on wf
13696528b96dSMatthew G. Knepley 
13706528b96dSMatthew G. Knepley   Input Parameter:
13716528b96dSMatthew G. Knepley . wf - the PetscWeakForm object to destroy
13726528b96dSMatthew G. Knepley 
13736528b96dSMatthew G. Knepley   Level: developer
13746528b96dSMatthew G. Knepley 
13756528b96dSMatthew G. Knepley .seealso PetscWeakFormCreate(), PetscWeakFormView()
13766528b96dSMatthew G. Knepley @*/
13776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormDestroy(PetscWeakForm *wf)
13786528b96dSMatthew G. Knepley {
137906ad1575SMatthew G. Knepley   PetscInt       f;
13806528b96dSMatthew G. Knepley 
13816528b96dSMatthew G. Knepley   PetscFunctionBegin;
13826528b96dSMatthew G. Knepley   if (!*wf) PetscFunctionReturn(0);
13836528b96dSMatthew G. Knepley   PetscValidHeaderSpecific((*wf), PETSCWEAKFORM_CLASSID, 1);
13846528b96dSMatthew G. Knepley 
13856528b96dSMatthew G. Knepley   if (--((PetscObject)(*wf))->refct > 0) {*wf = NULL; PetscFunctionReturn(0);}
13866528b96dSMatthew G. Knepley   ((PetscObject) (*wf))->refct = 0;
1387*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDestroy(&(*wf)->funcs));
1388*5f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormDestroy(&(*wf)->form[f]));
1389*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*wf)->form));
1390*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(wf));
13916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13926528b96dSMatthew G. Knepley }
13936528b96dSMatthew G. Knepley 
139445480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormViewTable_Ascii(PetscWeakForm wf, PetscViewer viewer, PetscBool splitField, const char tableName[], PetscHMapForm map)
13956528b96dSMatthew G. Knepley {
139645480ffeSMatthew G. Knepley   PetscInt       Nf = wf->Nf, Nk, k;
13976528b96dSMatthew G. Knepley 
13986528b96dSMatthew G. Knepley   PetscFunctionBegin;
1399*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(map, &Nk));
14006528b96dSMatthew G. Knepley   if (Nk) {
140106ad1575SMatthew G. Knepley     PetscFormKey *keys;
14026528b96dSMatthew G. Knepley     void       (**funcs)(void);
14035fedec97SMatthew G. Knepley     const char  **names;
14045fedec97SMatthew G. Knepley     PetscInt     *values, *idx1, *idx2, *idx;
14055fedec97SMatthew G. Knepley     PetscBool     showPart = PETSC_FALSE, showPointer = PETSC_FALSE;
14065fedec97SMatthew G. Knepley     PetscInt      off = 0;
14076528b96dSMatthew G. Knepley 
1408*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc6(Nk, &keys, Nk, &names, Nk, &values, Nk, &idx1, Nk, &idx2, Nk, &idx));
1409*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormGetKeys(map, &off, keys));
14105fedec97SMatthew G. Knepley     /* Sort keys by label name and value */
14115fedec97SMatthew G. Knepley     {
14125fedec97SMatthew G. Knepley       /* First sort values */
14135fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {values[k] = keys[k].value; idx1[k] = k;}
1414*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSortIntWithPermutation(Nk, values, idx1));
14155fedec97SMatthew G. Knepley       /* If the string sort is stable, it will be sorted correctly overall */
14165fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
1417*5f80ce2aSJacob Faibussowitsch         if (keys[idx1[k]].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[idx1[k]].label, &names[k]));
14185fedec97SMatthew G. Knepley         else                     {names[k] = "";}
14195fedec97SMatthew G. Knepley         idx2[k] = k;
14205fedec97SMatthew G. Knepley       }
1421*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSortStrWithPermutation(Nk, names, idx2));
14225fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
1423*5f80ce2aSJacob Faibussowitsch         if (keys[k].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[k].label, &names[k]));
14245fedec97SMatthew G. Knepley         else               {names[k] = "";}
14255fedec97SMatthew G. Knepley         idx[k] = idx1[idx2[k]];
14265fedec97SMatthew G. Knepley       }
14275fedec97SMatthew G. Knepley     }
1428*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s\n", tableName));
1429*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPushTab(viewer));
14306528b96dSMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14310944a4d6SMatthew G. Knepley       if (keys[k].part != 0) showPart = PETSC_TRUE;
14320944a4d6SMatthew G. Knepley     }
14330944a4d6SMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14345fedec97SMatthew G. Knepley       const PetscInt i = idx[k];
14355fedec97SMatthew G. Knepley       PetscInt       n, f;
14365fedec97SMatthew G. Knepley 
14375fedec97SMatthew G. Knepley       if (keys[i].label) {
1438*5f80ce2aSJacob Faibussowitsch         if (showPointer) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s:%p, %D) ", names[i], keys[i].label, keys[i].value));
1439*5f80ce2aSJacob Faibussowitsch         else             CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s, %D) ", names[i], keys[i].value));
1440*5f80ce2aSJacob Faibussowitsch       } else CHKERRQ(PetscViewerASCIIPrintf(viewer, ""));
1441*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_FALSE));
1442*5f80ce2aSJacob Faibussowitsch       if (splitField) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D, %D) ", keys[i].field/Nf, keys[i].field%Nf));
1443*5f80ce2aSJacob Faibussowitsch       else            CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].field));
1444*5f80ce2aSJacob Faibussowitsch       if (showPart)   CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].part));
1445*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, map, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &n, &funcs));
14465fedec97SMatthew G. Knepley       for (f = 0; f < n; ++f) {
1447258ec3d2SMatthew G. Knepley         char  *fname;
14485fedec97SMatthew G. Knepley         size_t len, l;
1449258ec3d2SMatthew G. Knepley 
1450*5f80ce2aSJacob Faibussowitsch         if (f > 0) CHKERRQ(PetscViewerASCIIPrintf(viewer, ", "));
1451*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDLAddr(funcs[f], &fname));
14525fedec97SMatthew G. Knepley         if (fname) {
14535fedec97SMatthew G. Knepley           /* Eliminate argument types */
1454*5f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscStrlen(fname, &len));
14555fedec97SMatthew G. Knepley           for (l = 0; l < len; ++l) if (fname[l] == '(') {fname[l] = '\0'; break;}
1456*5f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s", fname));
14575fedec97SMatthew G. Knepley         } else if (showPointer) {
1458*5f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer, "%p", funcs[f]));
14595fedec97SMatthew G. Knepley         }
1460*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscFree(fname));
14616528b96dSMatthew G. Knepley       }
1462*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer, "\n"));
1463*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_TRUE));
14646528b96dSMatthew G. Knepley     }
1465*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPopTab(viewer));
1466*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree6(keys, names, values, idx1, idx2, idx));
14676528b96dSMatthew G. Knepley   }
14686528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14696528b96dSMatthew G. Knepley }
14706528b96dSMatthew G. Knepley 
14716528b96dSMatthew G. Knepley static PetscErrorCode PetscWeakFormView_Ascii(PetscWeakForm wf, PetscViewer viewer)
14726528b96dSMatthew G. Knepley {
14736528b96dSMatthew G. Knepley   PetscViewerFormat format;
147406ad1575SMatthew G. Knepley   PetscInt          f;
14756528b96dSMatthew G. Knepley 
14766528b96dSMatthew G. Knepley   PetscFunctionBegin;
1477*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetFormat(viewer, &format));
1478*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer, "Weak Form System with %d fields\n", wf->Nf));
1479*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
148006ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
1481*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscWeakFormViewTable_Ascii(wf, viewer, PETSC_TRUE, PetscWeakFormKinds[f], wf->form[f]));
148206ad1575SMatthew G. Knepley   }
1483*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
14846528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14856528b96dSMatthew G. Knepley }
14866528b96dSMatthew G. Knepley 
14876528b96dSMatthew G. Knepley /*@C
14886528b96dSMatthew G. Knepley   PetscWeakFormView - Views a PetscWeakForm
14896528b96dSMatthew G. Knepley 
14906528b96dSMatthew G. Knepley   Collective on wf
14916528b96dSMatthew G. Knepley 
1492d8d19677SJose E. Roman   Input Parameters:
14936528b96dSMatthew G. Knepley + wf - the PetscWeakForm object to view
14946528b96dSMatthew G. Knepley - v  - the viewer
14956528b96dSMatthew G. Knepley 
14966528b96dSMatthew G. Knepley   Level: developer
14976528b96dSMatthew G. Knepley 
14986528b96dSMatthew G. Knepley .seealso PetscWeakFormDestroy(), PetscWeakFormCreate()
14996528b96dSMatthew G. Knepley @*/
15006528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormView(PetscWeakForm wf, PetscViewer v)
15016528b96dSMatthew G. Knepley {
15026528b96dSMatthew G. Knepley   PetscBool      iascii;
15036528b96dSMatthew G. Knepley 
15046528b96dSMatthew G. Knepley   PetscFunctionBegin;
15056528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
1506*5f80ce2aSJacob Faibussowitsch   if (!v) CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) wf), &v));
15076528b96dSMatthew G. Knepley   else    {PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);}
1508*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii));
1509*5f80ce2aSJacob Faibussowitsch   if (iascii) CHKERRQ(PetscWeakFormView_Ascii(wf, v));
1510*5f80ce2aSJacob Faibussowitsch   if (wf->ops->view) CHKERRQ((*wf->ops->view)(wf, v));
15116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15126528b96dSMatthew G. Knepley }
15136528b96dSMatthew G. Knepley 
15146528b96dSMatthew G. Knepley /*@
15156528b96dSMatthew G. Knepley   PetscWeakFormCreate - Creates an empty PetscWeakForm object.
15166528b96dSMatthew G. Knepley 
15176528b96dSMatthew G. Knepley   Collective
15186528b96dSMatthew G. Knepley 
15196528b96dSMatthew G. Knepley   Input Parameter:
15206528b96dSMatthew G. Knepley . comm - The communicator for the PetscWeakForm object
15216528b96dSMatthew G. Knepley 
15226528b96dSMatthew G. Knepley   Output Parameter:
15236528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
15246528b96dSMatthew G. Knepley 
15256528b96dSMatthew G. Knepley   Level: beginner
15266528b96dSMatthew G. Knepley 
15276528b96dSMatthew G. Knepley .seealso: PetscDS, PetscWeakFormDestroy()
15286528b96dSMatthew G. Knepley @*/
15296528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormCreate(MPI_Comm comm, PetscWeakForm *wf)
15306528b96dSMatthew G. Knepley {
15316528b96dSMatthew G. Knepley   PetscWeakForm  p;
153206ad1575SMatthew G. Knepley   PetscInt       f;
15336528b96dSMatthew G. Knepley 
15346528b96dSMatthew G. Knepley   PetscFunctionBegin;
15356528b96dSMatthew G. Knepley   PetscValidPointer(wf, 2);
15366528b96dSMatthew G. Knepley   *wf  = NULL;
1537*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDSInitializePackage());
15386528b96dSMatthew G. Knepley 
1539*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(p, PETSCWEAKFORM_CLASSID, "PetscWeakForm", "Weak Form System", "PetscWeakForm", comm, PetscWeakFormDestroy, PetscWeakFormView));
15406528b96dSMatthew G. Knepley 
15416528b96dSMatthew G. Knepley   p->Nf = 0;
1542*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferCreate(sizeof(&PetscWeakFormCreate), 2, &p->funcs));
1543*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(PETSC_NUM_WF, &p->form));
1544*5f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormCreate(&p->form[f]));
15456528b96dSMatthew G. Knepley   *wf = p;
15466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15476528b96dSMatthew G. Knepley }
1548