/*$Id: baijfact.c,v 1.86 2000/11/28 17:29:14 bsmith Exp $*/
/*
Factorization code for BAIJ format.
*/
#include "src/mat/impls/baij/seq/baij.h"
#include "src/vec/vecimpl.h"
#include "src/inline/ilu.h"
/* ----------------------------------------------------------- */
#undef __FUNC__
#define __FUNC__ /**/"MatLUFactorNumeric_SeqBAIJ_N"
int MatLUFactorNumeric_SeqBAIJ_N(Mat A,Mat *B)
{
Mat C = *B;
Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data,*b = (Mat_SeqBAIJ *)C->data;
IS isrow = b->row,isicol = b->icol;
int *r,*ic,ierr,i,j,n = a->mbs,*bi = b->i,*bj = b->j;
int *ajtmpold,*ajtmp,nz,row,bslog,*ai=a->i,*aj=a->j,k,flg;
int *diag_offset=b->diag,diag,bs=a->bs,bs2 = a->bs2,*v_pivots,*pj;
MatScalar *ba = b->a,*aa = a->a,*pv,*v,*rtmp,*multiplier,*v_work,*pc,*w;
PetscFunctionBegin;
ierr = ISGetIndices(isrow,&r);CHKERRQ(ierr);
ierr = ISGetIndices(isicol,&ic);CHKERRQ(ierr);
rtmp = (MatScalar*)PetscMalloc(bs2*(n+1)*sizeof(MatScalar));CHKPTRQ(rtmp);
ierr = PetscMemzero(rtmp,bs2*(n+1)*sizeof(MatScalar));CHKERRQ(ierr);
/* generate work space needed by dense LU factorization */
v_work = (MatScalar*)PetscMalloc(bs*sizeof(int) + (bs+bs2)*sizeof(MatScalar));CHKPTRQ(v_work);
multiplier = v_work + bs;
v_pivots = (int*)(multiplier + bs2);
/* flops in while loop */
bslog = 2*bs*bs2;
for (i=0; ia */
pv = ba + bs2*bi[i];
pj = bj + bi[i];
nz = bi[i+1] - bi[i];
for (j=0; jfactor = FACTOR_LU;
C->assembled = PETSC_TRUE;
PLogFlops(1.3333*bs*bs2*b->mbs); /* from inverting diagonal blocks */
PetscFunctionReturn(0);
}