PETSC_EXTERN void PETSC_STDCALL matnestgetsubmats_(Mat *A,PetscInt *M,PetscInt *N,Mat *sub,int *ierr) { PetscInt i,j,m,n; Mat **mat; CHKFORTRANNULLINTEGER(M); CHKFORTRANNULLINTEGER(N); CHKFORTRANNULLOBJECT(sub); *ierr = MatNestGetSubMats(*A,&m,&n,&mat); if (M) { *M = m; } if (N) { *N = n; } if (sub) { for (i=0; i<m; i++) { for (j=0; j<n; j++) { sub[j + n * i] = mat[i][j]; } } } }
static PetscErrorCode FormJacobian1_block(SNES snes,Vec x,Mat *jac,Mat *B,MatStructure *flag,void *dummy) { Vec *xx, x1,x2; PetscScalar xx_0, xx_1; PetscInt index,nb; PetscScalar A_00, A_01, A_10, A_11; Mat j11, j12, j21, j22; Mat **mats; PetscErrorCode ierr; PetscFunctionBegin; /* get blocks for solution */ ierr = VecNestGetSubVecs( x, &nb, &xx ); CHKERRQ(ierr); x1 = xx[0]; x2 = xx[1]; /* get solution values */ index = 0; ierr = VecGetValues( x1,1, &index, &xx_0 ); CHKERRQ(ierr); ierr = VecGetValues( x2,1, &index, &xx_1 ); CHKERRQ(ierr); /* get block matrices */ ierr = MatNestGetSubMats(*jac,PETSC_NULL,PETSC_NULL,&mats); CHKERRQ(ierr); j11 = mats[0][0]; j12 = mats[0][1]; j21 = mats[1][0]; j22 = mats[1][1]; /* compute jacobian entries */ A_00 = 2.0*xx_0 + xx_1; A_01 = xx_0; A_10 = xx_1; A_11 = xx_0 + 2.0*xx_1; /* set jacobian values */ ierr = MatSetValue( j11, 0,0, A_00, INSERT_VALUES); CHKERRQ(ierr); ierr = MatSetValue( j12, 0,0, A_01, INSERT_VALUES); CHKERRQ(ierr); ierr = MatSetValue( j21, 0,0, A_10, INSERT_VALUES); CHKERRQ(ierr); ierr = MatSetValue( j22, 0,0, A_11, INSERT_VALUES); CHKERRQ(ierr); *flag = SAME_NONZERO_PATTERN; /* Assemble sub matrix */ ierr = MatAssemblyBegin(*jac,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(*jac,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); PetscFunctionReturn(0); }