xref: /petsc/src/dm/dt/interface/dtweakform.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
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 
7d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscChunkBufferCreate(size_t unitbytes, size_t expected, PetscChunkBuffer **buffer)
8d71ae5a4SJacob Faibussowitsch {
96528b96dSMatthew G. Knepley   PetscFunctionBegin;
109566063dSJacob Faibussowitsch   PetscCall(PetscNew(buffer));
119566063dSJacob Faibussowitsch   PetscCall(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 
18d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscChunkBufferDuplicate(PetscChunkBuffer *buffer, PetscChunkBuffer **bufferNew)
19d71ae5a4SJacob Faibussowitsch {
2045480ffeSMatthew G. Knepley   PetscFunctionBegin;
219566063dSJacob Faibussowitsch   PetscCall(PetscNew(bufferNew));
229566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(buffer->size * buffer->unitbytes, &(*bufferNew)->array));
239566063dSJacob Faibussowitsch   PetscCall(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 
30d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscChunkBufferDestroy(PetscChunkBuffer **buffer)
31d71ae5a4SJacob Faibussowitsch {
326528b96dSMatthew G. Knepley   PetscFunctionBegin;
339566063dSJacob Faibussowitsch   PetscCall(PetscFree((*buffer)->array));
349566063dSJacob Faibussowitsch   PetscCall(PetscFree(*buffer));
356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
366528b96dSMatthew G. Knepley }
376528b96dSMatthew G. Knepley 
38d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscChunkBufferCreateChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
39d71ae5a4SJacob Faibussowitsch {
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;
469566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(buffer->alloc, &tmp));
479566063dSJacob Faibussowitsch     PetscCall(PetscMemcpy(tmp, buffer->array, buffer->size * buffer->unitbytes));
489566063dSJacob Faibussowitsch     PetscCall(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 
58d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscChunkBufferEnlargeChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
59d71ae5a4SJacob Faibussowitsch {
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;
699566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(buffer, (size_t)reserved, &newchunk));
706528b96dSMatthew G. Knepley     newchunk.size = chunk->size + size;
719566063dSJacob Faibussowitsch     PetscCall(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
80*dce8aebaSBarry Smith   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 
90*dce8aebaSBarry Smith .seealso: `PetscFormKey`, `PetscIntSortSemiOrdered()`, `PetscSortInt()`
916528b96dSMatthew G. Knepley @*/
92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscFormKeySort(PetscInt n, PetscFormKey arr[])
93d71ae5a4SJacob Faibussowitsch {
946528b96dSMatthew G. Knepley   PetscFunctionBegin;
956528b96dSMatthew G. Knepley   if (n <= 1) PetscFunctionReturn(0);
966528b96dSMatthew G. Knepley   PetscValidPointer(arr, 2);
979566063dSJacob Faibussowitsch   PetscCall(PetscTimSort(n, arr, sizeof(PetscFormKey), Compare_PetscFormKey_Private, NULL));
986528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
996528b96dSMatthew G. Knepley }
1006528b96dSMatthew G. Knepley 
1013274405dSPierre Jolivet PetscErrorCode PetscWeakFormGetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt *n, void (***func)(void))
102d71ae5a4SJacob Faibussowitsch {
10306ad1575SMatthew G. Knepley   PetscFormKey key;
1046528b96dSMatthew G. Knepley   PetscChunk   chunk;
1056528b96dSMatthew G. Knepley 
1066528b96dSMatthew G. Knepley   PetscFunctionBegin;
1079371c9d4SSatish Balay   key.label = label;
1089371c9d4SSatish Balay   key.value = value;
1099371c9d4SSatish Balay   key.field = f;
1109371c9d4SSatish Balay   key.part  = part;
1119566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1129371c9d4SSatish Balay   if (chunk.size < 0) {
1139371c9d4SSatish Balay     *n    = 0;
1149371c9d4SSatish Balay     *func = NULL;
1159371c9d4SSatish Balay   } else {
1169371c9d4SSatish Balay     *n    = chunk.size;
1173274405dSPierre Jolivet     *func = (void (**)(void)) & wf->funcs->array[chunk.start];
1189371c9d4SSatish Balay   }
1196528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1206528b96dSMatthew G. Knepley }
1216528b96dSMatthew G. Knepley 
1226528b96dSMatthew G. Knepley /* A NULL argument for func causes this to clear the key */
1233274405dSPierre Jolivet PetscErrorCode PetscWeakFormSetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt n, void (**func)(void))
124d71ae5a4SJacob Faibussowitsch {
12506ad1575SMatthew G. Knepley   PetscFormKey key;
1266528b96dSMatthew G. Knepley   PetscChunk   chunk;
1276528b96dSMatthew G. Knepley   PetscInt     i;
1286528b96dSMatthew G. Knepley 
1296528b96dSMatthew G. Knepley   PetscFunctionBegin;
1309371c9d4SSatish Balay   key.label = label;
1319371c9d4SSatish Balay   key.value = value;
1329371c9d4SSatish Balay   key.field = f;
1339371c9d4SSatish Balay   key.part  = part;
1346528b96dSMatthew G. Knepley   if (!func) {
1359566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDel(ht, key));
1366528b96dSMatthew G. Knepley     PetscFunctionReturn(0);
1371baa6e33SBarry Smith   } else PetscCall(PetscHMapFormGet(ht, key, &chunk));
1386528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1399566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, n, &chunk));
1409566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1416528b96dSMatthew G. Knepley   } else if (chunk.size <= n) {
1429566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, n - chunk.size, &chunk));
1439566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1446528b96dSMatthew G. Knepley   }
1453274405dSPierre Jolivet   for (i = 0; i < n; ++i) ((void (**)(void)) & wf->funcs->array[chunk.start])[i] = func[i];
1466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1476528b96dSMatthew G. Knepley }
1486528b96dSMatthew G. Knepley 
1493274405dSPierre Jolivet PetscErrorCode PetscWeakFormAddFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, void (*func)(void))
150d71ae5a4SJacob Faibussowitsch {
15106ad1575SMatthew G. Knepley   PetscFormKey key;
1526528b96dSMatthew G. Knepley   PetscChunk   chunk;
1536528b96dSMatthew G. Knepley 
1546528b96dSMatthew G. Knepley   PetscFunctionBegin;
1556528b96dSMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
1569371c9d4SSatish Balay   key.label = label;
1579371c9d4SSatish Balay   key.value = value;
1589371c9d4SSatish Balay   key.field = f;
1599371c9d4SSatish Balay   key.part  = part;
1609566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1616528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1629566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, 1, &chunk));
1639566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1643274405dSPierre Jolivet     ((void (**)(void)) & wf->funcs->array[chunk.start])[0] = func;
1656528b96dSMatthew G. Knepley   } else {
1669566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, 1, &chunk));
1679566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1683274405dSPierre Jolivet     ((void (**)(void)) & wf->funcs->array[chunk.start])[chunk.size - 1] = func;
1696528b96dSMatthew G. Knepley   }
1706528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1716528b96dSMatthew G. Knepley }
1726528b96dSMatthew G. Knepley 
1733274405dSPierre Jolivet PetscErrorCode PetscWeakFormGetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (**func)(void))
174d71ae5a4SJacob Faibussowitsch {
17506ad1575SMatthew G. Knepley   PetscFormKey key;
1766528b96dSMatthew G. Knepley   PetscChunk   chunk;
1776528b96dSMatthew G. Knepley 
1786528b96dSMatthew G. Knepley   PetscFunctionBegin;
1799371c9d4SSatish Balay   key.label = label;
1809371c9d4SSatish Balay   key.value = value;
1819371c9d4SSatish Balay   key.field = f;
1829371c9d4SSatish Balay   key.part  = part;
1839566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1849371c9d4SSatish Balay   if (chunk.size < 0) {
1859371c9d4SSatish Balay     *func = NULL;
1869371c9d4SSatish Balay   } else {
18763a3b9bcSJacob Faibussowitsch     PetscCheck(ind < chunk.size, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " not in [0, %" PetscInt_FMT ")", ind, chunk.size);
1883274405dSPierre Jolivet     *func = ((void (**)(void)) & wf->funcs->array[chunk.start])[ind];
1896528b96dSMatthew G. Knepley   }
1906528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1916528b96dSMatthew G. Knepley }
1926528b96dSMatthew G. Knepley 
19306ad1575SMatthew G. Knepley /* Ignore a NULL func */
1943274405dSPierre Jolivet PetscErrorCode PetscWeakFormSetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (*func)(void))
195d71ae5a4SJacob Faibussowitsch {
19606ad1575SMatthew G. Knepley   PetscFormKey key;
1976528b96dSMatthew G. Knepley   PetscChunk   chunk;
1986528b96dSMatthew G. Knepley 
1996528b96dSMatthew G. Knepley   PetscFunctionBegin;
20006ad1575SMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
2019371c9d4SSatish Balay   key.label = label;
2029371c9d4SSatish Balay   key.value = value;
2039371c9d4SSatish Balay   key.field = f;
2049371c9d4SSatish Balay   key.part  = part;
2059566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
2066528b96dSMatthew G. Knepley   if (chunk.size < 0) {
2079566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, ind + 1, &chunk));
2089566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
2096528b96dSMatthew G. Knepley   } else if (chunk.size <= ind) {
2109566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, ind - chunk.size + 1, &chunk));
2119566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
2126528b96dSMatthew G. Knepley   }
2133274405dSPierre Jolivet   ((void (**)(void)) & wf->funcs->array[chunk.start])[ind] = func;
2146528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
2156528b96dSMatthew G. Knepley }
2166528b96dSMatthew G. Knepley 
217d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormClearIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind)
218d71ae5a4SJacob Faibussowitsch {
21906ad1575SMatthew G. Knepley   PetscFormKey key;
22006ad1575SMatthew G. Knepley   PetscChunk   chunk;
22106ad1575SMatthew G. Knepley 
22206ad1575SMatthew G. Knepley   PetscFunctionBegin;
2239371c9d4SSatish Balay   key.label = label;
2249371c9d4SSatish Balay   key.value = value;
2259371c9d4SSatish Balay   key.field = f;
2269371c9d4SSatish Balay   key.part  = part;
2279566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
22806ad1575SMatthew G. Knepley   if (chunk.size < 0) {
22906ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
23006ad1575SMatthew G. Knepley   } else if (!ind && chunk.size == 1) {
2319566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDel(ht, key));
23206ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
23306ad1575SMatthew G. Knepley   } else if (chunk.size <= ind) {
23406ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
23506ad1575SMatthew G. Knepley   }
2363274405dSPierre Jolivet   ((void (**)(void)) & wf->funcs->array[chunk.start])[ind] = NULL;
23706ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
23806ad1575SMatthew G. Knepley }
23906ad1575SMatthew G. Knepley 
24045480ffeSMatthew G. Knepley /*@
241*dce8aebaSBarry Smith   PetscWeakFormCopy - Copy the pointwise functions to another `PetscWeakForm`
24245480ffeSMatthew G. Knepley 
24345480ffeSMatthew G. Knepley   Not Collective
24445480ffeSMatthew G. Knepley 
24545480ffeSMatthew G. Knepley   Input Parameter:
246*dce8aebaSBarry Smith . wf - The original `PetscWeakForm`
24745480ffeSMatthew G. Knepley 
24845480ffeSMatthew G. Knepley   Output Parameter:
249*dce8aebaSBarry Smith . wfNew - The copy of the `PetscWeakForm`
25045480ffeSMatthew G. Knepley 
25145480ffeSMatthew G. Knepley   Level: intermediate
25245480ffeSMatthew G. Knepley 
253*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
25445480ffeSMatthew G. Knepley @*/
255d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormCopy(PetscWeakForm wf, PetscWeakForm wfNew)
256d71ae5a4SJacob Faibussowitsch {
25706ad1575SMatthew G. Knepley   PetscInt f;
25845480ffeSMatthew G. Knepley 
25945480ffeSMatthew G. Knepley   PetscFunctionBegin;
26045480ffeSMatthew G. Knepley   wfNew->Nf = wf->Nf;
2619566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDestroy(&wfNew->funcs));
2629566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDuplicate(wf->funcs, &wfNew->funcs));
26306ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
2649566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDestroy(&wfNew->form[f]));
2659566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDuplicate(wf->form[f], &wfNew->form[f]));
26606ad1575SMatthew G. Knepley   }
26706ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
26806ad1575SMatthew G. Knepley }
26906ad1575SMatthew G. Knepley 
27006ad1575SMatthew G. Knepley /*@
271*dce8aebaSBarry Smith   PetscWeakFormClear - Clear all functions from the `PetscWeakForm`
27206ad1575SMatthew G. Knepley 
27306ad1575SMatthew G. Knepley   Not Collective
27406ad1575SMatthew G. Knepley 
27506ad1575SMatthew G. Knepley   Input Parameter:
276*dce8aebaSBarry Smith . wf - The original `PetscWeakForm`
27706ad1575SMatthew G. Knepley 
27806ad1575SMatthew G. Knepley   Level: intermediate
27906ad1575SMatthew G. Knepley 
280*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscWeakFormCopy()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
28106ad1575SMatthew G. Knepley @*/
282d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormClear(PetscWeakForm wf)
283d71ae5a4SJacob Faibussowitsch {
28406ad1575SMatthew G. Knepley   PetscInt f;
28506ad1575SMatthew G. Knepley 
28606ad1575SMatthew G. Knepley   PetscFunctionBegin;
2879566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormClear(wf->form[f]));
28845480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
28945480ffeSMatthew G. Knepley }
29045480ffeSMatthew G. Knepley 
291d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWeakFormRewriteKeys_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label, PetscInt Nv, const PetscInt values[])
292d71ae5a4SJacob Faibussowitsch {
29306ad1575SMatthew G. Knepley   PetscFormKey *keys;
29445480ffeSMatthew G. Knepley   PetscInt      n, i, v, off = 0;
29545480ffeSMatthew G. Knepley 
29645480ffeSMatthew G. Knepley   PetscFunctionBegin;
2979566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(hmap, &n));
2989566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n, &keys));
2999566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetKeys(hmap, &off, keys));
30045480ffeSMatthew G. Knepley   for (i = 0; i < n; ++i) {
30145480ffeSMatthew G. Knepley     if (keys[i].label == label) {
30245480ffeSMatthew G. Knepley       PetscBool clear = PETSC_TRUE;
3033274405dSPierre Jolivet       void (**funcs)(void);
30445480ffeSMatthew G. Knepley       PetscInt Nf;
30545480ffeSMatthew G. Knepley 
3069566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
30745480ffeSMatthew G. Knepley       for (v = 0; v < Nv; ++v) {
3089566063dSJacob Faibussowitsch         PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, values[v], keys[i].field, keys[i].part, Nf, funcs));
30945480ffeSMatthew G. Knepley         if (values[v] == keys[i].value) clear = PETSC_FALSE;
31045480ffeSMatthew G. Knepley       }
3119566063dSJacob Faibussowitsch       if (clear) PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, 0, NULL));
31245480ffeSMatthew G. Knepley     }
31345480ffeSMatthew G. Knepley   }
3149566063dSJacob Faibussowitsch   PetscCall(PetscFree(keys));
31545480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
31645480ffeSMatthew G. Knepley }
31745480ffeSMatthew G. Knepley 
31845480ffeSMatthew G. Knepley /*@C
31945480ffeSMatthew G. Knepley   PetscWeakFormRewriteKeys - Change any key on the given label to use the new set of label values
32045480ffeSMatthew G. Knepley 
32145480ffeSMatthew G. Knepley   Not Collective
32245480ffeSMatthew G. Knepley 
32345480ffeSMatthew G. Knepley   Input Parameters:
324*dce8aebaSBarry Smith + wf     - The original `PetscWeakForm`
32545480ffeSMatthew G. Knepley . label  - The label to change keys for
32645480ffeSMatthew G. Knepley . Nv     - The number of new label values
32745480ffeSMatthew G. Knepley - values - The set of new values to relabel keys with
32845480ffeSMatthew G. Knepley 
32945480ffeSMatthew G. Knepley   Level: intermediate
33045480ffeSMatthew G. Knepley 
331*dce8aebaSBarry Smith   Note:
332*dce8aebaSBarry Smith   This is used internally when boundary label values are specified from the command line.
333*dce8aebaSBarry Smith 
334*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `DMLabel`, `PetscWeakFormReplaceLabel()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
33545480ffeSMatthew G. Knepley @*/
336d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormRewriteKeys(PetscWeakForm wf, DMLabel label, PetscInt Nv, const PetscInt values[])
337d71ae5a4SJacob Faibussowitsch {
33806ad1575SMatthew G. Knepley   PetscInt f;
33945480ffeSMatthew G. Knepley 
34045480ffeSMatthew G. Knepley   PetscFunctionBegin;
3419566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscWeakFormRewriteKeys_Internal(wf, wf->form[f], label, Nv, values));
34245480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
34345480ffeSMatthew G. Knepley }
34445480ffeSMatthew G. Knepley 
345d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWeakFormReplaceLabel_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label)
346d71ae5a4SJacob Faibussowitsch {
347d700741fSMatthew G. Knepley   PetscFormKey *keys;
348d700741fSMatthew G. Knepley   PetscInt      n, i, off = 0, maxFuncs = 0;
3493274405dSPierre Jolivet   void (**tmpf)(void);
350d700741fSMatthew G. Knepley   const char *name = NULL;
351d700741fSMatthew G. Knepley 
352d700741fSMatthew G. Knepley   PetscFunctionBegin;
3539566063dSJacob Faibussowitsch   if (label) PetscCall(PetscObjectGetName((PetscObject)label, &name));
3549566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(hmap, &n));
3559566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n, &keys));
3569566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetKeys(hmap, &off, keys));
357d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
358d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
359d700741fSMatthew G. Knepley     const char *lname = NULL;
360d700741fSMatthew G. Knepley 
361d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3629566063dSJacob Faibussowitsch     if (keys[i].label) PetscCall(PetscObjectGetName((PetscObject)keys[i].label, &lname));
3639566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(name, lname, &match));
364d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
3653274405dSPierre Jolivet       void (**funcs)(void);
366d700741fSMatthew G. Knepley       PetscInt Nf;
367d700741fSMatthew G. Knepley 
3689566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
369d700741fSMatthew G. Knepley       maxFuncs = PetscMax(maxFuncs, Nf);
370d700741fSMatthew G. Knepley     }
371d700741fSMatthew G. Knepley   }
372d700741fSMatthew G. Knepley   /* Need temp space because chunk buffer can be reallocated in SetFunction() call */
3739566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(maxFuncs, &tmpf));
374d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
375d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
376d700741fSMatthew G. Knepley     const char *lname = NULL;
377d700741fSMatthew G. Knepley 
378d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3799566063dSJacob Faibussowitsch     if (keys[i].label) PetscCall(PetscObjectGetName((PetscObject)keys[i].label, &lname));
3809566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(name, lname, &match));
381d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
3823274405dSPierre Jolivet       void (**funcs)(void);
383d700741fSMatthew G. Knepley       PetscInt Nf, j;
384d700741fSMatthew G. Knepley 
3859566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
386d700741fSMatthew G. Knepley       for (j = 0; j < Nf; ++j) tmpf[j] = funcs[j];
3879566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, label, keys[i].value, keys[i].field, keys[i].part, Nf, tmpf));
3889566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, 0, NULL));
389d700741fSMatthew G. Knepley     }
390d700741fSMatthew G. Knepley   }
3919566063dSJacob Faibussowitsch   PetscCall(PetscFree(tmpf));
3929566063dSJacob Faibussowitsch   PetscCall(PetscFree(keys));
393d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
394d700741fSMatthew G. Knepley }
395d700741fSMatthew G. Knepley 
396d700741fSMatthew G. Knepley /*@C
397d700741fSMatthew G. Knepley   PetscWeakFormReplaceLabel - Change any key on a label of the same name to use the new label
398d700741fSMatthew G. Knepley 
399d700741fSMatthew G. Knepley   Not Collective
400d700741fSMatthew G. Knepley 
401d700741fSMatthew G. Knepley   Input Parameters:
402*dce8aebaSBarry Smith + wf    - The original `PetscWeakForm`
403d700741fSMatthew G. Knepley - label - The label to change keys for
404d700741fSMatthew G. Knepley 
405d700741fSMatthew G. Knepley   Level: intermediate
406d700741fSMatthew G. Knepley 
407*dce8aebaSBarry Smith   Note:
408*dce8aebaSBarry Smith   This is used internally when meshes are modified
409*dce8aebaSBarry Smith 
410*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `DMLabel`, `PetscWeakFormRewriteKeys()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
411d700741fSMatthew G. Knepley @*/
412d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormReplaceLabel(PetscWeakForm wf, DMLabel label)
413d71ae5a4SJacob Faibussowitsch {
414d700741fSMatthew G. Knepley   PetscInt f;
415d700741fSMatthew G. Knepley 
416d700741fSMatthew G. Knepley   PetscFunctionBegin;
4179566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscWeakFormReplaceLabel_Internal(wf, wf->form[f], label));
418d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
419d700741fSMatthew G. Knepley }
420d700741fSMatthew G. Knepley 
421d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormClearIndex(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscWeakFormKind kind, PetscInt ind)
422d71ae5a4SJacob Faibussowitsch {
42306ad1575SMatthew G. Knepley   PetscFunctionBegin;
4249566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormClearIndexFunction_Private(wf, wf->form[kind], label, val, f, part, ind));
42506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
42606ad1575SMatthew G. Knepley }
42706ad1575SMatthew G. Knepley 
428d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n, void (***obj)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
429d71ae5a4SJacob Faibussowitsch {
4306528b96dSMatthew G. Knepley   PetscFunctionBegin;
4319566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (***)(void))obj));
4326528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4336528b96dSMatthew G. Knepley }
4346528b96dSMatthew G. Knepley 
435d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n, void (**obj)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
436d71ae5a4SJacob Faibussowitsch {
4376528b96dSMatthew G. Knepley   PetscFunctionBegin;
4389566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (**)(void))obj));
4396528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4406528b96dSMatthew G. Knepley }
4416528b96dSMatthew G. Knepley 
442d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, void (*obj)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
443d71ae5a4SJacob Faibussowitsch {
4446528b96dSMatthew G. Knepley   PetscFunctionBegin;
4459566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, (void (*)(void))obj));
4466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4476528b96dSMatthew G. Knepley }
4486528b96dSMatthew G. Knepley 
449d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind, void (**obj)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
450d71ae5a4SJacob Faibussowitsch {
4516528b96dSMatthew G. Knepley   PetscFunctionBegin;
4529566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (**)(void))obj));
4536528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4546528b96dSMatthew G. Knepley }
4556528b96dSMatthew G. Knepley 
456d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind, void (*obj)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
457d71ae5a4SJacob Faibussowitsch {
4586528b96dSMatthew G. Knepley   PetscFunctionBegin;
4599566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (*)(void))obj));
4606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4616528b96dSMatthew G. Knepley }
4626528b96dSMatthew G. Knepley 
463d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n0, void (***f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
464d71ae5a4SJacob Faibussowitsch {
4656528b96dSMatthew G. Knepley   PetscFunctionBegin;
4669566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (***)(void))f0));
4679566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (***)(void))f1));
4686528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4696528b96dSMatthew G. Knepley }
4706528b96dSMatthew G. Knepley 
471d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, void (*f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
472d71ae5a4SJacob Faibussowitsch {
4736528b96dSMatthew G. Knepley   PetscFunctionBegin;
4749566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, (void (*)(void))f0));
4759566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, (void (*)(void))f1));
4766528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4776528b96dSMatthew G. Knepley }
4786528b96dSMatthew G. Knepley 
479d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n0, void (**f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
480d71ae5a4SJacob Faibussowitsch {
4816528b96dSMatthew G. Knepley   PetscFunctionBegin;
4829566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (**)(void))f0));
4839566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (**)(void))f1));
4846528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4856528b96dSMatthew G. Knepley }
4866528b96dSMatthew G. Knepley 
487d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt i0, void (*f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
488d71ae5a4SJacob Faibussowitsch {
4896528b96dSMatthew G. Knepley   PetscFunctionBegin;
4909566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, i0, (void (*)(void))f0));
4919566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, i1, (void (*)(void))f1));
4926528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4936528b96dSMatthew G. Knepley }
4946528b96dSMatthew G. Knepley 
495d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n0, void (***f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
496d71ae5a4SJacob Faibussowitsch {
4976528b96dSMatthew G. Knepley   PetscFunctionBegin;
4989566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (***)(void))f0));
4999566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (***)(void))f1));
5006528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5016528b96dSMatthew G. Knepley }
5026528b96dSMatthew G. Knepley 
503d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, void (*f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
504d71ae5a4SJacob Faibussowitsch {
5056528b96dSMatthew G. Knepley   PetscFunctionBegin;
5069566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, (void (*)(void))f0));
5079566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, (void (*)(void))f1));
5086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5096528b96dSMatthew G. Knepley }
5106528b96dSMatthew G. Knepley 
511d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n0, void (**f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
512d71ae5a4SJacob Faibussowitsch {
5136528b96dSMatthew G. Knepley   PetscFunctionBegin;
5149566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (**)(void))f0));
5159566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (**)(void))f1));
5166528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5176528b96dSMatthew G. Knepley }
5186528b96dSMatthew G. Knepley 
519d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt i0, void (*f0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*f1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
520d71ae5a4SJacob Faibussowitsch {
5216528b96dSMatthew G. Knepley   PetscFunctionBegin;
5229566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, i0, (void (*)(void))f0));
5239566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, i1, (void (*)(void))f1));
5246528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5256528b96dSMatthew G. Knepley }
5266528b96dSMatthew G. Knepley 
527d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormHasJacobian(PetscWeakForm wf, PetscBool *hasJac)
528d71ae5a4SJacob Faibussowitsch {
5296528b96dSMatthew G. Knepley   PetscInt n0, n1, n2, n3;
5306528b96dSMatthew G. Knepley 
5316528b96dSMatthew G. Knepley   PetscFunctionBegin;
5326528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
5336528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
5349566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G0], &n0));
5359566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G1], &n1));
5369566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G2], &n2));
5379566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G3], &n3));
5386528b96dSMatthew G. Knepley   *hasJac = n0 + n1 + n2 + n3 ? PETSC_TRUE : PETSC_FALSE;
5396528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5406528b96dSMatthew G. Knepley }
5416528b96dSMatthew G. Knepley 
542d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt *n0, void (***g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n2, void (***g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n3, void (***g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
543d71ae5a4SJacob Faibussowitsch {
5446528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
5456528b96dSMatthew G. Knepley 
5466528b96dSMatthew G. Knepley   PetscFunctionBegin;
5479566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (***)(void))g0));
5489566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (***)(void))g1));
5499566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (***)(void))g2));
5509566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (***)(void))g3));
5516528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5526528b96dSMatthew G. Knepley }
5536528b96dSMatthew G. Knepley 
554d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
555d71ae5a4SJacob Faibussowitsch {
5566528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
5576528b96dSMatthew G. Knepley 
5586528b96dSMatthew G. Knepley   PetscFunctionBegin;
5599566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, (void (*)(void))g0));
5609566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, (void (*)(void))g1));
5619566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, (void (*)(void))g2));
5629566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, (void (*)(void))g3));
5636528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5646528b96dSMatthew G. Knepley }
5656528b96dSMatthew G. Knepley 
566d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt n0, void (**g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n2, void (**g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n3, void (**g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
567d71ae5a4SJacob Faibussowitsch {
5686528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
5696528b96dSMatthew G. Knepley 
5706528b96dSMatthew G. Knepley   PetscFunctionBegin;
5719566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (**)(void))g0));
5729566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (**)(void))g1));
5739566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (**)(void))g2));
5749566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (**)(void))g3));
5756528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5766528b96dSMatthew G. Knepley }
5776528b96dSMatthew G. Knepley 
578d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt i0, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i2, void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i3, void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
579d71ae5a4SJacob Faibussowitsch {
5806528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
5816528b96dSMatthew G. Knepley 
5826528b96dSMatthew G. Knepley   PetscFunctionBegin;
5839566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, i0, (void (*)(void))g0));
5849566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, i1, (void (*)(void))g1));
5859566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, i2, (void (*)(void))g2));
5869566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, i3, (void (*)(void))g3));
5876528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5886528b96dSMatthew G. Knepley }
5896528b96dSMatthew G. Knepley 
590d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormHasJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
591d71ae5a4SJacob Faibussowitsch {
5926528b96dSMatthew G. Knepley   PetscInt n0, n1, n2, n3;
5936528b96dSMatthew G. Knepley 
5946528b96dSMatthew G. Knepley   PetscFunctionBegin;
5956528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
5966528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
5979566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP0], &n0));
5989566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP1], &n1));
5999566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP2], &n2));
6009566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP3], &n3));
6016528b96dSMatthew G. Knepley   *hasJacPre = n0 + n1 + n2 + n3 ? PETSC_TRUE : PETSC_FALSE;
6026528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6036528b96dSMatthew G. Knepley }
6046528b96dSMatthew G. Knepley 
605d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt *n0, void (***g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n2, void (***g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n3, void (***g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
606d71ae5a4SJacob Faibussowitsch {
6076528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6086528b96dSMatthew G. Knepley 
6096528b96dSMatthew G. Knepley   PetscFunctionBegin;
6109566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (***)(void))g0));
6119566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (***)(void))g1));
6129566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (***)(void))g2));
6139566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (***)(void))g3));
6146528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6156528b96dSMatthew G. Knepley }
6166528b96dSMatthew G. Knepley 
617d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
618d71ae5a4SJacob Faibussowitsch {
6196528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6206528b96dSMatthew G. Knepley 
6216528b96dSMatthew G. Knepley   PetscFunctionBegin;
6229566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, (void (*)(void))g0));
6239566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, (void (*)(void))g1));
6249566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, (void (*)(void))g2));
6259566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, (void (*)(void))g3));
6266528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6276528b96dSMatthew G. Knepley }
6286528b96dSMatthew G. Knepley 
629d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt n0, void (**g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n2, void (**g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n3, void (**g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
630d71ae5a4SJacob Faibussowitsch {
6316528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6326528b96dSMatthew G. Knepley 
6336528b96dSMatthew G. Knepley   PetscFunctionBegin;
6349566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (**)(void))g0));
6359566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (**)(void))g1));
6369566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (**)(void))g2));
6379566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (**)(void))g3));
6386528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6396528b96dSMatthew G. Knepley }
6406528b96dSMatthew G. Knepley 
641d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt i0, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i2, void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i3, void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
642d71ae5a4SJacob Faibussowitsch {
6436528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6446528b96dSMatthew G. Knepley 
6456528b96dSMatthew G. Knepley   PetscFunctionBegin;
6469566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, i0, (void (*)(void))g0));
6479566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, i1, (void (*)(void))g1));
6489566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, i2, (void (*)(void))g2));
6499566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, i3, (void (*)(void))g3));
6506528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6516528b96dSMatthew G. Knepley }
6526528b96dSMatthew G. Knepley 
653d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormHasBdJacobian(PetscWeakForm wf, PetscBool *hasJac)
654d71ae5a4SJacob Faibussowitsch {
6556528b96dSMatthew G. Knepley   PetscInt n0, n1, n2, n3;
6566528b96dSMatthew G. Knepley 
6576528b96dSMatthew G. Knepley   PetscFunctionBegin;
6586528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
6596528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
6609566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG0], &n0));
6619566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG1], &n1));
6629566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG2], &n2));
6639566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG3], &n3));
6646528b96dSMatthew G. Knepley   *hasJac = n0 + n1 + n2 + n3 ? PETSC_TRUE : PETSC_FALSE;
6656528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6666528b96dSMatthew G. Knepley }
6676528b96dSMatthew G. Knepley 
668d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt *n0, void (***g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n2, void (***g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n3, void (***g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
669d71ae5a4SJacob Faibussowitsch {
6706528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6716528b96dSMatthew G. Knepley 
6726528b96dSMatthew G. Knepley   PetscFunctionBegin;
6739566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (***)(void))g0));
6749566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (***)(void))g1));
6759566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (***)(void))g2));
6769566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (***)(void))g3));
6776528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6786528b96dSMatthew G. Knepley }
6796528b96dSMatthew G. Knepley 
680d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
681d71ae5a4SJacob Faibussowitsch {
6826528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6836528b96dSMatthew G. Knepley 
6846528b96dSMatthew G. Knepley   PetscFunctionBegin;
6859566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, (void (*)(void))g0));
6869566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, (void (*)(void))g1));
6879566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, (void (*)(void))g2));
6889566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, (void (*)(void))g3));
6896528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6906528b96dSMatthew G. Knepley }
6916528b96dSMatthew G. Knepley 
692d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt n0, void (**g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n2, void (**g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n3, void (**g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
693d71ae5a4SJacob Faibussowitsch {
6946528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
6956528b96dSMatthew G. Knepley 
6966528b96dSMatthew G. Knepley   PetscFunctionBegin;
6979566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (**)(void))g0));
6989566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (**)(void))g1));
6999566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (**)(void))g2));
7009566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (**)(void))g3));
7016528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7026528b96dSMatthew G. Knepley }
7036528b96dSMatthew G. Knepley 
704d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt i0, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i2, void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i3, void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
705d71ae5a4SJacob Faibussowitsch {
7066528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7076528b96dSMatthew G. Knepley 
7086528b96dSMatthew G. Knepley   PetscFunctionBegin;
7099566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, i0, (void (*)(void))g0));
7109566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, i1, (void (*)(void))g1));
7119566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, i2, (void (*)(void))g2));
7129566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, i3, (void (*)(void))g3));
7136528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7146528b96dSMatthew G. Knepley }
7156528b96dSMatthew G. Knepley 
716d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormHasBdJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
717d71ae5a4SJacob Faibussowitsch {
7186528b96dSMatthew G. Knepley   PetscInt n0, n1, n2, n3;
7196528b96dSMatthew G. Knepley 
7206528b96dSMatthew G. Knepley   PetscFunctionBegin;
7216528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
7226528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
7239566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP0], &n0));
7249566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP1], &n1));
7259566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP2], &n2));
7269566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP3], &n3));
7276528b96dSMatthew G. Knepley   *hasJacPre = n0 + n1 + n2 + n3 ? PETSC_TRUE : PETSC_FALSE;
7286528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7296528b96dSMatthew G. Knepley }
7306528b96dSMatthew G. Knepley 
731d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt *n0, void (***g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n2, void (***g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n3, void (***g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
732d71ae5a4SJacob Faibussowitsch {
7336528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7346528b96dSMatthew G. Knepley 
7356528b96dSMatthew G. Knepley   PetscFunctionBegin;
7369566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (***)(void))g0));
7379566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (***)(void))g1));
7389566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (***)(void))g2));
7399566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (***)(void))g3));
7406528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7416528b96dSMatthew G. Knepley }
7426528b96dSMatthew G. Knepley 
743d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
744d71ae5a4SJacob Faibussowitsch {
7456528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7466528b96dSMatthew G. Knepley 
7476528b96dSMatthew G. Knepley   PetscFunctionBegin;
7489566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, (void (*)(void))g0));
7499566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, (void (*)(void))g1));
7509566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, (void (*)(void))g2));
7519566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, (void (*)(void))g3));
7526528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7536528b96dSMatthew G. Knepley }
7546528b96dSMatthew G. Knepley 
755d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt n0, void (**g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n2, void (**g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n3, void (**g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
756d71ae5a4SJacob Faibussowitsch {
7576528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7586528b96dSMatthew G. Knepley 
7596528b96dSMatthew G. Knepley   PetscFunctionBegin;
7609566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (**)(void))g0));
7619566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (**)(void))g1));
7629566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (**)(void))g2));
7639566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (**)(void))g3));
7646528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7656528b96dSMatthew G. Knepley }
7666528b96dSMatthew G. Knepley 
767d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt i0, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i2, void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i3, void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
768d71ae5a4SJacob Faibussowitsch {
7696528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7706528b96dSMatthew G. Knepley 
7716528b96dSMatthew G. Knepley   PetscFunctionBegin;
7729566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, i0, (void (*)(void))g0));
7739566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, i1, (void (*)(void))g1));
7749566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, i2, (void (*)(void))g2));
7759566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, i3, (void (*)(void))g3));
7766528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7776528b96dSMatthew G. Knepley }
7786528b96dSMatthew G. Knepley 
779d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormHasDynamicJacobian(PetscWeakForm wf, PetscBool *hasDynJac)
780d71ae5a4SJacob Faibussowitsch {
7816528b96dSMatthew G. Knepley   PetscInt n0, n1, n2, n3;
7826528b96dSMatthew G. Knepley 
7836528b96dSMatthew G. Knepley   PetscFunctionBegin;
7846528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
7856528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasDynJac, 2);
7869566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT0], &n0));
7879566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT1], &n1));
7889566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT2], &n2));
7899566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT3], &n3));
7906528b96dSMatthew G. Knepley   *hasDynJac = n0 + n1 + n2 + n3 ? PETSC_TRUE : PETSC_FALSE;
7916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7926528b96dSMatthew G. Knepley }
7936528b96dSMatthew G. Knepley 
794d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt *n0, void (***g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n1, void (***g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n2, void (***g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt *n3, void (***g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
795d71ae5a4SJacob Faibussowitsch {
7966528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
7976528b96dSMatthew G. Knepley 
7986528b96dSMatthew G. Knepley   PetscFunctionBegin;
7999566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (***)(void))g0));
8009566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (***)(void))g1));
8019566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (***)(void))g2));
8029566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (***)(void))g3));
8036528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8046528b96dSMatthew G. Knepley }
8056528b96dSMatthew G. Knepley 
806d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormAddDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
807d71ae5a4SJacob Faibussowitsch {
8086528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
8096528b96dSMatthew G. Knepley 
8106528b96dSMatthew G. Knepley   PetscFunctionBegin;
8119566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, (void (*)(void))g0));
8129566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, (void (*)(void))g1));
8139566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, (void (*)(void))g2));
8149566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, (void (*)(void))g3));
8156528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8166528b96dSMatthew G. Knepley }
8176528b96dSMatthew G. Knepley 
818d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt n0, void (**g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n1, void (**g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n2, void (**g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt n3, void (**g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
819d71ae5a4SJacob Faibussowitsch {
8206528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
8216528b96dSMatthew G. Knepley 
8226528b96dSMatthew G. Knepley   PetscFunctionBegin;
8239566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (**)(void))g0));
8249566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (**)(void))g1));
8259566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (**)(void))g2));
8269566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (**)(void))g3));
8276528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8286528b96dSMatthew G. Knepley }
8296528b96dSMatthew G. Knepley 
830d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part, PetscInt i0, void (*g0)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i1, void (*g1)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i2, void (*g2)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]), PetscInt i3, void (*g3)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
831d71ae5a4SJacob Faibussowitsch {
8326528b96dSMatthew G. Knepley   PetscInt find = f * wf->Nf + g;
8336528b96dSMatthew G. Knepley 
8346528b96dSMatthew G. Knepley   PetscFunctionBegin;
8359566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, i0, (void (*)(void))g0));
8369566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, i1, (void (*)(void))g1));
8379566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, i2, (void (*)(void))g2));
8389566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, i3, (void (*)(void))g3));
8396528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8406528b96dSMatthew G. Knepley }
8416528b96dSMatthew G. Knepley 
842d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n, void (***r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
843d71ae5a4SJacob Faibussowitsch {
8446528b96dSMatthew G. Knepley   PetscFunctionBegin;
8459566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (***)(void))r));
8466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8476528b96dSMatthew G. Knepley }
8486528b96dSMatthew G. Knepley 
849d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n, void (**r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
850d71ae5a4SJacob Faibussowitsch {
8516528b96dSMatthew G. Knepley   PetscFunctionBegin;
8529566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (**)(void))r));
8536528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8546528b96dSMatthew G. Knepley }
8556528b96dSMatthew G. Knepley 
856d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetIndexRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt i, void (*r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
857d71ae5a4SJacob Faibussowitsch {
8586528b96dSMatthew G. Knepley   PetscFunctionBegin;
8599566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, i, (void (*)(void))r));
8606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8616528b96dSMatthew G. Knepley }
8626528b96dSMatthew G. Knepley 
8636528b96dSMatthew G. Knepley /*@
864*dce8aebaSBarry Smith   PetscWeakFormGetNumFields - Returns the number of fields in a `PetscWeakForm`
8656528b96dSMatthew G. Knepley 
8666528b96dSMatthew G. Knepley   Not collective
8676528b96dSMatthew G. Knepley 
8686528b96dSMatthew G. Knepley   Input Parameter:
869*dce8aebaSBarry Smith . wf - The `PetscWeakForm` object
8706528b96dSMatthew G. Knepley 
8716528b96dSMatthew G. Knepley   Output Parameter:
872a5b23f4aSJose E. Roman . Nf - The number of fields
8736528b96dSMatthew G. Knepley 
8746528b96dSMatthew G. Knepley   Level: beginner
8756528b96dSMatthew G. Knepley 
876*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscWeakFormSetNumFields()`, `PetscWeakFormCreate()`
8776528b96dSMatthew G. Knepley @*/
878d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormGetNumFields(PetscWeakForm wf, PetscInt *Nf)
879d71ae5a4SJacob Faibussowitsch {
8806528b96dSMatthew G. Knepley   PetscFunctionBegin;
8816528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
882dadcf809SJacob Faibussowitsch   PetscValidIntPointer(Nf, 2);
8836528b96dSMatthew G. Knepley   *Nf = wf->Nf;
8846528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8856528b96dSMatthew G. Knepley }
8866528b96dSMatthew G. Knepley 
8876528b96dSMatthew G. Knepley /*@
8886528b96dSMatthew G. Knepley   PetscWeakFormSetNumFields - Sets the number of fields
8896528b96dSMatthew G. Knepley 
8906528b96dSMatthew G. Knepley   Not collective
8916528b96dSMatthew G. Knepley 
8926528b96dSMatthew G. Knepley   Input Parameters:
893*dce8aebaSBarry Smith + wf - The `PetscWeakForm` object
8946528b96dSMatthew G. Knepley - Nf - The number of fields
8956528b96dSMatthew G. Knepley 
8966528b96dSMatthew G. Knepley   Level: beginner
8976528b96dSMatthew G. Knepley 
898*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscWeakFormGetNumFields()`, `PetscWeakFormCreate()`
8996528b96dSMatthew G. Knepley @*/
900d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormSetNumFields(PetscWeakForm wf, PetscInt Nf)
901d71ae5a4SJacob Faibussowitsch {
9026528b96dSMatthew G. Knepley   PetscFunctionBegin;
9036528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
9046528b96dSMatthew G. Knepley   wf->Nf = Nf;
9056528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9066528b96dSMatthew G. Knepley }
9076528b96dSMatthew G. Knepley 
9086528b96dSMatthew G. Knepley /*@
909*dce8aebaSBarry Smith   PetscWeakFormDestroy - Destroys a `PetscWeakForm` object
9106528b96dSMatthew G. Knepley 
9116528b96dSMatthew G. Knepley   Collective on wf
9126528b96dSMatthew G. Knepley 
9136528b96dSMatthew G. Knepley   Input Parameter:
914*dce8aebaSBarry Smith . wf - the `PetscWeakForm` object to destroy
9156528b96dSMatthew G. Knepley 
9166528b96dSMatthew G. Knepley   Level: developer
9176528b96dSMatthew G. Knepley 
918*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscWeakFormCreate()`, `PetscWeakFormView()`
9196528b96dSMatthew G. Knepley @*/
920d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormDestroy(PetscWeakForm *wf)
921d71ae5a4SJacob Faibussowitsch {
92206ad1575SMatthew G. Knepley   PetscInt f;
9236528b96dSMatthew G. Knepley 
9246528b96dSMatthew G. Knepley   PetscFunctionBegin;
9256528b96dSMatthew G. Knepley   if (!*wf) PetscFunctionReturn(0);
9266528b96dSMatthew G. Knepley   PetscValidHeaderSpecific((*wf), PETSCWEAKFORM_CLASSID, 1);
9276528b96dSMatthew G. Knepley 
9289371c9d4SSatish Balay   if (--((PetscObject)(*wf))->refct > 0) {
9299371c9d4SSatish Balay     *wf = NULL;
9309371c9d4SSatish Balay     PetscFunctionReturn(0);
9319371c9d4SSatish Balay   }
9326528b96dSMatthew G. Knepley   ((PetscObject)(*wf))->refct = 0;
9339566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDestroy(&(*wf)->funcs));
9349566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormDestroy(&(*wf)->form[f]));
9359566063dSJacob Faibussowitsch   PetscCall(PetscFree((*wf)->form));
9369566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(wf));
9376528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9386528b96dSMatthew G. Knepley }
9396528b96dSMatthew G. Knepley 
940d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWeakFormViewTable_Ascii(PetscWeakForm wf, PetscViewer viewer, PetscBool splitField, const char tableName[], PetscHMapForm map)
941d71ae5a4SJacob Faibussowitsch {
94245480ffeSMatthew G. Knepley   PetscInt Nf = wf->Nf, Nk, k;
9436528b96dSMatthew G. Knepley 
9446528b96dSMatthew G. Knepley   PetscFunctionBegin;
9459566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(map, &Nk));
9466528b96dSMatthew G. Knepley   if (Nk) {
94706ad1575SMatthew G. Knepley     PetscFormKey *keys;
948165f9cc3SJed Brown     void (**funcs)(void) = NULL;
9495fedec97SMatthew G. Knepley     const char **names;
9505fedec97SMatthew G. Knepley     PetscInt    *values, *idx1, *idx2, *idx;
9515fedec97SMatthew G. Knepley     PetscBool    showPart = PETSC_FALSE, showPointer = PETSC_FALSE;
9525fedec97SMatthew G. Knepley     PetscInt     off = 0;
9536528b96dSMatthew G. Knepley 
9549566063dSJacob Faibussowitsch     PetscCall(PetscMalloc6(Nk, &keys, Nk, &names, Nk, &values, Nk, &idx1, Nk, &idx2, Nk, &idx));
9559566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormGetKeys(map, &off, keys));
9565fedec97SMatthew G. Knepley     /* Sort keys by label name and value */
9575fedec97SMatthew G. Knepley     {
9585fedec97SMatthew G. Knepley       /* First sort values */
9599371c9d4SSatish Balay       for (k = 0; k < Nk; ++k) {
9609371c9d4SSatish Balay         values[k] = keys[k].value;
9619371c9d4SSatish Balay         idx1[k]   = k;
9629371c9d4SSatish Balay       }
9639566063dSJacob Faibussowitsch       PetscCall(PetscSortIntWithPermutation(Nk, values, idx1));
9645fedec97SMatthew G. Knepley       /* If the string sort is stable, it will be sorted correctly overall */
9655fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
9669566063dSJacob Faibussowitsch         if (keys[idx1[k]].label) PetscCall(PetscObjectGetName((PetscObject)keys[idx1[k]].label, &names[k]));
967ad540459SPierre Jolivet         else names[k] = "";
9685fedec97SMatthew G. Knepley         idx2[k] = k;
9695fedec97SMatthew G. Knepley       }
9709566063dSJacob Faibussowitsch       PetscCall(PetscSortStrWithPermutation(Nk, names, idx2));
9715fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
9729566063dSJacob Faibussowitsch         if (keys[k].label) PetscCall(PetscObjectGetName((PetscObject)keys[k].label, &names[k]));
973ad540459SPierre Jolivet         else names[k] = "";
9745fedec97SMatthew G. Knepley         idx[k] = idx1[idx2[k]];
9755fedec97SMatthew G. Knepley       }
9765fedec97SMatthew G. Knepley     }
9779566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", tableName));
9789566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
9796528b96dSMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
9800944a4d6SMatthew G. Knepley       if (keys[k].part != 0) showPart = PETSC_TRUE;
9810944a4d6SMatthew G. Knepley     }
9820944a4d6SMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
9835fedec97SMatthew G. Knepley       const PetscInt i = idx[k];
9845fedec97SMatthew G. Knepley       PetscInt       n, f;
9855fedec97SMatthew G. Knepley 
9865fedec97SMatthew G. Knepley       if (keys[i].label) {
987c75bfeddSPierre Jolivet         if (showPointer) PetscCall(PetscViewerASCIIPrintf(viewer, "(%s:%p, %" PetscInt_FMT ") ", names[i], (void *)keys[i].label, keys[i].value));
98863a3b9bcSJacob Faibussowitsch         else PetscCall(PetscViewerASCIIPrintf(viewer, "(%s, %" PetscInt_FMT ") ", names[i], keys[i].value));
98963a3b9bcSJacob Faibussowitsch       }
9909566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIUseTabs(viewer, PETSC_FALSE));
99163a3b9bcSJacob Faibussowitsch       if (splitField) PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ", %" PetscInt_FMT ") ", keys[i].field / Nf, keys[i].field % Nf));
99263a3b9bcSJacob Faibussowitsch       else PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ") ", keys[i].field));
99363a3b9bcSJacob Faibussowitsch       if (showPart) PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ") ", keys[i].part));
9949566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, map, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &n, &funcs));
9955fedec97SMatthew G. Knepley       for (f = 0; f < n; ++f) {
996258ec3d2SMatthew G. Knepley         char  *fname;
9975fedec97SMatthew G. Knepley         size_t len, l;
998258ec3d2SMatthew G. Knepley 
9999566063dSJacob Faibussowitsch         if (f > 0) PetscCall(PetscViewerASCIIPrintf(viewer, ", "));
10009566063dSJacob Faibussowitsch         PetscCall(PetscDLAddr(funcs[f], &fname));
10015fedec97SMatthew G. Knepley         if (fname) {
10025fedec97SMatthew G. Knepley           /* Eliminate argument types */
10039566063dSJacob Faibussowitsch           PetscCall(PetscStrlen(fname, &len));
10049371c9d4SSatish Balay           for (l = 0; l < len; ++l)
10059371c9d4SSatish Balay             if (fname[l] == '(') {
10069371c9d4SSatish Balay               fname[l] = '\0';
10079371c9d4SSatish Balay               break;
10089371c9d4SSatish Balay             }
10099566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(viewer, "%s", fname));
10105fedec97SMatthew G. Knepley         } else if (showPointer) {
10119566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(viewer, "%p", funcs[f]));
10125fedec97SMatthew G. Knepley         }
10139566063dSJacob Faibussowitsch         PetscCall(PetscFree(fname));
10146528b96dSMatthew G. Knepley       }
10159566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
10169566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIUseTabs(viewer, PETSC_TRUE));
10176528b96dSMatthew G. Knepley     }
10189566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
10199566063dSJacob Faibussowitsch     PetscCall(PetscFree6(keys, names, values, idx1, idx2, idx));
10206528b96dSMatthew G. Knepley   }
10216528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10226528b96dSMatthew G. Knepley }
10236528b96dSMatthew G. Knepley 
1024d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWeakFormView_Ascii(PetscWeakForm wf, PetscViewer viewer)
1025d71ae5a4SJacob Faibussowitsch {
10266528b96dSMatthew G. Knepley   PetscViewerFormat format;
102706ad1575SMatthew G. Knepley   PetscInt          f;
10286528b96dSMatthew G. Knepley 
10296528b96dSMatthew G. Knepley   PetscFunctionBegin;
10309566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
103163a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Weak Form System with %" PetscInt_FMT " fields\n", wf->Nf));
10329566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
103348a46eb9SPierre Jolivet   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscWeakFormViewTable_Ascii(wf, viewer, PETSC_TRUE, PetscWeakFormKinds[f], wf->form[f]));
10349566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
10356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10366528b96dSMatthew G. Knepley }
10376528b96dSMatthew G. Knepley 
10386528b96dSMatthew G. Knepley /*@C
1039*dce8aebaSBarry Smith   PetscWeakFormView - Views a `PetscWeakForm`
10406528b96dSMatthew G. Knepley 
10416528b96dSMatthew G. Knepley   Collective on wf
10426528b96dSMatthew G. Knepley 
1043d8d19677SJose E. Roman   Input Parameters:
1044*dce8aebaSBarry Smith + wf - the `PetscWeakForm` object to view
10456528b96dSMatthew G. Knepley - v  - the viewer
10466528b96dSMatthew G. Knepley 
10476528b96dSMatthew G. Knepley   Level: developer
10486528b96dSMatthew G. Knepley 
1049*dce8aebaSBarry Smith .seealso: `PetscViewer`, `PetscWeakForm`, `PetscWeakFormDestroy()`, `PetscWeakFormCreate()`
10506528b96dSMatthew G. Knepley @*/
1051d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormView(PetscWeakForm wf, PetscViewer v)
1052d71ae5a4SJacob Faibussowitsch {
10536528b96dSMatthew G. Knepley   PetscBool iascii;
10546528b96dSMatthew G. Knepley 
10556528b96dSMatthew G. Knepley   PetscFunctionBegin;
10566528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
10579566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)wf), &v));
1058ad540459SPierre Jolivet   else PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
10599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
10609566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscWeakFormView_Ascii(wf, v));
1061dbbe0bcdSBarry Smith   PetscTryTypeMethod(wf, view, v);
10626528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10636528b96dSMatthew G. Knepley }
10646528b96dSMatthew G. Knepley 
10656528b96dSMatthew G. Knepley /*@
1066*dce8aebaSBarry Smith   PetscWeakFormCreate - Creates an empty `PetscWeakForm` object.
10676528b96dSMatthew G. Knepley 
10686528b96dSMatthew G. Knepley   Collective
10696528b96dSMatthew G. Knepley 
10706528b96dSMatthew G. Knepley   Input Parameter:
1071*dce8aebaSBarry Smith . comm - The communicator for the `PetscWeakForm` object
10726528b96dSMatthew G. Knepley 
10736528b96dSMatthew G. Knepley   Output Parameter:
1074*dce8aebaSBarry Smith . wf - The `PetscWeakForm` object
10756528b96dSMatthew G. Knepley 
10766528b96dSMatthew G. Knepley   Level: beginner
10776528b96dSMatthew G. Knepley 
1078*dce8aebaSBarry Smith .seealso: `PetscWeakForm`, `PetscDS`, `PetscWeakFormDestroy()`
10796528b96dSMatthew G. Knepley @*/
1080d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscWeakFormCreate(MPI_Comm comm, PetscWeakForm *wf)
1081d71ae5a4SJacob Faibussowitsch {
10826528b96dSMatthew G. Knepley   PetscWeakForm p;
108306ad1575SMatthew G. Knepley   PetscInt      f;
10846528b96dSMatthew G. Knepley 
10856528b96dSMatthew G. Knepley   PetscFunctionBegin;
10866528b96dSMatthew G. Knepley   PetscValidPointer(wf, 2);
10876528b96dSMatthew G. Knepley   *wf = NULL;
10889566063dSJacob Faibussowitsch   PetscCall(PetscDSInitializePackage());
10896528b96dSMatthew G. Knepley 
10909566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCWEAKFORM_CLASSID, "PetscWeakForm", "Weak Form System", "PetscWeakForm", comm, PetscWeakFormDestroy, PetscWeakFormView));
10916528b96dSMatthew G. Knepley 
10926528b96dSMatthew G. Knepley   p->Nf = 0;
10939566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferCreate(sizeof(&PetscWeakFormCreate), 2, &p->funcs));
10949566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(PETSC_NUM_WF, &p->form));
10959566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormCreate(&p->form[f]));
10966528b96dSMatthew G. Knepley   *wf = p;
10976528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10986528b96dSMatthew G. Knepley }
1099