xref: /petsc/src/mat/utils/gcreate.c (revision ec6e0d8009882f6b6de494135ae53872dacb9873)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*ec6e0d80SSatish Balay static char vcid[] = "$Id: gcreate.c,v 1.113 1999/05/04 20:33:40 balay Exp balay $";
3cb512458SBarry Smith #endif
47807a1faSBarry Smith 
57807a1faSBarry Smith #include "sys.h"
648b35521SBarry Smith #include "mat.h"       /*I "mat.h"  I*/
77807a1faSBarry Smith 
85615d1e5SSatish Balay #undef __FUNC__
95615d1e5SSatish Balay #define __FUNC__ "MatCreate"
10325ab940SBarry Smith /*@C
1169dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
1202a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
1383e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
1483e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
1583e1b59cSLois Curfman McInnes 
16cb13003dSBarry Smith    Collective on MPI_Comm
17cb13003dSBarry Smith 
187807a1faSBarry Smith    Input Parameters:
1982b900a8SBarry Smith +  m - number of local rows (or PETSC_DECIDE)
2082b900a8SBarry Smith .  n - number of local columns (or PETSC_DECIDE)
2182b900a8SBarry Smith .  M - number of global rows (or PETSC_DETERMINE)
2282b900a8SBarry Smith .  N - number of global columns (or PETSC_DETERMINE)
23cb13003dSBarry Smith -  comm - MPI communicator
247807a1faSBarry Smith 
257807a1faSBarry Smith    Output Parameter:
26dc401e71SLois Curfman McInnes .  A - the matrix
27e0b365e2SLois Curfman McInnes 
28dc401e71SLois Curfman McInnes    Basic Options Database Keys:
29dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
30dc401e71SLois Curfman McInnes    depending on the communicator, comm.
31cb13003dSBarry Smith +    -mat_aij      - AIJ type
32cb13003dSBarry Smith .    -mat_baij     - block AIJ type
33cb13003dSBarry Smith .    -mat_dense    - dense type
34cb13003dSBarry Smith -    -mat_bdiag    - block diagonal type
35dc401e71SLois Curfman McInnes 
36dc401e71SLois Curfman McInnes    More Options Database Keys:
37cb13003dSBarry Smith +    -mat_seqaij   - AIJ type, uses MatCreateSeqAIJ()
38cb13003dSBarry Smith .    -mat_mpiaij   - AIJ type, uses MatCreateMPIAIJ()
39cb13003dSBarry Smith .    -mat_seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
40cb13003dSBarry Smith .    -mat_mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
41cb13003dSBarry Smith .    -mat_mpirowbs - rowbs type, uses MatCreateMPIRowbs()
42cb13003dSBarry Smith .    -mat_seqdense - dense type, uses MatCreateSeqDense()
43cb13003dSBarry Smith .    -mat_mpidense - dense type, uses MatCreateMPIDense()
44cb13003dSBarry Smith .    -mat_seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
45cb13003dSBarry Smith -    -mat_mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
46e0b365e2SLois Curfman McInnes 
4783e1b59cSLois Curfman McInnes    Even More Options Database Keys:
4883e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
4983e1b59cSLois Curfman McInnes    for additional format-specific options.
50e0b365e2SLois Curfman McInnes 
51bd9ce289SLois Curfman McInnes    Notes:
52*ec6e0d80SSatish Balay    If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the
53*ec6e0d80SSatish Balay    user must ensure that they are chosen to be compatible with the
54*ec6e0d80SSatish Balay    vectors. To do this, one first considers the matrix-vector product
55*ec6e0d80SSatish Balay    'y = A x'. The 'm' that is used in the above routine must match the
56*ec6e0d80SSatish Balay    local size used in the vector creation routine VecCreateMPI() for 'y'.
57*ec6e0d80SSatish Balay    Likewise, the 'n' used must match that used as the local size in
58*ec6e0d80SSatish Balay    VecCreateMPI() for 'x'.
59*ec6e0d80SSatish Balay 
603ffaccefSLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determine the matrix type.
61bd9ce289SLois Curfman McInnes 
621d69843bSLois Curfman McInnes    Level: beginner
631d69843bSLois Curfman McInnes 
64dc401e71SLois Curfman McInnes .keywords: matrix, create
65e0b365e2SLois Curfman McInnes 
66fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
67fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
6839ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
69db81eaa0SLois Curfman McInnes           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ()
70ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
717807a1faSBarry Smith @*/
7282b900a8SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A)
737807a1faSBarry Smith {
74dbb450caSBarry Smith   MatType    type;
7556cd22aeSBarry Smith   PetscTruth set;
7656cd22aeSBarry Smith   int        ierr, bs=1, flg;
77dbb450caSBarry Smith 
783a40ed3dSBarry Smith   PetscFunctionBegin;
7977c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set);CHKERRQ(ierr);
80dfa27b74SSatish Balay   switch (type) {
81dfa27b74SSatish Balay   case MATSEQDENSE:
8282b900a8SBarry Smith     m    = PetscMax(m,M);
8382b900a8SBarry Smith     n    = PetscMax(n,N);
8487bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A);CHKERRQ(ierr);
85dfa27b74SSatish Balay     break;
86dfa27b74SSatish Balay   case MATMPIBDIAG:
8782b900a8SBarry Smith     ierr = MatCreateMPIBDiag(comm,m,M,N,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,A);CHKERRQ(ierr);
88dfa27b74SSatish Balay     break;
89dfa27b74SSatish Balay   case MATSEQBDIAG:
9082b900a8SBarry Smith     m    = PetscMax(m,M);
9182b900a8SBarry Smith     n    = PetscMax(n,N);
9282b900a8SBarry Smith     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,A);CHKERRQ(ierr);
93dfa27b74SSatish Balay     break;
94dfa27b74SSatish Balay   case MATMPIROWBS:
9582b900a8SBarry Smith     ierr = MatCreateMPIRowbs(comm,m,M,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,A);CHKERRQ(ierr);
96dfa27b74SSatish Balay     break;
97dfa27b74SSatish Balay   case MATMPIDENSE:
9882b900a8SBarry Smith     ierr = MatCreateMPIDense(comm,m,n,M,N,PETSC_NULL,A);CHKERRQ(ierr);
99dfa27b74SSatish Balay     break;
100dfa27b74SSatish Balay   case MATMPIAIJ:
10182b900a8SBarry Smith     ierr = MatCreateMPIAIJ(comm,m,n,M,N,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
102dfa27b74SSatish Balay     break;
103dfa27b74SSatish Balay   case MATSEQBAIJ:
10482b900a8SBarry Smith     m    = PetscMax(m,M);
10582b900a8SBarry Smith     n    = PetscMax(n,N);
106cd0e1443SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
10787bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
108ed1f4bc7SLois Curfman McInnes     break;
1098130634dSSatish Balay   case MATMPIBAIJ:
1108130634dSSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
11182b900a8SBarry Smith     ierr = MatCreateMPIBAIJ(comm,bs,m,n,M,N,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
1128130634dSSatish Balay     break;
11324b2b559SSatish Balay   default:
11482b900a8SBarry Smith     m    = PetscMax(m,M);
11582b900a8SBarry Smith     n    = PetscMax(n,N);
11687bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A);CHKERRQ(ierr);
11724b2b559SSatish Balay     break;
118dfa27b74SSatish Balay   }
1193a40ed3dSBarry Smith   PetscFunctionReturn(0);
1207807a1faSBarry Smith }
1217807a1faSBarry Smith 
122dae03382SLois Curfman McInnes 
123dae03382SLois Curfman McInnes 
124d5d45c9bSBarry Smith 
125d5d45c9bSBarry Smith 
126