xref: /petsc/src/mat/impls/shell/shell.c (revision 0b6271093bf45363169cd314acc5fc2d6b1e3e10)
1357feee3SLois Curfman McInnes #ifndef lint
2*0b627109SLois Curfman McInnes static char vcid[] = "$Id: shell.c,v 1.8 1995/04/25 19:08:57 curfman Exp curfman $";
3357feee3SLois Curfman McInnes #endif
4e51e0e81SBarry Smith 
5e51e0e81SBarry Smith /*
620563c6bSBarry Smith    This provides a simple shell for Fortran (and C programmers) to
720563c6bSBarry Smith   create a very simple matrix class for use with KSP without coding
820563c6bSBarry Smith   mush of anything.
9e51e0e81SBarry Smith */
10e51e0e81SBarry Smith 
11e51e0e81SBarry Smith #include "petsc.h"
12e51e0e81SBarry Smith #include "matimpl.h"        /*I "mat.h" I*/
13e51e0e81SBarry Smith #include "vec/vecimpl.h"
14e51e0e81SBarry Smith 
1520563c6bSBarry Smith typedef struct {
1620563c6bSBarry Smith   int  m,n;
1720563c6bSBarry Smith   int  (*mult)(void *,Vec,Vec);
18f0479e8cSBarry Smith   int  (*multtransadd)(void*,Vec,Vec,Vec);
1920563c6bSBarry Smith   void *ctx;
2020563c6bSBarry Smith } MatShell;
21e51e0e81SBarry Smith 
2220563c6bSBarry Smith static int MatShellMult(Mat mat,Vec x,Vec y)
23e51e0e81SBarry Smith {
2420563c6bSBarry Smith   MatShell *shell;
2520563c6bSBarry Smith   shell = (MatShell *) mat->data;
2620563c6bSBarry Smith   return (*shell->mult)(shell->ctx,x,y);
27e51e0e81SBarry Smith }
28f0479e8cSBarry Smith static int MatShellMultTransAdd(Mat mat,Vec x,Vec y,Vec z)
29f0479e8cSBarry Smith {
30f0479e8cSBarry Smith   MatShell *shell;
31f0479e8cSBarry Smith   shell = (MatShell *) mat->data;
32f0479e8cSBarry Smith   return (*shell->multtransadd)(shell->ctx,x,y,z);
33f0479e8cSBarry Smith }
3420563c6bSBarry Smith static int MatShellDestroy(PetscObject obj)
35e51e0e81SBarry Smith {
3620563c6bSBarry Smith   Mat      mat = (Mat) obj;
3720563c6bSBarry Smith   MatShell *shell;
3820563c6bSBarry Smith   shell = (MatShell *) mat->data;
399e25ed09SBarry Smith   FREE(shell);
40a5a9c739SBarry Smith   PLogObjectDestroy(mat);
419e25ed09SBarry Smith   PETSCHEADERDESTROY(mat);
42e51e0e81SBarry Smith   return 0;
43e51e0e81SBarry Smith }
44e51e0e81SBarry Smith 
4520563c6bSBarry Smith static struct _MatOps MatOps = {0,0,
4620563c6bSBarry Smith        0,
47f0479e8cSBarry Smith        MatShellMult,0,0,MatShellMultTransAdd,
4820563c6bSBarry Smith        0,0,0,0,
4920563c6bSBarry Smith        0,0,
5020563c6bSBarry Smith        0,
5120563c6bSBarry Smith        0,
5220563c6bSBarry Smith        0,0,0,
5320563c6bSBarry Smith        0,
5420563c6bSBarry Smith        0,0,0,
5520563c6bSBarry Smith        0,0,
5620563c6bSBarry Smith        0,
5720563c6bSBarry Smith        0,0,0,0,
5820563c6bSBarry Smith        0,0 };
59e51e0e81SBarry Smith 
60e51e0e81SBarry Smith /*@
61ff756334SLois Curfman McInnes    MatShellCreate - Creates a new matrix class for use with a user-defined
62ff756334SLois Curfman McInnes    private data storage format.
63e51e0e81SBarry Smith 
64e51e0e81SBarry Smith    Input Parameters:
656b5873e3SBarry Smith .  comm - MPI communicator
66ff756334SLois Curfman McInnes .  m - number of rows
67ff756334SLois Curfman McInnes .  n - number of columns
68*0b627109SLois Curfman McInnes .  ctx - pointer to data needed by matrix-vector multiplication routine(s)
69e51e0e81SBarry Smith 
70ff756334SLois Curfman McInnes    Output Parameter:
71e51e0e81SBarry Smith .  mat - the matrix
72e51e0e81SBarry Smith 
73ff756334SLois Curfman McInnes    Notes:
74ff756334SLois Curfman McInnes    The shell matrix type is intended to provide a simple class to use
75ff756334SLois Curfman McInnes    with KSP (such as, for use with matrix-free methods). You should not
76ff756334SLois Curfman McInnes    use the shell type if you plan to define a complete matrix class.
77e51e0e81SBarry Smith 
7820563c6bSBarry Smith   Usage:
79ff756334SLois Curfman McInnes $   MatShellCreate(m,n,ctx,&mat);
80ff756334SLois Curfman McInnes $   MatShellSetMult(mat,mult);
81e51e0e81SBarry Smith 
82*0b627109SLois Curfman McInnes .keywords: matrix, shell, create
83*0b627109SLois Curfman McInnes 
84*0b627109SLois Curfman McInnes .seealso: MatShellSetMult(), MatShellSetMultTransAdd()
85e51e0e81SBarry Smith @*/
866b5873e3SBarry Smith int MatShellCreate(MPI_Comm comm,int m, int n, void *ctx,Mat *mat)
87e51e0e81SBarry Smith {
8820563c6bSBarry Smith   Mat      newmat;
8920563c6bSBarry Smith   MatShell *shell;
906b5873e3SBarry Smith   PETSCHEADERCREATE(newmat,_Mat,MAT_COOKIE,MATSHELL,comm);
91a5a9c739SBarry Smith   PLogObjectCreate(newmat);
9220563c6bSBarry Smith   *mat           = newmat;
9320563c6bSBarry Smith   newmat->factor = 0;
9420563c6bSBarry Smith   newmat->destroy= MatShellDestroy;
9520563c6bSBarry Smith   newmat->ops    = &MatOps;
9620563c6bSBarry Smith   shell          = NEW(MatShell); CHKPTR(shell);
9720563c6bSBarry Smith   newmat->data   = (void *) shell;
9820563c6bSBarry Smith   shell->mult    = 0;
9920563c6bSBarry Smith   shell->m       = m;
10020563c6bSBarry Smith   shell->n       = n;
10120563c6bSBarry Smith   shell->ctx     = ctx;
102e51e0e81SBarry Smith   return 0;
103e51e0e81SBarry Smith }
104e51e0e81SBarry Smith 
105e51e0e81SBarry Smith /*@
106*0b627109SLois Curfman McInnes    MatShellSetMult - Sets the routine for computing the matrix-vector product.
107e51e0e81SBarry Smith 
108e51e0e81SBarry Smith    Input Parameters:
109*0b627109SLois Curfman McInnes .  mat - the matrix associated with this operation, created
110*0b627109SLois Curfman McInnes          with MatShellCreate()
111*0b627109SLois Curfman McInnes .  mult - the user-defined routine
112e51e0e81SBarry Smith 
113*0b627109SLois Curfman McInnes    Calling sequence of mult:
114*0b627109SLois Curfman McInnes    int mult (void *ptr,Vec xin,Vec xout)
115*0b627109SLois Curfman McInnes .  ptr - the application context for matrix data
116*0b627109SLois Curfman McInnes .  xin - input vector
117*0b627109SLois Curfman McInnes .  xout - output vector
118*0b627109SLois Curfman McInnes 
119*0b627109SLois Curfman McInnes .keywords: matrix, multiply, shell, set
120*0b627109SLois Curfman McInnes 
121*0b627109SLois Curfman McInnes .seealso: MatShellCreate(), MatShellSetMultTransAdd()
122e51e0e81SBarry Smith @*/
12320563c6bSBarry Smith int MatShellSetMult(Mat mat, int (*mult)(void*,Vec,Vec))
124e51e0e81SBarry Smith {
12520563c6bSBarry Smith   MatShell *shell;
126e51e0e81SBarry Smith   VALIDHEADER(mat,MAT_COOKIE);
12720563c6bSBarry Smith   shell = (MatShell *) mat->data;
12820563c6bSBarry Smith   shell->mult = mult;
12920563c6bSBarry Smith   return 0;
130e51e0e81SBarry Smith }
131f0479e8cSBarry Smith /*@
132*0b627109SLois Curfman McInnes    MatShellSetMultTransAdd - Sets the routine for computing v3 = v2 + A' * v1.
133f0479e8cSBarry Smith 
134f0479e8cSBarry Smith    Input Parameters:
135*0b627109SLois Curfman McInnes .  mat - the matrix associated with this operation, created
136*0b627109SLois Curfman McInnes          with MatShellCreate()
137*0b627109SLois Curfman McInnes .  mult - the user-defined routine
138f0479e8cSBarry Smith 
139*0b627109SLois Curfman McInnes    Calling sequence of mult:
140*0b627109SLois Curfman McInnes    int mult (void *ptr,Vec v1,Vec v2,Vec v3)
141*0b627109SLois Curfman McInnes .  ptr - the application context for matrix data
142*0b627109SLois Curfman McInnes .  v1, v2 - the input vectors
143*0b627109SLois Curfman McInnes .  v3 - the result
144*0b627109SLois Curfman McInnes 
145*0b627109SLois Curfman McInnes .keywords: matrix, multiply, transpose
146*0b627109SLois Curfman McInnes 
147*0b627109SLois Curfman McInnes .seealso: MatShellCreate(), MatShellSetMult()
148f0479e8cSBarry Smith @*/
149f0479e8cSBarry Smith int MatShellSetMultTransAdd(Mat mat, int (*mult)(void*,Vec,Vec,Vec))
150f0479e8cSBarry Smith {
151f0479e8cSBarry Smith   MatShell *shell;
152f0479e8cSBarry Smith   VALIDHEADER(mat,MAT_COOKIE);
153f0479e8cSBarry Smith   shell               = (MatShell *) mat->data;
154f0479e8cSBarry Smith   shell->multtransadd = mult;
155f0479e8cSBarry Smith   return 0;
156f0479e8cSBarry Smith }
157f0479e8cSBarry Smith 
158f0479e8cSBarry Smith 
159