Schur system + MatShell
tribur at vision.ee.ethz.ch
tribur at vision.ee.ethz.ch
Tue Apr 22 07:06:12 CDT 2008
Dear Satish, dear Barry, dear rest,
Thank you for your response.
>> Being concerned with b in the moment, I managed to set up and solve
>> the global
>> Schur system using MATDENSE. The solving works well with, e.g.,
>> gmres+jacobi,
>> but the assembling of the global Schur matrix takes too long.
>
> Hmm - with dense - if you have some other efficient way of assembling
> the matrix - you can specify this directly to MatCreateMPIDense() - [or
> use MatGetArray() - and set the values directly into this array]
I don't see an alternative, as the partitioning of PETSc has nothing to
do with my partitioning (unstructured mesh, partitioned with Metis).
Moreover, in case of 2 Subdomains, e.g., the local Schur complements S1
and S2 have the same size as the global one, S=S1+S2, and there is no
matrix format in PETSc supporting this, isn't it?
>> 2) Using KSPBICG, it iterates without error message, but the result is wrong
>> (norm of residual 1.42768 instead of something like 1.0e-10), although my
>> Mat-functions PETSC_SchurMatMult and PETSC_SchurMatMultTranspose seem to be
>> correct. I tested the latter comparing the vectors y1 and y2 computed by,
>> e.g., MatMult(S,x,y1) and PETS_SchurMatMult(S,x,y2). Norm(y1-y2) was < e-15
>> for both functions.
>
> Not sure what the problem could be. Can you confirm that the code is
> valgrind clean? It could explain the issue 1 aswell.
Valgrind didn't find an error in my PETSC_SchurMatMult, but PETSc gave
me now also an error message when running with KSPBICG (same
MatShell-code as in my previous e-mail):
[1]PETSC ERROR: MatMult() line 1632 in src/mat/interface/matrix.c
[1]PETSC ERROR: KSPSolve_BiCG() line 95 in src/ksp/ksp/impls/bicg/bicg.c
[1]PETSC ERROR: KSPSolve() line 379 in src/ksp/ksp/interface/itfunc.c
The error seems to occurr at the second call of PETSC_SchurMatMult.
I attached the related source files (petsc version petsc-2.3.3-p8,
downloaded about 4 months ago), and below you find additionally my
MatMult-function PETSC_SchurMatMult (maybe there is problem with ctx?).
I'm stuck and I'll be very grateful for any help,
Kathrin
PS My user defined MatMult-function:
typedef struct {
int NPb;
IS is; //int *uBId_global;
double *Sloc;
} localData;
void PETSC_SchurMatMult(Mat Stot, Vec xtot, Vec ytot){
localData * ctx;
MatShellGetContext(Stot, (void**) &ctx);
int NPb = ctx->NPb; IS is = ctx->is;
double *Sloc = ctx->Sloc;
//extracting local vector xloc
Vec xloc;
VecCreateSeq(PETSC_COMM_SELF, NPb, &xloc);
VecScatter ctx2;
VecScatterCreate(xtot,is,xloc,PETSC_NULL, &ctx2);
VecScatterBegin(ctx2,xtot,xloc,INSERT_VALUES,SCATTER_FORWARD);
VecScatterEnd(ctx2,xtot,xloc,INSERT_VALUES,SCATTER_FORWARD);
VecScatterDestroy(ctx2);
//local matrix multiplication
vector<double> yloc_array(NPb,0);
PetscScalar *xloc_array;
VecGetArray(xloc, &xloc_array);
for(int k=0; k<NPb; k++)
for(int l=0; l<NPb; l++)
yloc_array[k] += Sloc[k*NPb+l] * xloc_array[l];
VecRestoreArray(xloc, &xloc_array);
VecDestroy(xloc);
//scatter yloc to ytot
Vec yloc;
VecCreateSeqWithArray(PETSC_COMM_SELF, NPb, PETSC_NULL, &yloc);
VecPlaceArray(yloc,&yloc_array[0]);
VecScatter ctx3;
VecScatterCreate(yloc, PETSC_NULL, ytot, is, &ctx3);
VecScatterBegin(ctx3, yloc, ytot, ADD_VALUES, SCATTER_FORWARD);
VecScatterEnd(ctx3, yloc, ytot, ADD_VALUES, SCATTER_FORWARD);
VecScatterDestroy(ctx3);
VecDestroy(yloc);
}
More information about the petsc-users
mailing list