PetscErrorCode DMCreateMatrix_Network(DM dm,Mat *J) { PetscErrorCode ierr; DM_Network *network = (DM_Network*) dm->data; PetscFunctionBegin; ierr = DMCreateMatrix(network->plex,J);CHKERRQ(ierr); ierr = MatSetDM(*J,dm);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MyComputeFunction(SNES snes,Vec x,Vec F,void *ctx) { PetscErrorCode ierr; Mat J; DM dm; PetscFunctionBeginUser; ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr); ierr = DMGetApplicationContext(dm,&J);CHKERRQ(ierr); if (!J) { ierr = DMCreateMatrix(dm,MATAIJ,&J);CHKERRQ(ierr); ierr = MatSetDM(J, PETSC_NULL);CHKERRQ(ierr); ierr = FormMatrix(dm,J);CHKERRQ(ierr); ierr = DMSetApplicationContext(dm,J);CHKERRQ(ierr); ierr = DMSetApplicationContextDestroy(dm,(PetscErrorCode (*)(void**))MatDestroy);CHKERRQ(ierr); } ierr = MatMult(J,x,F);CHKERRQ(ierr); PetscFunctionReturn(0); }