PetscErrorCode ComputeJacobian_MF(SNES snes,Vec x,Mat A,Mat B,void *ctx) { PetscErrorCode ierr; PetscFunctionBeginUser; ierr = MatMFFDSetFunction(A,(PetscErrorCode (*)(void*,Vec,Vec))SNESComputeFunction,snes);CHKERRQ(ierr); ierr = MatMFFDSetBase(A,x,NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* MatAssemblyEnd_SNESMF - Calls MatAssemblyEnd_MFFD() and then sets the base from the SNES context */ PetscErrorCode MatAssemblyEnd_SNESMF(Mat J,MatAssemblyType mt) { PetscErrorCode ierr; MatMFFD j = (MatMFFD)J->data; SNES snes = (SNES)j->funcctx; Vec u,f; PetscFunctionBegin; ierr = MatAssemblyEnd_MFFD(J,mt);CHKERRQ(ierr); ierr = SNESGetSolution(snes,&u);CHKERRQ(ierr); ierr = SNESGetFunction(snes,&f,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); ierr = MatMFFDSetBase(J,u,f);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode TaoDefaultComputeHessianMFFD(Tao tao,Vec X,Mat H,Mat B,void *ctx) { PetscInt n,N; PetscErrorCode ierr; PetscFunctionBegin; if (B && B != H) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_SUP,"Preconditioning Hessian matrix"); ierr = VecGetSize(X,&N);CHKERRQ(ierr); ierr = VecGetLocalSize(X,&n);CHKERRQ(ierr); ierr = MatSetSizes(H,n,n,N,N);CHKERRQ(ierr); ierr = MatSetType(H,MATMFFD);CHKERRQ(ierr); ierr = MatSetUp(H);CHKERRQ(ierr); ierr = MatMFFDSetBase(H,X,NULL);CHKERRQ(ierr); ierr = MatMFFDSetFunction(H,(PetscErrorCode (*)(void*,Vec,Vec))TaoComputeGradient,tao);CHKERRQ(ierr); ierr = MatAssemblyBegin(H,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(H,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); PetscFunctionReturn(0); }
void PETSC_STDCALL matmffdsetbase_(Mat J,Vec U,Vec F, int *__ierr ){ *__ierr = MatMFFDSetBase( (Mat)PetscToPointer((J) ), (Vec)PetscToPointer((U) ), (Vec)PetscToPointer((F) )); }