Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions test_fms/mpp/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ check_PROGRAMS = test_mpp \
test_mpp_print_memuse_stats_stderr \
test_mpp_print_memuse_stats_file \
test_mpp_memutils_begin_2x \
test_mpp_memutils_end_before_begin
test_mpp_memutils_end_before_begin \
test_read_input_nml

# These are the sources for the tests.
test_mpp_SOURCES = test_mpp.F90
Expand All @@ -50,21 +51,25 @@ test_mpp_print_memuse_stats_stderr_SOURCES=test_mpp_print_memuse_stats_stderr.F9
test_mpp_print_memuse_stats_file_SOURCES=test_mpp_print_memuse_stats_file.F90
test_mpp_memutils_begin_2x_SOURCES=test_mpp_memutils_begin_2x.F90
test_mpp_memutils_end_before_begin_SOURCES=test_mpp_memutils_end_before_begin.F90
test_read_input_nml_SOURCES=test_read_input_nml.F90

# Run the test programs.
TESTS = test_mpp_domains2.sh \
test_mpp_pset2.sh \
test_mpp2.sh \
test_mpp_memuse \
test_mpp_mem_dump \
test_mpp_memutils_mod.sh
test_mpp_memutils_mod.sh \
test_read_input_nml2.sh


# These files will also be included in the distribution.
EXTRA_DIST = input_base.nml \
test_mpp_domains2.sh \
test_mpp_pset2.sh \
test_mpp2.sh \
test_mpp_memutils_mod.sh
test_mpp_memutils_mod.sh \
test_read_input_nml2.sh

# Clean up
CLEANFILES = input.nml *.out*
225 changes: 225 additions & 0 deletions test_fms/mpp/test_read_input_nml.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
!***********************************************************************
!* GNU Lesser General Public License
!*
!* This file is part of the GFDL Flexible Modeling System (FMS).
!*
!* FMS is free software: you can redistribute it and/or modify it under
!* the terms of the GNU Lesser General Public License as published by
!* the Free Software Foundation, either version 3 of the License, or (at
!* your option) any later version.
!*
!* FMS is distributed in the hope that it will be useful, but WITHOUT
!* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
!* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
!* for more details.
!*
!* You should have received a copy of the GNU Lesser General Public
!* License along with FMS. If not, see <http://www.gnu.org/licenses/>.
!***********************************************************************

!> @file
!! @brief Tests the read_input_nml subroutine
!! @author Colin Gladue
!! @email gfdl.climate.model.info@noaa.gov

program test_read_input_nml

use mpp_mod, only : mpp_init, mpp_exit
use mpp_mod, only : mpp_error, FATAL, NOTE
use mpp_mod, only : read_input_nml, mpp_get_current_pelist_name

#include<file_version.h>

character(len=200) :: line !< Current line being read
character(len=200) :: linelog, linenml !< Current log and nml lines being read
character(len=128) :: filename !< Name of file being read
integer :: n !< Looping variable
logical :: version_bool, filename_bool !< Booleans that tell whether or not the
!! lines where version and filename should be
!! written in logfile have been found
!! yet. Default value is false

namelist /test_read_input_nml_nml/ test_numb

open(10, file="test_numb.nml", form="formatted", status="old")
read(10, nml = test_read_input_nml_nml)
close(10)

if (test_numb.eq.1) then
! Test 1: Tests the subroutine on a valid input nml full of data,
! with no arguments passed to read_input_nml()

filename = "input.nml"
call mpp_init() ! Initialize mpp
call read_input_nml()
call mpp_exit()
open(110, file='logfile.000000.out', iostat=ioslog) ! Open logfile
open(111, file='input.nml', iostat=iosnml) ! Open of input nml
do while (ioslog.eq.0) ! Check for the first two written lines, then stay at this
! position so we can compare from here on to the namelist
read(110, '(A)', iostat=ioslog) line
! Check if we have found the version line
if (index(line, "READ_INPUT_NML: "//trim(version)).ne.0) then
version_bool = .true.
end if
! Check if we have found the filename line
if (index(line, "READ_INPUT_NML: "//trim(filename)).ne.0) then
filename_bool = .true.
end if
! Check if we have found all we are looking for
if (version_bool.and.filename_bool) then
write(*,*) "SUCCESS: Found the first 2 written lines, version&
& and filename"
exit ! Successful test portion
end if
! If we have reached the end of the file, was anything missed?
if (index(line, "Total runtime").ne.0) then
if (.not.version_bool) then
call mpp_error(FATAL, "Version not written to &
&logfile")
else if (.not.filename_bool) then
call mpp_error(FATAL, "Filename not written to &
&logfile")
else
call mpp_error(FATAL, "Logfile not written to by &
&read_input_nml correctly.")
end if
end if
end do
! Make sure the read pointers for logfile and input nml are in the same
! location below.
read(110, '(A)', iostat=ioslog) linelog
read(111, '(A)', iostat=iosnml) linenml
do while (TRIM(linelog).ne.TRIM(" "//linenml))
read(110, '(A)', iostat=ioslog) linelog
end do
! Compare contents of logfile and the input nml
do while (iosnml.eq.0)
if (TRIM(linelog).ne.TRIM(" "//linenml)) then
call mpp_error(FATAL, linelog//" -Does not equal- "//&
&linenml//". Namelist not written to logfile &
&correctly")
end if
read(110, '(A)', iostat=ioslog) linelog
read(111, '(A)', iostat=iosnml) linenml
end do
write(*,*) "SUCCESS: Matched all lines from input nml to the logfile"
close(110)
close(111)

else if (test_numb.eq.2) then
! Test 2: Tests the same valid input nml, but with a pelist_name_in passed as an
! argument to read_input_nml().

filename = "input_alternative.nml"
call mpp_init() ! Initialize mpp
call read_input_nml("alternative")
call mpp_exit()
open(110, file='logfile.000000.out', iostat=ioslog) ! Open logfile
open(111, file='input_alternative.nml', iostat=iosnml) ! Open of input nml
do while (ioslog.eq.0) ! Check for the first two written lines, then stay at this
! position so we can compare from here on to the namelist
read(110, '(A)', iostat=ioslog) line
! Check if we have found the version line
if (index(line, "READ_INPUT_NML: "//trim(version)).ne.0) then
version_bool = .true.
end if
! Check if we have found the filename line
if (index(line, "READ_INPUT_NML: "//trim(filename)).ne.0) then
filename_bool = .true.
end if
! Check if we have found all we are looking for
if (version_bool.and.filename_bool) then
write(*,*) "SUCCESS: Found the first 2 written lines, version&
& and filename"
exit ! Successful test portion
end if
! If we have reached the end of the file, was anything missed?
if (index(line, "Total runtime").ne.0) then
if (.not.version_bool) then
call mpp_error(FATAL, "Version not written to &
&logfile")
else if (.not.filename_bool) then
call mpp_error(FATAL, "Filename not written to &
&logfile")
else
call mpp_error(FATAL, "Logfile not written to by &
&read_input_nml correctly.")
end if
end if
end do
! Make sure the read pointers for logfile and input nml are in the same
! location below.
read(110, '(A)', iostat=ioslog) linelog
read(111, '(A)', iostat=iosnml) linenml
do while (TRIM(linelog).ne.TRIM(" "//linenml))
read(110, '(A)', iostat=ioslog) linelog
end do
! Compare contents of logfile and the input nml
do while (iosnml.eq.0)
if (TRIM(linelog).ne.TRIM(" "//linenml)) then
call mpp_error(FATAL, linelog//" -Does not equal- "//&
&linenml//". Namelist not written to logfile &
&correctly")
end if
read(110, '(A)', iostat=ioslog) linelog
read(111, '(A)', iostat=iosnml) linenml
end do
write(*,*) "SUCCESS: Matched all lines from input nml to the logfile"
close(110)
close(111)

else if (test_numb.eq.3) then
! Test 3: Tests with an invalid pelist_name_in pass as an argument. An invalid
! pelist_name_in would be one who's size is greater than local pelist_name

call mpp_init ! Initialize mpp
call read_input_nml(mpp_get_current_pelist_name()//"e")
! Call read_input_nml
! with the local
! pelist_name plus an
! extra character "e"
call mpp_exit() ! Exit mpp

else if (test_numb.eq.4) then
! Test 4: Tests an empty input nml. No arguments are passed.

filename = "input.nml"
call mpp_init() ! Initialize mpp
call read_input_nml()
call mpp_exit()
open(44, file='logfile.000000.out', iostat=ios)
do while (ios.eq.0) ! Check for the first two written lines
read(44, '(A)', iostat=ios) line
! Check if we have found the version line
if (index(line, "READ_INPUT_NML: "//trim(version)).ne.0) then
version_bool = .true.
end if
! Check if we have found the filename line
if (index(line, "READ_INPUT_NML: "//trim(filename)).ne.0) then
filename_bool = .true.
end if
! Check if we have found all we are looking for
if (version_bool.and.filename_bool) then
write(*,*) "SUCCESS: Found the first 2 written lines, version&
& and filename"
exit ! Successful test
end if
! If we have reached the end of the file, was anything missed?
if (index(line, "Total runtime").ne.0) then
if (.not.version_bool) then
call mpp_error(FATAL, "Version not written to &
&logfile")
else if (.not.filename_bool) then
call mpp_error(FATAL, "Filename not written to &
&logfile")
else
call mpp_error(FATAL, "Logfile not written to by &
&read_input_nml correctly.")
end if
end if
end do
close(44)
end if

end program test_read_input_nml
32 changes: 32 additions & 0 deletions test_fms/mpp/test_read_input_nml.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/sh

#***********************************************************************
# GNU Lesser General Public License
#
# This file is part of the GFDL Flexible Modeling System (FMS).
#
# FMS is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# FMS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with FMS. If not, see <http://www.gnu.org/licenses/>.
#***********************************************************************

# This is part of the GFDL FMS package. This is a shell script to
# execute tests in the test_fms/mpp directory.

# Colin Gladue 04/27/2020

# Set common test settings.
. ../test_common.sh

# Run tests

run_test test_read_input_nml 1
77 changes: 77 additions & 0 deletions test_fms/mpp/test_read_input_nml2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/bin/sh

#***********************************************************************
# GNU Lesser General Public License
#
# This file is part of the GFDL Flexible Modeling System (FMS).
#
# FMS is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# FMS is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with FMS. If not, see <http://www.gnu.org/licenses/>.
#***********************************************************************

# This is part of the GFDL FMS package. This is a shell script to
# execute tests in the test_fms/mpp directory.

# Colin Gladue 04/27/2020

touch test_numb_base.nml
echo "&test_read_input_nml_nml" > test_numb_base.nml
echo "test_numb = 0" >> test_numb_base.nml
echo "/" >> test_numb_base.nml

# Test 1
sed "s/test_numb = [0-9]/test_numb = 1/" test_numb_base.nml > test_numb.nml
cp input_base.nml input.nml
./test_read_input_nml.sh
if [ $? = 0 ]; then
echo "Test 1 has passed"
else
echo "ERROR: Test 1 was unsuccessful."
exit 11
fi

# Test 2
sed "s/test_numb = [0-9]/test_numb = 2/" test_numb_base.nml > test_numb.nml
cp input_base.nml input_alternative.nml
./test_read_input_nml.sh
if [ $? = 0 ]; then
echo "Test 2 has passed"
else
echo "ERROR: Test 2 was unsuccessful."
exit 12
fi

# Test 3
sed "s/test_numb = [0-9]/test_numb = 3/" test_numb_base.nml > test_numb.nml
cp input_base.nml input.nml
./test_read_input_nml.sh
if [ $? = 1 ]; then
echo "Test 3 has passed"
else
echo "ERROR: Test 3 did not hit the error it was expected to"
exit 13
fi

# Test 4
sed "s/test_numb = [0-9]/test_numb = 4/" test_numb_base.nml > test_numb.nml
rm input.nml
touch input.nml # Achieve a blank namelist to be read
./test_read_input_nml.sh
if [ $? = 0 ]; then
echo "Test 4 has passed"
else
echo "ERROR: Test 4 was unsuccessful."
exit 14
fi

cp input_base.nml input.nml