xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 35bd34fa3344fb53ae05f23bf99eddd2f9bb15e6)
1ce0a2cd1SBarry Smith #include "private/fortranimpl.h"
2f4e70085SSatish Balay #include "petscmat.h"
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
55dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
6*35bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
7f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
8f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
9f4e70085SSatish Balay #define matgetrow_                       MATGETROW
10f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
11f4e70085SSatish Balay #define matview_                         MATVIEW
12f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
13f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
14f4e70085SSatish Balay #define matconvert_                      MATCONVERT
15f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
16f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
17f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
18f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
19f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
201eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
217c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
22812c3f48SMatthew Knepley #define matnullspaceremove_              MATNULLSPACEREMOVE
23f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
245dffd610SBarry Smith #define matgetfactor_                    matgetfactor
25*35bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
267c54600cSBarry Smith #define matgetvecs_                      matgetvecs
27f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
28f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
29f4e70085SSatish Balay #define matgetrow_                       matgetrow
30f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
31f4e70085SSatish Balay #define matview_                         matview
32f4e70085SSatish Balay #define matgetarray_                     matgetarray
33f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
34f4e70085SSatish Balay #define matconvert_                      matconvert
35f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
36f4e70085SSatish Balay #define matzerorows_                     matzerorows
37f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
38f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
39f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
401eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
41812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
42f4e70085SSatish Balay #endif
43f4e70085SSatish Balay 
44f4e70085SSatish Balay EXTERN_C_BEGIN
45f4e70085SSatish Balay 
467c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr )
477c54600cSBarry Smith {
487c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
497c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
507c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
517c54600cSBarry Smith }
527c54600cSBarry Smith 
538f7157efSSatish Balay void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
548f7157efSSatish Balay                                 PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
55f4e70085SSatish Balay {
56f4e70085SSatish Balay   PetscInt *IA,*JA;
578f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
58f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
59f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
60f4e70085SSatish Balay }
61f4e70085SSatish Balay 
628f7157efSSatish Balay void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
638f7157efSSatish Balay                                     PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
64f4e70085SSatish Balay {
65f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
668f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
67f4e70085SSatish Balay }
68f4e70085SSatish Balay 
69f4e70085SSatish Balay /*
70f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
71f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
72f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
73f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
74f4e70085SSatish Balay   at a time.
75f4e70085SSatish Balay */
76f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
77f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
78f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
79f4e70085SSatish Balay 
80f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
81f4e70085SSatish Balay {
82f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
83f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
84f4e70085SSatish Balay 
85f4e70085SSatish Balay   if (matgetrowactive) {
86f4e70085SSatish Balay      PetscError(__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,1,0,
87f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
88f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
89f4e70085SSatish Balay      *ierr = 1;
90f4e70085SSatish Balay      return;
91f4e70085SSatish Balay   }
92f4e70085SSatish Balay 
93f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
94f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
95f4e70085SSatish Balay 
96f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
97f4e70085SSatish Balay   if (*ierr) return;
98f4e70085SSatish Balay 
99f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
100f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
101f4e70085SSatish Balay   matgetrowactive = 1;
102f4e70085SSatish Balay }
103f4e70085SSatish Balay 
104f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
105f4e70085SSatish Balay {
106f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
107f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
108f4e70085SSatish Balay   if (!matgetrowactive) {
109f4e70085SSatish Balay      PetscError(__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,1,0,
110f4e70085SSatish Balay                "Must call MatGetRow() first");
111f4e70085SSatish Balay      *ierr = 1;
112f4e70085SSatish Balay      return;
113f4e70085SSatish Balay   }
114f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
115f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
116f4e70085SSatish Balay 
117f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
118f4e70085SSatish Balay   matgetrowactive = 0;
119f4e70085SSatish Balay }
120f4e70085SSatish Balay 
121f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
122f4e70085SSatish Balay {
123f4e70085SSatish Balay   PetscViewer v;
124f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
125f4e70085SSatish Balay   *ierr = MatView(*mat,v);
126f4e70085SSatish Balay }
127f4e70085SSatish Balay 
128f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
129f4e70085SSatish Balay {
130f4e70085SSatish Balay   PetscScalar *mm;
131f4e70085SSatish Balay   PetscInt    m,n;
132f4e70085SSatish Balay 
133f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
134f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
135f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
136f4e70085SSatish Balay }
137f4e70085SSatish Balay 
138f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
139f4e70085SSatish Balay {
140f4e70085SSatish Balay   PetscScalar          *lx;
141f4e70085SSatish Balay   PetscInt                  m,n;
142f4e70085SSatish Balay 
143f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
144f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
145f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
146f4e70085SSatish Balay }
147f4e70085SSatish Balay 
148*35bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
149*35bd34faSBarry Smith {
150*35bd34faSBarry Smith   const char *tname;
151*35bd34faSBarry Smith 
152*35bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
153*35bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
154*35bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
155*35bd34faSBarry Smith   }
156*35bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
157*35bd34faSBarry Smith }
158*35bd34faSBarry Smith 
1595dffd610SBarry Smith void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
1605dffd610SBarry Smith {
1615dffd610SBarry Smith   char *t;
1625dffd610SBarry Smith   FIXCHAR(outtype,len,t);
163c911e420SBarry Smith   *ierr = MatGetFactor(*mat,t,ftype,M);
1645dffd610SBarry Smith   FREECHAR(outtype,t);
1655dffd610SBarry Smith }
1665dffd610SBarry Smith 
167f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
168f4e70085SSatish Balay {
169f4e70085SSatish Balay   char *t;
170f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
171f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
172f4e70085SSatish Balay   FREECHAR(outtype,t);
173f4e70085SSatish Balay }
174f4e70085SSatish Balay 
175f4e70085SSatish Balay /*
176f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
177f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
178f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
179f4e70085SSatish Balay */
180f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
181f4e70085SSatish Balay {
182f4e70085SSatish Balay   Mat *lsmat;
183f4e70085SSatish Balay   PetscInt i;
184f4e70085SSatish Balay 
185f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
186f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
187f4e70085SSatish Balay     for (i=0; i<*n; i++) {
188f4e70085SSatish Balay       smat[i] = lsmat[i];
189f4e70085SSatish Balay     }
190f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
191f4e70085SSatish Balay   } else {
192f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
193f4e70085SSatish Balay   }
194f4e70085SSatish Balay }
195f4e70085SSatish Balay 
196f4e70085SSatish Balay void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
197f4e70085SSatish Balay {
198f4e70085SSatish Balay   *ierr = MatZeroRows(*mat,*numRows,rows,*diag);
199f4e70085SSatish Balay }
200f4e70085SSatish Balay 
201f4e70085SSatish Balay void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
202f4e70085SSatish Balay {
203f4e70085SSatish Balay   *ierr = MatZeroRowsIS(*mat,*is,*diag);
204f4e70085SSatish Balay }
205f4e70085SSatish Balay 
206f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
207f4e70085SSatish Balay {
208f4e70085SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag);
209f4e70085SSatish Balay }
210f4e70085SSatish Balay 
211f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
212f4e70085SSatish Balay {
213f4e70085SSatish Balay   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag);
214f4e70085SSatish Balay }
215f4e70085SSatish Balay 
2161eea217eSSatish Balay 
2171eea217eSSatish Balay void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),
2181eea217eSSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
2191eea217eSSatish Balay {
2201eea217eSSatish Balay   char *t;
2211eea217eSSatish Balay 
2221eea217eSSatish Balay   FIXCHAR(prefix,len,t);
2231eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
2241eea217eSSatish Balay   FREECHAR(prefix,t);
2251eea217eSSatish Balay }
2261eea217eSSatish Balay 
227812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
228812c3f48SMatthew Knepley {
229812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
230812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
231812c3f48SMatthew Knepley }
2321eea217eSSatish Balay 
233f4e70085SSatish Balay EXTERN_C_END
234