Actual source code: fdiff.c
petsc-3.6.1 2015-08-06
1: #include <petsctao.h> /*I "petsctao.h" I*/
2: #include <petsc/private/taoimpl.h>
3: #include <petscsnes.h>
5: /*
6: For finited difference computations of the Hessian, we use PETSc's SNESComputeJacobianDefault
7: */
11: static PetscErrorCode Fsnes(SNES snes ,Vec X,Vec G,void*ctx)
12: {
14: Tao tao = (Tao)ctx;
18: ierr=TaoComputeGradient(tao,X,G);
19: return(0);
20: }
24: /*@C
25: TaoDefaultComputeGradient - computes the gradient using finite differences.
27: Collective on Tao
29: Input Parameters:
30: + tao - the Tao context
31: . X - compute gradient at this point
32: - dummy - not used
34: Output Parameters:
35: . G - Gradient Vector
37: Options Database Key:
38: + -tao_fd_gradient - Activates TaoDefaultComputeGradient()
39: - -tao_fd_delta <delta> - change in x used to calculate finite differences
41: Level: advanced
43: Note:
44: This routine is slow and expensive, and is not currently optimized
45: to take advantage of sparsity in the problem. Although
46: TaoAppDefaultComputeGradient is not recommended for general use
47: in large-scale applications, It can be useful in checking the
48: correctness of a user-provided gradient. Use the tao method TAOTEST
49: to get an indication of whether your gradient is correct.
52: Note:
53: This finite difference gradient evaluation can be set using the routine TaoSetGradientRoutine() or by using the command line option -tao_fd_gradient
55: .seealso: TaoSetGradientRoutine()
57: @*/
58: PetscErrorCode TaoDefaultComputeGradient(Tao tao,Vec X,Vec G,void *dummy)
59: {
60: PetscScalar *x,*g;
61: PetscReal f, f2;
63: PetscInt low,high,N,i;
64: PetscBool flg;
65: PetscReal h=PETSC_SQRT_MACHINE_EPSILON;
68: TaoComputeObjective(tao, X,&f);
69: PetscOptionsGetReal(NULL,"-tao_fd_delta",&h,&flg);
70: VecGetSize(X,&N);
71: VecGetOwnershipRange(X,&low,&high);
72: VecGetArray(G,&g);
73: for (i=0;i<N;i++) {
74: if (i>=low && i<high) {
75: VecGetArray(X,&x);
76: x[i-low] += h;
77: VecRestoreArray(X,&x);
78: }
80: TaoComputeObjective(tao,X,&f2);
82: if (i>=low && i<high) {
83: VecGetArray(X,&x);
84: x[i-low] -= h;
85: VecRestoreArray(X,&x);
86: }
87: if (i>=low && i<high) {
88: g[i-low]=(f2-f)/h;
89: }
90: }
91: VecRestoreArray(G,&g);
92: return(0);
93: }
97: /*@C
98: TaoDefaultComputeHessian - Computes the Hessian using finite differences.
100: Collective on Tao
102: Input Parameters:
103: + tao - the Tao context
104: . V - compute Hessian at this point
105: - dummy - not used
107: Output Parameters:
108: + H - Hessian matrix (not altered in this routine)
109: - B - newly computed Hessian matrix to use with preconditioner (generally the same as H)
111: Options Database Key:
112: + -tao_fd - Activates TaoDefaultComputeHessian()
113: - -tao_view_hessian - view the hessian after each evaluation using PETSC_VIEWER_STDOUT_WORLD
115: Level: advanced
117: Notes:
118: This routine is slow and expensive, and is not currently optimized
119: to take advantage of sparsity in the problem. Although
120: TaoDefaultComputeHessian() is not recommended for general use
121: in large-scale applications, It can be useful in checking the
122: correctness of a user-provided Hessian.
124: .seealso: TaoSetHessianRoutine(), TaoDefaultComputeHessianColor(), SNESComputeJacobianDefault(), TaoSetGradientRoutine(), TaoDefaultComputeGradient()
126: @*/
127: PetscErrorCode TaoDefaultComputeHessian(Tao tao,Vec V,Mat H,Mat B,void *dummy)
128: {
129: PetscErrorCode ierr;
130: MPI_Comm comm;
131: Vec G;
132: SNES snes;
136: VecDuplicate(V,&G);
138: PetscInfo(tao,"TAO Using finite differences w/o coloring to compute Hessian matrix\n");
140: TaoComputeGradient(tao,V,G);
142: PetscObjectGetComm((PetscObject)H,&comm);
143: SNESCreate(comm,&snes);
145: SNESSetFunction(snes,G,Fsnes,tao);
146: SNESComputeJacobianDefault(snes,V,H,B,tao);
147: SNESDestroy(&snes);
148: VecDestroy(&G);
149: return(0);
150: }
154: /*@C
155: TaoDefaultComputeHessianColor - Computes the Hessian using colored finite differences.
157: Collective on Tao
159: Input Parameters:
160: + tao - the Tao context
161: . V - compute Hessian at this point
162: - ctx - the PetscColoring object (must be of type MatFDColoring)
164: Output Parameters:
165: + H - Hessian matrix (not altered in this routine)
166: - B - newly computed Hessian matrix to use with preconditioner (generally the same as H)
168: Level: advanced
171: .seealso: TaoSetHessianRoutine(), TaoDefaultComputeHessian(),SNESComputeJacobianDefaultColor(), TaoSetGradientRoutine()
173: @*/
174: PetscErrorCode TaoDefaultComputeHessianColor(Tao tao, Vec V, Mat H,Mat B,void *ctx)
175: {
176: PetscErrorCode ierr;
177: MatFDColoring coloring = (MatFDColoring)ctx;
181: ierr=PetscInfo(tao,"TAO computing matrix using finite differences Hessian and coloring\n");
182: MatFDColoringApply(B,coloring,V,ctx);
183: if (H != B) {
184: MatAssemblyBegin(H, MAT_FINAL_ASSEMBLY);
185: MatAssemblyEnd(H, MAT_FINAL_ASSEMBLY);
186: }
187: return(0);
188: }