1*6dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
255fcb7f5SSatish Balay
355fcb7f5SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
455fcb7f5SSatish Balay #define petscfprintf_ PETSCFPRINTF
555fcb7f5SSatish Balay #define petscprintf_ PETSCPRINTF
655fcb7f5SSatish Balay #define petscsynchronizedfprintf_ PETSCSYNCHRONIZEDFPRINTF
755fcb7f5SSatish Balay #define petscsynchronizedprintf_ PETSCSYNCHRONIZEDPRINTF
80ec8b6e3SBarry Smith #define petscsynchronizedflush_ PETSCSYNCHRONIZEDFLUSH
955fcb7f5SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
1055fcb7f5SSatish Balay #define petscfprintf_ petscfprintf
1155fcb7f5SSatish Balay #define petscprintf_ petscprintf
1255fcb7f5SSatish Balay #define petscsynchronizedfprintf_ petscsynchronizedfprintf
1355fcb7f5SSatish Balay #define petscsynchronizedprintf_ petscsynchronizedprintf
140ec8b6e3SBarry Smith #define petscsynchronizedflush_ petscsynchronizedflush
1555fcb7f5SSatish Balay #endif
1655fcb7f5SSatish Balay
1718d1adefSBarry Smith #if defined(__cplusplus)
1818d1adefSBarry Smith extern "C" {
1918d1adefSBarry Smith #endif
2018d1adefSBarry Smith
petscsynchronizedflush_(MPI_Fint * comm,FILE ** file,int * ierr)2119caf8f3SSatish Balay PETSC_EXTERN void petscsynchronizedflush_(MPI_Fint *comm, FILE **file, int *ierr)
220ec8b6e3SBarry Smith {
23e50bf69fSBarry Smith FILE *f = *file;
24e50bf69fSBarry Smith if (!f) f = PETSC_STDOUT; /* support for PETSC_STDOUT in Fortran */
25e50bf69fSBarry Smith *ierr = PetscSynchronizedFlush(MPI_Comm_f2c(*(comm)), f);
260ec8b6e3SBarry Smith }
270ec8b6e3SBarry Smith
PetscFixSlashN(const char * in,char * out[])28dd460d27SBarry Smith static PetscErrorCode PetscFixSlashN(const char *in, char *out[])
291850a936SBarry Smith {
303ca90d2dSJacob Faibussowitsch size_t i, len;
311850a936SBarry Smith
321850a936SBarry Smith PetscFunctionBegin;
339566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(in, out));
349566063dSJacob Faibussowitsch PetscCall(PetscStrlen(*out, &len));
353ca90d2dSJacob Faibussowitsch for (i = 0; i < len - 1; i++) {
365975b3b6SBarry Smith if ((*out)[i] == '\\' && (*out)[i + 1] == 'n') {
375975b3b6SBarry Smith (*out)[i] = ' ';
385975b3b6SBarry Smith (*out)[i + 1] = '\n';
395975b3b6SBarry Smith }
401850a936SBarry Smith }
413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
421850a936SBarry Smith }
431850a936SBarry Smith
petscfprintf_(MPI_Comm * comm,FILE ** file,char * fname,PetscErrorCode * ierr,PETSC_FORTRAN_CHARLEN_T len1)4419caf8f3SSatish Balay PETSC_EXTERN void petscfprintf_(MPI_Comm *comm, FILE **file, char *fname, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1)
4555fcb7f5SSatish Balay {
461850a936SBarry Smith char *c1, *tmp;
4755fcb7f5SSatish Balay
4855fcb7f5SSatish Balay FIXCHAR(fname, len1, c1);
495975b3b6SBarry Smith *ierr = PetscFixSlashN(c1, &tmp);
505975b3b6SBarry Smith if (*ierr) return;
5155fcb7f5SSatish Balay FREECHAR(fname, c1);
525975b3b6SBarry Smith *ierr = PetscFPrintf(MPI_Comm_f2c(*(MPI_Fint *)&*comm), *file, "%s", tmp);
535975b3b6SBarry Smith if (*ierr) return;
548bceffaeSBarry Smith *ierr = PetscFree(tmp);
5555fcb7f5SSatish Balay }
5655fcb7f5SSatish Balay
petscprintf_(MPI_Comm * comm,char * fname,PetscErrorCode * ierr,PETSC_FORTRAN_CHARLEN_T len1)5719caf8f3SSatish Balay PETSC_EXTERN void petscprintf_(MPI_Comm *comm, char *fname, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1)
5855fcb7f5SSatish Balay {
591850a936SBarry Smith char *c1, *tmp;
6055fcb7f5SSatish Balay
6155fcb7f5SSatish Balay FIXCHAR(fname, len1, c1);
625975b3b6SBarry Smith *ierr = PetscFixSlashN(c1, &tmp);
635975b3b6SBarry Smith if (*ierr) return;
6455fcb7f5SSatish Balay FREECHAR(fname, c1);
655975b3b6SBarry Smith *ierr = PetscPrintf(MPI_Comm_f2c(*(MPI_Fint *)&*comm), "%s", tmp);
665975b3b6SBarry Smith if (*ierr) return;
678bceffaeSBarry Smith *ierr = PetscFree(tmp);
6855fcb7f5SSatish Balay }
6955fcb7f5SSatish Balay
petscsynchronizedfprintf_(MPI_Comm * comm,FILE ** file,char * fname,PetscErrorCode * ierr,PETSC_FORTRAN_CHARLEN_T len1)7019caf8f3SSatish Balay PETSC_EXTERN void petscsynchronizedfprintf_(MPI_Comm *comm, FILE **file, char *fname, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1)
7155fcb7f5SSatish Balay {
721850a936SBarry Smith char *c1, *tmp;
7355fcb7f5SSatish Balay
7455fcb7f5SSatish Balay FIXCHAR(fname, len1, c1);
755975b3b6SBarry Smith *ierr = PetscFixSlashN(c1, &tmp);
765975b3b6SBarry Smith if (*ierr) return;
7755fcb7f5SSatish Balay FREECHAR(fname, c1);
785975b3b6SBarry Smith *ierr = PetscSynchronizedFPrintf(MPI_Comm_f2c(*(MPI_Fint *)&*comm), *file, "%s", tmp);
795975b3b6SBarry Smith if (*ierr) return;
808bceffaeSBarry Smith *ierr = PetscFree(tmp);
8155fcb7f5SSatish Balay }
8255fcb7f5SSatish Balay
petscsynchronizedprintf_(MPI_Comm * comm,char * fname,PetscErrorCode * ierr,PETSC_FORTRAN_CHARLEN_T len1)8319caf8f3SSatish Balay PETSC_EXTERN void petscsynchronizedprintf_(MPI_Comm *comm, char *fname, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len1)
8455fcb7f5SSatish Balay {
851850a936SBarry Smith char *c1, *tmp;
8655fcb7f5SSatish Balay
8755fcb7f5SSatish Balay FIXCHAR(fname, len1, c1);
885975b3b6SBarry Smith *ierr = PetscFixSlashN(c1, &tmp);
895975b3b6SBarry Smith if (*ierr) return;
9055fcb7f5SSatish Balay FREECHAR(fname, c1);
915975b3b6SBarry Smith *ierr = PetscSynchronizedPrintf(MPI_Comm_f2c(*(MPI_Fint *)&*comm), "%s", tmp);
925975b3b6SBarry Smith if (*ierr) return;
938bceffaeSBarry Smith *ierr = PetscFree(tmp);
9455fcb7f5SSatish Balay }
9518d1adefSBarry Smith #if defined(__cplusplus)
9618d1adefSBarry Smith }
9718d1adefSBarry Smith #endif
98