Hello PetSc users,
I am a beginner to PetSc and I am trying to write Jacobian matrix for my
problem involving 2 nonlinear equations in 2 unknown variables, solving in a 1D
domain.Most of the petsc examples involve one variable and I am finding it
difficult to understand how the Jacobian matrix is built when there are more
than one variables.
For my problem the DOF is 2 (since 2 unknown variables). I am using finite
difference and my stencil is 3 (i-1,i,i+1).Jacobian matrix will have 2x2
submatrix elements and with stencil 3, we have to set 4x3=12 values for each
grid point.
Let the unknown variables are "u,v" and (F1_u)_i-1 represent "partial
derivative of residual of equation 1 at grid point 'i' with respect to variable
'u' at i-1".
Is the following pseudo-code the correct way of filling jacobian matrix?
FormJacobianLocal(DMDALocalInfo *info,Field *sol,Mat J,Mat Jpre, AppCtx
*user){ .......
MatStencil col[2][3],row; PetscReal v[2][3];
.........for(i=xs;i<xs+xm;i++){ row.i = i; row.c=0; { // Internal points
col[0][0].i = i-1; col[0][0].c = 0; v[0][0] = jacobian value =
(F1_u)_i-1
col[0][1].i = i; col[0][1].c = 0; v[0][1] = jacobian value =
(F1_u)_i
col[0][2].i = i+1; col[0][2].c = 0; v[0][1] = jacobian value =
(F1_u)_i+1
col[1][0].i = i-1; col[1][0].c = 1; v[1][0] = jacobian
value = (F1_v)_i-1 col[1][1].i = i; col[1][1].c = 1; v[1][1]
= jacobian value = (F1_v)_i
col[1][2].i = i+1; col[1][2].c = 1; v[1][1] = jacobian value =
(F1_v)_i+1
} MatSetValuesStencil(Jpre,1,&row,6,col,v,INSERT_VALUES);row.i = i;
row.c=1; { // Internal points
col[0][0].i = i-1; col[0][0].c = 0; v[0][0] = jacobian value =
(F2_u)_i-1
col[0][1].i = i; col[0][1].c = 0; v[0][1] = jacobian value =
(F2_u)_i
col[0][2].i = i+1; col[0][2].c = 0; v[0][1] = jacobian value =
(F2_u)_i+1
col[1][0].i = i-1; col[1][0].c = 1; v[1][0] = jacobian
value = (F2_v)_i-1 col[1][1].i = i; col[1][1].c = 1; v[1][1]
= jacobian value = (F2_v)_i
col[1][2].i = i+1; col[1][2].c = 1; v[1][1] = jacobian value =
(F2_v)_i+1
} MatSetValuesStencil(Jpre,1,&row,6,col,v,INSERT_VALUES);
}.......
}
Thank you,Rahul.