Пример #1
0
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];
      }
    }
  }
}
Пример #2
0
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);
}