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 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 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 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 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 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 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