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