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