xref: /petsc/src/dm/dt/interface/dtweakform.c (revision dadcf80911fb48939c55327431ae8d7e47dbe367)
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;
105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(buffer));
115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(expected*unitbytes, &(*buffer)->array));
126528b96dSMatthew G. Knepley   (*buffer)->size      = expected;
136528b96dSMatthew G. Knepley   (*buffer)->unitbytes = unitbytes;
146528b96dSMatthew G. Knepley   (*buffer)->alloc     = expected*unitbytes;
156528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
166528b96dSMatthew G. Knepley }
176528b96dSMatthew G. Knepley 
1845480ffeSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDuplicate(PetscChunkBuffer *buffer, PetscChunkBuffer **bufferNew)
1945480ffeSMatthew G. Knepley {
2045480ffeSMatthew G. Knepley   PetscFunctionBegin;
215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNew(bufferNew));
225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(buffer->size*buffer->unitbytes, &(*bufferNew)->array));
235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemcpy((*bufferNew)->array, buffer->array, buffer->size*buffer->unitbytes));
2445480ffeSMatthew G. Knepley   (*bufferNew)->size      = buffer->size;
2545480ffeSMatthew G. Knepley   (*bufferNew)->unitbytes = buffer->unitbytes;
2645480ffeSMatthew G. Knepley   (*bufferNew)->alloc     = buffer->size*buffer->unitbytes;
2745480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
2845480ffeSMatthew G. Knepley }
2945480ffeSMatthew G. Knepley 
306528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferDestroy(PetscChunkBuffer **buffer)
316528b96dSMatthew G. Knepley {
326528b96dSMatthew G. Knepley   PetscFunctionBegin;
335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*buffer)->array));
345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(*buffer));
356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
366528b96dSMatthew G. Knepley }
376528b96dSMatthew G. Knepley 
386528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferCreateChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
396528b96dSMatthew G. Knepley {
406528b96dSMatthew G. Knepley   PetscFunctionBegin;
416528b96dSMatthew G. Knepley   if ((buffer->size + size)*buffer->unitbytes > buffer->alloc) {
426528b96dSMatthew G. Knepley     char *tmp;
436528b96dSMatthew G. Knepley 
446528b96dSMatthew G. Knepley     if (!buffer->alloc) buffer->alloc = (buffer->size + size)*buffer->unitbytes;
456528b96dSMatthew G. Knepley     while ((buffer->size + size)*buffer->unitbytes > buffer->alloc) buffer->alloc *= 2;
465f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc(buffer->alloc, &tmp));
475f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMemcpy(tmp, buffer->array, buffer->size*buffer->unitbytes));
485f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(buffer->array));
496528b96dSMatthew G. Knepley     buffer->array = tmp;
506528b96dSMatthew G. Knepley   }
512baeeceeSMatthew G. Knepley   chunk->start    = buffer->size*buffer->unitbytes;
526528b96dSMatthew G. Knepley   chunk->size     = size;
536528b96dSMatthew G. Knepley   chunk->reserved = size;
546528b96dSMatthew G. Knepley   buffer->size   += size;
556528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
566528b96dSMatthew G. Knepley }
576528b96dSMatthew G. Knepley 
586528b96dSMatthew G. Knepley static PetscErrorCode PetscChunkBufferEnlargeChunk(PetscChunkBuffer *buffer, PetscInt size, PetscChunk *chunk)
596528b96dSMatthew G. Knepley {
606528b96dSMatthew G. Knepley   size_t         siz = size;
616528b96dSMatthew G. Knepley 
626528b96dSMatthew G. Knepley   PetscFunctionBegin;
636528b96dSMatthew G. Knepley   if (chunk->size + size > chunk->reserved) {
646528b96dSMatthew G. Knepley     PetscChunk newchunk;
656528b96dSMatthew G. Knepley     PetscInt   reserved = chunk->size;
666528b96dSMatthew G. Knepley 
676528b96dSMatthew G. Knepley     /* TODO Here if we had a chunk list, we could update them all to reclaim unused space */
686528b96dSMatthew G. Knepley     while (reserved < chunk->size+size) reserved *= 2;
695f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(buffer, (size_t) reserved, &newchunk));
706528b96dSMatthew G. Knepley     newchunk.size = chunk->size+size;
715f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMemcpy(&buffer->array[newchunk.start], &buffer->array[chunk->start], chunk->size * buffer->unitbytes));
726528b96dSMatthew G. Knepley     *chunk = newchunk;
736528b96dSMatthew G. Knepley   } else {
746528b96dSMatthew G. Knepley     chunk->size += siz;
756528b96dSMatthew G. Knepley   }
766528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
776528b96dSMatthew G. Knepley }
786528b96dSMatthew G. Knepley 
796528b96dSMatthew G. Knepley /*@C
8006ad1575SMatthew G. Knepley   PetscFormKeySort - Sorts an array of PetscFormKey in place in increasing order.
816528b96dSMatthew G. Knepley 
826528b96dSMatthew G. Knepley   Not Collective
836528b96dSMatthew G. Knepley 
846528b96dSMatthew G. Knepley   Input Parameters:
856528b96dSMatthew G. Knepley + n - number of values
8606ad1575SMatthew G. Knepley - X - array of PetscFormKey
876528b96dSMatthew G. Knepley 
886528b96dSMatthew G. Knepley   Level: intermediate
896528b96dSMatthew G. Knepley 
906528b96dSMatthew G. Knepley .seealso: PetscIntSortSemiOrdered(), PetscSortInt()
916528b96dSMatthew G. Knepley @*/
9206ad1575SMatthew G. Knepley PetscErrorCode PetscFormKeySort(PetscInt n, PetscFormKey arr[])
936528b96dSMatthew G. Knepley {
946528b96dSMatthew G. Knepley   PetscFunctionBegin;
956528b96dSMatthew G. Knepley   if (n <= 1) PetscFunctionReturn(0);
966528b96dSMatthew G. Knepley   PetscValidPointer(arr, 2);
975f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTimSort(n, arr, sizeof(PetscFormKey), Compare_PetscFormKey_Private, NULL));
986528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
996528b96dSMatthew G. Knepley }
1006528b96dSMatthew G. Knepley 
10106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt *n, void (***func)())
1026528b96dSMatthew G. Knepley {
10306ad1575SMatthew G. Knepley   PetscFormKey   key;
1046528b96dSMatthew G. Knepley   PetscChunk     chunk;
1056528b96dSMatthew G. Knepley 
1066528b96dSMatthew G. Knepley   PetscFunctionBegin;
10706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1096528b96dSMatthew G. Knepley   if (chunk.size < 0) {*n = 0;          *func = NULL;}
1102baeeceeSMatthew G. Knepley   else                {*n = chunk.size; *func = (void (**)()) &wf->funcs->array[chunk.start];}
1116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1126528b96dSMatthew G. Knepley }
1136528b96dSMatthew G. Knepley 
1146528b96dSMatthew G. Knepley /* A NULL argument for func causes this to clear the key */
11506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt n, void (**func)())
1166528b96dSMatthew G. Knepley {
11706ad1575SMatthew G. Knepley   PetscFormKey   key;
1186528b96dSMatthew G. Knepley   PetscChunk     chunk;
1196528b96dSMatthew G. Knepley   PetscInt       i;
1206528b96dSMatthew G. Knepley 
1216528b96dSMatthew G. Knepley   PetscFunctionBegin;
12206ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1236528b96dSMatthew G. Knepley   if (!func) {
1245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDel(ht, key));
1256528b96dSMatthew G. Knepley     PetscFunctionReturn(0);
1266528b96dSMatthew G. Knepley   } else {
1275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1286528b96dSMatthew G. Knepley   }
1296528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, n, &chunk));
1315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1326528b96dSMatthew G. Knepley   } else if (chunk.size <= n) {
1335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, n - chunk.size, &chunk));
1345f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1356528b96dSMatthew G. Knepley   }
1362baeeceeSMatthew G. Knepley   for (i = 0; i < n; ++i) ((void (**)()) &wf->funcs->array[chunk.start])[i] = func[i];
1376528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1386528b96dSMatthew G. Knepley }
1396528b96dSMatthew G. Knepley 
14006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, void (*func)())
1416528b96dSMatthew G. Knepley {
14206ad1575SMatthew G. Knepley   PetscFormKey   key;
1436528b96dSMatthew G. Knepley   PetscChunk     chunk;
1446528b96dSMatthew G. Knepley 
1456528b96dSMatthew G. Knepley   PetscFunctionBegin;
1466528b96dSMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
14706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1496528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1505f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, 1, &chunk));
1515f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1522baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[0] = func;
1536528b96dSMatthew G. Knepley   } else {
1545f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, 1, &chunk));
1555f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1562baeeceeSMatthew G. Knepley     ((void (**)()) &wf->funcs->array[chunk.start])[chunk.size-1] = func;
1576528b96dSMatthew G. Knepley   }
1586528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1596528b96dSMatthew G. Knepley }
1606528b96dSMatthew G. Knepley 
16106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (**func)())
1626528b96dSMatthew G. Knepley {
16306ad1575SMatthew G. Knepley   PetscFormKey key;
1646528b96dSMatthew G. Knepley   PetscChunk       chunk;
1656528b96dSMatthew G. Knepley 
1666528b96dSMatthew G. Knepley   PetscFunctionBegin;
16706ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1696528b96dSMatthew G. Knepley   if (chunk.size < 0) {*func = NULL;}
1706528b96dSMatthew G. Knepley   else {
1712c71b3e2SJacob Faibussowitsch     PetscCheckFalse(ind >= chunk.size,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Index %D not in [0, %D)", ind, chunk.size);
1722baeeceeSMatthew G. Knepley     *func = ((void (**)()) &wf->funcs->array[chunk.start])[ind];
1736528b96dSMatthew G. Knepley   }
1746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1756528b96dSMatthew G. Knepley }
1766528b96dSMatthew G. Knepley 
17706ad1575SMatthew G. Knepley /* Ignore a NULL func */
17806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind, void (*func)())
1796528b96dSMatthew G. Knepley {
18006ad1575SMatthew G. Knepley   PetscFormKey key;
1816528b96dSMatthew G. Knepley   PetscChunk       chunk;
1826528b96dSMatthew G. Knepley 
1836528b96dSMatthew G. Knepley   PetscFunctionBegin;
18406ad1575SMatthew G. Knepley   if (!func) PetscFunctionReturn(0);
18506ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
1865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
1876528b96dSMatthew G. Knepley   if (chunk.size < 0) {
1885f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, ind+1, &chunk));
1895f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1906528b96dSMatthew G. Knepley   } else if (chunk.size <= ind) {
1915f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, ind - chunk.size + 1, &chunk));
1925f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormSet(ht, key, chunk));
1936528b96dSMatthew G. Knepley   }
1942baeeceeSMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = func;
1956528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
1966528b96dSMatthew G. Knepley }
1976528b96dSMatthew G. Knepley 
19806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndexFunction_Private(PetscWeakForm wf, PetscHMapForm ht, DMLabel label, PetscInt value, PetscInt f, PetscInt part, PetscInt ind)
19906ad1575SMatthew G. Knepley {
20006ad1575SMatthew G. Knepley   PetscFormKey key;
20106ad1575SMatthew G. Knepley   PetscChunk       chunk;
20206ad1575SMatthew G. Knepley 
20306ad1575SMatthew G. Knepley   PetscFunctionBegin;
20406ad1575SMatthew G. Knepley   key.label = label; key.value = value; key.field = f; key.part = part;
2055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGet(ht, key, &chunk));
20606ad1575SMatthew G. Knepley   if (chunk.size < 0) {
20706ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
20806ad1575SMatthew G. Knepley   } else if (!ind && chunk.size == 1) {
2095f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDel(ht, key));
21006ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21106ad1575SMatthew G. Knepley   } else if (chunk.size <= ind) {
21206ad1575SMatthew G. Knepley     PetscFunctionReturn(0);
21306ad1575SMatthew G. Knepley   }
21406ad1575SMatthew G. Knepley   ((void (**)()) &wf->funcs->array[chunk.start])[ind] = NULL;
21506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
21606ad1575SMatthew G. Knepley }
21706ad1575SMatthew G. Knepley 
21845480ffeSMatthew G. Knepley /*@
21945480ffeSMatthew G. Knepley   PetscWeakFormCopy - Copy the pointwise functions to another PetscWeakForm
22045480ffeSMatthew G. Knepley 
22145480ffeSMatthew G. Knepley   Not Collective
22245480ffeSMatthew G. Knepley 
22345480ffeSMatthew G. Knepley   Input Parameter:
22445480ffeSMatthew G. Knepley . wf - The original PetscWeakForm
22545480ffeSMatthew G. Knepley 
22645480ffeSMatthew G. Knepley   Output Parameter:
22745480ffeSMatthew G. Knepley . wfNew - The copy PetscWeakForm
22845480ffeSMatthew G. Knepley 
22945480ffeSMatthew G. Knepley   Level: intermediate
23045480ffeSMatthew G. Knepley 
23145480ffeSMatthew G. Knepley .seealso: PetscWeakFormCreate(), PetscWeakFormDestroy()
23245480ffeSMatthew G. Knepley @*/
23345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormCopy(PetscWeakForm wf, PetscWeakForm wfNew)
23445480ffeSMatthew G. Knepley {
23506ad1575SMatthew G. Knepley   PetscInt       f;
23645480ffeSMatthew G. Knepley 
23745480ffeSMatthew G. Knepley   PetscFunctionBegin;
23845480ffeSMatthew G. Knepley   wfNew->Nf = wf->Nf;
2395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDestroy(&wfNew->funcs));
2405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDuplicate(wf->funcs, &wfNew->funcs));
24106ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
2425f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDestroy(&wfNew->form[f]));
2435f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormDuplicate(wf->form[f], &wfNew->form[f]));
24406ad1575SMatthew G. Knepley   }
24506ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
24606ad1575SMatthew G. Knepley }
24706ad1575SMatthew G. Knepley 
24806ad1575SMatthew G. Knepley /*@
24906ad1575SMatthew G. Knepley   PetscWeakFormClear - Clear all functions from the PetscWeakForm
25006ad1575SMatthew G. Knepley 
25106ad1575SMatthew G. Knepley   Not Collective
25206ad1575SMatthew G. Knepley 
25306ad1575SMatthew G. Knepley   Input Parameter:
25406ad1575SMatthew G. Knepley . wf - The original PetscWeakForm
25506ad1575SMatthew G. Knepley 
25606ad1575SMatthew G. Knepley   Level: intermediate
25706ad1575SMatthew G. Knepley 
25806ad1575SMatthew G. Knepley .seealso: PetscWeakFormCopy(), PetscWeakFormCreate(), PetscWeakFormDestroy()
25906ad1575SMatthew G. Knepley @*/
26006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClear(PetscWeakForm wf)
26106ad1575SMatthew G. Knepley {
26206ad1575SMatthew G. Knepley   PetscInt       f;
26306ad1575SMatthew G. Knepley 
26406ad1575SMatthew G. Knepley   PetscFunctionBegin;
2655f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormClear(wf->form[f]));
26645480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
26745480ffeSMatthew G. Knepley }
26845480ffeSMatthew G. Knepley 
26945480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormRewriteKeys_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label, PetscInt Nv, const PetscInt values[])
27045480ffeSMatthew G. Knepley {
27106ad1575SMatthew G. Knepley   PetscFormKey  *keys;
27245480ffeSMatthew G. Knepley   PetscInt       n, i, v, off = 0;
27345480ffeSMatthew G. Knepley 
27445480ffeSMatthew G. Knepley   PetscFunctionBegin;
2755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(hmap, &n));
2765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(n, &keys));
2775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetKeys(hmap, &off, keys));
27845480ffeSMatthew G. Knepley   for (i = 0; i < n; ++i) {
27945480ffeSMatthew G. Knepley     if (keys[i].label == label) {
28045480ffeSMatthew G. Knepley       PetscBool clear = PETSC_TRUE;
28145480ffeSMatthew G. Knepley       void   (**funcs)();
28245480ffeSMatthew G. Knepley       PetscInt  Nf;
28345480ffeSMatthew G. Knepley 
2845f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
28545480ffeSMatthew G. Knepley       for (v = 0; v < Nv; ++v) {
2865f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, values[v], keys[i].field, keys[i].part, Nf, funcs));
28745480ffeSMatthew G. Knepley         if (values[v] == keys[i].value) clear = PETSC_FALSE;
28845480ffeSMatthew G. Knepley       }
2895f80ce2aSJacob Faibussowitsch       if (clear) CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, 0, NULL));
29045480ffeSMatthew G. Knepley     }
29145480ffeSMatthew G. Knepley   }
2925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(keys));
29345480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
29445480ffeSMatthew G. Knepley }
29545480ffeSMatthew G. Knepley 
29645480ffeSMatthew G. Knepley /*@C
29745480ffeSMatthew G. Knepley   PetscWeakFormRewriteKeys - Change any key on the given label to use the new set of label values
29845480ffeSMatthew G. Knepley 
29945480ffeSMatthew G. Knepley   Not Collective
30045480ffeSMatthew G. Knepley 
30145480ffeSMatthew G. Knepley   Input Parameters:
30245480ffeSMatthew G. Knepley + wf     - The original PetscWeakForm
30345480ffeSMatthew G. Knepley . label  - The label to change keys for
30445480ffeSMatthew G. Knepley . Nv     - The number of new label values
30545480ffeSMatthew G. Knepley - values - The set of new values to relabel keys with
30645480ffeSMatthew G. Knepley 
30745480ffeSMatthew G. Knepley   Note: This is used internally when boundary label values are specified from the command line.
30845480ffeSMatthew G. Knepley 
30945480ffeSMatthew G. Knepley   Level: intermediate
31045480ffeSMatthew G. Knepley 
311d700741fSMatthew G. Knepley .seealso: PetscWeakFormReplaceLabel(), PetscWeakFormCreate(), PetscWeakFormDestroy()
31245480ffeSMatthew G. Knepley @*/
31345480ffeSMatthew G. Knepley PetscErrorCode PetscWeakFormRewriteKeys(PetscWeakForm wf, DMLabel label, PetscInt Nv, const PetscInt values[])
31445480ffeSMatthew G. Knepley {
31506ad1575SMatthew G. Knepley   PetscInt       f;
31645480ffeSMatthew G. Knepley 
31745480ffeSMatthew G. Knepley   PetscFunctionBegin;
3185f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscWeakFormRewriteKeys_Internal(wf, wf->form[f], label, Nv, values));
31945480ffeSMatthew G. Knepley   PetscFunctionReturn(0);
32045480ffeSMatthew G. Knepley }
32145480ffeSMatthew G. Knepley 
322d700741fSMatthew G. Knepley static PetscErrorCode PetscWeakFormReplaceLabel_Internal(PetscWeakForm wf, PetscHMapForm hmap, DMLabel label)
323d700741fSMatthew G. Knepley {
324d700741fSMatthew G. Knepley   PetscFormKey  *keys;
325d700741fSMatthew G. Knepley   PetscInt       n, i, off = 0, maxFuncs = 0;
326d700741fSMatthew G. Knepley   void       (**tmpf)();
327d700741fSMatthew G. Knepley   const char    *name = NULL;
328d700741fSMatthew G. Knepley 
329d700741fSMatthew G. Knepley   PetscFunctionBegin;
3305f80ce2aSJacob Faibussowitsch   if (label) CHKERRQ(PetscObjectGetName((PetscObject) label, &name));
3315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(hmap, &n));
3325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(n, &keys));
3335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetKeys(hmap, &off, keys));
334d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
335d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
336d700741fSMatthew G. Knepley     const char *lname = NULL;
337d700741fSMatthew G. Knepley 
338d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3395f80ce2aSJacob Faibussowitsch     if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname));
3405f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(name, lname, &match));
341d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
342d700741fSMatthew G. Knepley       void  (**funcs)();
343d700741fSMatthew G. Knepley       PetscInt Nf;
344d700741fSMatthew G. Knepley 
3455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
346d700741fSMatthew G. Knepley       maxFuncs = PetscMax(maxFuncs, Nf);
347d700741fSMatthew G. Knepley     }
348d700741fSMatthew G. Knepley   }
349d700741fSMatthew G. Knepley   /* Need temp space because chunk buffer can be reallocated in SetFunction() call */
3505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(maxFuncs, &tmpf));
351d700741fSMatthew G. Knepley   for (i = 0; i < n; ++i) {
352d700741fSMatthew G. Knepley     PetscBool   match = PETSC_FALSE;
353d700741fSMatthew G. Knepley     const char *lname = NULL;
354d700741fSMatthew G. Knepley 
355d700741fSMatthew G. Knepley     if (label == keys[i].label) continue;
3565f80ce2aSJacob Faibussowitsch     if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname));
3575f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(name, lname, &match));
358d700741fSMatthew G. Knepley     if ((!name && !lname) || match) {
359d700741fSMatthew G. Knepley       void  (**funcs)();
360d700741fSMatthew G. Knepley       PetscInt Nf, j;
361d700741fSMatthew G. Knepley 
3625f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &Nf, &funcs));
363d700741fSMatthew G. Knepley       for (j = 0; j < Nf; ++j) tmpf[j] = funcs[j];
3645f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, label,         keys[i].value, keys[i].field, keys[i].part,  Nf,  tmpf));
3655f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, keys[i].label, keys[i].value, keys[i].field, keys[i].part,  0,   NULL));
366d700741fSMatthew G. Knepley     }
367d700741fSMatthew G. Knepley   }
3685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tmpf));
3695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(keys));
370d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
371d700741fSMatthew G. Knepley }
372d700741fSMatthew G. Knepley 
373d700741fSMatthew G. Knepley /*@C
374d700741fSMatthew G. Knepley   PetscWeakFormReplaceLabel - Change any key on a label of the same name to use the new label
375d700741fSMatthew G. Knepley 
376d700741fSMatthew G. Knepley   Not Collective
377d700741fSMatthew G. Knepley 
378d700741fSMatthew G. Knepley   Input Parameters:
379d700741fSMatthew G. Knepley + wf    - The original PetscWeakForm
380d700741fSMatthew G. Knepley - label - The label to change keys for
381d700741fSMatthew G. Knepley 
382d700741fSMatthew G. Knepley   Note: This is used internally when meshes are modified
383d700741fSMatthew G. Knepley 
384d700741fSMatthew G. Knepley   Level: intermediate
385d700741fSMatthew G. Knepley 
386d700741fSMatthew G. Knepley .seealso: PetscWeakFormRewriteKeys(), PetscWeakFormCreate(), PetscWeakFormDestroy()
387d700741fSMatthew G. Knepley @*/
388d700741fSMatthew G. Knepley PetscErrorCode PetscWeakFormReplaceLabel(PetscWeakForm wf, DMLabel label)
389d700741fSMatthew G. Knepley {
390d700741fSMatthew G. Knepley   PetscInt       f;
391d700741fSMatthew G. Knepley 
392d700741fSMatthew G. Knepley   PetscFunctionBegin;
3935f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscWeakFormReplaceLabel_Internal(wf, wf->form[f], label));
394d700741fSMatthew G. Knepley   PetscFunctionReturn(0);
395d700741fSMatthew G. Knepley }
396d700741fSMatthew G. Knepley 
39706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormClearIndex(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscWeakFormKind kind, PetscInt ind)
39806ad1575SMatthew G. Knepley {
39906ad1575SMatthew G. Knepley   PetscFunctionBegin;
4005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormClearIndexFunction_Private(wf, wf->form[kind], label, val, f, part, ind));
40106ad1575SMatthew G. Knepley   PetscFunctionReturn(0);
40206ad1575SMatthew G. Knepley }
40306ad1575SMatthew G. Knepley 
40406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
4056528b96dSMatthew G. Knepley                                          void (***obj)(PetscInt, PetscInt, PetscInt,
4066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4076528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4086528b96dSMatthew G. Knepley                                                        PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4096528b96dSMatthew G. Knepley {
4106528b96dSMatthew G. Knepley   PetscFunctionBegin;
4115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (***)(void)) obj));
4126528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4136528b96dSMatthew G. Knepley }
4146528b96dSMatthew G. Knepley 
41506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt n,
4166528b96dSMatthew G. Knepley                                          void (**obj)(PetscInt, PetscInt, PetscInt,
4176528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const  PetscScalar[],
4186528b96dSMatthew G. Knepley                                                       const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4196528b96dSMatthew G. Knepley                                                       PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4206528b96dSMatthew G. Knepley {
4216528b96dSMatthew G. Knepley   PetscFunctionBegin;
4225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, n, (void (**)(void)) obj));
4236528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4246528b96dSMatthew G. Knepley }
4256528b96dSMatthew G. Knepley 
42606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4276528b96dSMatthew G. Knepley                                          void (*obj)(PetscInt, PetscInt, PetscInt,
4286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4296528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4306528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4316528b96dSMatthew G. Knepley {
4326528b96dSMatthew G. Knepley   PetscFunctionBegin;
4335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, (void (*)(void)) obj));
4346528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4356528b96dSMatthew G. Knepley }
4366528b96dSMatthew G. Knepley 
43706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4386528b96dSMatthew G. Knepley                                               void (**obj)(PetscInt, PetscInt, PetscInt,
4396528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4406528b96dSMatthew G. Knepley                                                            const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4416528b96dSMatthew G. Knepley                                                            PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4426528b96dSMatthew G. Knepley {
4436528b96dSMatthew G. Knepley   PetscFunctionBegin;
4445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (**)(void)) obj));
4456528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4466528b96dSMatthew G. Knepley }
4476528b96dSMatthew G. Knepley 
44806ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexObjective(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt ind,
4496528b96dSMatthew G. Knepley                                               void (*obj)(PetscInt, PetscInt, PetscInt,
4506528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4516528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4526528b96dSMatthew G. Knepley                                                           PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4536528b96dSMatthew G. Knepley {
4546528b96dSMatthew G. Knepley   PetscFunctionBegin;
4555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_OBJECTIVE], label, val, f, part, ind, (void (*)(void)) obj));
4566528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4576528b96dSMatthew G. Knepley }
4586528b96dSMatthew G. Knepley 
45906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4606528b96dSMatthew G. Knepley                                         PetscInt *n0,
4616528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
4626528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4636528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4646528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4656528b96dSMatthew G. Knepley                                         PetscInt *n1,
4666528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
4676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4686528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4696528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4706528b96dSMatthew G. Knepley {
4716528b96dSMatthew G. Knepley   PetscFunctionBegin;
4725f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (***)(void)) f0));
4735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (***)(void)) f1));
4746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4756528b96dSMatthew G. Knepley }
4766528b96dSMatthew G. Knepley 
47706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4786528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
4796528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4806528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4816528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4826528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
4836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4846528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4856528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
4866528b96dSMatthew G. Knepley {
4876528b96dSMatthew G. Knepley   PetscFunctionBegin;
4885f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, (void (*)(void)) f0));
4895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, (void (*)(void)) f1));
4906528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
4916528b96dSMatthew G. Knepley }
4926528b96dSMatthew G. Knepley 
49306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
4946528b96dSMatthew G. Knepley                                         PetscInt n0,
4956528b96dSMatthew G. Knepley                                         void (**f0)(PetscInt, PetscInt, PetscInt,
4966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4976528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
4986528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
4996528b96dSMatthew G. Knepley                                         PetscInt n1,
5006528b96dSMatthew G. Knepley                                         void (**f1)(PetscInt, PetscInt, PetscInt,
5016528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5026528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5036528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5046528b96dSMatthew G. Knepley {
5056528b96dSMatthew G. Knepley   PetscFunctionBegin;
5065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (**)(void)) f0));
5075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, n1, (void (**)(void)) f1));
5086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5096528b96dSMatthew G. Knepley }
5106528b96dSMatthew G. Knepley 
51106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5126528b96dSMatthew G. Knepley                                         PetscInt i0,
5136528b96dSMatthew G. Knepley                                         void (*f0)(PetscInt, PetscInt, PetscInt,
5146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5166528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5176528b96dSMatthew G. Knepley                                         PetscInt i1,
5186528b96dSMatthew G. Knepley                                         void (*f1)(PetscInt, PetscInt, PetscInt,
5196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5216528b96dSMatthew G. Knepley                                                    PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5226528b96dSMatthew G. Knepley {
5236528b96dSMatthew G. Knepley   PetscFunctionBegin;
5245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, i0, (void (*)(void)) f0));
5255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F1], label, val, f, part, i1, (void (*)(void)) f1));
5266528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5276528b96dSMatthew G. Knepley }
5286528b96dSMatthew G. Knepley 
52906ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5306528b96dSMatthew G. Knepley                                           PetscInt *n0,
5316528b96dSMatthew G. Knepley                                         void (***f0)(PetscInt, PetscInt, PetscInt,
5326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5346528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5356528b96dSMatthew G. Knepley                                         PetscInt *n1,
5366528b96dSMatthew G. Knepley                                         void (***f1)(PetscInt, PetscInt, PetscInt,
5376528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5396528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5406528b96dSMatthew G. Knepley {
5416528b96dSMatthew G. Knepley   PetscFunctionBegin;
5425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (***)(void)) f0));
5435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (***)(void)) f1));
5446528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5456528b96dSMatthew G. Knepley }
5466528b96dSMatthew G. Knepley 
54706ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5486528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5496528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5506528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5516528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5526528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5536528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5546528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5556528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5566528b96dSMatthew G. Knepley {
5576528b96dSMatthew G. Knepley   PetscFunctionBegin;
5585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, (void (*)(void)) f0));
5595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, (void (*)(void)) f1));
5606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5616528b96dSMatthew G. Knepley }
5626528b96dSMatthew G. Knepley 
56306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5646528b96dSMatthew G. Knepley                                           PetscInt n0,
5656528b96dSMatthew G. Knepley                                           void (**f0)(PetscInt, PetscInt, PetscInt,
5666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5676528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5686528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5696528b96dSMatthew G. Knepley                                           PetscInt n1,
5706528b96dSMatthew G. Knepley                                           void (**f1)(PetscInt, PetscInt, PetscInt,
5716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5726528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5736528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5746528b96dSMatthew G. Knepley {
5756528b96dSMatthew G. Knepley   PetscFunctionBegin;
5765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (**)(void)) f0));
5775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, n1, (void (**)(void)) f1));
5786528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5796528b96dSMatthew G. Knepley }
5806528b96dSMatthew G. Knepley 
58106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdResidual(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
5826528b96dSMatthew G. Knepley                                           PetscInt i0,
5836528b96dSMatthew G. Knepley                                           void (*f0)(PetscInt, PetscInt, PetscInt,
5846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5856528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5866528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
5876528b96dSMatthew G. Knepley                                           PetscInt i1,
5886528b96dSMatthew G. Knepley                                           void (*f1)(PetscInt, PetscInt, PetscInt,
5896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5906528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
5916528b96dSMatthew G. Knepley                                                      PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
5926528b96dSMatthew G. Knepley {
5936528b96dSMatthew G. Knepley   PetscFunctionBegin;
5945f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, i0, (void (*)(void)) f0));
5955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF1], label, val, f, part, i1, (void (*)(void)) f1));
5966528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
5976528b96dSMatthew G. Knepley }
5986528b96dSMatthew G. Knepley 
5996528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobian(PetscWeakForm wf, PetscBool *hasJac)
6006528b96dSMatthew G. Knepley {
6016528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
6026528b96dSMatthew G. Knepley 
6036528b96dSMatthew G. Knepley   PetscFunctionBegin;
6046528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
6056528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
6065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G0], &n0));
6075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G1], &n1));
6085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G2], &n2));
6095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G3], &n3));
6106528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
6116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6126528b96dSMatthew G. Knepley }
6136528b96dSMatthew G. Knepley 
61406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6156528b96dSMatthew G. Knepley                                         PetscInt *n0,
6166528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
6176528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6186528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6196528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6206528b96dSMatthew G. Knepley                                         PetscInt *n1,
6216528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
6226528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6236528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6246528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6256528b96dSMatthew G. Knepley                                         PetscInt *n2,
6266528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
6276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6286528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6296528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6306528b96dSMatthew G. Knepley                                         PetscInt *n3,
6316528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
6326528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6336528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6346528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6356528b96dSMatthew G. Knepley {
6366528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6376528b96dSMatthew G. Knepley 
6386528b96dSMatthew G. Knepley   PetscFunctionBegin;
6395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (***)(void)) g0));
6405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (***)(void)) g1));
6415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (***)(void)) g2));
6425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (***)(void)) g3));
6436528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6446528b96dSMatthew G. Knepley }
6456528b96dSMatthew G. Knepley 
64606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6476528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
6486528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6496528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6506528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6516528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
6526528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6536528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6546528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6556528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
6566528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6576528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6586528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6596528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
6606528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6616528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6626528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6636528b96dSMatthew G. Knepley {
6646528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6656528b96dSMatthew G. Knepley 
6666528b96dSMatthew G. Knepley   PetscFunctionBegin;
6675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, (void (*)(void)) g0));
6685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, (void (*)(void)) g1));
6695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, (void (*)(void)) g2));
6705f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, (void (*)(void)) g3));
6716528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
6726528b96dSMatthew G. Knepley }
6736528b96dSMatthew G. Knepley 
67406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
6756528b96dSMatthew G. Knepley                                         PetscInt n0,
6766528b96dSMatthew G. Knepley                                         void (**g0)(PetscInt, PetscInt, PetscInt,
6776528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6786528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6796528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6806528b96dSMatthew G. Knepley                                         PetscInt n1,
6816528b96dSMatthew G. Knepley                                         void (**g1)(PetscInt, PetscInt, PetscInt,
6826528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6836528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6846528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6856528b96dSMatthew G. Knepley                                         PetscInt n2,
6866528b96dSMatthew G. Knepley                                         void (**g2)(PetscInt, PetscInt, PetscInt,
6876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
6906528b96dSMatthew G. Knepley                                         PetscInt n3,
6916528b96dSMatthew G. Knepley                                         void (**g3)(PetscInt, PetscInt, PetscInt,
6926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6936528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
6946528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
6956528b96dSMatthew G. Knepley {
6966528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
6976528b96dSMatthew G. Knepley 
6986528b96dSMatthew G. Knepley   PetscFunctionBegin;
6995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (**)(void)) g0));
7005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (**)(void)) g1));
7015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (**)(void)) g2));
7025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, n3, (void (**)(void)) g3));
7036528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7046528b96dSMatthew G. Knepley }
7056528b96dSMatthew G. Knepley 
70606ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7076528b96dSMatthew G. Knepley                                         PetscInt i0,
7086528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7106528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7116528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7126528b96dSMatthew G. Knepley                                         PetscInt i1,
7136528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7146528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7156528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7166528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7176528b96dSMatthew G. Knepley                                         PetscInt i2,
7186528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7196528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7206528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7216528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7226528b96dSMatthew G. Knepley                                         PetscInt i3,
7236528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7246528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7256528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7266528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7276528b96dSMatthew G. Knepley {
7286528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7296528b96dSMatthew G. Knepley 
7306528b96dSMatthew G. Knepley   PetscFunctionBegin;
7315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, i0, (void (*)(void)) g0));
7325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, i1, (void (*)(void)) g1));
7335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, i2, (void (*)(void)) g2));
7345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G3], label, val, find, part, i3, (void (*)(void)) g3));
7356528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7366528b96dSMatthew G. Knepley }
7376528b96dSMatthew G. Knepley 
7386528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
7396528b96dSMatthew G. Knepley {
7406528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
7416528b96dSMatthew G. Knepley 
7426528b96dSMatthew G. Knepley   PetscFunctionBegin;
7436528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
7446528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
7455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP0], &n0));
7465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP1], &n1));
7475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP2], &n2));
7485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP3], &n3));
7496528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
7506528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7516528b96dSMatthew G. Knepley }
7526528b96dSMatthew G. Knepley 
75306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7546528b96dSMatthew G. Knepley                                                       PetscInt *n0,
7556528b96dSMatthew G. Knepley                                                       void (***g0)(PetscInt, PetscInt, PetscInt,
7566528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7576528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7586528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7596528b96dSMatthew G. Knepley                                                       PetscInt *n1,
7606528b96dSMatthew G. Knepley                                                       void (***g1)(PetscInt, PetscInt, PetscInt,
7616528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7626528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7636528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7646528b96dSMatthew G. Knepley                                                       PetscInt *n2,
7656528b96dSMatthew G. Knepley                                                       void (***g2)(PetscInt, PetscInt, PetscInt,
7666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7676528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7686528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7696528b96dSMatthew G. Knepley                                                       PetscInt *n3,
7706528b96dSMatthew G. Knepley                                                       void (***g3)(PetscInt, PetscInt, PetscInt,
7716528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7726528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7736528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
7746528b96dSMatthew G. Knepley {
7756528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
7766528b96dSMatthew G. Knepley 
7776528b96dSMatthew G. Knepley   PetscFunctionBegin;
7785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (***)(void)) g0));
7795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (***)(void)) g1));
7805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (***)(void)) g2));
7815f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (***)(void)) g3));
7826528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
7836528b96dSMatthew G. Knepley }
7846528b96dSMatthew G. Knepley 
78506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
7866528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
7876528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7886528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7896528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7906528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
7916528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7926528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7936528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7946528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
7956528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7966528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
7976528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
7986528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
7996528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8006528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8016528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8026528b96dSMatthew G. Knepley {
8036528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8046528b96dSMatthew G. Knepley 
8056528b96dSMatthew G. Knepley   PetscFunctionBegin;
8065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, (void (*)(void)) g0));
8075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, (void (*)(void)) g1));
8085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, (void (*)(void)) g2));
8095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, (void (*)(void)) g3));
8106528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8116528b96dSMatthew G. Knepley }
8126528b96dSMatthew G. Knepley 
81306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8146528b96dSMatthew G. Knepley                                                       PetscInt n0,
8156528b96dSMatthew G. Knepley                                                       void (**g0)(PetscInt, PetscInt, PetscInt,
8166528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8176528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8186528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8196528b96dSMatthew G. Knepley                                                       PetscInt n1,
8206528b96dSMatthew G. Knepley                                                       void (**g1)(PetscInt, PetscInt, PetscInt,
8216528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8226528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8236528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8246528b96dSMatthew G. Knepley                                                       PetscInt n2,
8256528b96dSMatthew G. Knepley                                                       void (**g2)(PetscInt, PetscInt, PetscInt,
8266528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8276528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8286528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8296528b96dSMatthew G. Knepley                                                       PetscInt n3,
8306528b96dSMatthew G. Knepley                                                       void (**g3)(PetscInt, PetscInt, PetscInt,
8316528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8326528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8336528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8346528b96dSMatthew G. Knepley {
8356528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8366528b96dSMatthew G. Knepley 
8376528b96dSMatthew G. Knepley   PetscFunctionBegin;
8385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (**)(void)) g0));
8395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (**)(void)) g1));
8405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (**)(void)) g2));
8415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, n3, (void (**)(void)) g3));
8426528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8436528b96dSMatthew G. Knepley }
8446528b96dSMatthew G. Knepley 
84506ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8466528b96dSMatthew G. Knepley                                                       PetscInt i0,
8476528b96dSMatthew G. Knepley                                                       void (*g0)(PetscInt, PetscInt, PetscInt,
8486528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8496528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8506528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8516528b96dSMatthew G. Knepley                                                       PetscInt i1,
8526528b96dSMatthew G. Knepley                                                       void (*g1)(PetscInt, PetscInt, PetscInt,
8536528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8546528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8556528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8566528b96dSMatthew G. Knepley                                                       PetscInt i2,
8576528b96dSMatthew G. Knepley                                                       void (*g2)(PetscInt, PetscInt, PetscInt,
8586528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8596528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8606528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8616528b96dSMatthew G. Knepley                                                       PetscInt i3,
8626528b96dSMatthew G. Knepley                                                       void (*g3)(PetscInt, PetscInt, PetscInt,
8636528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8646528b96dSMatthew G. Knepley                                                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8656528b96dSMatthew G. Knepley                                                                  PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
8666528b96dSMatthew G. Knepley {
8676528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
8686528b96dSMatthew G. Knepley 
8696528b96dSMatthew G. Knepley   PetscFunctionBegin;
8705f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, i0, (void (*)(void)) g0));
8715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, i1, (void (*)(void)) g1));
8725f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, i2, (void (*)(void)) g2));
8735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP3], label, val, find, part, i3, (void (*)(void)) g3));
8746528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8756528b96dSMatthew G. Knepley }
8766528b96dSMatthew G. Knepley 
8776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobian(PetscWeakForm wf, PetscBool *hasJac)
8786528b96dSMatthew G. Knepley {
8796528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
8806528b96dSMatthew G. Knepley 
8816528b96dSMatthew G. Knepley   PetscFunctionBegin;
8826528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
8836528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJac, 2);
8845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG0], &n0));
8855f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG1], &n1));
8865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG2], &n2));
8875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG3], &n3));
8886528b96dSMatthew G. Knepley   *hasJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
8896528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
8906528b96dSMatthew G. Knepley }
8916528b96dSMatthew G. Knepley 
89206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
8936528b96dSMatthew G. Knepley                                           PetscInt *n0,
8946528b96dSMatthew G. Knepley                                           void (***g0)(PetscInt, PetscInt, PetscInt,
8956528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8966528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
8976528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
8986528b96dSMatthew G. Knepley                                           PetscInt *n1,
8996528b96dSMatthew G. Knepley                                           void (***g1)(PetscInt, PetscInt, PetscInt,
9006528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9016528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9026528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9036528b96dSMatthew G. Knepley                                           PetscInt *n2,
9046528b96dSMatthew G. Knepley                                           void (***g2)(PetscInt, PetscInt, PetscInt,
9056528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9066528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9076528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9086528b96dSMatthew G. Knepley                                           PetscInt *n3,
9096528b96dSMatthew G. Knepley                                           void (***g3)(PetscInt, PetscInt, PetscInt,
9106528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9116528b96dSMatthew G. Knepley                                                        const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9126528b96dSMatthew G. Knepley                                                        PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9136528b96dSMatthew G. Knepley {
9146528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9156528b96dSMatthew G. Knepley 
9166528b96dSMatthew G. Knepley   PetscFunctionBegin;
9175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (***)(void)) g0));
9185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (***)(void)) g1));
9195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (***)(void)) g2));
9205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (***)(void)) g3));
9216528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9226528b96dSMatthew G. Knepley }
9236528b96dSMatthew G. Knepley 
92406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9256528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9266528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9276528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9286528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9296528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9306528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9316528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9326528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9336528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9346528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9356528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9366528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9376528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
9386528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9396528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9406528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9416528b96dSMatthew G. Knepley {
9426528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9436528b96dSMatthew G. Knepley 
9446528b96dSMatthew G. Knepley   PetscFunctionBegin;
9455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, (void (*)(void)) g0));
9465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, (void (*)(void)) g1));
9475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, (void (*)(void)) g2));
9485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, (void (*)(void)) g3));
9496528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9506528b96dSMatthew G. Knepley }
9516528b96dSMatthew G. Knepley 
95206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9536528b96dSMatthew G. Knepley                                           PetscInt n0,
9546528b96dSMatthew G. Knepley                                           void (**g0)(PetscInt, PetscInt, PetscInt,
9556528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9566528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9576528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9586528b96dSMatthew G. Knepley                                           PetscInt n1,
9596528b96dSMatthew G. Knepley                                           void (**g1)(PetscInt, PetscInt, PetscInt,
9606528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9616528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9626528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9636528b96dSMatthew G. Knepley                                           PetscInt n2,
9646528b96dSMatthew G. Knepley                                           void (**g2)(PetscInt, PetscInt, PetscInt,
9656528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9666528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9676528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9686528b96dSMatthew G. Knepley                                           PetscInt n3,
9696528b96dSMatthew G. Knepley                                           void (**g3)(PetscInt, PetscInt, PetscInt,
9706528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9716528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9726528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
9736528b96dSMatthew G. Knepley {
9746528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
9756528b96dSMatthew G. Knepley 
9766528b96dSMatthew G. Knepley   PetscFunctionBegin;
9775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (**)(void)) g0));
9785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (**)(void)) g1));
9795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (**)(void)) g2));
9805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, n3, (void (**)(void)) g3));
9816528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
9826528b96dSMatthew G. Knepley }
9836528b96dSMatthew G. Knepley 
98406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
9856528b96dSMatthew G. Knepley                                           PetscInt i0,
9866528b96dSMatthew G. Knepley                                           void (*g0)(PetscInt, PetscInt, PetscInt,
9876528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9896528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9906528b96dSMatthew G. Knepley                                           PetscInt i1,
9916528b96dSMatthew G. Knepley                                           void (*g1)(PetscInt, PetscInt, PetscInt,
9926528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9936528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9946528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
9956528b96dSMatthew G. Knepley                                           PetscInt i2,
9966528b96dSMatthew G. Knepley                                           void (*g2)(PetscInt, PetscInt, PetscInt,
9976528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9986528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
9996528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10006528b96dSMatthew G. Knepley                                           PetscInt i3,
10016528b96dSMatthew G. Knepley                                           void (*g3)(PetscInt, PetscInt, PetscInt,
10026528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10036528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10046528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10056528b96dSMatthew G. Knepley {
10066528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10076528b96dSMatthew G. Knepley 
10086528b96dSMatthew G. Knepley   PetscFunctionBegin;
10095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, i0, (void (*)(void)) g0));
10105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, i1, (void (*)(void)) g1));
10115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, i2, (void (*)(void)) g2));
10125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG3], label, val, find, part, i3, (void (*)(void)) g3));
10136528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10146528b96dSMatthew G. Knepley }
10156528b96dSMatthew G. Knepley 
10166528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasBdJacobianPreconditioner(PetscWeakForm wf, PetscBool *hasJacPre)
10176528b96dSMatthew G. Knepley {
10186528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
10196528b96dSMatthew G. Knepley 
10206528b96dSMatthew G. Knepley   PetscFunctionBegin;
10216528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
10226528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasJacPre, 2);
10235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP0], &n0));
10245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP1], &n1));
10255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP2], &n2));
10265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP3], &n3));
10276528b96dSMatthew G. Knepley   *hasJacPre = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
10286528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10296528b96dSMatthew G. Knepley }
10306528b96dSMatthew G. Knepley 
103106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10326528b96dSMatthew G. Knepley                                                         PetscInt *n0,
10336528b96dSMatthew G. Knepley                                                         void (***g0)(PetscInt, PetscInt, PetscInt,
10346528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10356528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10366528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10376528b96dSMatthew G. Knepley                                                         PetscInt *n1,
10386528b96dSMatthew G. Knepley                                                         void (***g1)(PetscInt, PetscInt, PetscInt,
10396528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10406528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10416528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10426528b96dSMatthew G. Knepley                                                         PetscInt *n2,
10436528b96dSMatthew G. Knepley                                                         void (***g2)(PetscInt, PetscInt, PetscInt,
10446528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10456528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10466528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10476528b96dSMatthew G. Knepley                                                         PetscInt *n3,
10486528b96dSMatthew G. Knepley                                                         void (***g3)(PetscInt, PetscInt, PetscInt,
10496528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10506528b96dSMatthew G. Knepley                                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10516528b96dSMatthew G. Knepley                                                                      PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10526528b96dSMatthew G. Knepley {
10536528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10546528b96dSMatthew G. Knepley 
10556528b96dSMatthew G. Knepley   PetscFunctionBegin;
10565f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (***)(void)) g0));
10575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (***)(void)) g1));
10585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (***)(void)) g2));
10595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (***)(void)) g3));
10606528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10616528b96dSMatthew G. Knepley }
10626528b96dSMatthew G. Knepley 
106306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10646528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
10656528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10666528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10676528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10686528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
10696528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10706528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10716528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10726528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
10736528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10746528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10756528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10766528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
10776528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10786528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10796528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
10806528b96dSMatthew G. Knepley {
10816528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
10826528b96dSMatthew G. Knepley 
10836528b96dSMatthew G. Knepley   PetscFunctionBegin;
10845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, (void (*)(void)) g0));
10855f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, (void (*)(void)) g1));
10865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, (void (*)(void)) g2));
10875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, (void (*)(void)) g3));
10886528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
10896528b96dSMatthew G. Knepley }
10906528b96dSMatthew G. Knepley 
109106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
10926528b96dSMatthew G. Knepley                                                         PetscInt n0,
10936528b96dSMatthew G. Knepley                                                         void (**g0)(PetscInt, PetscInt, PetscInt,
10946528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10956528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
10966528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
10976528b96dSMatthew G. Knepley                                                         PetscInt n1,
10986528b96dSMatthew G. Knepley                                                         void (**g1)(PetscInt, PetscInt, PetscInt,
10996528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11006528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11016528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11026528b96dSMatthew G. Knepley                                                         PetscInt n2,
11036528b96dSMatthew G. Knepley                                                         void (**g2)(PetscInt, PetscInt, PetscInt,
11046528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11056528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11066528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11076528b96dSMatthew G. Knepley                                                         PetscInt n3,
11086528b96dSMatthew G. Knepley                                                         void (**g3)(PetscInt, PetscInt, PetscInt,
11096528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11106528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11116528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11126528b96dSMatthew G. Knepley {
11136528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11146528b96dSMatthew G. Knepley 
11156528b96dSMatthew G. Knepley   PetscFunctionBegin;
11165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (**)(void)) g0));
11175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (**)(void)) g1));
11185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (**)(void)) g2));
11195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, n3, (void (**)(void)) g3));
11206528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11216528b96dSMatthew G. Knepley }
11226528b96dSMatthew G. Knepley 
112306ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexBdJacobianPreconditioner(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11246528b96dSMatthew G. Knepley                                                         PetscInt i0,
11256528b96dSMatthew G. Knepley                                                         void (*g0)(PetscInt, PetscInt, PetscInt,
11266528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11276528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11286528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11296528b96dSMatthew G. Knepley                                                         PetscInt i1,
11306528b96dSMatthew G. Knepley                                                         void (*g1)(PetscInt, PetscInt, PetscInt,
11316528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11326528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11336528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11346528b96dSMatthew G. Knepley                                                         PetscInt i2,
11356528b96dSMatthew G. Knepley                                                         void (*g2)(PetscInt, PetscInt, PetscInt,
11366528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11376528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11386528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11396528b96dSMatthew G. Knepley                                                         PetscInt i3,
11406528b96dSMatthew G. Knepley                                                         void (*g3)(PetscInt, PetscInt, PetscInt,
11416528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11426528b96dSMatthew G. Knepley                                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11436528b96dSMatthew G. Knepley                                                                    PetscReal, PetscReal, const PetscReal[], const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11446528b96dSMatthew G. Knepley {
11456528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11466528b96dSMatthew G. Knepley 
11476528b96dSMatthew G. Knepley   PetscFunctionBegin;
11485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, i0, (void (*)(void)) g0));
11495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, i1, (void (*)(void)) g1));
11505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, i2, (void (*)(void)) g2));
11515f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP3], label, val, find, part, i3, (void (*)(void)) g3));
11526528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11536528b96dSMatthew G. Knepley }
11546528b96dSMatthew G. Knepley 
11556528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormHasDynamicJacobian(PetscWeakForm wf, PetscBool *hasDynJac)
11566528b96dSMatthew G. Knepley {
11576528b96dSMatthew G. Knepley   PetscInt       n0, n1, n2, n3;
11586528b96dSMatthew G. Knepley 
11596528b96dSMatthew G. Knepley   PetscFunctionBegin;
11606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
11616528b96dSMatthew G. Knepley   PetscValidBoolPointer(hasDynJac, 2);
11625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT0], &n0));
11635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT1], &n1));
11645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT2], &n2));
11655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT3], &n3));
11666528b96dSMatthew G. Knepley   *hasDynJac = n0+n1+n2+n3 ? PETSC_TRUE : PETSC_FALSE;
11676528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
11686528b96dSMatthew G. Knepley }
11696528b96dSMatthew G. Knepley 
117006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
11716528b96dSMatthew G. Knepley                                         PetscInt *n0,
11726528b96dSMatthew G. Knepley                                         void (***g0)(PetscInt, PetscInt, PetscInt,
11736528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11746528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11756528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11766528b96dSMatthew G. Knepley                                         PetscInt *n1,
11776528b96dSMatthew G. Knepley                                         void (***g1)(PetscInt, PetscInt, PetscInt,
11786528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11796528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11806528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11816528b96dSMatthew G. Knepley                                         PetscInt *n2,
11826528b96dSMatthew G. Knepley                                         void (***g2)(PetscInt, PetscInt, PetscInt,
11836528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11846528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11856528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
11866528b96dSMatthew G. Knepley                                         PetscInt *n3,
11876528b96dSMatthew G. Knepley                                         void (***g3)(PetscInt, PetscInt, PetscInt,
11886528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11896528b96dSMatthew G. Knepley                                                      const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
11906528b96dSMatthew G. Knepley                                                      PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
11916528b96dSMatthew G. Knepley {
11926528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
11936528b96dSMatthew G. Knepley 
11946528b96dSMatthew G. Knepley   PetscFunctionBegin;
11955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (***)(void)) g0));
11965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (***)(void)) g1));
11975f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (***)(void)) g2));
11985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (***)(void)) g3));
11996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12006528b96dSMatthew G. Knepley }
12016528b96dSMatthew G. Knepley 
120206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormAddDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12036528b96dSMatthew G. Knepley                                         void (*g0)(PetscInt, PetscInt, PetscInt,
12046528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12056528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12066528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12076528b96dSMatthew G. Knepley                                         void (*g1)(PetscInt, PetscInt, PetscInt,
12086528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12096528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12106528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12116528b96dSMatthew G. Knepley                                         void (*g2)(PetscInt, PetscInt, PetscInt,
12126528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12136528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12146528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12156528b96dSMatthew G. Knepley                                         void (*g3)(PetscInt, PetscInt, PetscInt,
12166528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12176528b96dSMatthew G. Knepley                                                    const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12186528b96dSMatthew G. Knepley                                                    PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12196528b96dSMatthew G. Knepley {
12206528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12216528b96dSMatthew G. Knepley 
12226528b96dSMatthew G. Knepley   PetscFunctionBegin;
12235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, (void (*)(void)) g0));
12245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, (void (*)(void)) g1));
12255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, (void (*)(void)) g2));
12265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, (void (*)(void)) g3));
12276528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12286528b96dSMatthew G. Knepley }
12296528b96dSMatthew G. Knepley 
123006ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12316528b96dSMatthew G. Knepley                                                PetscInt n0,
12326528b96dSMatthew G. Knepley                                                void (**g0)(PetscInt, PetscInt, PetscInt,
12336528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12346528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12356528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12366528b96dSMatthew G. Knepley                                                PetscInt n1,
12376528b96dSMatthew G. Knepley                                                void (**g1)(PetscInt, PetscInt, PetscInt,
12386528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12396528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12406528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12416528b96dSMatthew G. Knepley                                                PetscInt n2,
12426528b96dSMatthew G. Knepley                                                void (**g2)(PetscInt, PetscInt, PetscInt,
12436528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12446528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12456528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12466528b96dSMatthew G. Knepley                                                PetscInt n3,
12476528b96dSMatthew G. Knepley                                                void (**g3)(PetscInt, PetscInt, PetscInt,
12486528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12496528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12506528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12516528b96dSMatthew G. Knepley {
12526528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12536528b96dSMatthew G. Knepley 
12546528b96dSMatthew G. Knepley   PetscFunctionBegin;
12555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (**)(void)) g0));
12565f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (**)(void)) g1));
12575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (**)(void)) g2));
12585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, n3, (void (**)(void)) g3));
12596528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12606528b96dSMatthew G. Knepley }
12616528b96dSMatthew G. Knepley 
126206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexDynamicJacobian(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt g, PetscInt part,
12636528b96dSMatthew G. Knepley                                                PetscInt i0,
12646528b96dSMatthew G. Knepley                                                void (*g0)(PetscInt, PetscInt, PetscInt,
12656528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12666528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12676528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12686528b96dSMatthew G. Knepley                                                PetscInt i1,
12696528b96dSMatthew G. Knepley                                                void (*g1)(PetscInt, PetscInt, PetscInt,
12706528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12716528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12726528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12736528b96dSMatthew G. Knepley                                                PetscInt i2,
12746528b96dSMatthew G. Knepley                                                void (*g2)(PetscInt, PetscInt, PetscInt,
12756528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12766528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12776528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]),
12786528b96dSMatthew G. Knepley                                                PetscInt i3,
12796528b96dSMatthew G. Knepley                                                void (*g3)(PetscInt, PetscInt, PetscInt,
12806528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12816528b96dSMatthew G. Knepley                                                           const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
12826528b96dSMatthew G. Knepley                                                           PetscReal, PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]))
12836528b96dSMatthew G. Knepley {
12846528b96dSMatthew G. Knepley   PetscInt       find = f*wf->Nf + g;
12856528b96dSMatthew G. Knepley 
12866528b96dSMatthew G. Knepley   PetscFunctionBegin;
12875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, i0, (void (*)(void)) g0));
12885f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, i1, (void (*)(void)) g1));
12895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, i2, (void (*)(void)) g2));
12905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT3], label, val, find, part, i3, (void (*)(void)) g3));
12916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
12926528b96dSMatthew G. Knepley }
12936528b96dSMatthew G. Knepley 
129406ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormGetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part, PetscInt *n,
12956528b96dSMatthew G. Knepley                                              void (***r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
12966528b96dSMatthew G. Knepley {
12976528b96dSMatthew G. Knepley   PetscFunctionBegin;
12985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (***)(void)) r));
12996528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13006528b96dSMatthew G. Knepley }
13016528b96dSMatthew G. Knepley 
130206ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13036528b96dSMatthew G. Knepley                                              PetscInt n,
13046528b96dSMatthew G. Knepley                                              void (**r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13056528b96dSMatthew G. Knepley {
13066528b96dSMatthew G. Knepley   PetscFunctionBegin;
13075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, n, (void (**)(void)) r));
13086528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13096528b96dSMatthew G. Knepley }
13106528b96dSMatthew G. Knepley 
131106ad1575SMatthew G. Knepley PetscErrorCode PetscWeakFormSetIndexRiemannSolver(PetscWeakForm wf, DMLabel label, PetscInt val, PetscInt f, PetscInt part,
13126528b96dSMatthew G. Knepley                                                   PetscInt i,
13136528b96dSMatthew G. Knepley                                                   void (*r)(PetscInt, PetscInt, const PetscReal[], const PetscReal[], const PetscScalar[], const PetscScalar[], PetscInt, const PetscScalar[], PetscScalar[], void *))
13146528b96dSMatthew G. Knepley {
13156528b96dSMatthew G. Knepley   PetscFunctionBegin;
13165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_R], label, val, f, part, i, (void (*)(void)) r));
13176528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13186528b96dSMatthew G. Knepley }
13196528b96dSMatthew G. Knepley 
13206528b96dSMatthew G. Knepley /*@
13216528b96dSMatthew G. Knepley   PetscWeakFormGetNumFields - Returns the number of fields
13226528b96dSMatthew G. Knepley 
13236528b96dSMatthew G. Knepley   Not collective
13246528b96dSMatthew G. Knepley 
13256528b96dSMatthew G. Knepley   Input Parameter:
13266528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
13276528b96dSMatthew G. Knepley 
13286528b96dSMatthew G. Knepley   Output Parameter:
1329a5b23f4aSJose E. Roman . Nf - The number of fields
13306528b96dSMatthew G. Knepley 
13316528b96dSMatthew G. Knepley   Level: beginner
13326528b96dSMatthew G. Knepley 
13336528b96dSMatthew G. Knepley .seealso: PetscWeakFormSetNumFields(), PetscWeakFormCreate()
13346528b96dSMatthew G. Knepley @*/
13356528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormGetNumFields(PetscWeakForm wf, PetscInt *Nf)
13366528b96dSMatthew G. Knepley {
13376528b96dSMatthew G. Knepley   PetscFunctionBegin;
13386528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
1339*dadcf809SJacob 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 
13556528b96dSMatthew G. Knepley .seealso: PetscWeakFormGetNumFields(), PetscWeakFormCreate()
13566528b96dSMatthew G. Knepley @*/
13576528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormSetNumFields(PetscWeakForm wf, PetscInt Nf)
13586528b96dSMatthew G. Knepley {
13596528b96dSMatthew G. Knepley   PetscFunctionBegin;
13606528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
13616528b96dSMatthew G. Knepley   wf->Nf = Nf;
13626528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13636528b96dSMatthew G. Knepley }
13646528b96dSMatthew G. Knepley 
13656528b96dSMatthew G. Knepley /*@
13666528b96dSMatthew G. Knepley   PetscWeakFormDestroy - Destroys a PetscWeakForm object
13676528b96dSMatthew G. Knepley 
13686528b96dSMatthew G. Knepley   Collective on wf
13696528b96dSMatthew G. Knepley 
13706528b96dSMatthew G. Knepley   Input Parameter:
13716528b96dSMatthew G. Knepley . wf - the PetscWeakForm object to destroy
13726528b96dSMatthew G. Knepley 
13736528b96dSMatthew G. Knepley   Level: developer
13746528b96dSMatthew G. Knepley 
13756528b96dSMatthew G. Knepley .seealso PetscWeakFormCreate(), PetscWeakFormView()
13766528b96dSMatthew G. Knepley @*/
13776528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormDestroy(PetscWeakForm *wf)
13786528b96dSMatthew G. Knepley {
137906ad1575SMatthew G. Knepley   PetscInt       f;
13806528b96dSMatthew G. Knepley 
13816528b96dSMatthew G. Knepley   PetscFunctionBegin;
13826528b96dSMatthew G. Knepley   if (!*wf) PetscFunctionReturn(0);
13836528b96dSMatthew G. Knepley   PetscValidHeaderSpecific((*wf), PETSCWEAKFORM_CLASSID, 1);
13846528b96dSMatthew G. Knepley 
13856528b96dSMatthew G. Knepley   if (--((PetscObject)(*wf))->refct > 0) {*wf = NULL; PetscFunctionReturn(0);}
13866528b96dSMatthew G. Knepley   ((PetscObject) (*wf))->refct = 0;
13875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferDestroy(&(*wf)->funcs));
13885f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormDestroy(&(*wf)->form[f]));
13895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*wf)->form));
13905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(wf));
13916528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
13926528b96dSMatthew G. Knepley }
13936528b96dSMatthew G. Knepley 
139445480ffeSMatthew G. Knepley static PetscErrorCode PetscWeakFormViewTable_Ascii(PetscWeakForm wf, PetscViewer viewer, PetscBool splitField, const char tableName[], PetscHMapForm map)
13956528b96dSMatthew G. Knepley {
139645480ffeSMatthew G. Knepley   PetscInt       Nf = wf->Nf, Nk, k;
13976528b96dSMatthew G. Knepley 
13986528b96dSMatthew G. Knepley   PetscFunctionBegin;
13995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapFormGetSize(map, &Nk));
14006528b96dSMatthew G. Knepley   if (Nk) {
140106ad1575SMatthew G. Knepley     PetscFormKey *keys;
14026528b96dSMatthew G. Knepley     void       (**funcs)(void);
14035fedec97SMatthew G. Knepley     const char  **names;
14045fedec97SMatthew G. Knepley     PetscInt     *values, *idx1, *idx2, *idx;
14055fedec97SMatthew G. Knepley     PetscBool     showPart = PETSC_FALSE, showPointer = PETSC_FALSE;
14065fedec97SMatthew G. Knepley     PetscInt      off = 0;
14076528b96dSMatthew G. Knepley 
14085f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc6(Nk, &keys, Nk, &names, Nk, &values, Nk, &idx1, Nk, &idx2, Nk, &idx));
14095f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscHMapFormGetKeys(map, &off, keys));
14105fedec97SMatthew G. Knepley     /* Sort keys by label name and value */
14115fedec97SMatthew G. Knepley     {
14125fedec97SMatthew G. Knepley       /* First sort values */
14135fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {values[k] = keys[k].value; idx1[k] = k;}
14145f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSortIntWithPermutation(Nk, values, idx1));
14155fedec97SMatthew G. Knepley       /* If the string sort is stable, it will be sorted correctly overall */
14165fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
14175f80ce2aSJacob Faibussowitsch         if (keys[idx1[k]].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[idx1[k]].label, &names[k]));
14185fedec97SMatthew G. Knepley         else                     {names[k] = "";}
14195fedec97SMatthew G. Knepley         idx2[k] = k;
14205fedec97SMatthew G. Knepley       }
14215f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSortStrWithPermutation(Nk, names, idx2));
14225fedec97SMatthew G. Knepley       for (k = 0; k < Nk; ++k) {
14235f80ce2aSJacob Faibussowitsch         if (keys[k].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[k].label, &names[k]));
14245fedec97SMatthew G. Knepley         else               {names[k] = "";}
14255fedec97SMatthew G. Knepley         idx[k] = idx1[idx2[k]];
14265fedec97SMatthew G. Knepley       }
14275fedec97SMatthew G. Knepley     }
14285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s\n", tableName));
14295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPushTab(viewer));
14306528b96dSMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14310944a4d6SMatthew G. Knepley       if (keys[k].part != 0) showPart = PETSC_TRUE;
14320944a4d6SMatthew G. Knepley     }
14330944a4d6SMatthew G. Knepley     for (k = 0; k < Nk; ++k) {
14345fedec97SMatthew G. Knepley       const PetscInt i = idx[k];
14355fedec97SMatthew G. Knepley       PetscInt       n, f;
14365fedec97SMatthew G. Knepley 
14375fedec97SMatthew G. Knepley       if (keys[i].label) {
14385f80ce2aSJacob Faibussowitsch         if (showPointer) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s:%p, %D) ", names[i], keys[i].label, keys[i].value));
14395f80ce2aSJacob Faibussowitsch         else             CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s, %D) ", names[i], keys[i].value));
14405f80ce2aSJacob Faibussowitsch       } else CHKERRQ(PetscViewerASCIIPrintf(viewer, ""));
14415f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_FALSE));
14425f80ce2aSJacob Faibussowitsch       if (splitField) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D, %D) ", keys[i].field/Nf, keys[i].field%Nf));
14435f80ce2aSJacob Faibussowitsch       else            CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].field));
14445f80ce2aSJacob Faibussowitsch       if (showPart)   CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].part));
14455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscWeakFormGetFunction_Private(wf, map, keys[i].label, keys[i].value, keys[i].field, keys[i].part, &n, &funcs));
14465fedec97SMatthew G. Knepley       for (f = 0; f < n; ++f) {
1447258ec3d2SMatthew G. Knepley         char  *fname;
14485fedec97SMatthew G. Knepley         size_t len, l;
1449258ec3d2SMatthew G. Knepley 
14505f80ce2aSJacob Faibussowitsch         if (f > 0) CHKERRQ(PetscViewerASCIIPrintf(viewer, ", "));
14515f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDLAddr(funcs[f], &fname));
14525fedec97SMatthew G. Knepley         if (fname) {
14535fedec97SMatthew G. Knepley           /* Eliminate argument types */
14545f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscStrlen(fname, &len));
14555fedec97SMatthew G. Knepley           for (l = 0; l < len; ++l) if (fname[l] == '(') {fname[l] = '\0'; break;}
14565f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s", fname));
14575fedec97SMatthew G. Knepley         } else if (showPointer) {
14585f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer, "%p", funcs[f]));
14595fedec97SMatthew G. Knepley         }
14605f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscFree(fname));
14616528b96dSMatthew G. Knepley       }
14625f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer, "\n"));
14635f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_TRUE));
14646528b96dSMatthew G. Knepley     }
14655f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPopTab(viewer));
14665f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree6(keys, names, values, idx1, idx2, idx));
14676528b96dSMatthew G. Knepley   }
14686528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14696528b96dSMatthew G. Knepley }
14706528b96dSMatthew G. Knepley 
14716528b96dSMatthew G. Knepley static PetscErrorCode PetscWeakFormView_Ascii(PetscWeakForm wf, PetscViewer viewer)
14726528b96dSMatthew G. Knepley {
14736528b96dSMatthew G. Knepley   PetscViewerFormat format;
147406ad1575SMatthew G. Knepley   PetscInt          f;
14756528b96dSMatthew G. Knepley 
14766528b96dSMatthew G. Knepley   PetscFunctionBegin;
14775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetFormat(viewer, &format));
14785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer, "Weak Form System with %d fields\n", wf->Nf));
14795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
148006ad1575SMatthew G. Knepley   for (f = 0; f < PETSC_NUM_WF; ++f) {
14815f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscWeakFormViewTable_Ascii(wf, viewer, PETSC_TRUE, PetscWeakFormKinds[f], wf->form[f]));
148206ad1575SMatthew G. Knepley   }
14835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
14846528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
14856528b96dSMatthew G. Knepley }
14866528b96dSMatthew G. Knepley 
14876528b96dSMatthew G. Knepley /*@C
14886528b96dSMatthew G. Knepley   PetscWeakFormView - Views a PetscWeakForm
14896528b96dSMatthew G. Knepley 
14906528b96dSMatthew G. Knepley   Collective on wf
14916528b96dSMatthew G. Knepley 
1492d8d19677SJose E. Roman   Input Parameters:
14936528b96dSMatthew G. Knepley + wf - the PetscWeakForm object to view
14946528b96dSMatthew G. Knepley - v  - the viewer
14956528b96dSMatthew G. Knepley 
14966528b96dSMatthew G. Knepley   Level: developer
14976528b96dSMatthew G. Knepley 
14986528b96dSMatthew G. Knepley .seealso PetscWeakFormDestroy(), PetscWeakFormCreate()
14996528b96dSMatthew G. Knepley @*/
15006528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormView(PetscWeakForm wf, PetscViewer v)
15016528b96dSMatthew G. Knepley {
15026528b96dSMatthew G. Knepley   PetscBool      iascii;
15036528b96dSMatthew G. Knepley 
15046528b96dSMatthew G. Knepley   PetscFunctionBegin;
15056528b96dSMatthew G. Knepley   PetscValidHeaderSpecific(wf, PETSCWEAKFORM_CLASSID, 1);
15065f80ce2aSJacob Faibussowitsch   if (!v) CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) wf), &v));
15076528b96dSMatthew G. Knepley   else    {PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);}
15085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii));
15095f80ce2aSJacob Faibussowitsch   if (iascii) CHKERRQ(PetscWeakFormView_Ascii(wf, v));
15105f80ce2aSJacob Faibussowitsch   if (wf->ops->view) CHKERRQ((*wf->ops->view)(wf, v));
15116528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15126528b96dSMatthew G. Knepley }
15136528b96dSMatthew G. Knepley 
15146528b96dSMatthew G. Knepley /*@
15156528b96dSMatthew G. Knepley   PetscWeakFormCreate - Creates an empty PetscWeakForm object.
15166528b96dSMatthew G. Knepley 
15176528b96dSMatthew G. Knepley   Collective
15186528b96dSMatthew G. Knepley 
15196528b96dSMatthew G. Knepley   Input Parameter:
15206528b96dSMatthew G. Knepley . comm - The communicator for the PetscWeakForm object
15216528b96dSMatthew G. Knepley 
15226528b96dSMatthew G. Knepley   Output Parameter:
15236528b96dSMatthew G. Knepley . wf - The PetscWeakForm object
15246528b96dSMatthew G. Knepley 
15256528b96dSMatthew G. Knepley   Level: beginner
15266528b96dSMatthew G. Knepley 
15276528b96dSMatthew G. Knepley .seealso: PetscDS, PetscWeakFormDestroy()
15286528b96dSMatthew G. Knepley @*/
15296528b96dSMatthew G. Knepley PetscErrorCode PetscWeakFormCreate(MPI_Comm comm, PetscWeakForm *wf)
15306528b96dSMatthew G. Knepley {
15316528b96dSMatthew G. Knepley   PetscWeakForm  p;
153206ad1575SMatthew G. Knepley   PetscInt       f;
15336528b96dSMatthew G. Knepley 
15346528b96dSMatthew G. Knepley   PetscFunctionBegin;
15356528b96dSMatthew G. Knepley   PetscValidPointer(wf, 2);
15366528b96dSMatthew G. Knepley   *wf  = NULL;
15375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDSInitializePackage());
15386528b96dSMatthew G. Knepley 
15395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(p, PETSCWEAKFORM_CLASSID, "PetscWeakForm", "Weak Form System", "PetscWeakForm", comm, PetscWeakFormDestroy, PetscWeakFormView));
15406528b96dSMatthew G. Knepley 
15416528b96dSMatthew G. Knepley   p->Nf = 0;
15425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscChunkBufferCreate(sizeof(&PetscWeakFormCreate), 2, &p->funcs));
15435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(PETSC_NUM_WF, &p->form));
15445f80ce2aSJacob Faibussowitsch   for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormCreate(&p->form[f]));
15456528b96dSMatthew G. Knepley   *wf = p;
15466528b96dSMatthew G. Knepley   PetscFunctionReturn(0);
15476528b96dSMatthew G. Knepley }
1548