module LumbricusUnitTestsData implicit none integer , private :: modflowStep ! current iMODFLOW time step counter integer , private :: dtswStep ! current (sub) dtsw time step counter double precision, private :: secondsPerDay = 86400.0D+0 ! #secs in a day double precision, private :: dmmDtsw = 1.0D+0 ! Dtsw step size (MJD) contains function dmmTestGetNumTimeSteps() result(numTests) ! return value integer :: numTests ! number of tests. (each test is done in a time step) numTests = 11 end function dmmTestGetNumTimeSteps subroutine dmmTestSetModflowStep(step) ! arguments integer, intent(in) :: step ! modflow step ! store step number modflowStep = step end subroutine dmmTestSetModflowStep subroutine dmmTestSetDtswStep(step) ! arguments integer, intent(in) :: step ! dtsw (top system) step ! store step number dtswStep = step end subroutine dmmTestSetDtswStep logical function MetaSWAP_PutSurfacewaterTimestep(dtsw) result(success) ! arguments double precision, intent(out) :: dtsw select case(modflowStep) case(1,2,3,4,5,6) dtsw = 1.0d+0 ! 1 day dmmDtsw = 1.0d+0 case(7,8,9) dtsw = 1.0d+0/4.0d+0 ! 8 hours dmmDtsw = 1.0d+0/4.0d+0 case(10,11) dtsw = 1.0d+0 ! 1 day dmmDtsw = 1.0d+0 case default stop 'unknown testNumber in MetaSWAP_PutSurfacewaterTimestep' end select success = .true. end function MetaSWAP_PutSurfacewaterTimestep logical function DflowFM_Put2DWaterlevels(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2,3) values = (/ 11.0D+0 /) case default values = (/ 13.0D+0 /) end select success = .true. end function DflowFM_Put2DWaterlevels logical function MetaSWAP_Get2DWaterlevels(values,missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1,2,3) expectedValues = (/ 11.0D+0, 11.0D+0 /) case default expectedValues = (/ 13.0D+0, 13.0D+0 /) end select call CheckValues('MetaSWAP_Get2DWaterlevels', values, expectedValues) success = .true. end function MetaSWAP_Get2DWaterlevels logical function dflowfm_Put1DNodeSurfacewaterLevels(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2,3) values = (/ 10.5D+0 /) case default values = (/ 12.5D+0 /) end select success = .true. end function dflowfm_Put1DNodeSurfacewaterLevels logical function mf2005_Get1DWaterlevels(values,missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1,2,3) expectedValues = (/ 10.5D+0, 10.5D+0, 10.5D+0 /) case default expectedValues = (/ 12.5D+0, 12.5D+0, 12.5D+0 /) end select call CheckValues('mf2005_Get1DWaterlevels', values, expectedValues) success = .true. end function mf2005_Get1DWaterlevels logical function MetaSWAP_PutPondingDeltaVolumes(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2) values = (/ -2.0D+0, -3.0D+0 /) case(3,4,5,6,7,8,9,10,11) values = (/ -3.0D+0, +1.0D+0 /) case default stop 'unknown testNumber in MetaSWAP_PutPondingDeltaVolumes' end select success = .true. end function MetaSWAP_PutPondingDeltaVolumes logical function DflowFM_GetFluxes2D(values, missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1,2) expectedValues = (/ -5.0D+0 / ( dmmDtsw * secondsPerDay) /) case(3,4,5,6,7,8,9,10,11) expectedValues = (/ -2.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown testNumber in DflowFM_GetFluxes2D' end select call CheckValues('DflowFM_GetFluxes2D', values, expectedValues) success = .true. end function DflowFM_GetFluxes2D logical function dflowfm_PutRealised2DCellFlux(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1) values = (/ -5.0D+0 / ( dmmDtsw * secondsPerDay) /) case(2,3,4,5,6,7,8,9,10,11) values = (/ -1.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown testNumber in dflowfm_PutRealised2DCellFlux' end select success = .true. end function dflowfm_PutRealised2DCellFlux logical function MetaSWAP_GetDeltaPondingAllocation(values, missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1) expectedValues = (/ -2.0D+0, -3.0D+0 /) case(2) expectedValues = (/ -0.4D+0, -0.6D+0 /) case(3,4,5,6,7,8,9,10,11) expectedValues = (/ -2.0D+0, +1.0D+0 /) case default stop 'unknown testNumber in MetaSWAP_GetDeltaPondingAllocation' end select call CheckValues('MetaSWAP_GetDeltaPondingAllocation', values, expectedValues) success = .true. end function MetaSWAP_GetDeltaPondingAllocation logical function mf2005_Put1DVolumes(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1) values = (/ -11.0D+0, 13.0D+0, -7.0D+0 /) case(2,3) values = (/ -11.0D+0, -13.0D+0, -7.0D+0 /) case(4) values = (/ -10.0D+0, -13.0D+0, -7.0D+0 /) case(5) values = (/ -12.0D+0, -13.0D+0, -7.0D+0 /) case(6,7,8) values = (/ -12.0D+0, 15.0D+0, -6.0D+0 /) case(9) values = (/ -12.0D+0, 3.0D+0, -6.0D+0 /) case(10,11) values = (/ -10.0D+0, -13.0D+0, -7.0D+0 /) case default stop 'unknown testNumber in mf2005_Put1DVolumes' end select values = values * -1.0D+0 success = .true. end function mf2005_Put1DVolumes logical function mf2005_Put1DFlux2(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2,3,4,5,6,7,8,9,10,11) values = (/ 0.0D+0, 0.0D+0, 0.0D+0, 0.0D+0, 0.0D+0 /) case default stop 'unknown testNumber in Put1DFlux2' end select values = values * -1.0D+0 success = .true. end function mf2005_Put1DFlux2 logical function mf2005_PutDrnFlux(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1) values = (/ 11.0D+0, 3.0D+0, 5.0D+0, 7.0D+0 /) case(2,3,4) values = (/ 1.0D+0, 3.0D+0, 5.0D+0, 7.0D+0 /) case(5,6,7,8,9) values = (/ 0.0D+0, 0.0D+0, 0.0D+0, 0.0D+0 /) case(10,11) values = (/ 1.0D+0, 3.0D+0, 5.0D+0, 7.0D+0 /) case default stop 'unknown testNumber in mf2005_PutDrnFlux' end select values = values * -1.0D+0 success = .true. end function mf2005_PutDrnFlux logical function MetaSWAP_PutSprinklingDemand(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2,3,4,5,6) values = (/ -3.0D+0, -6.0D+0 /) case(7,8,9) values = (/ -3.0D+0, -6.0D+0 /) values = values / 4.0D+0 case(10,11) values = (/ -3.0D+0, -6.0D+0 /) case default stop 'unknown testNumber in MetaSWAP_PutSprinklingDemand' end select success = .true. end function MetaSWAP_PutSprinklingDemand logical function MetaSWAP_PutRunoffVolumes(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1,2,3,4,5,6,7,8,9,10,11) values = (/ 0.0D+0, 0.0D+0 /) case default stop 'unknown testNumber in MetaSWAP_PutRunoffVolumes' end select success = .true. end function MetaSWAP_PutRunoffVolumes logical function dflowfm_Get1DNodeFlux(values, missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1) expectedValues = (/ 12.0D+0 / ( dmmDtsw * secondsPerDay) /) case(2,3) expectedValues = (/ -24.0D+0 / ( dmmDtsw * secondsPerDay) /) case(4) expectedValues = (/ -23.0D+0 / ( dmmDtsw * secondsPerDay) /) case(5) expectedValues = (/ -41.0D+0 / ( dmmDtsw * secondsPerDay) /) case(6) expectedValues = (/ -12.0D+0 / ( dmmDtsw * secondsPerDay) /) case(7,8) select case(dtswStep) case(1,2,3,4) expectedValues = (/ -3.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown dtswStep in dflowfm_Get1DNodeFlux' end select case(9) select case(dtswStep) case(1,2,3,4) expectedValues = (/ -6.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown dtswStep in dflowfm_Get1DNodeFlux' end select case(10,11) expectedValues = (/ -23.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown testNumber in dflowfm_Get1DNodeFlux' end select call CheckValues('dflowfm_Get1DNodeFlux', values, expectedValues) success = .true. end function dflowfm_Get1DNodeFlux logical function dflowfm_PutRealised1DNodeFlux(values) result(success) ! arguments double precision, dimension(:), intent(out) :: values ! return values depending on test number select case(modflowStep) case(1) values = (/ 12.0D+0 / ( dmmDtsw * secondsPerDay) /) case(2) values = (/ -21.0D+0 / ( dmmDtsw * secondsPerDay) /) case(3) values = (/ -15.0D+0 / ( dmmDtsw * secondsPerDay) /) case(4) values = (/ -11.0D+0 / ( dmmDtsw * secondsPerDay) /) case(5,6) values = (/ 0.0D+0 / ( dmmDtsw * secondsPerDay) /) case(7) select case(dtswStep) case(1,2,3,4) values = (/ -3.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown dtswStep in dflowfm_PutRealised1DNodeFlux' end select case(8) select case(dtswStep) case(1,2,3,4) values = (/ 0.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown dtswStep in dflowfm_PutRealised1DNodeFlux' end select case(9) select case(dtswStep) case(1) values = (/ -6.0D+0 / ( dmmDtsw * secondsPerDay) /) case(2) values = (/ -4.0D+0 / ( dmmDtsw * secondsPerDay) /) case(3) values = (/ -0.0D+0 / ( dmmDtsw * secondsPerDay) /) case(4) values = (/ -3.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown dtswStep in dflowfm_PutRealised1DNodeFlux' end select case(10,11) values = (/ -11.0D+0 / ( dmmDtsw * secondsPerDay) /) case default stop 'unknown testNumber in dflowfm_PutRealised1DNodeFlux' end select success = .true. end function dflowfm_PutRealised1DNodeFlux logical function MetaSWAP_GetSprinklingAllocation(values, missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1) expectedValues = (/ -3.0D+0, -6.0D+0 /) case(2) expectedValues = (/ -2.0D+0, -4.0D+0 /) case(3,4,5,6) expectedValues = (/ -0.0D+0, -0.0D+0 /) case(7) select case(dtswStep) case(1,2,3,4) expectedValues = (/ -3.0D+0, -6.0D+0 /) expectedValues = expectedValues / 4.0D+0 case default stop 'unknown dtswStep in MetaSWAP_GetSprinklingAllocation' end select case(8) expectedValues = (/ -0.0D+0, -0.0D+0 /) case(9) select case(dtswStep) case(1) expectedValues = (/ -0.75D+0 , -1.5D+0 /) case(2) expectedValues = (/ -0.0833333D+0, -0.1666667D+0 /) case(3,4) expectedValues = (/ -0.0D+0 , -0.0D+0 /) case default stop 'unknown dtswStep in MetaSWAP_GetSprinklingAllocation' end select case(10,11) expectedValues = (/ -0.0D+0, -0.0D+0 /) case default stop 'unknown testNumber in MetaSWAP_GetSprinklingAllocation' end select call CheckValues('MetaSWAP_GetSprinklingAllocation', values, expectedValues) success = .true. end function MetaSWAP_GetSprinklingAllocation logical function mf2005_Get1DCorrectionFlux(values, missVal) result(success) ! arguments double precision, dimension(:), intent(in) :: values double precision, intent(in) :: missVal ! locals double precision, dimension(size(values)) :: expectedValues ! check result, depending on test number select case(modflowStep) case(1,2,3) expectedValues = (/ 0.0D+0, 0.0D+0, 0.0D+0 /) case(4) expectedValues = (/ -1.0D+0, -1.3D+0, -0.7D+0 /) case(5) expectedValues = (/-12.0D+0,-13.0D+0, -7.0D+0 /) case(6) expectedValues = (/ -2.0D+0, -0.0D+0, -1.0D+0 /) case(7) expectedValues = (/ -0.0D+0, -0.0D+0, -0.0D+0 /) case(8) expectedValues = (/ -2.0D+0, -0.0D+0, -1.0D+0 /) case(9) expectedValues = (/ -3.0D+0, -0.0D+0, -1.5D+0 /) case(10,11) expectedValues = (/ -1.0D+0, -1.3D+0, -0.7D+0 /) case default stop 'unknown testNumber in mf2005_Get1DCorrectionFlux' end select call CheckValues('mf2005_Get1DCorrectionFlux', values, expectedValues) success = .true. end function mf2005_Get1DCorrectionFlux subroutine CheckValues(functionName, values, expectedValues) ! arguments character(len=*), intent(in) :: functionName ! name of calling get-function double precision, dimension(:), intent(in) :: values ! actual received values double precision, dimension(:), intent(in) :: expectedValues ! expected values ! locals integer :: i ! loop counter double precision, parameter :: epsilon = 1.0D-7 ! accuracy in difference check ! check results if (size(values) /= size(values)) then print '(A)', 'CheckValues: Values / ExpectedValues sizes differ. Called by '// trim(functionName) stop endif do i = 1, size(values) if(values(i) > expectedValues(i) + epsilon .or. values(i) < expectedValues(i) - epsilon ) then print '(3A,I2,A,I1,A,I1,A,F12.8,A,F12.8)', 'Test ', trim(functionName), ' failed for step ', modflowStep, ', sub-step ', & dtswStep, ', index ', i, '. expected: ', expectedValues(i), ', was: ', values(i) endif enddo end subroutine CheckValues end module LumbricusUnitTestsData