xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 5dffd610ba0f7d1b98cf004897cd9ae601ebd0a5)
1ce0a2cd1SBarry Smith #include "private/fortranimpl.h"
2f4e70085SSatish Balay #include "petscmat.h"
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5*5dffd610SBarry Smith #define matgetfactor_                    MATGETFACTOR
6f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
7f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
8f4e70085SSatish Balay #define matgetrow_                       MATGETROW
9f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
10f4e70085SSatish Balay #define matview_                         MATVIEW
11f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
12f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
13f4e70085SSatish Balay #define matconvert_                      MATCONVERT
14f4e70085SSatish Balay #define matgetsubmatrices_               MATGETSUBMATRICES
15f4e70085SSatish Balay #define matzerorows_                     MATZEROROWS
16f4e70085SSatish Balay #define matzerorowsis_                   MATZEROROWSIS
17f4e70085SSatish Balay #define matzerorowslocal_                MATZEROROWSLOCAL
18f4e70085SSatish Balay #define matzerorowslocalis_              MATZEROROWSLOCALIS
191eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
207c54600cSBarry Smith #define matgetvecs_                      MATGETVECS
21812c3f48SMatthew Knepley #define matnullspaceremove_              MATNULLSPACEREMOVE
22f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
23*5dffd610SBarry Smith #define matgetfactor_                    matgetfactor
247c54600cSBarry Smith #define matgetvecs_                      matgetvecs
25f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
26f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
27f4e70085SSatish Balay #define matgetrow_                       matgetrow
28f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
29f4e70085SSatish Balay #define matview_                         matview
30f4e70085SSatish Balay #define matgetarray_                     matgetarray
31f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
32f4e70085SSatish Balay #define matconvert_                      matconvert
33f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
34f4e70085SSatish Balay #define matzerorows_                     matzerorows
35f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
36f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
37f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
381eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
39812c3f48SMatthew Knepley #define matnullspaceremove_              matnullspaceremove
40f4e70085SSatish Balay #endif
41f4e70085SSatish Balay 
42f4e70085SSatish Balay EXTERN_C_BEGIN
43f4e70085SSatish Balay 
447c54600cSBarry Smith void PETSC_STDCALL   matgetvecs_(Mat *mat,Vec *right,Vec *left, int *ierr )
457c54600cSBarry Smith {
467c54600cSBarry Smith   CHKFORTRANNULLOBJECT(right);
477c54600cSBarry Smith   CHKFORTRANNULLOBJECT(left);
487c54600cSBarry Smith   *ierr = MatGetVecs(*mat,right,left);
497c54600cSBarry Smith }
507c54600cSBarry Smith 
518f7157efSSatish Balay void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed,PetscInt *n,PetscInt *ia,size_t *iia,
528f7157efSSatish Balay                                 PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
53f4e70085SSatish Balay {
54f4e70085SSatish Balay   PetscInt *IA,*JA;
558f7157efSSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);if (*ierr) return;
56f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
57f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
58f4e70085SSatish Balay }
59f4e70085SSatish Balay 
608f7157efSSatish Balay void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscTruth *blockcompressed, PetscInt *n,PetscInt *ia,size_t *iia,
618f7157efSSatish Balay                                     PetscInt *ja,size_t *jja,PetscTruth *done,PetscErrorCode *ierr)
62f4e70085SSatish Balay {
63f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
648f7157efSSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,*blockcompressed,n,&IA,&JA,done);
65f4e70085SSatish Balay }
66f4e70085SSatish Balay 
67f4e70085SSatish Balay /*
68f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
69f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
70f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
71f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
72f4e70085SSatish Balay   at a time.
73f4e70085SSatish Balay */
74f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
75f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
76f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
77f4e70085SSatish Balay 
78f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
79f4e70085SSatish Balay {
80f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
81f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
82f4e70085SSatish Balay 
83f4e70085SSatish Balay   if (matgetrowactive) {
84f4e70085SSatish Balay      PetscError(__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,1,0,
85f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
86f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
87f4e70085SSatish Balay      *ierr = 1;
88f4e70085SSatish Balay      return;
89f4e70085SSatish Balay   }
90f4e70085SSatish Balay 
91f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
92f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
93f4e70085SSatish Balay 
94f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
95f4e70085SSatish Balay   if (*ierr) return;
96f4e70085SSatish Balay 
97f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
98f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
99f4e70085SSatish Balay   matgetrowactive = 1;
100f4e70085SSatish Balay }
101f4e70085SSatish Balay 
102f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
103f4e70085SSatish Balay {
104f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
105f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
106f4e70085SSatish Balay   if (!matgetrowactive) {
107f4e70085SSatish Balay      PetscError(__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,1,0,
108f4e70085SSatish Balay                "Must call MatGetRow() first");
109f4e70085SSatish Balay      *ierr = 1;
110f4e70085SSatish Balay      return;
111f4e70085SSatish Balay   }
112f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
113f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
114f4e70085SSatish Balay 
115f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
116f4e70085SSatish Balay   matgetrowactive = 0;
117f4e70085SSatish Balay }
118f4e70085SSatish Balay 
119f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
120f4e70085SSatish Balay {
121f4e70085SSatish Balay   PetscViewer v;
122f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
123f4e70085SSatish Balay   *ierr = MatView(*mat,v);
124f4e70085SSatish Balay }
125f4e70085SSatish Balay 
126f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
127f4e70085SSatish Balay {
128f4e70085SSatish Balay   PetscScalar *mm;
129f4e70085SSatish Balay   PetscInt    m,n;
130f4e70085SSatish Balay 
131f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
132f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
133f91d1997SBarry Smith   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,1,fa,mm,m*n,ia); if (*ierr) return;
134f4e70085SSatish Balay }
135f4e70085SSatish Balay 
136f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
137f4e70085SSatish Balay {
138f4e70085SSatish Balay   PetscScalar          *lx;
139f4e70085SSatish Balay   PetscInt                  m,n;
140f4e70085SSatish Balay 
141f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
142f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
143f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
144f4e70085SSatish Balay }
145f4e70085SSatish Balay 
146*5dffd610SBarry Smith void PETSC_STDCALL matgetfactor_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatFactorType ftype,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
147*5dffd610SBarry Smith {
148*5dffd610SBarry Smith   char *t;
149*5dffd610SBarry Smith   FIXCHAR(outtype,len,t);
150*5dffd610SBarry Smith   *ierr = MatGetFactorType(*mat,t,ftype,M);
151*5dffd610SBarry Smith   FREECHAR(outtype,t);
152*5dffd610SBarry Smith }
153*5dffd610SBarry Smith 
154f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
155f4e70085SSatish Balay {
156f4e70085SSatish Balay   char *t;
157f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
158f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
159f4e70085SSatish Balay   FREECHAR(outtype,t);
160f4e70085SSatish Balay }
161f4e70085SSatish Balay 
162f4e70085SSatish Balay /*
163f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
164f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
165f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
166f4e70085SSatish Balay */
167f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
168f4e70085SSatish Balay {
169f4e70085SSatish Balay   Mat *lsmat;
170f4e70085SSatish Balay   PetscInt i;
171f4e70085SSatish Balay 
172f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
173f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
174f4e70085SSatish Balay     for (i=0; i<*n; i++) {
175f4e70085SSatish Balay       smat[i] = lsmat[i];
176f4e70085SSatish Balay     }
177f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
178f4e70085SSatish Balay   } else {
179f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
180f4e70085SSatish Balay   }
181f4e70085SSatish Balay }
182f4e70085SSatish Balay 
183f4e70085SSatish Balay void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
184f4e70085SSatish Balay {
185f4e70085SSatish Balay   *ierr = MatZeroRows(*mat,*numRows,rows,*diag);
186f4e70085SSatish Balay }
187f4e70085SSatish Balay 
188f4e70085SSatish Balay void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
189f4e70085SSatish Balay {
190f4e70085SSatish Balay   *ierr = MatZeroRowsIS(*mat,*is,*diag);
191f4e70085SSatish Balay }
192f4e70085SSatish Balay 
193f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
194f4e70085SSatish Balay {
195f4e70085SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag);
196f4e70085SSatish Balay }
197f4e70085SSatish Balay 
198f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
199f4e70085SSatish Balay {
200f4e70085SSatish Balay   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag);
201f4e70085SSatish Balay }
202f4e70085SSatish Balay 
2031eea217eSSatish Balay 
2041eea217eSSatish Balay void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),
2051eea217eSSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
2061eea217eSSatish Balay {
2071eea217eSSatish Balay   char *t;
2081eea217eSSatish Balay 
2091eea217eSSatish Balay   FIXCHAR(prefix,len,t);
2101eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
2111eea217eSSatish Balay   FREECHAR(prefix,t);
2121eea217eSSatish Balay }
2131eea217eSSatish Balay 
214812c3f48SMatthew Knepley void PETSC_STDCALL matnullspaceremove_(MatNullSpace *sp,Vec *vec,Vec *out,PetscErrorCode *ierr)
215812c3f48SMatthew Knepley {
216812c3f48SMatthew Knepley   CHKFORTRANNULLOBJECT(out);
217812c3f48SMatthew Knepley   *ierr = MatNullSpaceRemove(*sp,*vec,out);
218812c3f48SMatthew Knepley }
2191eea217eSSatish Balay 
220f4e70085SSatish Balay EXTERN_C_END
221