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