diff --git a/configure.ac b/configure.ac index 021e7754..06b5b2e3 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,12 @@ -# Prelude. +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.64]) AC_INIT([IPhreeqc], [1.0], [charlton@usgs.gov]) AC_CONFIG_AUX_DIR([config]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +AC_CONFIG_SRCDIR([src/IPhreeqc.cpp]) # Checks for programs. AC_PROG_CXX @@ -17,9 +21,12 @@ AC_ARG_ENABLE([fortran], if test "X$IPQ_FORTRAN" = "Xyes"; then echo "yes" - AC_PROG_F77 - AC_F77_LIBRARY_LDFLAGS - AC_F77_WRAPPERS + AC_PROG_FC + AC_FC_LIBRARY_LDFLAGS + AC_FC_WRAPPERS + AC_FC_MAIN + AC_SUBST(F77, $FC) + AC_SUBST(FFLAGS, $FCFLAGS) else echo "no" fi @@ -29,7 +36,14 @@ AM_CONDITIONAL([BUILD_FORTRAN], [test "X$IPQ_FORTRAN" = "Xyes"]) AC_DISABLE_SHARED AC_PROG_LIBTOOL -# Output files. +# Checks for libraries. + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. + AC_CONFIG_FILES([Makefile src/Makefile test/Makefile testcpp/Makefile]) AC_OUTPUT diff --git a/include/IPhreeqc.f.inc b/include/IPhreeqc.f.inc index 5fa9f6aa..74ebc702 100644 --- a/include/IPhreeqc.f.inc +++ b/include/IPhreeqc.f.inc @@ -59,7 +59,7 @@ C INTEGER LoadDatabase INTEGER LoadDatabaseString C INTEGER OutputLastError - INTEGER OutputLastWarning +C INTEGER OutputLastWarning INTEGER OutputLines INTEGER RunAccumulated INTEGER RunFile diff --git a/include/IPhreeqc.f90.inc b/include/IPhreeqc.f90.inc index 04d329f7..2d50eda6 100644 --- a/include/IPhreeqc.f90.inc +++ b/include/IPhreeqc.f90.inc @@ -91,50 +91,56 @@ INTERFACE - SUBROUTINE SetSelectedOutputOn(ID,SEL_ON) + FUNCTION SetSelectedOutputOn(ID,SEL_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: SEL_ON - END SUBROUTINE SetSelectedOutputOn + INTEGER(KIND=4) :: SetSelectedOutputOn + END FUNCTION SetSelectedOutputOn END INTERFACE INTERFACE - SUBROUTINE SetOutputOn(ID,OUT_ON) + FUNCTION SetOutputOn(ID,OUT_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: OUT_ON - END SUBROUTINE SetOutputOn + INTEGER(KIND=4) :: SetOutputOn + END FUNCTION SetOutputOn END INTERFACE INTERFACE - SUBROUTINE SetErrorOn(ID,ERR_ON) + FUNCTION SetErrorOn(ID,ERR_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: ERR_ON - END SUBROUTINE SetErrorOn + INTEGER(KIND=4) :: SetErrorOn + END FUNCTION SetErrorOn END INTERFACE INTERFACE - SUBROUTINE SetLogOn(ID,LOG_ON) + FUNCTION SetLogOn(ID,LOG_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: LOG_ON - END SUBROUTINE SetLogOn + INTEGER(KIND=4) :: SetLogOn + END FUNCTION SetLogOn END INTERFACE INTERFACE - SUBROUTINE SetDumpOn(ID,DUMP_ON) + FUNCTION SetDumpOn(ID,DUMP_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: DUMP_ON - END SUBROUTINE SetDumpOn + INTEGER(KIND=4) :: SetDumpOn + END FUNCTION SetDumpOn END INTERFACE INTERFACE - SUBROUTINE SetDumpStringOn(ID,DUMP_STRING_ON) + FUNCTION SetDumpStringOn(ID,DUMP_STRING_ON) INTEGER(KIND=4) :: ID LOGICAL(KIND=4) :: DUMP_STRING_ON - END SUBROUTINE SetDumpStringOn + INTEGER(KIND=4) :: SetDumpStringOn + END FUNCTION SetDumpStringOn END INTERFACE @@ -234,9 +240,10 @@ INTERFACE - SUBROUTINE GetComponent(ID,N,COMP) + FUNCTION GetComponent(ID,N,COMP) INTEGER(KIND=4) :: ID INTEGER(KIND=4) :: N CHARACTER(LEN=*) :: COMP - END SUBROUTINE + INTEGER(KIND=4) :: GetComponent + END FUNCTION GetComponent END INTERFACE diff --git a/src/IPhreeqcF.F b/src/IPhreeqcF.f similarity index 95% rename from src/IPhreeqcF.F rename to src/IPhreeqcF.f index 904b63d4..3a65885c 100644 --- a/src/IPhreeqcF.F +++ b/src/IPhreeqcF.f @@ -40,14 +40,17 @@ UnLoadDatabase = UnLoadDatabaseF(ID) END FUNCTION UnLoadDatabase !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - SUBROUTINE OutputLastError + SUBROUTINE OutputLastError(ID) IMPLICIT NONE - CALL OutputLastErrorF + INTEGER :: ID + WRITE(*,*) "fortran OutputLastError ID = ", ID + CALL OutputLastErrorF(ID) END SUBROUTINE OutputLastError !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - SUBROUTINE OutputLastWarning + SUBROUTINE OutputLastWarning(ID) IMPLICIT NONE - CALL OutputLastWarningF + INTEGER :: ID + CALL OutputLastWarningF(ID) END SUBROUTINE OutputLastWarning !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FUNCTION AccumulateLine(ID,LINE) diff --git a/src/IPhreeqcLib.cpp b/src/IPhreeqcLib.cpp index 0226bb9f..5ac90f33 100644 --- a/src/IPhreeqcLib.cpp +++ b/src/IPhreeqcLib.cpp @@ -18,18 +18,25 @@ private: int CreateIPhreeqc(void) { - return IPhreeqcLib::CreateIPhreeqc(); +// return IPhreeqcLib::CreateIPhreeqc(); + int i = IPhreeqcLib::CreateIPhreeqc(); + std::cout << "CreateIPhreeqc " << i << "\n"; + return i; } IPQ_RESULT DestroyIPhreeqc(int id) { - return IPhreeqcLib::DestroyIPhreeqc(id); +// return IPhreeqcLib::DestroyIPhreeqc(id); + IPQ_RESULT i = IPhreeqcLib::DestroyIPhreeqc(id); + std::cout << "DestroyIPhreeqc( " << id << ") = " << i << "\n"; + return i; } int LoadDatabase(int id, const char* filename) { + std::cout << "In LoadDatabase id = " << id << "\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { @@ -65,6 +72,7 @@ void OutputLastError(int id) { static const char err_msg[] = "OutputLastError: Bad instance.\n"; + std::cout << "In OutputLastError id = " << id << "\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { @@ -134,7 +142,7 @@ GetDumpLineCount(int id) return 0; } -const char* +const char* GetDumpLine(int id, int n) { static const char err_msg[] = "GetDumpLine: Bad instance.\n"; diff --git a/src/Makefile.am b/src/Makefile.am index a7725124..f1d2f1a0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -148,11 +148,11 @@ include_HEADERS=\ if BUILD_FORTRAN libiphreeqc_la_SOURCES+=\ - fwrap.cpp\ fwrap.h\ + fwrap.cpp\ fwrap2.cpp\ fwrap3.cpp\ - IPhreeqcF.F + IPhreeqcF.f include_HEADERS+=\ $(top_srcdir)/include/IPhreeqc.f90.inc\ diff --git a/src/fwrap.h b/src/fwrap.h index 914f3375..65f6875d 100644 --- a/src/fwrap.h +++ b/src/fwrap.h @@ -7,37 +7,37 @@ #define DLL_EXPORT #endif -#if defined(F77_FUNC) -#define CreateIPhreeqcF F77_FUNC (createiphreeqcf, CREATEIPHREEQCF) -#define DestroyIPhreeqcF F77_FUNC (destroyiphreeqcf, DESTROYIPHREEQCF) -#define LoadDatabaseF F77_FUNC (loaddatabasef, LOADDATABASEF) -#define LoadDatabaseStringF F77_FUNC (loaddatabasestringf, LOADDATABASESTRINGF) -#define UnLoadDatabaseF F77_FUNC (unloaddatabasef, UNLOADDATABASEF) -#define AccumulateLineF F77_FUNC (accumulatelinef, ACCUMULATELINEF) -#define RunAccumulatedF F77_FUNC (runaccumulatedf, RUNACCUMULATEDF) -#define RunFileF F77_FUNC (runfilef, RUNFILEF) -#define RunStringF F77_FUNC (runstringf, RUNSTRINGF) -#define GetSelectedOutputRowCountF F77_FUNC (getselectedoutputrowcountf, GETSELECTEDOUTPUTROWCOUNTF) -#define GetSelectedOutputColumnCountF F77_FUNC (getselectedoutputcolumncountf, GETSELECTEDOUTPUTCOLUMNCOUNTF) -#define GetSelectedOutputValueF F77_FUNC (getselectedoutputvaluef, GETSELECTEDOUTPUTVALUEF) -#define SetSelectedOutputOnF F77_FUNC (setselectedoutputonf, SETSELECTEDOUTPUTONF) -#define SetOutputOnF F77_FUNC (setoutputonf, SETOUTPUTONF) -#define SetErrorOnF F77_FUNC (seterroronf, SETERRORONF) -#define SetLogOnF F77_FUNC (setlogonf, SETLOGONF) -#define SetDumpOnF F77_FUNC (setdumponf, SETDUMPONF) -#define SetDumpStringOnF F77_FUNC (setdumpstringonf, SETDUMPSTRINGONF) -#define GetDumpLineCountF F77_FUNC (getdumplinecountf, GETDUMPLINECOUNTF) -#define GetDumpLineF F77_FUNC (getdumplinef, GETDUMPLINEF) -#define GetErrorLineCountF F77_FUNC (geterrorlinecountf, GETERRORLINECOUNTF) -#define GetErrorLineF F77_FUNC (geterrorlinef, GETERRORLINEF) -#define GetWarningLineCountF F77_FUNC (getwarninglinecountf, GETWARNINGLINECOUNTF) -#define GetWarningLineF F77_FUNC (getwarninglinef, GETWARNINGLINEF) -#define GetComponentCountF F77_FUNC (getcomponentcountf, GETCOMPONENTCOUNTF) -#define GetComponentF F77_FUNC (getcomponentf, GETCOMPONENTF) -#define OutputLastErrorF F77_FUNC (outputlasterrorf, OUTPUTLASTERRORF) -#define OutputLastWarningF F77_FUNC (outputlastwarningf, OUTPUTLASTWARNINGF) -#define OutputLinesF F77_FUNC (outputlinesf, OUTPUTLINESF) -#endif /* F77_FUNC */ +#if defined(FC_FUNC) +#define CreateIPhreeqcF FC_FUNC (createiphreeqcf, CREATEIPHREEQCF) +#define DestroyIPhreeqcF FC_FUNC (destroyiphreeqcf, DESTROYIPHREEQCF) +#define LoadDatabaseF FC_FUNC (loaddatabasef, LOADDATABASEF) +#define LoadDatabaseStringF FC_FUNC (loaddatabasestringf, LOADDATABASESTRINGF) +#define UnLoadDatabaseF FC_FUNC (unloaddatabasef, UNLOADDATABASEF) +#define AccumulateLineF FC_FUNC (accumulatelinef, ACCUMULATELINEF) +#define RunAccumulatedF FC_FUNC (runaccumulatedf, RUNACCUMULATEDF) +#define RunFileF FC_FUNC (runfilef, RUNFILEF) +#define RunStringF FC_FUNC (runstringf, RUNSTRINGF) +#define GetSelectedOutputRowCountF FC_FUNC (getselectedoutputrowcountf, GETSELECTEDOUTPUTROWCOUNTF) +#define GetSelectedOutputColumnCountF FC_FUNC (getselectedoutputcolumncountf, GETSELECTEDOUTPUTCOLUMNCOUNTF) +#define GetSelectedOutputValueF FC_FUNC (getselectedoutputvaluef, GETSELECTEDOUTPUTVALUEF) +#define SetSelectedOutputOnF FC_FUNC (setselectedoutputonf, SETSELECTEDOUTPUTONF) +#define SetOutputOnF FC_FUNC (setoutputonf, SETOUTPUTONF) +#define SetErrorOnF FC_FUNC (seterroronf, SETERRORONF) +#define SetLogOnF FC_FUNC (setlogonf, SETLOGONF) +#define SetDumpOnF FC_FUNC (setdumponf, SETDUMPONF) +#define SetDumpStringOnF FC_FUNC (setdumpstringonf, SETDUMPSTRINGONF) +#define GetDumpLineCountF FC_FUNC (getdumplinecountf, GETDUMPLINECOUNTF) +#define GetDumpLineF FC_FUNC (getdumplinef, GETDUMPLINEF) +#define GetErrorLineCountF FC_FUNC (geterrorlinecountf, GETERRORLINECOUNTF) +#define GetErrorLineF FC_FUNC (geterrorlinef, GETERRORLINEF) +#define GetWarningLineCountF FC_FUNC (getwarninglinecountf, GETWARNINGLINECOUNTF) +#define GetWarningLineF FC_FUNC (getwarninglinef, GETWARNINGLINEF) +#define GetComponentCountF FC_FUNC (getcomponentcountf, GETCOMPONENTCOUNTF) +#define GetComponentF FC_FUNC (getcomponentf, GETCOMPONENTF) +#define OutputLastErrorF FC_FUNC (outputlasterrorf, OUTPUTLASTERRORF) +#define OutputLastWarningF FC_FUNC (outputlastwarningf, OUTPUTLASTWARNINGF) +#define OutputLinesF FC_FUNC (outputlinesf, OUTPUTLINESF) +#endif /* FC_FUNC */ #if defined(__cplusplus) extern "C" { diff --git a/test/Makefile.am b/test/Makefile.am index 17aa63f9..e2602427 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,7 @@ EXTRA_DIST = phreeqc.dat llnl.dat +AM_FCFLAGS = -I$(top_srcdir)/include AM_FFLAGS = -I$(top_srcdir)/include + noinst_PROGRAMS = kinn -kinn_SOURCES = kinn.f dummy.cxx -kinn_LDADD = ../src/libiphreeqc.la $(FLIBS) +kinn_SOURCES = kinn.f main.cxx +kinn_LDADD = $(top_builddir)/src/libiphreeqc.la $(FCLIBS) diff --git a/test/kinn.f b/test/kinn.f index 26d212b5..1b53d5df 100644 --- a/test/kinn.f +++ b/test/kinn.f @@ -1,5 +1,6 @@ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - PROGRAM DRIVER +C PROGRAM DRIVER + SUBROUTINE F_MAIN IMPLICIT NONE INCLUDE 'IPhreeqc.f.inc' @@ -10,18 +11,22 @@ CHARACTER(30) comp INTEGER n INTEGER len - INTEGER id + INTEGER(KIND=4) id REAL*8 dvalue id = CreateIPhreeqc() + write (*,*) "id = ", id IF (id.LT.0) THEN CALL OutputLastError(id) STOP ENDIF + write (*,*) "id = ", id iresult = LoadDatabase(id, 'llnl.dat') + write (*,*) "id = ", id IF (iresult.NE.0) THEN + write (*,*) "id = ", id CALL OutputLastError(id) STOP ENDIF @@ -103,7 +108,8 @@ 50 FORMAT(A15,A,$) 60 FORMAT(1PG15.7E2,A,$) - END PROGRAM DRIVER +C END PROGRAM DRIVER + END SUBROUTINE F_MAIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE SOLUTION(id, C, Ca, Na) INCLUDE 'IPhreeqc.f90.inc' @@ -111,13 +117,13 @@ INTEGER err REAL C, Ca, Na CHARACTER(80) line - WRITE (line,100),'SOLUTION 1' + WRITE (line,100) 'SOLUTION 1' err = AccumulateLine(id, line) - WRITE (line,110),'C ', C + WRITE (line,110) 'C ', C err = AccumulateLine(id, line) - WRITE (line,110),'Ca ', Ca + WRITE (line,110) 'Ca ', Ca err = AccumulateLine(id, line) - WRITE (line,110),'Na ', Na + WRITE (line,110) 'Na ', Na err = AccumulateLine(id, line) 100 FORMAT(A) 110 FORMAT(TR4,A,F8.4) @@ -130,9 +136,9 @@ REAL si, amount CHARACTER*(*) phase CHARACTER(80) line - WRITE (line,'(A)'),'EQUILIBRIUM_PHASES' + WRITE (line,'(A)') 'EQUILIBRIUM_PHASES' err = AccumulateLine(id, line) - WRITE (line,'(TR4, A, F8.4, F8.4)'), phase, si, amount + WRITE (line,'(TR4, A, F8.4, F8.4)') phase, si, amount err = AccumulateLine(id, line) END SUBROUTINE EQUILIBRIUM_PHASES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -146,37 +152,37 @@ CHARACTER(800) line CHARACTER(80) form CHARACTER(30) heading(20) - WRITE (line,200),'USER_PUNCH' + WRITE (line,200) 'USER_PUNCH' err = AccumulateLine(id, line) DO i = 1,max - WRITE (heading(i), 210), + WRITE (heading(i), 210) & i, '.name ', & i, '.type ', & i, '.moles ' END DO - WRITE (line, *), '-head ', (heading(i), i=1,max) + WRITE (line, *) '-head ', (heading(i), i=1,max) err = AccumulateLine(id, line) - WRITE (line, 200), '-start' + WRITE (line, 200) '-start' err = AccumulateLine(id, line) - WRITE (line, 220), '10 n = sys("' + WRITE (line, 220) '10 n = sys("' & , element, '", count, names$, types$, moles)' err = AccumulateLine(id, line) - WRITE (line, 230), '20 n = ', max + WRITE (line, 230) '20 n = ', max err = AccumulateLine(id, line) - WRITE (line, 240), '30 if count < ', max + WRITE (line, 240) '30 if count < ', max & , ' then n = count' err = AccumulateLine(id, line) - WRITE (line, 200), '40 for i = 1 to count' + WRITE (line, 200) '40 for i = 1 to count' err = AccumulateLine(id, line) - WRITE (line, 200), '50 PUNCH names$(i), types$(i), moles(i)' + WRITE (line, 200) '50 PUNCH names$(i), types$(i), moles(i)' err = AccumulateLine(id, line) - WRITE (line, 200), '60 next i' + WRITE (line, 200) '60 next i' err = AccumulateLine(id, line) - WRITE (line, 200), '70 list' + WRITE (line, 200) '70 list' err = AccumulateLine(id, line) - WRITE (line, 200), '-end' + WRITE (line, 200) '-end' err = AccumulateLine(id, line) - WRITE (line, 200), 'SELECTED_OUTPUT' + WRITE (line, 200) 'SELECTED_OUTPUT' err = AccumulateLine(id, line) !!! WRITE (line, 200), '-file srctest.txt' !!! CALL AccumulateLine(line) @@ -193,13 +199,13 @@ INTEGER err CHARACTER(80) line INTEGER i - WRITE (line,500),'PHASES' + WRITE (line,500) 'PHASES' err = AccumulateLine(id, line) - WRITE (line,510),'Fix_H+' + WRITE (line,510) 'Fix_H+' err = AccumulateLine(id, line) - WRITE (line,510),'H+ = H+' + WRITE (line,510) 'H+ = H+' err = AccumulateLine(id, line) - WRITE (line,510),'log_k 0.0' + WRITE (line,510) 'log_k 0.0' err = AccumulateLine(id, line) 500 FORMAT(A) 510 FORMAT(TR4,A)