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