DSD-NL 2014 - iMOD Symposium - 12b. iMOD OSS, Peter Vermeulen, Deltares
1. Tuesday June 16, 2014
iMOD – OSS
PTM Vermeulen1
I had a dream
1 Deltares Unit Subsurface and Groundwater Systems, Groundwater Management, the Netherlands
2. iMOD-Structure
17 juni 2014
Main Program
FORTRAN 90
*.F90
Dialogs
WINTERACTER
*.RC / *.BMP / *.CUR
VISUAL STUDIO /
INTEL FORTRAN
COMPILER
X32 / X64
WINTERACTER
DELFTIO / NETCDF
externe libraries
4. iMOD-Structure
17 juni 2014
Main Program
FORTRAN 90
*.F90
IMOD_PRG.F90
MODEL1MAIN(ITYPE,MESSAGE)
GET ACTION
MODEL1RUN()
DO ACTION
IMOD_MODEL.F90
Check messages
ITYPE: welk type
MESSAGE: specifieke informatie
5. iMOD-Structure
17 juni 2014
!###======================================================================
PROGRAM IMODPRG
!###======================================================================
USE WINTERACTER
USE RESOURCE
USE MOD_MODEL, ONLY : MODEL1MAIN
DO
CALL WMESSAGE(ITYPE,MESSAGE)
SELECT CASE(MESSAGE%WIN)
CASE (ID_DMODEL,ID_DMODELTAB1,ID_DMODELTAB2)
CALL MODEL1MAIN(ITYPE,MESSAGE)
END SELECT
ENDDO
STOP
END PROGRAM
SUBROUTINE IN
MODULE MOD_MODEL
IDENTIFIERS IN
RESOURCE.RC
6. iMOD-Structure
17 juni 2014
MODULE MOD_MODEL
USE MOD_MODEL_PAR
CONTAINS
!###======================================================================
SUBROUTINE MODEL1MAIN(ITYPE,MESSAGE)
!###======================================================================
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITYPE
TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE
SELECT CASE (ITYPE)
CASE (PUSHBUTTON)
SELECT CASE (MESSAGE%VALUE1)
CASE (IDOK)
CALL MODEL1RUN()
END SELECT
END SELECT
END SUBROUTINE MODEL1MAIN
END MODULE MOD_MODEL
GLOBAL VARIABLES
7. IMOD Inlezen IDF bestanden
17 juni 2014
MODULE MOD_READMYIDF
USE MOD_READMYIDF_PAR
CONTAINS
!## process messages
SUBROUTINE READMYIDF1MAIN(ITYPE,MESSAGE)
END SUBROUTINE READMYIDF1MAIN
!## read idf and calc
SUBROUTINE READMYIDF1CALC()
END SUBROUTINE READMYIDF1CALC
!## save idf and plot
SUBROUTINE READMYIDF1SAVEIT()
END SUBROUTINE WRITEMYIDF1SAVEIT
END MODULE MOD_READMYIDF
MODULE MOD_READMYIDF_PAR
USE MOD_IDF_PAR, ONLY : IDFOBJ, &
IDFREAD, &
IDFWRITE, &
IDFDEALLOCATEX
USE IMOD, ONLY : IDFINIT
TYPE(IDFOBJ) :: IDF
END MODULE MOD_READMYIDF_PAR
imod_readmyidf_par.f90imod_readmyidf.f90
8. IMOD Inlezen IDF bestanden
17 juni 2014
MODULE MOD_READMYIDF
USE MOD_READMYIDF_PAR
CONTAINS
!## process messages
SUBROUTINE READMYIDF1MAIN(ITYPE,MESSAGE)
IMPLICIT NONE
INTEGER,INTENT(IN) :: ITYPE
TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE
SELECT CASE (ITYPE)
CASE (PUSHBUTTON)
SELECT CASE (MESSAGE%VALUE1)
CASE (IDOK)
CALL READMYIDF1CALC ()
END SELECT
END SELECT
END SUBROUTINE READMYIDF1MAIN
!## read idf and calc
SUBROUTINE READMYIDF1CALC()
IMPLICIT NONE
INTEGER :: IROW,ICOL
IF(IDFREAD(IDF,’D:TEST.IDF’,1))THEN
DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL
IDF%X(ICOL,IROW)=IDF%X(ICOL,IROW)+1.0
ENDDO; ENDDO
CALL READMYIDF1SAVEIT()
CALL IDFDEALLOCATEX(IDF)
ENDIF
END SUBROUTINE READMYIDF1CALC
!## save idf and plot
SUBROUTINE READMYIDF1SAVEIT()
IMPLICIT NONE
IDF%FNAME=‘D:OUT.IDF’
IF(IDFWRITE(IDF,IDF%FNAME,1))THEN
CALL IDFINIT(IDF%FNAME,LPLOT=.TRUE.)
ENDIF
END SUBROUTINE WRITEMYIDF1SAVEIT
END MODULE MOD_READMYIDF
9. Programmeren
De snelste weg tussen twee punten is nog steeds een rechte lijn, kunst
van het weglaten;
Afweging genericiteit en efficientie;
Programmeren is een kunst, niet iedereen met een kwast kan de
nachtwacht schilderen
17 juni 2014