xref: /petsc/src/mat/utils/gcreate.c (revision a209d233842b37e5a5651f60579600c7f16b7fb4)
1*a209d233SLois Curfman McInnes /*$Id: gcreate.c,v 1.122 2000/09/01 19:09:14 balay Exp curfman $*/
27807a1faSBarry Smith 
3e090d566SSatish Balay #include "petscsys.h"
4e090d566SSatish Balay #include "petscmat.h"       /*I "petscmat.h"  I*/
57807a1faSBarry Smith 
65615d1e5SSatish Balay #undef __FUNC__
7b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatCreate"
8325ab940SBarry Smith /*@C
969dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
1002a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
1183e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
1283e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
1383e1b59cSLois Curfman McInnes 
14cb13003dSBarry Smith    Collective on MPI_Comm
15cb13003dSBarry Smith 
167807a1faSBarry Smith    Input Parameters:
1782b900a8SBarry Smith +  m - number of local rows (or PETSC_DECIDE)
1882b900a8SBarry Smith .  n - number of local columns (or PETSC_DECIDE)
1982b900a8SBarry Smith .  M - number of global rows (or PETSC_DETERMINE)
2082b900a8SBarry Smith .  N - number of global columns (or PETSC_DETERMINE)
21cb13003dSBarry Smith -  comm - MPI communicator
227807a1faSBarry Smith 
237807a1faSBarry Smith    Output Parameter:
24dc401e71SLois Curfman McInnes .  A - the matrix
25e0b365e2SLois Curfman McInnes 
26dc401e71SLois Curfman McInnes    Basic Options Database Keys:
27dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
28dc401e71SLois Curfman McInnes    depending on the communicator, comm.
29cb13003dSBarry Smith +    -mat_aij      - AIJ type
30cb13003dSBarry Smith .    -mat_baij     - block AIJ type
31cb13003dSBarry Smith .    -mat_dense    - dense type
32cb13003dSBarry Smith -    -mat_bdiag    - block diagonal type
33dc401e71SLois Curfman McInnes 
34dc401e71SLois Curfman McInnes    More Options Database Keys:
35cb13003dSBarry Smith +    -mat_seqaij   - AIJ type, uses MatCreateSeqAIJ()
36cb13003dSBarry Smith .    -mat_mpiaij   - AIJ type, uses MatCreateMPIAIJ()
37cb13003dSBarry Smith .    -mat_seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
38cb13003dSBarry Smith .    -mat_mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
39cb13003dSBarry Smith .    -mat_mpirowbs - rowbs type, uses MatCreateMPIRowbs()
40cb13003dSBarry Smith .    -mat_seqdense - dense type, uses MatCreateSeqDense()
41cb13003dSBarry Smith .    -mat_mpidense - dense type, uses MatCreateMPIDense()
42cb13003dSBarry Smith .    -mat_seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
43cb13003dSBarry Smith -    -mat_mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
44e0b365e2SLois Curfman McInnes 
4583e1b59cSLois Curfman McInnes    Even More Options Database Keys:
4683e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
4783e1b59cSLois Curfman McInnes    for additional format-specific options.
48e0b365e2SLois Curfman McInnes 
49bd9ce289SLois Curfman McInnes    Notes:
50ec6e0d80SSatish Balay    If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the
51ec6e0d80SSatish Balay    user must ensure that they are chosen to be compatible with the
52ec6e0d80SSatish Balay    vectors. To do this, one first considers the matrix-vector product
53ec6e0d80SSatish Balay    'y = A x'. The 'm' that is used in the above routine must match the
54ec6e0d80SSatish Balay    local size used in the vector creation routine VecCreateMPI() for 'y'.
55ec6e0d80SSatish Balay    Likewise, the 'n' used must match that used as the local size in
56ec6e0d80SSatish Balay    VecCreateMPI() for 'x'.
57ec6e0d80SSatish Balay 
583ffaccefSLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determine the matrix type.
59bd9ce289SLois Curfman McInnes 
601d69843bSLois Curfman McInnes    Level: beginner
611d69843bSLois Curfman McInnes 
62dc401e71SLois Curfman McInnes .keywords: matrix, create
63e0b365e2SLois Curfman McInnes 
64fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
65fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
6639ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
67*a209d233SLois Curfman McInnes           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
68*a209d233SLois Curfman McInnes           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
69ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
707807a1faSBarry Smith @*/
7182b900a8SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A)
727807a1faSBarry Smith {
73dbb450caSBarry Smith   MatType    type;
7456cd22aeSBarry Smith   PetscTruth set;
75f1af5d2fSBarry Smith   int        ierr,bs = 1;
76dbb450caSBarry Smith 
773a40ed3dSBarry Smith   PetscFunctionBegin;
7877c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set);CHKERRQ(ierr);
79dfa27b74SSatish Balay   switch (type) {
80dfa27b74SSatish Balay   case MATSEQDENSE:
8182b900a8SBarry Smith     m    = PetscMax(m,M);
8282b900a8SBarry Smith     n    = PetscMax(n,N);
8387bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A);CHKERRQ(ierr);
84dfa27b74SSatish Balay     break;
85dfa27b74SSatish Balay   case MATMPIBDIAG:
8682b900a8SBarry Smith     ierr = MatCreateMPIBDiag(comm,m,M,N,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,A);CHKERRQ(ierr);
87dfa27b74SSatish Balay     break;
88dfa27b74SSatish Balay   case MATSEQBDIAG:
8982b900a8SBarry Smith     m    = PetscMax(m,M);
9082b900a8SBarry Smith     n    = PetscMax(n,N);
9182b900a8SBarry Smith     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,A);CHKERRQ(ierr);
92dfa27b74SSatish Balay     break;
93f1af5d2fSBarry Smith #if defined(PETSC_HAVE_BLOCKSOLVE) && !defined(PETSC_USE_COMPLEX)
94dfa27b74SSatish Balay   case MATMPIROWBS:
95b9b97703SBarry Smith     ierr = MatCreateMPIRowbs(comm,m,M,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
96dfa27b74SSatish Balay     break;
97f1af5d2fSBarry Smith #endif
98dfa27b74SSatish Balay   case MATMPIDENSE:
9982b900a8SBarry Smith     ierr = MatCreateMPIDense(comm,m,n,M,N,PETSC_NULL,A);CHKERRQ(ierr);
100dfa27b74SSatish Balay     break;
101dfa27b74SSatish Balay   case MATMPIAIJ:
10282b900a8SBarry Smith     ierr = MatCreateMPIAIJ(comm,m,n,M,N,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
103dfa27b74SSatish Balay     break;
104dfa27b74SSatish Balay   case MATSEQBAIJ:
10582b900a8SBarry Smith     m    = PetscMax(m,M);
10682b900a8SBarry Smith     n    = PetscMax(n,N);
107f1af5d2fSBarry Smith     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
10887bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
109ed1f4bc7SLois Curfman McInnes     break;
1108130634dSSatish Balay   case MATMPIBAIJ:
111f1af5d2fSBarry Smith     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
11282b900a8SBarry Smith     ierr = MatCreateMPIBAIJ(comm,bs,m,n,M,N,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
1138130634dSSatish Balay     break;
114054a61e1SSatish Balay   case MATSEQSBAIJ:
115054a61e1SSatish Balay     m    = PetscMax(m,M);
116054a61e1SSatish Balay     n    = PetscMax(n,N);
117054a61e1SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
118054a61e1SSatish Balay     ierr = MatCreateSeqSBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
119054a61e1SSatish Balay     break;
120054a61e1SSatish Balay   case MATMPISBAIJ:
121054a61e1SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
122054a61e1SSatish Balay     ierr = MatCreateMPISBAIJ(comm,bs,m,n,M,N,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
123054a61e1SSatish Balay     break;
12424b2b559SSatish Balay   default:
12582b900a8SBarry Smith     m    = PetscMax(m,M);
12682b900a8SBarry Smith     n    = PetscMax(n,N);
12787bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
12824b2b559SSatish Balay     break;
129dfa27b74SSatish Balay   }
1303a40ed3dSBarry Smith   PetscFunctionReturn(0);
1317807a1faSBarry Smith }
1327807a1faSBarry Smith 
133dae03382SLois Curfman McInnes 
134dae03382SLois Curfman McInnes 
135d5d45c9bSBarry Smith 
136d5d45c9bSBarry Smith 
137