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; 10*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(buffer)); 11*5f80ce2aSJacob 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; 21*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(bufferNew)); 22*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscCalloc1(buffer->size*buffer->unitbytes, &(*bufferNew)->array)); 23*5f80ce2aSJacob 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; 33*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*buffer)->array)); 34*5f80ce2aSJacob 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; 46*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc(buffer->alloc, &tmp)); 47*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMemcpy(tmp, buffer->array, buffer->size*buffer->unitbytes)); 48*5f80ce2aSJacob 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; 69*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferCreateChunk(buffer, (size_t) reserved, &newchunk)); 706528b96dSMatthew G. Knepley newchunk.size = chunk->size+size; 71*5f80ce2aSJacob 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); 97*5f80ce2aSJacob 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; 108*5f80ce2aSJacob 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) { 124*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormDel(ht, key)); 1256528b96dSMatthew G. Knepley PetscFunctionReturn(0); 1266528b96dSMatthew G. Knepley } else { 127*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGet(ht, key, &chunk)); 1286528b96dSMatthew G. Knepley } 1296528b96dSMatthew G. Knepley if (chunk.size < 0) { 130*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, n, &chunk)); 131*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormSet(ht, key, chunk)); 1326528b96dSMatthew G. Knepley } else if (chunk.size <= n) { 133*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, n - chunk.size, &chunk)); 134*5f80ce2aSJacob 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; 148*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGet(ht, key, &chunk)); 1496528b96dSMatthew G. Knepley if (chunk.size < 0) { 150*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, 1, &chunk)); 151*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormSet(ht, key, chunk)); 1522baeeceeSMatthew G. Knepley ((void (**)()) &wf->funcs->array[chunk.start])[0] = func; 1536528b96dSMatthew G. Knepley } else { 154*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, 1, &chunk)); 155*5f80ce2aSJacob 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; 168*5f80ce2aSJacob 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; 186*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGet(ht, key, &chunk)); 1876528b96dSMatthew G. Knepley if (chunk.size < 0) { 188*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferCreateChunk(wf->funcs, ind+1, &chunk)); 189*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormSet(ht, key, chunk)); 1906528b96dSMatthew G. Knepley } else if (chunk.size <= ind) { 191*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferEnlargeChunk(wf->funcs, ind - chunk.size + 1, &chunk)); 192*5f80ce2aSJacob 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; 205*5f80ce2aSJacob 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) { 209*5f80ce2aSJacob 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; 239*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferDestroy(&wfNew->funcs)); 240*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferDuplicate(wf->funcs, &wfNew->funcs)); 24106ad1575SMatthew G. Knepley for (f = 0; f < PETSC_NUM_WF; ++f) { 242*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormDestroy(&wfNew->form[f])); 243*5f80ce2aSJacob 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; 265*5f80ce2aSJacob 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; 275*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(hmap, &n)); 276*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(n, &keys)); 277*5f80ce2aSJacob 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 284*5f80ce2aSJacob 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) { 286*5f80ce2aSJacob 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 } 289*5f80ce2aSJacob 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 } 292*5f80ce2aSJacob 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; 318*5f80ce2aSJacob 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; 330*5f80ce2aSJacob Faibussowitsch if (label) CHKERRQ(PetscObjectGetName((PetscObject) label, &name)); 331*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(hmap, &n)); 332*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(n, &keys)); 333*5f80ce2aSJacob 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; 339*5f80ce2aSJacob Faibussowitsch if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname)); 340*5f80ce2aSJacob 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 345*5f80ce2aSJacob 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 */ 350*5f80ce2aSJacob 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; 356*5f80ce2aSJacob Faibussowitsch if (keys[i].label) CHKERRQ(PetscObjectGetName((PetscObject) keys[i].label, &lname)); 357*5f80ce2aSJacob 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 362*5f80ce2aSJacob 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]; 364*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, hmap, label, keys[i].value, keys[i].field, keys[i].part, Nf, tmpf)); 365*5f80ce2aSJacob 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 } 368*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(tmpf)); 369*5f80ce2aSJacob 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; 393*5f80ce2aSJacob 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; 400*5f80ce2aSJacob 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; 411*5f80ce2aSJacob 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; 422*5f80ce2aSJacob 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; 433*5f80ce2aSJacob 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; 444*5f80ce2aSJacob 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; 455*5f80ce2aSJacob 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; 472*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (***)(void)) f0)); 473*5f80ce2aSJacob 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; 488*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, (void (*)(void)) f0)); 489*5f80ce2aSJacob 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; 506*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, n0, (void (**)(void)) f0)); 507*5f80ce2aSJacob 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; 524*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_F0], label, val, f, part, i0, (void (*)(void)) f0)); 525*5f80ce2aSJacob 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; 542*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (***)(void)) f0)); 543*5f80ce2aSJacob 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; 558*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, (void (*)(void)) f0)); 559*5f80ce2aSJacob 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; 576*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, n0, (void (**)(void)) f0)); 577*5f80ce2aSJacob 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; 594*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDF0], label, val, f, part, i0, (void (*)(void)) f0)); 595*5f80ce2aSJacob 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); 606*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G0], &n0)); 607*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G1], &n1)); 608*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_G2], &n2)); 609*5f80ce2aSJacob 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; 639*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (***)(void)) g0)); 640*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (***)(void)) g1)); 641*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (***)(void)) g2)); 642*5f80ce2aSJacob 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; 667*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, (void (*)(void)) g0)); 668*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, (void (*)(void)) g1)); 669*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, (void (*)(void)) g2)); 670*5f80ce2aSJacob 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; 699*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, n0, (void (**)(void)) g0)); 700*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, n1, (void (**)(void)) g1)); 701*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, n2, (void (**)(void)) g2)); 702*5f80ce2aSJacob 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; 731*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G0], label, val, find, part, i0, (void (*)(void)) g0)); 732*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G1], label, val, find, part, i1, (void (*)(void)) g1)); 733*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_G2], label, val, find, part, i2, (void (*)(void)) g2)); 734*5f80ce2aSJacob 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); 745*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP0], &n0)); 746*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP1], &n1)); 747*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GP2], &n2)); 748*5f80ce2aSJacob 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; 778*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (***)(void)) g0)); 779*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (***)(void)) g1)); 780*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (***)(void)) g2)); 781*5f80ce2aSJacob 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; 806*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, (void (*)(void)) g0)); 807*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, (void (*)(void)) g1)); 808*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, (void (*)(void)) g2)); 809*5f80ce2aSJacob 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; 838*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, n0, (void (**)(void)) g0)); 839*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, n1, (void (**)(void)) g1)); 840*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, n2, (void (**)(void)) g2)); 841*5f80ce2aSJacob 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; 870*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP0], label, val, find, part, i0, (void (*)(void)) g0)); 871*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP1], label, val, find, part, i1, (void (*)(void)) g1)); 872*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GP2], label, val, find, part, i2, (void (*)(void)) g2)); 873*5f80ce2aSJacob 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); 884*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG0], &n0)); 885*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG1], &n1)); 886*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDG2], &n2)); 887*5f80ce2aSJacob 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; 917*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (***)(void)) g0)); 918*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (***)(void)) g1)); 919*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (***)(void)) g2)); 920*5f80ce2aSJacob 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; 945*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, (void (*)(void)) g0)); 946*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, (void (*)(void)) g1)); 947*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, (void (*)(void)) g2)); 948*5f80ce2aSJacob 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; 977*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, n0, (void (**)(void)) g0)); 978*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, n1, (void (**)(void)) g1)); 979*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, n2, (void (**)(void)) g2)); 980*5f80ce2aSJacob 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; 1009*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG0], label, val, find, part, i0, (void (*)(void)) g0)); 1010*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG1], label, val, find, part, i1, (void (*)(void)) g1)); 1011*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDG2], label, val, find, part, i2, (void (*)(void)) g2)); 1012*5f80ce2aSJacob 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); 1023*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP0], &n0)); 1024*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP1], &n1)); 1025*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_BDGP2], &n2)); 1026*5f80ce2aSJacob 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; 1056*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (***)(void)) g0)); 1057*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (***)(void)) g1)); 1058*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (***)(void)) g2)); 1059*5f80ce2aSJacob 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; 1084*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, (void (*)(void)) g0)); 1085*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, (void (*)(void)) g1)); 1086*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, (void (*)(void)) g2)); 1087*5f80ce2aSJacob 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; 1116*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, n0, (void (**)(void)) g0)); 1117*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, n1, (void (**)(void)) g1)); 1118*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, n2, (void (**)(void)) g2)); 1119*5f80ce2aSJacob 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; 1148*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP0], label, val, find, part, i0, (void (*)(void)) g0)); 1149*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP1], label, val, find, part, i1, (void (*)(void)) g1)); 1150*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_BDGP2], label, val, find, part, i2, (void (*)(void)) g2)); 1151*5f80ce2aSJacob 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); 1162*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT0], &n0)); 1163*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT1], &n1)); 1164*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHMapFormGetSize(wf->form[PETSC_WF_GT2], &n2)); 1165*5f80ce2aSJacob 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; 1195*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (***)(void)) g0)); 1196*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (***)(void)) g1)); 1197*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormGetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (***)(void)) g2)); 1198*5f80ce2aSJacob 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; 1223*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, (void (*)(void)) g0)); 1224*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, (void (*)(void)) g1)); 1225*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormAddFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, (void (*)(void)) g2)); 1226*5f80ce2aSJacob 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; 1255*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, n0, (void (**)(void)) g0)); 1256*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, n1, (void (**)(void)) g1)); 1257*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, n2, (void (**)(void)) g2)); 1258*5f80ce2aSJacob 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; 1287*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT0], label, val, find, part, i0, (void (*)(void)) g0)); 1288*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT1], label, val, find, part, i1, (void (*)(void)) g1)); 1289*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormSetIndexFunction_Private(wf, wf->form[PETSC_WF_GT2], label, val, find, part, i2, (void (*)(void)) g2)); 1290*5f80ce2aSJacob 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; 1298*5f80ce2aSJacob 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; 1307*5f80ce2aSJacob 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; 1316*5f80ce2aSJacob 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); 13396528b96dSMatthew G. Knepley PetscValidPointer(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; 1387*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferDestroy(&(*wf)->funcs)); 1388*5f80ce2aSJacob Faibussowitsch for (f = 0; f < PETSC_NUM_WF; ++f) CHKERRQ(PetscHMapFormDestroy(&(*wf)->form[f])); 1389*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*wf)->form)); 1390*5f80ce2aSJacob 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; 1399*5f80ce2aSJacob 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 1408*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc6(Nk, &keys, Nk, &names, Nk, &values, Nk, &idx1, Nk, &idx2, Nk, &idx)); 1409*5f80ce2aSJacob 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;} 1414*5f80ce2aSJacob 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) { 1417*5f80ce2aSJacob 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 } 1421*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSortStrWithPermutation(Nk, names, idx2)); 14225fedec97SMatthew G. Knepley for (k = 0; k < Nk; ++k) { 1423*5f80ce2aSJacob 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 } 1428*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s\n", tableName)); 1429*5f80ce2aSJacob 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) { 1438*5f80ce2aSJacob Faibussowitsch if (showPointer) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s:%p, %D) ", names[i], keys[i].label, keys[i].value)); 1439*5f80ce2aSJacob Faibussowitsch else CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%s, %D) ", names[i], keys[i].value)); 1440*5f80ce2aSJacob Faibussowitsch } else CHKERRQ(PetscViewerASCIIPrintf(viewer, "")); 1441*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_FALSE)); 1442*5f80ce2aSJacob Faibussowitsch if (splitField) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D, %D) ", keys[i].field/Nf, keys[i].field%Nf)); 1443*5f80ce2aSJacob Faibussowitsch else CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].field)); 1444*5f80ce2aSJacob Faibussowitsch if (showPart) CHKERRQ(PetscViewerASCIIPrintf(viewer, "(%D) ", keys[i].part)); 1445*5f80ce2aSJacob 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 1450*5f80ce2aSJacob Faibussowitsch if (f > 0) CHKERRQ(PetscViewerASCIIPrintf(viewer, ", ")); 1451*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDLAddr(funcs[f], &fname)); 14525fedec97SMatthew G. Knepley if (fname) { 14535fedec97SMatthew G. Knepley /* Eliminate argument types */ 1454*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlen(fname, &len)); 14555fedec97SMatthew G. Knepley for (l = 0; l < len; ++l) if (fname[l] == '(') {fname[l] = '\0'; break;} 1456*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "%s", fname)); 14575fedec97SMatthew G. Knepley } else if (showPointer) { 1458*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "%p", funcs[f])); 14595fedec97SMatthew G. Knepley } 1460*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(fname)); 14616528b96dSMatthew G. Knepley } 1462*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "\n")); 1463*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIUseTabs(viewer, PETSC_TRUE)); 14646528b96dSMatthew G. Knepley } 1465*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1466*5f80ce2aSJacob 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; 1477*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerGetFormat(viewer, &format)); 1478*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "Weak Form System with %d fields\n", wf->Nf)); 1479*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 148006ad1575SMatthew G. Knepley for (f = 0; f < PETSC_NUM_WF; ++f) { 1481*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscWeakFormViewTable_Ascii(wf, viewer, PETSC_TRUE, PetscWeakFormKinds[f], wf->form[f])); 148206ad1575SMatthew G. Knepley } 1483*5f80ce2aSJacob 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); 1506*5f80ce2aSJacob Faibussowitsch if (!v) CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) wf), &v)); 15076528b96dSMatthew G. Knepley else {PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);} 1508*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii)); 1509*5f80ce2aSJacob Faibussowitsch if (iascii) CHKERRQ(PetscWeakFormView_Ascii(wf, v)); 1510*5f80ce2aSJacob 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; 1537*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDSInitializePackage()); 15386528b96dSMatthew G. Knepley 1539*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(p, PETSCWEAKFORM_CLASSID, "PetscWeakForm", "Weak Form System", "PetscWeakForm", comm, PetscWeakFormDestroy, PetscWeakFormView)); 15406528b96dSMatthew G. Knepley 15416528b96dSMatthew G. Knepley p->Nf = 0; 1542*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscChunkBufferCreate(sizeof(&PetscWeakFormCreate), 2, &p->funcs)); 1543*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(PETSC_NUM_WF, &p->form)); 1544*5f80ce2aSJacob 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