xref: /petsc/src/mat/interface/ftn-custom/zmatrixf.c (revision 1eea217ea1b76fed4887dc25ca0bd0d01f6b1562)
1f4e70085SSatish Balay #include "zpetsc.h"
2f4e70085SSatish Balay #include "petscmat.h"
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f4e70085SSatish Balay #define matgetrowij_                     MATGETROWIJ
6f4e70085SSatish Balay #define matrestorerowij_                 MATRESTOREROWIJ
7f4e70085SSatish Balay #define matgetrow_                       MATGETROW
8f4e70085SSatish Balay #define matrestorerow_                   MATRESTOREROW
9f4e70085SSatish Balay #define matview_                         MATVIEW
10f4e70085SSatish Balay #define matgetarray_                     MATGETARRAY
11f4e70085SSatish Balay #define matrestorearray_                 MATRESTOREARRAY
12f4e70085SSatish Balay #define mattranspose_                    MATTRANSPOSE
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
19*1eea217eSSatish Balay #define matsetoptionsprefix_             MATSETOPTIONSPREFIX
20f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
21f4e70085SSatish Balay #define matgetrowij_                     matgetrowij
22f4e70085SSatish Balay #define matrestorerowij_                 matrestorerowij
23f4e70085SSatish Balay #define matgetrow_                       matgetrow
24f4e70085SSatish Balay #define matrestorerow_                   matrestorerow
25f4e70085SSatish Balay #define matview_                         matview
26f4e70085SSatish Balay #define matgetarray_                     matgetarray
27f4e70085SSatish Balay #define matrestorearray_                 matrestorearray
28f4e70085SSatish Balay #define mattranspose_                    mattranspose
29f4e70085SSatish Balay #define matconvert_                      matconvert
30f4e70085SSatish Balay #define matgetsubmatrices_               matgetsubmatrices
31f4e70085SSatish Balay #define matzerorows_                     matzerorows
32f4e70085SSatish Balay #define matzerorowsis_                   matzerorowsis
33f4e70085SSatish Balay #define matzerorowslocal_                matzerorowslocal
34f4e70085SSatish Balay #define matzerorowslocalis_              matzerorowslocalis
35*1eea217eSSatish Balay #define matsetoptionsprefix_             matsetoptionsprefix
36f4e70085SSatish Balay #endif
37f4e70085SSatish Balay 
38f4e70085SSatish Balay EXTERN_C_BEGIN
39f4e70085SSatish Balay 
40f4e70085SSatish Balay void PETSC_STDCALL matgetrowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscInt *n,PetscInt *ia,size_t *iia,PetscInt *ja,size_t *jja,
41f4e70085SSatish Balay                                 PetscTruth *done,PetscErrorCode *ierr)
42f4e70085SSatish Balay {
43f4e70085SSatish Balay   PetscInt *IA,*JA;
44f4e70085SSatish Balay   *ierr = MatGetRowIJ(*B,*shift,*sym,n,&IA,&JA,done);if (*ierr) return;
45f4e70085SSatish Balay   *iia  = PetscIntAddressToFortran(ia,IA);
46f4e70085SSatish Balay   *jja  = PetscIntAddressToFortran(ja,JA);
47f4e70085SSatish Balay }
48f4e70085SSatish Balay 
49f4e70085SSatish Balay void PETSC_STDCALL matrestorerowij_(Mat *B,PetscInt *shift,PetscTruth *sym,PetscInt *n,PetscInt *ia,size_t *iia,PetscInt *ja,size_t *jja,
50f4e70085SSatish Balay                                     PetscTruth *done,PetscErrorCode *ierr)
51f4e70085SSatish Balay {
52f4e70085SSatish Balay   PetscInt *IA = PetscIntAddressFromFortran(ia,*iia),*JA = PetscIntAddressFromFortran(ja,*jja);
53f4e70085SSatish Balay   *ierr = MatRestoreRowIJ(*B,*shift,*sym,n,&IA,&JA,done);
54f4e70085SSatish Balay }
55f4e70085SSatish Balay 
56f4e70085SSatish Balay /*
57f4e70085SSatish Balay    This is a poor way of storing the column and value pointers
58f4e70085SSatish Balay   generated by MatGetRow() to be returned with MatRestoreRow()
59f4e70085SSatish Balay   but there is not natural,good place else to store them. Hence
60f4e70085SSatish Balay   Fortran programmers can only have one outstanding MatGetRows()
61f4e70085SSatish Balay   at a time.
62f4e70085SSatish Balay */
63f4e70085SSatish Balay static PetscErrorCode    matgetrowactive = 0;
64f4e70085SSatish Balay static const PetscInt    *my_ocols = 0;
65f4e70085SSatish Balay static const PetscScalar *my_ovals = 0;
66f4e70085SSatish Balay 
67f4e70085SSatish Balay void PETSC_STDCALL matgetrow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
68f4e70085SSatish Balay {
69f4e70085SSatish Balay   const PetscInt    **oocols = &my_ocols;
70f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
71f4e70085SSatish Balay 
72f4e70085SSatish Balay   if (matgetrowactive) {
73f4e70085SSatish Balay      PetscError(__LINE__,"MatGetRow_Fortran",__FILE__,__SDIR__,1,0,
74f4e70085SSatish Balay                "Cannot have two MatGetRow() active simultaneously\n\
75f4e70085SSatish Balay                call MatRestoreRow() before calling MatGetRow() a second time");
76f4e70085SSatish Balay      *ierr = 1;
77f4e70085SSatish Balay      return;
78f4e70085SSatish Balay   }
79f4e70085SSatish Balay 
80f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
81f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
82f4e70085SSatish Balay 
83f4e70085SSatish Balay   *ierr = MatGetRow(*mat,*row,ncols,oocols,oovals);
84f4e70085SSatish Balay   if (*ierr) return;
85f4e70085SSatish Balay 
86f4e70085SSatish Balay   if (oocols) { *ierr = PetscMemcpy(cols,my_ocols,(*ncols)*sizeof(PetscInt)); if (*ierr) return;}
87f4e70085SSatish Balay   if (oovals) { *ierr = PetscMemcpy(vals,my_ovals,(*ncols)*sizeof(PetscScalar)); if (*ierr) return; }
88f4e70085SSatish Balay   matgetrowactive = 1;
89f4e70085SSatish Balay }
90f4e70085SSatish Balay 
91f4e70085SSatish Balay void PETSC_STDCALL matrestorerow_(Mat *mat,PetscInt *row,PetscInt *ncols,PetscInt *cols,PetscScalar *vals,PetscErrorCode *ierr)
92f4e70085SSatish Balay {
93f4e70085SSatish Balay   const PetscInt         **oocols = &my_ocols;
94f4e70085SSatish Balay   const PetscScalar **oovals = &my_ovals;
95f4e70085SSatish Balay   if (!matgetrowactive) {
96f4e70085SSatish Balay      PetscError(__LINE__,"MatRestoreRow_Fortran",__FILE__,__SDIR__,1,0,
97f4e70085SSatish Balay                "Must call MatGetRow() first");
98f4e70085SSatish Balay      *ierr = 1;
99f4e70085SSatish Balay      return;
100f4e70085SSatish Balay   }
101f4e70085SSatish Balay   CHKFORTRANNULLINTEGER(cols); if (!cols) oocols = PETSC_NULL;
102f4e70085SSatish Balay   CHKFORTRANNULLSCALAR(vals);  if (!vals) oovals = PETSC_NULL;
103f4e70085SSatish Balay 
104f4e70085SSatish Balay   *ierr = MatRestoreRow(*mat,*row,ncols,oocols,oovals);
105f4e70085SSatish Balay   matgetrowactive = 0;
106f4e70085SSatish Balay }
107f4e70085SSatish Balay 
108f4e70085SSatish Balay void PETSC_STDCALL matview_(Mat *mat,PetscViewer *vin,PetscErrorCode *ierr)
109f4e70085SSatish Balay {
110f4e70085SSatish Balay   PetscViewer v;
111f4e70085SSatish Balay   PetscPatchDefaultViewers_Fortran(vin,v);
112f4e70085SSatish Balay   *ierr = MatView(*mat,v);
113f4e70085SSatish Balay }
114f4e70085SSatish Balay 
115f4e70085SSatish Balay void PETSC_STDCALL matgetarray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
116f4e70085SSatish Balay {
117f4e70085SSatish Balay   PetscScalar *mm;
118f4e70085SSatish Balay   PetscInt    m,n;
119f4e70085SSatish Balay 
120f4e70085SSatish Balay   *ierr = MatGetArray(*mat,&mm); if (*ierr) return;
121f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n);  if (*ierr) return;
122f4e70085SSatish Balay   *ierr = PetscScalarAddressToFortran((PetscObject)*mat,fa,mm,m*n,ia); if (*ierr) return;
123f4e70085SSatish Balay }
124f4e70085SSatish Balay 
125f4e70085SSatish Balay void PETSC_STDCALL matrestorearray_(Mat *mat,PetscScalar *fa,size_t *ia,PetscErrorCode *ierr)
126f4e70085SSatish Balay {
127f4e70085SSatish Balay   PetscScalar          *lx;
128f4e70085SSatish Balay   PetscInt                  m,n;
129f4e70085SSatish Balay 
130f4e70085SSatish Balay   *ierr = MatGetSize(*mat,&m,&n); if (*ierr) return;
131f4e70085SSatish Balay   *ierr = PetscScalarAddressFromFortran((PetscObject)*mat,fa,*ia,m*n,&lx);if (*ierr) return;
132f4e70085SSatish Balay   *ierr = MatRestoreArray(*mat,&lx);if (*ierr) return;
133f4e70085SSatish Balay }
134f4e70085SSatish Balay 
135f4e70085SSatish Balay void PETSC_STDCALL mattranspose_(Mat *mat,Mat *B,PetscErrorCode *ierr)
136f4e70085SSatish Balay {
137f4e70085SSatish Balay   CHKFORTRANNULLOBJECT(B);
138f4e70085SSatish Balay   *ierr = MatTranspose(*mat,B);
139f4e70085SSatish Balay }
140f4e70085SSatish Balay 
141f4e70085SSatish Balay void PETSC_STDCALL matconvert_(Mat *mat,CHAR outtype PETSC_MIXED_LEN(len),MatReuse *reuse,Mat *M,PetscErrorCode *ierr PETSC_END_LEN(len))
142f4e70085SSatish Balay {
143f4e70085SSatish Balay   char *t;
144f4e70085SSatish Balay   FIXCHAR(outtype,len,t);
145f4e70085SSatish Balay   *ierr = MatConvert(*mat,t,*reuse,M);
146f4e70085SSatish Balay   FREECHAR(outtype,t);
147f4e70085SSatish Balay }
148f4e70085SSatish Balay 
149f4e70085SSatish Balay /*
150f4e70085SSatish Balay     MatGetSubmatrices() is slightly different from C since the
151f4e70085SSatish Balay     Fortran provides the array to hold the submatrix objects,while in C that
152f4e70085SSatish Balay     array is allocated by the MatGetSubmatrices()
153f4e70085SSatish Balay */
154f4e70085SSatish Balay void PETSC_STDCALL matgetsubmatrices_(Mat *mat,PetscInt *n,IS *isrow,IS *iscol,MatReuse *scall,Mat *smat,PetscErrorCode *ierr)
155f4e70085SSatish Balay {
156f4e70085SSatish Balay   Mat *lsmat;
157f4e70085SSatish Balay   PetscInt i;
158f4e70085SSatish Balay 
159f4e70085SSatish Balay   if (*scall == MAT_INITIAL_MATRIX) {
160f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&lsmat);
161f4e70085SSatish Balay     for (i=0; i<*n; i++) {
162f4e70085SSatish Balay       smat[i] = lsmat[i];
163f4e70085SSatish Balay     }
164f4e70085SSatish Balay     *ierr = PetscFree(lsmat);
165f4e70085SSatish Balay   } else {
166f4e70085SSatish Balay     *ierr = MatGetSubMatrices(*mat,*n,isrow,iscol,*scall,&smat);
167f4e70085SSatish Balay   }
168f4e70085SSatish Balay }
169f4e70085SSatish Balay 
170f4e70085SSatish Balay void PETSC_STDCALL matzerorows_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
171f4e70085SSatish Balay {
172f4e70085SSatish Balay   *ierr = MatZeroRows(*mat,*numRows,rows,*diag);
173f4e70085SSatish Balay }
174f4e70085SSatish Balay 
175f4e70085SSatish Balay void PETSC_STDCALL matzerorowsis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
176f4e70085SSatish Balay {
177f4e70085SSatish Balay   *ierr = MatZeroRowsIS(*mat,*is,*diag);
178f4e70085SSatish Balay }
179f4e70085SSatish Balay 
180f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocal_(Mat *mat,PetscInt *numRows,PetscInt *rows,PetscScalar *diag,PetscErrorCode *ierr)
181f4e70085SSatish Balay {
182f4e70085SSatish Balay   *ierr = MatZeroRowsLocal(*mat,*numRows,rows,*diag);
183f4e70085SSatish Balay }
184f4e70085SSatish Balay 
185f4e70085SSatish Balay void PETSC_STDCALL matzerorowslocalis_(Mat *mat,IS *is,PetscScalar *diag,PetscErrorCode *ierr)
186f4e70085SSatish Balay {
187f4e70085SSatish Balay   *ierr = MatZeroRowsLocalIS(*mat,*is,*diag);
188f4e70085SSatish Balay }
189f4e70085SSatish Balay 
190*1eea217eSSatish Balay 
191*1eea217eSSatish Balay void PETSC_STDCALL matsetoptionsprefix_(Mat *mat,CHAR prefix PETSC_MIXED_LEN(len),
192*1eea217eSSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
193*1eea217eSSatish Balay {
194*1eea217eSSatish Balay   char *t;
195*1eea217eSSatish Balay 
196*1eea217eSSatish Balay   FIXCHAR(prefix,len,t);
197*1eea217eSSatish Balay   *ierr = MatSetOptionsPrefix(*mat,t);
198*1eea217eSSatish Balay   FREECHAR(prefix,t);
199*1eea217eSSatish Balay }
200*1eea217eSSatish Balay 
201*1eea217eSSatish Balay 
202f4e70085SSatish Balay EXTERN_C_END
203