xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 7d6bfa3b9d7db0ccd4cc481237114ca8dbb0dbff)
1ce0a2cd1SBarry Smith #include "private/fortranimpl.h"
2f4e70085SSatish Balay #include "petscmat.h"
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5*7d6bfa3bSBarry Smith #define matdestroymatrices_              MATDESTROYMATRICES
65dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
735bd34faSBarry Smith #define matfactorgetsolverpackage_       MATFACTORGETSOLVERPACKAGE
8f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
9f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
10f4e70085SSatish Balay #define matgetrow_                       MATGETROW
11f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
12f4e70085SSatish Balay #define matview_                         MATVIEW
13f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
14f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
15f4e70085SSatish Balay #define matconvert_                      MATCONVERT
16f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
17f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
18f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
19f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
20f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
211eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
227c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
23812c3f48SMatthew Knepley #define matnullspaceremove_              MATNULLSPACEREMOVE
24f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
25*7d6bfa3bSBarry Smith #define matdestroymatrices_              matdestroymatrices_
265dffd610SBarry Smith #define matgetfactor_                    matgetfactor
2735bd34faSBarry Smith #define matfactorgetsolverpackage_       matfactorgetsolverpackage
287c54600cSBarry Smith #define matgetvecs_                      matgetvecs
29f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
30f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
31f4e70085SSatish Balay #define matgetrow_                       matgetrow
32f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
33f4e70085SSatish Balay #define matview_                         matview
34f4e70085SSatish Balay #define matgetarray_                     matgetarray
35f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
36f4e70085SSatish Balay #define matconvert_                      matconvert
37f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
38f4e70085SSatish Balay #define matzerorows_                     matzerorows
39f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
40f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
41f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
421eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
43812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
44f4e70085SSatish Balay #endif
45f4e70085SSatish Balay 
46f4e70085SSatish Balay EXTERN_C_BEGIN
47f4e70085SSatish Balay 
487c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr )
497c54600cSBarry Smith {
507c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
517c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
527c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
537c54600cSBarry Smith }
547c54600cSBarry Smith 
558f7157efSSatish Balay void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
568f7157efSSatish Balay                                 PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
57f4e70085SSatish Balay {
58f4e70085SSatish Balay   PetscInt *IA,*JA;
598f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
60f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
61f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
62f4e70085SSatish Balay }
63f4e70085SSatish Balay 
648f7157efSSatish Balay void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
658f7157efSSatish Balay                                     PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
66f4e70085SSatish Balay {
67f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
688f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
69f4e70085SSatish Balay }
70f4e70085SSatish Balay 
71f4e70085SSatish Balay /*
72f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
73f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
74f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
75f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
76f4e70085SSatish Balay   at a time.
77f4e70085SSatish Balay */
78f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
79f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
80f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
81f4e70085SSatish Balay 
82f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
83f4e70085SSatish Balay {
84f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
85f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
86f4e70085SSatish Balay 
87f4e70085SSatish Balay   if (matgetrowactive) {
88f4e70085SSatish Balay      PetscError(__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,1,0,
89f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
90f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
91f4e70085SSatish Balay      *ierr = 1;
92f4e70085SSatish Balay      return;
93f4e70085SSatish Balay   }
94f4e70085SSatish Balay 
95f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
96f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
97f4e70085SSatish Balay 
98f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
99f4e70085SSatish Balay   if (*ierr) return;
100f4e70085SSatish Balay 
101f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
102f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
103f4e70085SSatish Balay   matgetrowactive = 1;
104f4e70085SSatish Balay }
105f4e70085SSatish Balay 
106f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
107f4e70085SSatish Balay {
108f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
109f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
110f4e70085SSatish Balay   if (!matgetrowactive) {
111f4e70085SSatish Balay      PetscError(__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,1,0,
112f4e70085SSatish Balay                "Must call MatGetRow() first");
113f4e70085SSatish Balay      *ierr = 1;
114f4e70085SSatish Balay      return;
115f4e70085SSatish Balay   }
116f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
117f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
118f4e70085SSatish Balay 
119f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
120f4e70085SSatish Balay   matgetrowactive = 0;
121f4e70085SSatish Balay }
122f4e70085SSatish Balay 
123f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
124f4e70085SSatish Balay {
125f4e70085SSatish Balay   PetscViewer v;
126f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
127f4e70085SSatish Balay   *ierr = MatView(*mat,v);
128f4e70085SSatish Balay }
129f4e70085SSatish Balay 
130f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
131f4e70085SSatish Balay {
132f4e70085SSatish Balay   PetscScalar *mm;
133f4e70085SSatish Balay   PetscInt    m,n;
134f4e70085SSatish Balay 
135f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
136f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
137f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
138f4e70085SSatish Balay }
139f4e70085SSatish Balay 
140f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
141f4e70085SSatish Balay {
142f4e70085SSatish Balay   PetscScalar          *lx;
143f4e70085SSatish Balay   PetscInt                  m,n;
144f4e70085SSatish Balay 
145f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
146f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
147f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
148f4e70085SSatish Balay }
149f4e70085SSatish Balay 
15035bd34faSBarry Smith void PETSC_STDCALL matfactorgetsolverpackage_(Mat *mat,CHAR name PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
15135bd34faSBarry Smith {
15235bd34faSBarry Smith   const char *tname;
15335bd34faSBarry Smith 
15435bd34faSBarry Smith   *ierr = MatFactorGetSolverPackage(*mat,&tname);if (*ierr) return;
15535bd34faSBarry Smith   if (name != PETSC_NULL_CHARACTER_Fortran) {
15635bd34faSBarry Smith     *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
15735bd34faSBarry Smith   }
15835bd34faSBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
15935bd34faSBarry Smith }
16035bd34faSBarry Smith 
1615dffd610SBarry Smith void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
1625dffd610SBarry Smith {
1635dffd610SBarry Smith   char *t;
1645dffd610SBarry Smith   FIXCHAR(outtype,len,t);
165c911e420SBarry Smith   *ierr = MatGetFactor(*mat,t,ftype,M);
1665dffd610SBarry Smith   FREECHAR(outtype,t);
1675dffd610SBarry Smith }
1685dffd610SBarry Smith 
169f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
170f4e70085SSatish Balay {
171f4e70085SSatish Balay   char *t;
172f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
173f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
174f4e70085SSatish Balay   FREECHAR(outtype,t);
175f4e70085SSatish Balay }
176f4e70085SSatish Balay 
177f4e70085SSatish Balay /*
178f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
179f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
180f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
181f4e70085SSatish Balay */
182f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
183f4e70085SSatish Balay {
184f4e70085SSatish Balay   Mat *lsmat;
185f4e70085SSatish Balay   PetscInt i;
186f4e70085SSatish Balay 
187f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
188f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
189f4e70085SSatish Balay     for (i=0; i<*n; i++) {
190f4e70085SSatish Balay       smat[i] = lsmat[i];
191f4e70085SSatish Balay     }
192f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
193f4e70085SSatish Balay   } else {
194f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
195f4e70085SSatish Balay   }
196f4e70085SSatish Balay }
197f4e70085SSatish Balay 
198*7d6bfa3bSBarry Smith /*
199*7d6bfa3bSBarry Smith     MatDestroyMatrices() is slightly different from C since the
200*7d6bfa3bSBarry Smith     Fortran provides the array to hold the submatrix objects,while in C that
201*7d6bfa3bSBarry Smith     array is allocated by the MatGetSubmatrices()
202*7d6bfa3bSBarry Smith */
203*7d6bfa3bSBarry Smith void PETSC_STDCALL matdestroymatrices_(Mat *mat,PetscInt *n,Mat *smat,PetscErrorCode *ierr)
204*7d6bfa3bSBarry Smith {
205*7d6bfa3bSBarry Smith   PetscInt i;
206*7d6bfa3bSBarry Smith 
207*7d6bfa3bSBarry Smith   for (i=0; i<*n; i++) {
208*7d6bfa3bSBarry Smith     *ierr = MatDestroy(smat[i]);if (*ierr) return;
209*7d6bfa3bSBarry Smith   }
210*7d6bfa3bSBarry Smith }
211*7d6bfa3bSBarry Smith 
212f4e70085SSatish Balay void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
213f4e70085SSatish Balay {
214f4e70085SSatish Balay   *ierr = MatZeroRows(*mat,*numRows,rows,*diag);
215f4e70085SSatish Balay }
216f4e70085SSatish Balay 
217f4e70085SSatish Balay void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
218f4e70085SSatish Balay {
219f4e70085SSatish Balay   *ierr = MatZeroRowsIS(*mat,*is,*diag);
220f4e70085SSatish Balay }
221f4e70085SSatish Balay 
222f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
223f4e70085SSatish Balay {
224f4e70085SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag);
225f4e70085SSatish Balay }
226f4e70085SSatish Balay 
227f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
228f4e70085SSatish Balay {
229f4e70085SSatish Balay   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag);
230f4e70085SSatish Balay }
231f4e70085SSatish Balay 
2321eea217eSSatish Balay 
2331eea217eSSatish Balay void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),
2341eea217eSSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
2351eea217eSSatish Balay {
2361eea217eSSatish Balay   char *t;
2371eea217eSSatish Balay 
2381eea217eSSatish Balay   FIXCHAR(prefix,len,t);
2391eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
2401eea217eSSatish Balay   FREECHAR(prefix,t);
2411eea217eSSatish Balay }
2421eea217eSSatish Balay 
243812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
244812c3f48SMatthew Knepley {
245812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
246812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
247812c3f48SMatthew Knepley }
2481eea217eSSatish Balay 
249f4e70085SSatish Balay EXTERN_C_END
250