xref: /petsc/src/dm/dt/interface/dtweakform.c (revision 165f9cc327c75a5658e7e44e0b29ffe76d278833)
16528b96dSMatthew G. Knepley #include <petsc/private/petscdsimpl.h> /*I "petscds.h" I*/
26528b96dSMatthew G. Knepley 
36528b96dSMatthew G. Knepley PetscClassId PETSCWEAKFORM_CLASSID = 0;
46528b96dSMatthew G. Knepley 
506ad1575SMatthew G. Knepley const char *const PetscWeakFormKinds[] = {"objective", "residual_f0", "residual_f1", "jacobian_g0", "jacobian_g1", "jacobian_g2", "jacobian_g3", "jacobian_preconditioner_g0", "jacobian_preconditioner_g1", "jacobian_preconditioner_g2", "jacobian_preconditioner_g3", "dynamic_jacobian_g0", "dynamic_jacobian_g1", "dynamic_jacobian_g2", "dynamic_jacobian_g3", "boundary_residual_f0", "boundary_residual_f1", "boundary_jacobian_g0", "boundary_jacobian_g1", "boundary_jacobian_g2", "boundary_jacobian_g3", "boundary_jacobian_preconditioner_g0", "boundary_jacobian_preconditioner_g1", "boundary_jacobian_preconditioner_g2", "boundary_jacobian_preconditioner_g3", "riemann_solver", "PetscWeakFormKind", "PETSC_WF_", NULL};
606ad1575SMatthew G. Knepley 
76528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferCreate(size_t unitbytes, size_t expected, PetscChunkBuffer **buffer)
86528b96dSMatthew G. Knepley {
96528b96dSMatthew G. Knepley   PetscFunctionBegin;
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 
1845480ffeSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDuplicate(PetscChunkBuffer *buffer, PetscChunkBuffer **bufferNew)
1945480ffeSMatthew G. Knepley {
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 
306528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDestroy(PetscChunkBuffer **buffer)
316528b96dSMatthew G. Knepley {
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 
386528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferCreateChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
396528b96dSMatthew G. Knepley {
406528b96dSMatthew G. Knepley   PetscFunctionBegin;
416528b96dSMatthew G. Knepley   if ((buffer->size + size)*buffer->unitbytes > buffer->alloc) {
426528b96dSMatthew G. Knepley     char *tmp;
436528b96dSMatthew G. Knepley 
446528b96dSMatthew G. Knepley     if (!buffer->alloc) buffer->alloc = (buffer->size + size)*buffer->unitbytes;
456528b96dSMatthew G. Knepley     while ((buffer->size + size)*buffer->unitbytes > buffer->alloc) buffer->alloc *= 2;
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 
586528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferEnlargeChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
596528b96dSMatthew G. Knepley {
606528b96dSMatthew G. Knepley   size_t         siz = size;
616528b96dSMatthew G. Knepley 
626528b96dSMatthew G. Knepley   PetscFunctionBegin;
636528b96dSMatthew G. Knepley   if (chunk->size + size > chunk->reserved) {
646528b96dSMatthew G. Knepley     PetscChunk newchunk;
656528b96dSMatthew G. Knepley     PetscInt   reserved = chunk->size;
666528b96dSMatthew G. Knepley 
676528b96dSMatthew G. Knepley     /* TODO Here if we had a chunk list, we could update them all to reclaim unused space */
686528b96dSMatthew G. Knepley     while (reserved < chunk->size+size) reserved *= 2;
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
8006ad1575SMatthew G. Knepley   PetscFormKeySort - Sorts an array of PetscFormKey in place in increasing order.
816528b96dSMatthew G. Knepley 
826528b96dSMatthew G. Knepley   Not Collective
836528b96dSMatthew G. Knepley 
846528b96dSMatthew G. Knepley   Input Parameters:
856528b96dSMatthew G. Knepley + n - number of values
8606ad1575SMatthew G. Knepley - X - array of PetscFormKey
876528b96dSMatthew G. Knepley 
886528b96dSMatthew G. Knepley   Level: intermediate
896528b96dSMatthew G. Knepley 
90db781477SPatrick Sanan .seealso: `PetscIntSortSemiOrdered()`, `PetscSortInt()`
916528b96dSMatthew G. Knepley @*/
9206ad1575SMatthew G. Knepley PetscErrorCode PetscFormKeySort(PetscInt n, PetscFormKey arr[])
936528b96dSMatthew G. Knepley {
946528b96dSMatthew G. Knepley   PetscFunctionBegin;
956528b96dSMatthew G. Knepley   if (n <= 1) PetscFunctionReturn(0);
966528b96dSMatthew G. Knepley   PetscValidPointer(arr, 2);
979566063dSJacob Faibussowitsch   PetscCall(PetscTimSort(n, arr, sizeof(PetscFormKey), Compare_PetscFormKey_Private, NULL));
986528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
996528b96dSMatthew G. Knepley }
1006528b96dSMatthew G. Knepley 
10106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt *n, void (***func)())
1026528b96dSMatthew G. Knepley {
10306ad1575SMatthew G. Knepley   PetscFormKey   key;
1046528b96dSMatthew G. Knepley   PetscChunk     chunk;
1056528b96dSMatthew G. Knepley 
1066528b96dSMatthew G. Knepley   PetscFunctionBegin;
10706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1089566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1096528b96dSMatthew G. Knepley   if (chunk.size < 0) {*n = 0;          *func = NULL;}
1102baeeceeSMatthew G. Knepley   else                {*n = chunk.size; *func = (void (**)()) &wf->funcs->array[chunk.start];}
1116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1126528b96dSMatthew G. Knepley }
1136528b96dSMatthew G. Knepley 
1146528b96dSMatthew G. Knepley /* A NULL argument for func causes this to clear the key */
11506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt n, void (**func)())
1166528b96dSMatthew G. Knepley {
11706ad1575SMatthew G. Knepley   PetscFormKey   key;
1186528b96dSMatthew G. Knepley   PetscChunk     chunk;
1196528b96dSMatthew G. Knepley   PetscInt       i;
1206528b96dSMatthew G. Knepley 
1216528b96dSMatthew G. Knepley   PetscFunctionBegin;
12206ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1236528b96dSMatthew G. Knepley   if (!func) {
1249566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDel(ht, key));
1256528b96dSMatthew G. Knepley     PetscFunctionReturn(0);
1266528b96dSMatthew G. Knepley   } else {
1279566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormGet(ht, key, &chunk));
1286528b96dSMatthew G. Knepley   }
1296528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1309566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, n, &chunk));
1319566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1326528b96dSMatthew G. Knepley   } else if (chunk.size <= n) {
1339566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, n - chunk.size, &chunk));
1349566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1356528b96dSMatthew G. Knepley   }
1362baeeceeSMatthew G. Knepley   for (i = 0; i < n; ++i) ((void (**)()) &wf->funcs->array[chunk.start])[i] = func[i];
1376528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1386528b96dSMatthew G. Knepley }
1396528b96dSMatthew G. Knepley 
14006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, void (*func)())
1416528b96dSMatthew G. Knepley {
14206ad1575SMatthew G. Knepley   PetscFormKey   key;
1436528b96dSMatthew G. Knepley   PetscChunk     chunk;
1446528b96dSMatthew G. Knepley 
1456528b96dSMatthew G. Knepley   PetscFunctionBegin;
1466528b96dSMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
14706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1489566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1496528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1509566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, 1, &chunk));
1519566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1522baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[0] = func;
1536528b96dSMatthew G. Knepley   } else {
1549566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, 1, &chunk));
1559566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1562baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[chunk.size-1] = func;
1576528b96dSMatthew G. Knepley   }
1586528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1596528b96dSMatthew G. Knepley }
1606528b96dSMatthew G. Knepley 
16106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (**func)())
1626528b96dSMatthew G. Knepley {
16306ad1575SMatthew G. Knepley   PetscFormKey key;
1646528b96dSMatthew G. Knepley   PetscChunk       chunk;
1656528b96dSMatthew G. Knepley 
1666528b96dSMatthew G. Knepley   PetscFunctionBegin;
16706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1689566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1696528b96dSMatthew G. Knepley   if (chunk.size < 0) {*func = NULL;}
1706528b96dSMatthew G. Knepley   else {
17163a3b9bcSJacob Faibussowitsch     PetscCheck(ind < chunk.size,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %" PetscInt_FMT " not in [0, %" PetscInt_FMT ")", ind, chunk.size);
1722baeeceeSMatthew G. Knepley     *func = ((void (**)()) &wf->funcs->array[chunk.start])[ind];
1736528b96dSMatthew G. Knepley   }
1746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1756528b96dSMatthew G. Knepley }
1766528b96dSMatthew G. Knepley 
17706ad1575SMatthew G. Knepley /* Ignore a NULL func */
17806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (*func)())
1796528b96dSMatthew G. Knepley {
18006ad1575SMatthew G. Knepley   PetscFormKey key;
1816528b96dSMatthew G. Knepley   PetscChunk       chunk;
1826528b96dSMatthew G. Knepley 
1836528b96dSMatthew G. Knepley   PetscFunctionBegin;
18406ad1575SMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
18506ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1869566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
1876528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1889566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferCreateChunk(wf->funcs, ind+1, &chunk));
1899566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1906528b96dSMatthew G. Knepley   } else if (chunk.size <= ind) {
1919566063dSJacob Faibussowitsch     PetscCall(PetscChunkBufferEnlargeChunk(wf->funcs, ind - chunk.size + 1, &chunk));
1929566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormSet(ht, key, chunk));
1936528b96dSMatthew G. Knepley   }
1942baeeceeSMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = func;
1956528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1966528b96dSMatthew G. Knepley }
1976528b96dSMatthew G. Knepley 
19806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind)
19906ad1575SMatthew G. Knepley {
20006ad1575SMatthew G. Knepley   PetscFormKey key;
20106ad1575SMatthew G. Knepley   PetscChunk       chunk;
20206ad1575SMatthew G. Knepley 
20306ad1575SMatthew G. Knepley   PetscFunctionBegin;
20406ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
2059566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGet(ht, key, &chunk));
20606ad1575SMatthew G. Knepley   if (chunk.size < 0) {
20706ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
20806ad1575SMatthew G. Knepley   } else if (!ind && chunk.size == 1) {
2099566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDel(ht, key));
21006ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21106ad1575SMatthew G. Knepley   } else if (chunk.size <= ind) {
21206ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21306ad1575SMatthew G. Knepley   }
21406ad1575SMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = NULL;
21506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
21606ad1575SMatthew G. Knepley }
21706ad1575SMatthew G. Knepley 
21845480ffeSMatthew G. Knepley /*@
21945480ffeSMatthew G. Knepley   PetscWeakFormCopy - Copy the pointwise functions to another PetscWeakForm
22045480ffeSMatthew G. Knepley 
22145480ffeSMatthew G. Knepley   Not Collective
22245480ffeSMatthew G. Knepley 
22345480ffeSMatthew G. Knepley   Input Parameter:
22445480ffeSMatthew G. Knepley . wf - The original PetscWeakForm
22545480ffeSMatthew G. Knepley 
22645480ffeSMatthew G. Knepley   Output Parameter:
22745480ffeSMatthew G. Knepley . wfNew - The copy PetscWeakForm
22845480ffeSMatthew G. Knepley 
22945480ffeSMatthew G. Knepley   Level: intermediate
23045480ffeSMatthew G. Knepley 
231db781477SPatrick Sanan .seealso: `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
23245480ffeSMatthew G. Knepley @*/
23345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormCopy(PetscWeakForm wf, PetscWeakForm wfNew)
23445480ffeSMatthew G. Knepley {
23506ad1575SMatthew G. Knepley   PetscInt       f;
23645480ffeSMatthew G. Knepley 
23745480ffeSMatthew G. Knepley   PetscFunctionBegin;
23845480ffeSMatthew G. Knepley   wfNew->Nf = wf->Nf;
2399566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDestroy(&wfNew->funcs));
2409566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDuplicate(wf->funcs, &wfNew->funcs));
24106ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
2429566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDestroy(&wfNew->form[f]));
2439566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormDuplicate(wf->form[f], &wfNew->form[f]));
24406ad1575SMatthew G. Knepley   }
24506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
24606ad1575SMatthew G. Knepley }
24706ad1575SMatthew G. Knepley 
24806ad1575SMatthew G. Knepley /*@
24906ad1575SMatthew G. Knepley   PetscWeakFormClear - Clear all functions from the PetscWeakForm
25006ad1575SMatthew G. Knepley 
25106ad1575SMatthew G. Knepley   Not Collective
25206ad1575SMatthew G. Knepley 
25306ad1575SMatthew G. Knepley   Input Parameter:
25406ad1575SMatthew G. Knepley . wf - The original PetscWeakForm
25506ad1575SMatthew G. Knepley 
25606ad1575SMatthew G. Knepley   Level: intermediate
25706ad1575SMatthew G. Knepley 
258db781477SPatrick Sanan .seealso: `PetscWeakFormCopy()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
25906ad1575SMatthew G. Knepley @*/
26006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClear(PetscWeakForm wf)
26106ad1575SMatthew G. Knepley {
26206ad1575SMatthew G. Knepley   PetscInt       f;
26306ad1575SMatthew G. Knepley 
26406ad1575SMatthew G. Knepley   PetscFunctionBegin;
2659566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormClear(wf->form[f]));
26645480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
26745480ffeSMatthew G. Knepley }
26845480ffeSMatthew G. Knepley 
26945480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormRewriteKeys_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label, PetscInt Nv, const PetscInt values[])
27045480ffeSMatthew G. Knepley {
27106ad1575SMatthew G. Knepley   PetscFormKey  *keys;
27245480ffeSMatthew G. Knepley   PetscInt       n, i, v, off = 0;
27345480ffeSMatthew G. Knepley 
27445480ffeSMatthew G. Knepley   PetscFunctionBegin;
2759566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(hmap, &n));
2769566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n, &keys));
2779566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetKeys(hmap, &off, keys));
27845480ffeSMatthew G. Knepley   for (i = 0; i < n; ++i) {
27945480ffeSMatthew G. Knepley     if (keys[i].label == label) {
28045480ffeSMatthew G. Knepley       PetscBool clear = PETSC_TRUE;
28145480ffeSMatthew G. Knepley       void   (**funcs)();
28245480ffeSMatthew G. Knepley       PetscInt  Nf;
28345480ffeSMatthew G. Knepley 
2849566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
28545480ffeSMatthew G. Knepley       for (v = 0; v < Nv; ++v) {
2869566063dSJacob Faibussowitsch         PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, values[v], keys[i].field, keys[i].part, Nf, funcs));
28745480ffeSMatthew G. Knepley         if (values[v] == keys[i].value) clear = PETSC_FALSE;
28845480ffeSMatthew G. Knepley       }
2899566063dSJacob Faibussowitsch       if (clear) PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, 0, NULL));
29045480ffeSMatthew G. Knepley     }
29145480ffeSMatthew G. Knepley   }
2929566063dSJacob Faibussowitsch   PetscCall(PetscFree(keys));
29345480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
29445480ffeSMatthew G. Knepley }
29545480ffeSMatthew G. Knepley 
29645480ffeSMatthew G. Knepley /*@C
29745480ffeSMatthew G. Knepley   PetscWeakFormRewriteKeys - Change any key on the given label to use the new set of label values
29845480ffeSMatthew G. Knepley 
29945480ffeSMatthew G. Knepley   Not Collective
30045480ffeSMatthew G. Knepley 
30145480ffeSMatthew G. Knepley   Input Parameters:
30245480ffeSMatthew G. Knepley + wf     - The original PetscWeakForm
30345480ffeSMatthew G. Knepley . label  - The label to change keys for
30445480ffeSMatthew G. Knepley . Nv     - The number of new label values
30545480ffeSMatthew G. Knepley - values - The set of new values to relabel keys with
30645480ffeSMatthew G. Knepley 
30745480ffeSMatthew G. Knepley   Note: This is used internally when boundary label values are specified from the command line.
30845480ffeSMatthew G. Knepley 
30945480ffeSMatthew G. Knepley   Level: intermediate
31045480ffeSMatthew G. Knepley 
311db781477SPatrick Sanan .seealso: `PetscWeakFormReplaceLabel()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
31245480ffeSMatthew G. Knepley @*/
31345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormRewriteKeys(PetscWeakForm wf, DMLabel label, PetscInt Nv, const PetscInt values[])
31445480ffeSMatthew G. Knepley {
31506ad1575SMatthew G. Knepley   PetscInt       f;
31645480ffeSMatthew G. Knepley 
31745480ffeSMatthew G. Knepley   PetscFunctionBegin;
3189566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscWeakFormRewriteKeys_Internal(wf, wf->form[f], label, Nv, values));
31945480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
32045480ffeSMatthew G. Knepley }
32145480ffeSMatthew G. Knepley 
322d700741fSMatthew G. Knepley static PetscErrorCode PetscWeakFormReplaceLabel_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label)
323d700741fSMatthew G. Knepley {
324d700741fSMatthew G. Knepley   PetscFormKey  *keys;
325d700741fSMatthew G. Knepley   PetscInt       n, i, off = 0, maxFuncs = 0;
326d700741fSMatthew G. Knepley   void       (**tmpf)();
327d700741fSMatthew G. Knepley   const char    *name = NULL;
328d700741fSMatthew G. Knepley 
329d700741fSMatthew G. Knepley   PetscFunctionBegin;
3309566063dSJacob Faibussowitsch   if (label) PetscCall(PetscObjectGetName((PetscObject) label, &name));
3319566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(hmap, &n));
3329566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(n, &keys));
3339566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetKeys(hmap, &off, keys));
334d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
335d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
336d700741fSMatthew G. Knepley     const char *lname = NULL;
337d700741fSMatthew G. Knepley 
338d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3399566063dSJacob Faibussowitsch     if (keys[i].label) PetscCall(PetscObjectGetName((PetscObject) keys[i].label, &lname));
3409566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(name, lname, &match));
341d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
342d700741fSMatthew G. Knepley       void  (**funcs)();
343d700741fSMatthew G. Knepley       PetscInt Nf;
344d700741fSMatthew G. Knepley 
3459566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
346d700741fSMatthew G. Knepley       maxFuncs = PetscMax(maxFuncs, Nf);
347d700741fSMatthew G. Knepley     }
348d700741fSMatthew G. Knepley   }
349d700741fSMatthew G. Knepley   /* Need temp space because chunk buffer can be reallocated in SetFunction() call */
3509566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(maxFuncs, &tmpf));
351d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
352d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
353d700741fSMatthew G. Knepley     const char *lname = NULL;
354d700741fSMatthew G. Knepley 
355d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3569566063dSJacob Faibussowitsch     if (keys[i].label) PetscCall(PetscObjectGetName((PetscObject) keys[i].label, &lname));
3579566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(name, lname, &match));
358d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
359d700741fSMatthew G. Knepley       void  (**funcs)();
360d700741fSMatthew G. Knepley       PetscInt Nf, j;
361d700741fSMatthew G. Knepley 
3629566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
363d700741fSMatthew G. Knepley       for (j = 0; j < Nf; ++j) tmpf[j] = funcs[j];
3649566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, label,         keys[i].value, keys[i].field, keys[i].part,  Nf,  tmpf));
3659566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part,  0,   NULL));
366d700741fSMatthew G. Knepley     }
367d700741fSMatthew G. Knepley   }
3689566063dSJacob Faibussowitsch   PetscCall(PetscFree(tmpf));
3699566063dSJacob Faibussowitsch   PetscCall(PetscFree(keys));
370d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
371d700741fSMatthew G. Knepley }
372d700741fSMatthew G. Knepley 
373d700741fSMatthew G. Knepley /*@C
374d700741fSMatthew G. Knepley   PetscWeakFormReplaceLabel - Change any key on a label of the same name to use the new label
375d700741fSMatthew G. Knepley 
376d700741fSMatthew G. Knepley   Not Collective
377d700741fSMatthew G. Knepley 
378d700741fSMatthew G. Knepley   Input Parameters:
379d700741fSMatthew G. Knepley + wf    - The original PetscWeakForm
380d700741fSMatthew G. Knepley - label - The label to change keys for
381d700741fSMatthew G. Knepley 
382d700741fSMatthew G. Knepley   Note: This is used internally when meshes are modified
383d700741fSMatthew G. Knepley 
384d700741fSMatthew G. Knepley   Level: intermediate
385d700741fSMatthew G. Knepley 
386db781477SPatrick Sanan .seealso: `PetscWeakFormRewriteKeys()`, `PetscWeakFormCreate()`, `PetscWeakFormDestroy()`
387d700741fSMatthew G. Knepley @*/
388d700741fSMatthew G. Knepley PetscErrorCode PetscWeakFormReplaceLabel(PetscWeakForm wf, DMLabel label)
389d700741fSMatthew G. Knepley {
390d700741fSMatthew G. Knepley   PetscInt       f;
391d700741fSMatthew G. Knepley 
392d700741fSMatthew G. Knepley   PetscFunctionBegin;
3939566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscWeakFormReplaceLabel_Internal(wf, wf->form[f], label));
394d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
395d700741fSMatthew G. Knepley }
396d700741fSMatthew G. Knepley 
39706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndex(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscWeakFormKind kind, PetscInt ind)
39806ad1575SMatthew G. Knepley {
39906ad1575SMatthew G. Knepley   PetscFunctionBegin;
4009566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormClearIndexFunction_Private(wf, wf->form[kind], label, val, f, part, ind));
40106ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
40206ad1575SMatthew G. Knepley }
40306ad1575SMatthew G. Knepley 
40406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
4056528b96dSMatthew G. Knepley                                          void (***obj)(PetscInt, PetscInt, PetscInt,
4066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4076528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4086528b96dSMatthew G. Knepley                                                        PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4096528b96dSMatthew G. Knepley {
4106528b96dSMatthew G. Knepley   PetscFunctionBegin;
4119566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (***)(void)) obj));
4126528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4136528b96dSMatthew G. Knepley }
4146528b96dSMatthew G. Knepley 
41506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n,
4166528b96dSMatthew G. Knepley                                          void (**obj)(PetscInt, PetscInt, PetscInt,
4176528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const  PetscScalar[],
4186528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4196528b96dSMatthew G. Knepley                                                       PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4206528b96dSMatthew G. Knepley {
4216528b96dSMatthew G. Knepley   PetscFunctionBegin;
4229566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (**)(void)) obj));
4236528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4246528b96dSMatthew G. Knepley }
4256528b96dSMatthew G. Knepley 
42606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4276528b96dSMatthew G. Knepley                                          void (*obj)(PetscInt, PetscInt, PetscInt,
4286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4296528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4306528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4316528b96dSMatthew G. Knepley {
4326528b96dSMatthew G. Knepley   PetscFunctionBegin;
4339566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, (void (*)(void)) obj));
4346528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4356528b96dSMatthew G. Knepley }
4366528b96dSMatthew G. Knepley 
43706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4386528b96dSMatthew G. Knepley                                               void (**obj)(PetscInt, PetscInt, PetscInt,
4396528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4406528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4416528b96dSMatthew G. Knepley                                                            PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4426528b96dSMatthew G. Knepley {
4436528b96dSMatthew G. Knepley   PetscFunctionBegin;
4449566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (**)(void)) obj));
4456528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4466528b96dSMatthew G. Knepley }
4476528b96dSMatthew G. Knepley 
44806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4496528b96dSMatthew G. Knepley                                               void (*obj)(PetscInt, PetscInt, PetscInt,
4506528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4516528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4526528b96dSMatthew G. Knepley                                                           PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4536528b96dSMatthew G. Knepley {
4546528b96dSMatthew G. Knepley   PetscFunctionBegin;
4559566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (*)(void)) obj));
4566528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4576528b96dSMatthew G. Knepley }
4586528b96dSMatthew G. Knepley 
45906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4606528b96dSMatthew G. Knepley                                         PetscInt *n0,
4616528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
4626528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4636528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4646528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4656528b96dSMatthew G. Knepley                                         PetscInt *n1,
4666528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
4676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4686528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4696528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4706528b96dSMatthew G. Knepley {
4716528b96dSMatthew G. Knepley   PetscFunctionBegin;
4729566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (***)(void)) f0));
4739566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (***)(void)) f1));
4746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4756528b96dSMatthew G. Knepley }
4766528b96dSMatthew G. Knepley 
47706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4786528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
4796528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4806528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4816528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4826528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
4836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4846528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4856528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4866528b96dSMatthew G. Knepley {
4876528b96dSMatthew G. Knepley   PetscFunctionBegin;
4889566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, (void (*)(void)) f0));
4899566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, (void (*)(void)) f1));
4906528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4916528b96dSMatthew G. Knepley }
4926528b96dSMatthew G. Knepley 
49306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4946528b96dSMatthew G. Knepley                                         PetscInt n0,
4956528b96dSMatthew G. Knepley                                         void (**f0)(PetscInt, PetscInt, PetscInt,
4966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4976528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4986528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4996528b96dSMatthew G. Knepley                                         PetscInt n1,
5006528b96dSMatthew G. Knepley                                         void (**f1)(PetscInt, PetscInt, PetscInt,
5016528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5026528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5036528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5046528b96dSMatthew G. Knepley {
5056528b96dSMatthew G. Knepley   PetscFunctionBegin;
5069566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (**)(void)) f0));
5079566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (**)(void)) f1));
5086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5096528b96dSMatthew G. Knepley }
5106528b96dSMatthew G. Knepley 
51106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5126528b96dSMatthew G. Knepley                                         PetscInt i0,
5136528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
5146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5166528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5176528b96dSMatthew G. Knepley                                         PetscInt i1,
5186528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
5196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5216528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5226528b96dSMatthew G. Knepley {
5236528b96dSMatthew G. Knepley   PetscFunctionBegin;
5249566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, i0, (void (*)(void)) f0));
5259566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, i1, (void (*)(void)) f1));
5266528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5276528b96dSMatthew G. Knepley }
5286528b96dSMatthew G. Knepley 
52906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5306528b96dSMatthew G. Knepley                                           PetscInt *n0,
5316528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
5326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5346528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5356528b96dSMatthew G. Knepley                                         PetscInt *n1,
5366528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
5376528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5396528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5406528b96dSMatthew G. Knepley {
5416528b96dSMatthew G. Knepley   PetscFunctionBegin;
5429566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (***)(void)) f0));
5439566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (***)(void)) f1));
5446528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5456528b96dSMatthew G. Knepley }
5466528b96dSMatthew G. Knepley 
54706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5486528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5496528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5506528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5516528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5526528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5536528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5546528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5556528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5566528b96dSMatthew G. Knepley {
5576528b96dSMatthew G. Knepley   PetscFunctionBegin;
5589566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, (void (*)(void)) f0));
5599566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, (void (*)(void)) f1));
5606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5616528b96dSMatthew G. Knepley }
5626528b96dSMatthew G. Knepley 
56306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5646528b96dSMatthew G. Knepley                                           PetscInt n0,
5656528b96dSMatthew G. Knepley                                           void (**f0)(PetscInt, PetscInt, PetscInt,
5666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5686528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5696528b96dSMatthew G. Knepley                                           PetscInt n1,
5706528b96dSMatthew G. Knepley                                           void (**f1)(PetscInt, PetscInt, PetscInt,
5716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5726528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5736528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5746528b96dSMatthew G. Knepley {
5756528b96dSMatthew G. Knepley   PetscFunctionBegin;
5769566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (**)(void)) f0));
5779566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (**)(void)) f1));
5786528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5796528b96dSMatthew G. Knepley }
5806528b96dSMatthew G. Knepley 
58106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5826528b96dSMatthew G. Knepley                                           PetscInt i0,
5836528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5856528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5866528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5876528b96dSMatthew G. Knepley                                           PetscInt i1,
5886528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5906528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5916528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5926528b96dSMatthew G. Knepley {
5936528b96dSMatthew G. Knepley   PetscFunctionBegin;
5949566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, i0, (void (*)(void)) f0));
5959566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, i1, (void (*)(void)) f1));
5966528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5976528b96dSMatthew G. Knepley }
5986528b96dSMatthew G. Knepley 
5996528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobian(PetscWeakForm wf, PetscBool *hasJac)
6006528b96dSMatthew G. Knepley {
6016528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
6026528b96dSMatthew G. Knepley 
6036528b96dSMatthew G. Knepley   PetscFunctionBegin;
6046528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
6056528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
6069566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G0], &n0));
6079566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G1], &n1));
6089566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G2], &n2));
6099566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_G3], &n3));
6106528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
6116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6126528b96dSMatthew G. Knepley }
6136528b96dSMatthew G. Knepley 
61406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6156528b96dSMatthew G. Knepley                                         PetscInt *n0,
6166528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
6176528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6186528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6196528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6206528b96dSMatthew G. Knepley                                         PetscInt *n1,
6216528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
6226528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6236528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6246528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6256528b96dSMatthew G. Knepley                                         PetscInt *n2,
6266528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
6276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6296528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6306528b96dSMatthew G. Knepley                                         PetscInt *n3,
6316528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
6326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6346528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6356528b96dSMatthew G. Knepley {
6366528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6376528b96dSMatthew G. Knepley 
6386528b96dSMatthew G. Knepley   PetscFunctionBegin;
6399566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (***)(void)) g0));
6409566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (***)(void)) g1));
6419566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (***)(void)) g2));
6429566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (***)(void)) g3));
6436528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6446528b96dSMatthew G. Knepley }
6456528b96dSMatthew G. Knepley 
64606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6476528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
6486528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6496528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6506528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6516528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
6526528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6536528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6546528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6556528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
6566528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6576528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6586528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6596528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
6606528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6616528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6626528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6636528b96dSMatthew G. Knepley {
6646528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6656528b96dSMatthew G. Knepley 
6666528b96dSMatthew G. Knepley   PetscFunctionBegin;
6679566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, (void (*)(void)) g0));
6689566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, (void (*)(void)) g1));
6699566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, (void (*)(void)) g2));
6709566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, (void (*)(void)) g3));
6716528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6726528b96dSMatthew G. Knepley }
6736528b96dSMatthew G. Knepley 
67406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6756528b96dSMatthew G. Knepley                                         PetscInt n0,
6766528b96dSMatthew G. Knepley                                         void (**g0)(PetscInt, PetscInt, PetscInt,
6776528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6786528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6796528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6806528b96dSMatthew G. Knepley                                         PetscInt n1,
6816528b96dSMatthew G. Knepley                                         void (**g1)(PetscInt, PetscInt, PetscInt,
6826528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6846528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6856528b96dSMatthew G. Knepley                                         PetscInt n2,
6866528b96dSMatthew G. Knepley                                         void (**g2)(PetscInt, PetscInt, PetscInt,
6876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6906528b96dSMatthew G. Knepley                                         PetscInt n3,
6916528b96dSMatthew G. Knepley                                         void (**g3)(PetscInt, PetscInt, PetscInt,
6926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6936528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6946528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6956528b96dSMatthew G. Knepley {
6966528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6976528b96dSMatthew G. Knepley 
6986528b96dSMatthew G. Knepley   PetscFunctionBegin;
6999566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (**)(void)) g0));
7009566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (**)(void)) g1));
7019566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (**)(void)) g2));
7029566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (**)(void)) g3));
7036528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7046528b96dSMatthew G. Knepley }
7056528b96dSMatthew G. Knepley 
70606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7076528b96dSMatthew G. Knepley                                         PetscInt i0,
7086528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7106528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7116528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7126528b96dSMatthew G. Knepley                                         PetscInt i1,
7136528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7166528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7176528b96dSMatthew G. Knepley                                         PetscInt i2,
7186528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7216528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7226528b96dSMatthew G. Knepley                                         PetscInt i3,
7236528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7246528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7256528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7266528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7276528b96dSMatthew G. Knepley {
7286528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7296528b96dSMatthew G. Knepley 
7306528b96dSMatthew G. Knepley   PetscFunctionBegin;
7319566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, i0, (void (*)(void)) g0));
7329566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, i1, (void (*)(void)) g1));
7339566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, i2, (void (*)(void)) g2));
7349566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, i3, (void (*)(void)) g3));
7356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7366528b96dSMatthew G. Knepley }
7376528b96dSMatthew G. Knepley 
7386528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
7396528b96dSMatthew G. Knepley {
7406528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
7416528b96dSMatthew G. Knepley 
7426528b96dSMatthew G. Knepley   PetscFunctionBegin;
7436528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
7446528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
7459566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP0], &n0));
7469566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP1], &n1));
7479566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP2], &n2));
7489566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GP3], &n3));
7496528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
7506528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7516528b96dSMatthew G. Knepley }
7526528b96dSMatthew G. Knepley 
75306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7546528b96dSMatthew G. Knepley                                                       PetscInt *n0,
7556528b96dSMatthew G. Knepley                                                       void (***g0)(PetscInt, PetscInt, PetscInt,
7566528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7576528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7586528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7596528b96dSMatthew G. Knepley                                                       PetscInt *n1,
7606528b96dSMatthew G. Knepley                                                       void (***g1)(PetscInt, PetscInt, PetscInt,
7616528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7626528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7636528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7646528b96dSMatthew G. Knepley                                                       PetscInt *n2,
7656528b96dSMatthew G. Knepley                                                       void (***g2)(PetscInt, PetscInt, PetscInt,
7666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7676528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7686528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7696528b96dSMatthew G. Knepley                                                       PetscInt *n3,
7706528b96dSMatthew G. Knepley                                                       void (***g3)(PetscInt, PetscInt, PetscInt,
7716528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7726528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7736528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7746528b96dSMatthew G. Knepley {
7756528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7766528b96dSMatthew G. Knepley 
7776528b96dSMatthew G. Knepley   PetscFunctionBegin;
7789566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (***)(void)) g0));
7799566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (***)(void)) g1));
7809566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (***)(void)) g2));
7819566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (***)(void)) g3));
7826528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7836528b96dSMatthew G. Knepley }
7846528b96dSMatthew G. Knepley 
78506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7866528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7906528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7916528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7936528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7946528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7956528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7976528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7986528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7996528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8006528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8016528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8026528b96dSMatthew G. Knepley {
8036528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8046528b96dSMatthew G. Knepley 
8056528b96dSMatthew G. Knepley   PetscFunctionBegin;
8069566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, (void (*)(void)) g0));
8079566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, (void (*)(void)) g1));
8089566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, (void (*)(void)) g2));
8099566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, (void (*)(void)) g3));
8106528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8116528b96dSMatthew G. Knepley }
8126528b96dSMatthew G. Knepley 
81306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8146528b96dSMatthew G. Knepley                                                       PetscInt n0,
8156528b96dSMatthew G. Knepley                                                       void (**g0)(PetscInt, PetscInt, PetscInt,
8166528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8176528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8186528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8196528b96dSMatthew G. Knepley                                                       PetscInt n1,
8206528b96dSMatthew G. Knepley                                                       void (**g1)(PetscInt, PetscInt, PetscInt,
8216528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8226528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8236528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8246528b96dSMatthew G. Knepley                                                       PetscInt n2,
8256528b96dSMatthew G. Knepley                                                       void (**g2)(PetscInt, PetscInt, PetscInt,
8266528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8276528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8286528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8296528b96dSMatthew G. Knepley                                                       PetscInt n3,
8306528b96dSMatthew G. Knepley                                                       void (**g3)(PetscInt, PetscInt, PetscInt,
8316528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8326528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8336528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8346528b96dSMatthew G. Knepley {
8356528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8366528b96dSMatthew G. Knepley 
8376528b96dSMatthew G. Knepley   PetscFunctionBegin;
8389566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (**)(void)) g0));
8399566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (**)(void)) g1));
8409566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (**)(void)) g2));
8419566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (**)(void)) g3));
8426528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8436528b96dSMatthew G. Knepley }
8446528b96dSMatthew G. Knepley 
84506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8466528b96dSMatthew G. Knepley                                                       PetscInt i0,
8476528b96dSMatthew G. Knepley                                                       void (*g0)(PetscInt, PetscInt, PetscInt,
8486528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8496528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8506528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8516528b96dSMatthew G. Knepley                                                       PetscInt i1,
8526528b96dSMatthew G. Knepley                                                       void (*g1)(PetscInt, PetscInt, PetscInt,
8536528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8546528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8556528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8566528b96dSMatthew G. Knepley                                                       PetscInt i2,
8576528b96dSMatthew G. Knepley                                                       void (*g2)(PetscInt, PetscInt, PetscInt,
8586528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8596528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8606528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8616528b96dSMatthew G. Knepley                                                       PetscInt i3,
8626528b96dSMatthew G. Knepley                                                       void (*g3)(PetscInt, PetscInt, PetscInt,
8636528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8646528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8656528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8666528b96dSMatthew G. Knepley {
8676528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8686528b96dSMatthew G. Knepley 
8696528b96dSMatthew G. Knepley   PetscFunctionBegin;
8709566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, i0, (void (*)(void)) g0));
8719566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, i1, (void (*)(void)) g1));
8729566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, i2, (void (*)(void)) g2));
8739566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, i3, (void (*)(void)) g3));
8746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8756528b96dSMatthew G. Knepley }
8766528b96dSMatthew G. Knepley 
8776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobian(PetscWeakForm wf, PetscBool *hasJac)
8786528b96dSMatthew G. Knepley {
8796528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
8806528b96dSMatthew G. Knepley 
8816528b96dSMatthew G. Knepley   PetscFunctionBegin;
8826528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
8836528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
8849566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG0], &n0));
8859566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG1], &n1));
8869566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG2], &n2));
8879566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG3], &n3));
8886528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
8896528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8906528b96dSMatthew G. Knepley }
8916528b96dSMatthew G. Knepley 
89206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8936528b96dSMatthew G. Knepley                                           PetscInt *n0,
8946528b96dSMatthew G. Knepley                                           void (***g0)(PetscInt, PetscInt, PetscInt,
8956528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8966528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8976528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8986528b96dSMatthew G. Knepley                                           PetscInt *n1,
8996528b96dSMatthew G. Knepley                                           void (***g1)(PetscInt, PetscInt, PetscInt,
9006528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9016528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9026528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9036528b96dSMatthew G. Knepley                                           PetscInt *n2,
9046528b96dSMatthew G. Knepley                                           void (***g2)(PetscInt, PetscInt, PetscInt,
9056528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9076528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9086528b96dSMatthew G. Knepley                                           PetscInt *n3,
9096528b96dSMatthew G. Knepley                                           void (***g3)(PetscInt, PetscInt, PetscInt,
9106528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9116528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9126528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9136528b96dSMatthew G. Knepley {
9146528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9156528b96dSMatthew G. Knepley 
9166528b96dSMatthew G. Knepley   PetscFunctionBegin;
9179566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (***)(void)) g0));
9189566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (***)(void)) g1));
9199566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (***)(void)) g2));
9209566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (***)(void)) g3));
9216528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9226528b96dSMatthew G. Knepley }
9236528b96dSMatthew G. Knepley 
92406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9256528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9266528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9286528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9296528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9306528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9316528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9326528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9336528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9346528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9356528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9366528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9376528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
9386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9396528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9406528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9416528b96dSMatthew G. Knepley {
9426528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9436528b96dSMatthew G. Knepley 
9446528b96dSMatthew G. Knepley   PetscFunctionBegin;
9459566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, (void (*)(void)) g0));
9469566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, (void (*)(void)) g1));
9479566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, (void (*)(void)) g2));
9489566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, (void (*)(void)) g3));
9496528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9506528b96dSMatthew G. Knepley }
9516528b96dSMatthew G. Knepley 
95206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9536528b96dSMatthew G. Knepley                                           PetscInt n0,
9546528b96dSMatthew G. Knepley                                           void (**g0)(PetscInt, PetscInt, PetscInt,
9556528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9566528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9576528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9586528b96dSMatthew G. Knepley                                           PetscInt n1,
9596528b96dSMatthew G. Knepley                                           void (**g1)(PetscInt, PetscInt, PetscInt,
9606528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9616528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9626528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9636528b96dSMatthew G. Knepley                                           PetscInt n2,
9646528b96dSMatthew G. Knepley                                           void (**g2)(PetscInt, PetscInt, PetscInt,
9656528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9676528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9686528b96dSMatthew G. Knepley                                           PetscInt n3,
9696528b96dSMatthew G. Knepley                                           void (**g3)(PetscInt, PetscInt, PetscInt,
9706528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9726528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9736528b96dSMatthew G. Knepley {
9746528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9756528b96dSMatthew G. Knepley 
9766528b96dSMatthew G. Knepley   PetscFunctionBegin;
9779566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (**)(void)) g0));
9789566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (**)(void)) g1));
9799566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (**)(void)) g2));
9809566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (**)(void)) g3));
9816528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9826528b96dSMatthew G. Knepley }
9836528b96dSMatthew G. Knepley 
98406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9856528b96dSMatthew G. Knepley                                           PetscInt i0,
9866528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9876528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9896528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9906528b96dSMatthew G. Knepley                                           PetscInt i1,
9916528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9926528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9936528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9946528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9956528b96dSMatthew G. Knepley                                           PetscInt i2,
9966528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9976528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9986528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9996528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10006528b96dSMatthew G. Knepley                                           PetscInt i3,
10016528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
10026528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10036528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10046528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10056528b96dSMatthew G. Knepley {
10066528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10076528b96dSMatthew G. Knepley 
10086528b96dSMatthew G. Knepley   PetscFunctionBegin;
10099566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, i0, (void (*)(void)) g0));
10109566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, i1, (void (*)(void)) g1));
10119566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, i2, (void (*)(void)) g2));
10129566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, i3, (void (*)(void)) g3));
10136528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10146528b96dSMatthew G. Knepley }
10156528b96dSMatthew G. Knepley 
10166528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
10176528b96dSMatthew G. Knepley {
10186528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
10196528b96dSMatthew G. Knepley 
10206528b96dSMatthew G. Knepley   PetscFunctionBegin;
10216528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
10226528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
10239566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP0], &n0));
10249566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP1], &n1));
10259566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP2], &n2));
10269566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP3], &n3));
10276528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
10286528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10296528b96dSMatthew G. Knepley }
10306528b96dSMatthew G. Knepley 
103106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10326528b96dSMatthew G. Knepley                                                         PetscInt *n0,
10336528b96dSMatthew G. Knepley                                                         void (***g0)(PetscInt, PetscInt, PetscInt,
10346528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10356528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10366528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10376528b96dSMatthew G. Knepley                                                         PetscInt *n1,
10386528b96dSMatthew G. Knepley                                                         void (***g1)(PetscInt, PetscInt, PetscInt,
10396528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10406528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10416528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10426528b96dSMatthew G. Knepley                                                         PetscInt *n2,
10436528b96dSMatthew G. Knepley                                                         void (***g2)(PetscInt, PetscInt, PetscInt,
10446528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10456528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10466528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10476528b96dSMatthew G. Knepley                                                         PetscInt *n3,
10486528b96dSMatthew G. Knepley                                                         void (***g3)(PetscInt, PetscInt, PetscInt,
10496528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10506528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10516528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10526528b96dSMatthew G. Knepley {
10536528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10546528b96dSMatthew G. Knepley 
10556528b96dSMatthew G. Knepley   PetscFunctionBegin;
10569566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (***)(void)) g0));
10579566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (***)(void)) g1));
10589566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (***)(void)) g2));
10599566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (***)(void)) g3));
10606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10616528b96dSMatthew G. Knepley }
10626528b96dSMatthew G. Knepley 
106306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10646528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
10656528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10676528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10686528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
10696528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10706528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10716528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10726528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
10736528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10746528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10756528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10766528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
10776528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10786528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10796528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10806528b96dSMatthew G. Knepley {
10816528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10826528b96dSMatthew G. Knepley 
10836528b96dSMatthew G. Knepley   PetscFunctionBegin;
10849566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, (void (*)(void)) g0));
10859566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, (void (*)(void)) g1));
10869566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, (void (*)(void)) g2));
10879566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, (void (*)(void)) g3));
10886528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10896528b96dSMatthew G. Knepley }
10906528b96dSMatthew G. Knepley 
109106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10926528b96dSMatthew G. Knepley                                                         PetscInt n0,
10936528b96dSMatthew G. Knepley                                                         void (**g0)(PetscInt, PetscInt, PetscInt,
10946528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10956528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10966528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10976528b96dSMatthew G. Knepley                                                         PetscInt n1,
10986528b96dSMatthew G. Knepley                                                         void (**g1)(PetscInt, PetscInt, PetscInt,
10996528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11006528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11016528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11026528b96dSMatthew G. Knepley                                                         PetscInt n2,
11036528b96dSMatthew G. Knepley                                                         void (**g2)(PetscInt, PetscInt, PetscInt,
11046528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11056528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11066528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11076528b96dSMatthew G. Knepley                                                         PetscInt n3,
11086528b96dSMatthew G. Knepley                                                         void (**g3)(PetscInt, PetscInt, PetscInt,
11096528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11106528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11116528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11126528b96dSMatthew G. Knepley {
11136528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11146528b96dSMatthew G. Knepley 
11156528b96dSMatthew G. Knepley   PetscFunctionBegin;
11169566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (**)(void)) g0));
11179566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (**)(void)) g1));
11189566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (**)(void)) g2));
11199566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (**)(void)) g3));
11206528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11216528b96dSMatthew G. Knepley }
11226528b96dSMatthew G. Knepley 
112306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11246528b96dSMatthew G. Knepley                                                         PetscInt i0,
11256528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
11266528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11276528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11286528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11296528b96dSMatthew G. Knepley                                                         PetscInt i1,
11306528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
11316528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11326528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11336528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11346528b96dSMatthew G. Knepley                                                         PetscInt i2,
11356528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
11366528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11376528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11386528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11396528b96dSMatthew G. Knepley                                                         PetscInt i3,
11406528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
11416528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11426528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11436528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11446528b96dSMatthew G. Knepley {
11456528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11466528b96dSMatthew G. Knepley 
11476528b96dSMatthew G. Knepley   PetscFunctionBegin;
11489566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, i0, (void (*)(void)) g0));
11499566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, i1, (void (*)(void)) g1));
11509566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, i2, (void (*)(void)) g2));
11519566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, i3, (void (*)(void)) g3));
11526528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11536528b96dSMatthew G. Knepley }
11546528b96dSMatthew G. Knepley 
11556528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasDynamicJacobian(PetscWeakForm wf, PetscBool *hasDynJac)
11566528b96dSMatthew G. Knepley {
11576528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
11586528b96dSMatthew G. Knepley 
11596528b96dSMatthew G. Knepley   PetscFunctionBegin;
11606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
11616528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasDynJac, 2);
11629566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT0], &n0));
11639566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT1], &n1));
11649566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT2], &n2));
11659566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(wf->form[PETSC_WF_GT3], &n3));
11666528b96dSMatthew G. Knepley   *hasDynJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
11676528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11686528b96dSMatthew G. Knepley }
11696528b96dSMatthew G. Knepley 
117006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11716528b96dSMatthew G. Knepley                                         PetscInt *n0,
11726528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
11736528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11746528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11756528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11766528b96dSMatthew G. Knepley                                         PetscInt *n1,
11776528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
11786528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11796528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11806528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11816528b96dSMatthew G. Knepley                                         PetscInt *n2,
11826528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
11836528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11856528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11866528b96dSMatthew G. Knepley                                         PetscInt *n3,
11876528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
11886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11906528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11916528b96dSMatthew G. Knepley {
11926528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11936528b96dSMatthew G. Knepley 
11946528b96dSMatthew G. Knepley   PetscFunctionBegin;
11959566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (***)(void)) g0));
11969566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (***)(void)) g1));
11979566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (***)(void)) g2));
11989566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (***)(void)) g3));
11996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12006528b96dSMatthew G. Knepley }
12016528b96dSMatthew G. Knepley 
120206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12036528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
12046528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12056528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12066528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12076528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
12086528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12106528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12116528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
12126528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12136528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12146528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12156528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
12166528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12176528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12186528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12196528b96dSMatthew G. Knepley {
12206528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12216528b96dSMatthew G. Knepley 
12226528b96dSMatthew G. Knepley   PetscFunctionBegin;
12239566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, (void (*)(void)) g0));
12249566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, (void (*)(void)) g1));
12259566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, (void (*)(void)) g2));
12269566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, (void (*)(void)) g3));
12276528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12286528b96dSMatthew G. Knepley }
12296528b96dSMatthew G. Knepley 
123006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12316528b96dSMatthew G. Knepley                                                PetscInt n0,
12326528b96dSMatthew G. Knepley                                                void (**g0)(PetscInt, PetscInt, PetscInt,
12336528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12346528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12356528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12366528b96dSMatthew G. Knepley                                                PetscInt n1,
12376528b96dSMatthew G. Knepley                                                void (**g1)(PetscInt, PetscInt, PetscInt,
12386528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12396528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12406528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12416528b96dSMatthew G. Knepley                                                PetscInt n2,
12426528b96dSMatthew G. Knepley                                                void (**g2)(PetscInt, PetscInt, PetscInt,
12436528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12446528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12456528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12466528b96dSMatthew G. Knepley                                                PetscInt n3,
12476528b96dSMatthew G. Knepley                                                void (**g3)(PetscInt, PetscInt, PetscInt,
12486528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12496528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12506528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12516528b96dSMatthew G. Knepley {
12526528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12536528b96dSMatthew G. Knepley 
12546528b96dSMatthew G. Knepley   PetscFunctionBegin;
12559566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (**)(void)) g0));
12569566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (**)(void)) g1));
12579566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (**)(void)) g2));
12589566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (**)(void)) g3));
12596528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12606528b96dSMatthew G. Knepley }
12616528b96dSMatthew G. Knepley 
126206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12636528b96dSMatthew G. Knepley                                                PetscInt i0,
12646528b96dSMatthew G. Knepley                                                void (*g0)(PetscInt, PetscInt, PetscInt,
12656528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12666528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12676528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12686528b96dSMatthew G. Knepley                                                PetscInt i1,
12696528b96dSMatthew G. Knepley                                                void (*g1)(PetscInt, PetscInt, PetscInt,
12706528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12716528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12726528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12736528b96dSMatthew G. Knepley                                                PetscInt i2,
12746528b96dSMatthew G. Knepley                                                void (*g2)(PetscInt, PetscInt, PetscInt,
12756528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12766528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12776528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12786528b96dSMatthew G. Knepley                                                PetscInt i3,
12796528b96dSMatthew G. Knepley                                                void (*g3)(PetscInt, PetscInt, PetscInt,
12806528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12816528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12826528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12836528b96dSMatthew G. Knepley {
12846528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12856528b96dSMatthew G. Knepley 
12866528b96dSMatthew G. Knepley   PetscFunctionBegin;
12879566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, i0, (void (*)(void)) g0));
12889566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, i1, (void (*)(void)) g1));
12899566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, i2, (void (*)(void)) g2));
12909566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, i3, (void (*)(void)) g3));
12916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12926528b96dSMatthew G. Knepley }
12936528b96dSMatthew G. Knepley 
129406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
12956528b96dSMatthew G. Knepley                                              void (***r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
12966528b96dSMatthew G. Knepley {
12976528b96dSMatthew G. Knepley   PetscFunctionBegin;
12989566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (***)(void)) r));
12996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13006528b96dSMatthew G. Knepley }
13016528b96dSMatthew G. Knepley 
130206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13036528b96dSMatthew G. Knepley                                              PetscInt n,
13046528b96dSMatthew G. Knepley                                              void (**r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13056528b96dSMatthew G. Knepley {
13066528b96dSMatthew G. Knepley   PetscFunctionBegin;
13079566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (**)(void)) r));
13086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13096528b96dSMatthew G. Knepley }
13106528b96dSMatthew G. Knepley 
131106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13126528b96dSMatthew G. Knepley                                                   PetscInt i,
13136528b96dSMatthew G. Knepley                                                   void (*r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13146528b96dSMatthew G. Knepley {
13156528b96dSMatthew G. Knepley   PetscFunctionBegin;
13169566063dSJacob Faibussowitsch   PetscCall(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, i, (void (*)(void)) r));
13176528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13186528b96dSMatthew G. Knepley }
13196528b96dSMatthew G. Knepley 
13206528b96dSMatthew G. Knepley /*@
13216528b96dSMatthew G. Knepley   PetscWeakFormGetNumFields - Returns the number of fields
13226528b96dSMatthew G. Knepley 
13236528b96dSMatthew G. Knepley   Not collective
13246528b96dSMatthew G. Knepley 
13256528b96dSMatthew G. Knepley   Input Parameter:
13266528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
13276528b96dSMatthew G. Knepley 
13286528b96dSMatthew G. Knepley   Output Parameter:
1329a5b23f4aSJose E. Roman . Nf - The number of fields
13306528b96dSMatthew G. Knepley 
13316528b96dSMatthew G. Knepley   Level: beginner
13326528b96dSMatthew G. Knepley 
1333db781477SPatrick Sanan .seealso: `PetscWeakFormSetNumFields()`, `PetscWeakFormCreate()`
13346528b96dSMatthew G. Knepley @*/
13356528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormGetNumFields(PetscWeakForm wf, PetscInt *Nf)
13366528b96dSMatthew G. Knepley {
13376528b96dSMatthew G. Knepley   PetscFunctionBegin;
13386528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
1339dadcf809SJacob Faibussowitsch   PetscValidIntPointer(Nf, 2);
13406528b96dSMatthew G. Knepley   *Nf = wf->Nf;
13416528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13426528b96dSMatthew G. Knepley }
13436528b96dSMatthew G. Knepley 
13446528b96dSMatthew G. Knepley /*@
13456528b96dSMatthew G. Knepley   PetscWeakFormSetNumFields - Sets the number of fields
13466528b96dSMatthew G. Knepley 
13476528b96dSMatthew G. Knepley   Not collective
13486528b96dSMatthew G. Knepley 
13496528b96dSMatthew G. Knepley   Input Parameters:
13506528b96dSMatthew G. Knepley + wf - The PetscWeakForm object
13516528b96dSMatthew G. Knepley - Nf - The number of fields
13526528b96dSMatthew G. Knepley 
13536528b96dSMatthew G. Knepley   Level: beginner
13546528b96dSMatthew G. Knepley 
1355db781477SPatrick Sanan .seealso: `PetscWeakFormGetNumFields()`, `PetscWeakFormCreate()`
13566528b96dSMatthew G. Knepley @*/
13576528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormSetNumFields(PetscWeakForm wf, PetscInt Nf)
13586528b96dSMatthew G. Knepley {
13596528b96dSMatthew G. Knepley   PetscFunctionBegin;
13606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
13616528b96dSMatthew G. Knepley   wf->Nf = Nf;
13626528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13636528b96dSMatthew G. Knepley }
13646528b96dSMatthew G. Knepley 
13656528b96dSMatthew G. Knepley /*@
13666528b96dSMatthew G. Knepley   PetscWeakFormDestroy - Destroys a PetscWeakForm object
13676528b96dSMatthew G. Knepley 
13686528b96dSMatthew G. Knepley   Collective on wf
13696528b96dSMatthew G. Knepley 
13706528b96dSMatthew G. Knepley   Input Parameter:
13716528b96dSMatthew G. Knepley . wf - the PetscWeakForm object to destroy
13726528b96dSMatthew G. Knepley 
13736528b96dSMatthew G. Knepley   Level: developer
13746528b96dSMatthew G. Knepley 
1375db781477SPatrick Sanan .seealso `PetscWeakFormCreate()`, `PetscWeakFormView()`
13766528b96dSMatthew G. Knepley @*/
13776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormDestroy(PetscWeakForm *wf)
13786528b96dSMatthew G. Knepley {
137906ad1575SMatthew G. Knepley   PetscInt       f;
13806528b96dSMatthew G. Knepley 
13816528b96dSMatthew G. Knepley   PetscFunctionBegin;
13826528b96dSMatthew G. Knepley   if (!*wf) PetscFunctionReturn(0);
13836528b96dSMatthew G. Knepley   PetscValidHeaderSpecific((*wf), PETSCWEAKFORM_CLASSID, 1);
13846528b96dSMatthew G. Knepley 
13856528b96dSMatthew G. Knepley   if (--((PetscObject)(*wf))->refct > 0) {*wf = NULL; PetscFunctionReturn(0);}
13866528b96dSMatthew G. Knepley   ((PetscObject) (*wf))->refct = 0;
13879566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferDestroy(&(*wf)->funcs));
13889566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormDestroy(&(*wf)->form[f]));
13899566063dSJacob Faibussowitsch   PetscCall(PetscFree((*wf)->form));
13909566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(wf));
13916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13926528b96dSMatthew G. Knepley }
13936528b96dSMatthew G. Knepley 
139445480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormViewTable_Ascii(PetscWeakForm wf, PetscViewer viewer, PetscBool splitField, const char tableName[], PetscHMapForm map)
13956528b96dSMatthew G. Knepley {
139645480ffeSMatthew G. Knepley   PetscInt       Nf = wf->Nf, Nk, k;
13976528b96dSMatthew G. Knepley 
13986528b96dSMatthew G. Knepley   PetscFunctionBegin;
13999566063dSJacob Faibussowitsch   PetscCall(PetscHMapFormGetSize(map, &Nk));
14006528b96dSMatthew G. Knepley   if (Nk) {
140106ad1575SMatthew G. Knepley     PetscFormKey *keys;
1402*165f9cc3SJed Brown     void       (**funcs)(void) = NULL;
14035fedec97SMatthew G. Knepley     const char  **names;
14045fedec97SMatthew G. Knepley     PetscInt     *values, *idx1, *idx2, *idx;
14055fedec97SMatthew G. Knepley     PetscBool     showPart = PETSC_FALSE, showPointer = PETSC_FALSE;
14065fedec97SMatthew G. Knepley     PetscInt      off = 0;
14076528b96dSMatthew G. Knepley 
14089566063dSJacob Faibussowitsch     PetscCall(PetscMalloc6(Nk, &keys, Nk, &names, Nk, &values, Nk, &idx1, Nk, &idx2, Nk, &idx));
14099566063dSJacob Faibussowitsch     PetscCall(PetscHMapFormGetKeys(map, &off, keys));
14105fedec97SMatthew G. Knepley     /* Sort keys by label name and value */
14115fedec97SMatthew G. Knepley     {
14125fedec97SMatthew G. Knepley       /* First sort values */
14135fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {values[k] = keys[k].value; idx1[k] = k;}
14149566063dSJacob Faibussowitsch       PetscCall(PetscSortIntWithPermutation(Nk, values, idx1));
14155fedec97SMatthew G. Knepley       /* If the string sort is stable, it will be sorted correctly overall */
14165fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
14179566063dSJacob Faibussowitsch         if (keys[idx1[k]].label) PetscCall(PetscObjectGetName((PetscObject) keys[idx1[k]].label, &names[k]));
14185fedec97SMatthew G. Knepley         else                     {names[k] = "";}
14195fedec97SMatthew G. Knepley         idx2[k] = k;
14205fedec97SMatthew G. Knepley       }
14219566063dSJacob Faibussowitsch       PetscCall(PetscSortStrWithPermutation(Nk, names, idx2));
14225fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
14239566063dSJacob Faibussowitsch         if (keys[k].label) PetscCall(PetscObjectGetName((PetscObject) keys[k].label, &names[k]));
14245fedec97SMatthew G. Knepley         else               {names[k] = "";}
14255fedec97SMatthew G. Knepley         idx[k] = idx1[idx2[k]];
14265fedec97SMatthew G. Knepley       }
14275fedec97SMatthew G. Knepley     }
14289566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", tableName));
14299566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
14306528b96dSMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14310944a4d6SMatthew G. Knepley       if (keys[k].part != 0) showPart = PETSC_TRUE;
14320944a4d6SMatthew G. Knepley     }
14330944a4d6SMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14345fedec97SMatthew G. Knepley       const PetscInt i = idx[k];
14355fedec97SMatthew G. Knepley       PetscInt       n, f;
14365fedec97SMatthew G. Knepley 
14375fedec97SMatthew G. Knepley       if (keys[i].label) {
143863a3b9bcSJacob Faibussowitsch         if (showPointer) PetscCall(PetscViewerASCIIPrintf(viewer, "(%s:%p, %" PetscInt_FMT ") ", names[i], keys[i].label, keys[i].value));
143963a3b9bcSJacob Faibussowitsch         else             PetscCall(PetscViewerASCIIPrintf(viewer, "(%s, %" PetscInt_FMT ") ", names[i], keys[i].value));
144063a3b9bcSJacob Faibussowitsch       }
14419566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIUseTabs(viewer, PETSC_FALSE));
144263a3b9bcSJacob Faibussowitsch       if (splitField) PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ", %" PetscInt_FMT ") ", keys[i].field/Nf, keys[i].field%Nf));
144363a3b9bcSJacob Faibussowitsch       else            PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ") ", keys[i].field));
144463a3b9bcSJacob Faibussowitsch       if (showPart)   PetscCall(PetscViewerASCIIPrintf(viewer, "(%" PetscInt_FMT ") ", keys[i].part));
14459566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormGetFunction_Private(wf, map, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &n, &funcs));
14465fedec97SMatthew G. Knepley       for (f = 0; f < n; ++f) {
1447258ec3d2SMatthew G. Knepley         char  *fname;
14485fedec97SMatthew G. Knepley         size_t len, l;
1449258ec3d2SMatthew G. Knepley 
14509566063dSJacob Faibussowitsch         if (f > 0) PetscCall(PetscViewerASCIIPrintf(viewer, ", "));
14519566063dSJacob Faibussowitsch         PetscCall(PetscDLAddr(funcs[f], &fname));
14525fedec97SMatthew G. Knepley         if (fname) {
14535fedec97SMatthew G. Knepley           /* Eliminate argument types */
14549566063dSJacob Faibussowitsch           PetscCall(PetscStrlen(fname, &len));
14555fedec97SMatthew G. Knepley           for (l = 0; l < len; ++l) if (fname[l] == '(') {fname[l] = '\0'; break;}
14569566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(viewer, "%s", fname));
14575fedec97SMatthew G. Knepley         } else if (showPointer) {
14589566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(viewer, "%p", funcs[f]));
14595fedec97SMatthew G. Knepley         }
14609566063dSJacob Faibussowitsch         PetscCall(PetscFree(fname));
14616528b96dSMatthew G. Knepley       }
14629566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
14639566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIUseTabs(viewer, PETSC_TRUE));
14646528b96dSMatthew G. Knepley     }
14659566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
14669566063dSJacob Faibussowitsch     PetscCall(PetscFree6(keys, names, values, idx1, idx2, idx));
14676528b96dSMatthew G. Knepley   }
14686528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14696528b96dSMatthew G. Knepley }
14706528b96dSMatthew G. Knepley 
14716528b96dSMatthew G. Knepley static PetscErrorCode PetscWeakFormView_Ascii(PetscWeakForm wf, PetscViewer viewer)
14726528b96dSMatthew G. Knepley {
14736528b96dSMatthew G. Knepley   PetscViewerFormat format;
147406ad1575SMatthew G. Knepley   PetscInt          f;
14756528b96dSMatthew G. Knepley 
14766528b96dSMatthew G. Knepley   PetscFunctionBegin;
14779566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
147863a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Weak Form System with %" PetscInt_FMT " fields\n", wf->Nf));
14799566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
148006ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
14819566063dSJacob Faibussowitsch     PetscCall(PetscWeakFormViewTable_Ascii(wf, viewer, PETSC_TRUE, PetscWeakFormKinds[f], wf->form[f]));
148206ad1575SMatthew G. Knepley   }
14839566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
14846528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14856528b96dSMatthew G. Knepley }
14866528b96dSMatthew G. Knepley 
14876528b96dSMatthew G. Knepley /*@C
14886528b96dSMatthew G. Knepley   PetscWeakFormView - Views a PetscWeakForm
14896528b96dSMatthew G. Knepley 
14906528b96dSMatthew G. Knepley   Collective on wf
14916528b96dSMatthew G. Knepley 
1492d8d19677SJose E. Roman   Input Parameters:
14936528b96dSMatthew G. Knepley + wf - the PetscWeakForm object to view
14946528b96dSMatthew G. Knepley - v  - the viewer
14956528b96dSMatthew G. Knepley 
14966528b96dSMatthew G. Knepley   Level: developer
14976528b96dSMatthew G. Knepley 
1498db781477SPatrick Sanan .seealso `PetscWeakFormDestroy()`, `PetscWeakFormCreate()`
14996528b96dSMatthew G. Knepley @*/
15006528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormView(PetscWeakForm wf, PetscViewer v)
15016528b96dSMatthew G. Knepley {
15026528b96dSMatthew G. Knepley   PetscBool      iascii;
15036528b96dSMatthew G. Knepley 
15046528b96dSMatthew G. Knepley   PetscFunctionBegin;
15056528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
15069566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) wf), &v));
15076528b96dSMatthew G. Knepley   else    {PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);}
15089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii));
15099566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscWeakFormView_Ascii(wf, v));
15109566063dSJacob Faibussowitsch   if (wf->ops->view) PetscCall((*wf->ops->view)(wf, v));
15116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15126528b96dSMatthew G. Knepley }
15136528b96dSMatthew G. Knepley 
15146528b96dSMatthew G. Knepley /*@
15156528b96dSMatthew G. Knepley   PetscWeakFormCreate - Creates an empty PetscWeakForm object.
15166528b96dSMatthew G. Knepley 
15176528b96dSMatthew G. Knepley   Collective
15186528b96dSMatthew G. Knepley 
15196528b96dSMatthew G. Knepley   Input Parameter:
15206528b96dSMatthew G. Knepley . comm - The communicator for the PetscWeakForm object
15216528b96dSMatthew G. Knepley 
15226528b96dSMatthew G. Knepley   Output Parameter:
15236528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
15246528b96dSMatthew G. Knepley 
15256528b96dSMatthew G. Knepley   Level: beginner
15266528b96dSMatthew G. Knepley 
1527db781477SPatrick Sanan .seealso: `PetscDS`, `PetscWeakFormDestroy()`
15286528b96dSMatthew G. Knepley @*/
15296528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormCreate(MPI_Comm comm, PetscWeakForm *wf)
15306528b96dSMatthew G. Knepley {
15316528b96dSMatthew G. Knepley   PetscWeakForm  p;
153206ad1575SMatthew G. Knepley   PetscInt       f;
15336528b96dSMatthew G. Knepley 
15346528b96dSMatthew G. Knepley   PetscFunctionBegin;
15356528b96dSMatthew G. Knepley   PetscValidPointer(wf, 2);
15366528b96dSMatthew G. Knepley   *wf  = NULL;
15379566063dSJacob Faibussowitsch   PetscCall(PetscDSInitializePackage());
15386528b96dSMatthew G. Knepley 
15399566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(p, PETSCWEAKFORM_CLASSID, "PetscWeakForm", "Weak Form System", "PetscWeakForm", comm, PetscWeakFormDestroy, PetscWeakFormView));
15406528b96dSMatthew G. Knepley 
15416528b96dSMatthew G. Knepley   p->Nf = 0;
15429566063dSJacob Faibussowitsch   PetscCall(PetscChunkBufferCreate(sizeof(&PetscWeakFormCreate), 2, &p->funcs));
15439566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(PETSC_NUM_WF, &p->form));
15449566063dSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) PetscCall(PetscHMapFormCreate(&p->form[f]));
15456528b96dSMatthew G. Knepley   *wf = p;
15466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15476528b96dSMatthew G. Knepley }
1548