From e190934b6a3d7ca59a84f491ad1974d3c3ea4cf3 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Mon, 4 Dec 2023 09:03:13 -0700 Subject: [PATCH 01/23] adding IO unit test --- .github/workflows/io_gnu.yml | 123 +++++++++++++++++++++++++++++ CMakeLists.txt | 6 ++ model/tests/CMakeLists.txt | 39 +++++++++ model/tests/data/io_mod_def.ww3 | Bin 0 -> 6321 bytes model/tests/data/out_pnt.ww3 | Bin 0 -> 193804 bytes model/tests/data/switch.io | 1 + model/tests/data/ww3_outp.inp | 8 ++ model/tests/test_io_points_bin.F90 | 83 +++++++++++++++++++ 8 files changed, 260 insertions(+) create mode 100644 .github/workflows/io_gnu.yml create mode 100644 model/tests/CMakeLists.txt create mode 100644 model/tests/data/io_mod_def.ww3 create mode 100644 model/tests/data/out_pnt.ww3 create mode 100644 model/tests/data/switch.io create mode 100644 model/tests/data/ww3_outp.inp create mode 100644 model/tests/test_io_points_bin.F90 diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml new file mode 100644 index 000000000..89acaed0c --- /dev/null +++ b/.github/workflows/io_gnu.yml @@ -0,0 +1,123 @@ +name: io_gnu +on: [push, pull_request, workflow_dispatch] + +# Cancel in-progress workflows when pushing to a branch +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + cache_key: gnu11-1 + CC: gcc-10 + FC: gfortran-10 + CXX: g++-10 + + +# Split into a steup step, and a WW3 build step which +# builds multiple switches in a matrix. The setup is run once and +# the environment is cached so each build of WW3 can share the dependencies. + +jobs: + setup: + runs-on: ubuntu-latest + + steps: + - name: checkout-ww3 + if: steps.cache-env.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + path: ww3 + # Cache spack, OASIS, and compiler + # No way to flush Action cache, so key may have # appended + - name: cache-env + id: cache-env + uses: actions/cache@v3 + with: + path: | + spack + ~/.spack + work_oasis3-mct + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('ww3/model/ci/spack_gnu.yaml') }} + + # Build WW3 spack environment + - name: install-dependencies-with-spack + if: steps.cache-env.outputs.cache-hit != 'true' + run: | + # Install NetCDF, ESMF, g2, etc using Spack + sudo apt install cmake + git clone -c feature.manyFiles=true https://github.com/JCSDA/spack.git + source spack/share/spack/setup-env.sh + spack env create ww3-gnu ww3/model/ci/spack_gnu.yaml + spack env activate ww3-gnu + spack compiler find + spack external find cmake + spack add mpich@3.4.2 + spack concretize + spack install --dirty -v + + - name: build-oasis + if: steps.cache-env.outputs.cache-hit != 'true' + run: | + source spack/share/spack/setup-env.sh + spack env activate ww3-gnu + export WWATCH3_DIR=${GITHUB_WORKSPACE}/ww3/model + export OASIS_INPUT_PATH=${GITHUB_WORKSPACE}/ww3/regtests/ww3_tp2.14/input/oasis3-mct + export OASIS_WORK_PATH=${GITHUB_WORKSPACE}/ww3/regtests/ww3_tp2.14/input/work_oasis3-mct + cd ww3/regtests/ww3_tp2.14/input/oasis3-mct/util/make_dir + cmake . + make VERBOSE=1 + cp -r ${GITHUB_WORKSPACE}/ww3/regtests/ww3_tp2.14/input/work_oasis3-mct ${GITHUB_WORKSPACE} + + io_gnu: + needs: setup + runs-on: ubuntu-latest + + steps: + - name: install-dependencies + run: | + sudo apt-get update + sudo apt-get install doxygen gcovr valgrind + + - name: checkout-ww3 + uses: actions/checkout@v3 + with: + path: ww3 + + - name: cache-env + id: cache-env + uses: actions/cache@v3 + with: + path: | + spack + ~/.spack + work_oasis3-mct + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('ww3/model/ci/spack_gnu.yaml') }} + + - name: build-ww3 + run: | + source spack/share/spack/setup-env.sh + spack env activate ww3-gnu + set -x + cd ww3 + export CC=mpicc + export FC=mpif90 + export OASISDIR=${GITHUB_WORKSPACE}/work_oasis3-mct + mkdir build && cd build + pwd + echo "${GITHUB_WORKSPACE}" + export LD_LIBRARY_PATH="/home/runner/work/WW3/WW3/spack/var/spack/environments/ww3-gnu/.spack-env/view/:$LD_LIBRARY_PATH" + which ncdump + cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. + make -j2 VERBOSE=1 + ctest --verbose --output-on-failure --rerun-failed + gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null + + - name: upload-test-coverage + uses: actions/upload-artifact@v3 + with: + name: ww3-test-coverage + path: | + ww3/build/*.html + ww3/build/*.css + + diff --git a/CMakeLists.txt b/CMakeLists.txt index 58115b3aa..126f6faf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,3 +58,9 @@ if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$") endif() add_subdirectory(model) + +# Turn on unit testing. +include(CTest) +if(BUILD_TESTING) + add_subdirectory(model/tests) +endif() diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt new file mode 100644 index 000000000..d1949c2ce --- /dev/null +++ b/model/tests/CMakeLists.txt @@ -0,0 +1,39 @@ +# This is the CMake file for the model/tests directory in the WW3 +# project. +# +# Ed Hartnett, 10/14/23 + +# Some very small test files may be committed to the repo. This +# function copies such a data file to the build directory. +function(copy_test_data name) + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/data/${name}" + DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +endfunction() + +# Some very small test files may be committed to the repo. This +# function copies such a data file to the build directory. +function(copy_test_data_2 srcname destname) + file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/data/${srcname}" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" + FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${srcname}" "${CMAKE_CURRENT_BINARY_DIR}/${destname}") +endfunction() + +# Function to build and run a test. +function(unit_test name) + add_executable(${name} ${name}.F90) + target_link_libraries(${name} PRIVATE ww3_lib) + add_test(NAME ${name} COMMAND ${name}) +endfunction() + +# Copy test data files that are in the repo to the build directory. +copy_test_data(out_pnt.ww3) +copy_test_data_2(io_mod_def.ww3 mod_def.ww3) +copy_test_data(switch.io) +copy_test_data(ww3_outp.inp) + +# Build and run the tests. +unit_test(test_io_points_bin) + + diff --git a/model/tests/data/io_mod_def.ww3 b/model/tests/data/io_mod_def.ww3 new file mode 100644 index 0000000000000000000000000000000000000000..b8d754881d98a602f2d73f780e85d8916b927518 GIT binary patch literal 6321 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 AEdT%j literal 0 HcmV?d00001 diff --git a/model/tests/data/switch.io b/model/tests/data/switch.io new file mode 100644 index 000000000..c97e44765 --- /dev/null +++ b/model/tests/data/switch.io @@ -0,0 +1 @@ +NOGRB SHRD PR1 FLX2 LN0 ST0 NL0 BT0 DB0 TR0 BS0 IC0 IS0 REF0 WNT1 WNX1 CRT1 CRX1 O0 O1 O2 O3 O4 O5 O6 O7 O10 O11 \ No newline at end of file diff --git a/model/tests/data/ww3_outp.inp b/model/tests/data/ww3_outp.inp new file mode 100644 index 000000000..dd728819f --- /dev/null +++ b/model/tests/data/ww3_outp.inp @@ -0,0 +1,8 @@ +$ + 20100101 000000 3600 1 +$ + 1 + -1 +$ + 4 + 2 30 20100101 000000 'UTC' diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 new file mode 100644 index 000000000..8bc0e5b75 --- /dev/null +++ b/model/tests/test_io_points_bin.F90 @@ -0,0 +1,83 @@ +! This is a test for model IO for WW3. This tests the legacy (binary) +! output of points data, done by function W3IOPO(). +! +! Ed Hartnett 10/14/23 +program test_io_points_bin + use w3iopomd + use w3gdatmd + use w3wdatmd + use w3odatmd + use w3iogrmd + use w3adatmd + implicit none + + integer, target :: i, j, k, l + integer :: ndsop, iotest, imod, ndstst, ierr, ndsbul, ndsm + integer :: ndstrc, ntrace + real :: m2km + character*7 expected_ptnme + character*6 my_fmt + real :: expected_loc_1 + + print *, 'Testing WW3 binary point file code.' + + ! These are mysterious but have to be called or else the IPASS + ! variable does not exist and w3iopo() crashes. + call w3nmod(1, 6, 6) + call w3setg(1, 6, 6) + call w3ndat(6, 6) + call w3setw(1, 6, 6) + call w3nout(6, 6) + call w3seto(1, 6, 6) + + ndsm = 20 + ndsop = 20 + ndsbul = 0 + ndstrc = 6 + ntrace = 10 + + write (ndso,900) +900 FORMAT (/15X,' *** WAVEWATCH III Point output post.*** '/ & + 15X,'==============================================='/) + + ! Open the file with the output settings for WW3. It is not needed actually. + ! open(ndsi, file = 'ww3_outp.inp', status='old', iostat = ierr) + ! if (ierr .ne. 0) stop 10 + + ! 2. Read model definition file. + CALL W3IOGR('READ', NDSM) + WRITE (NDSO,920) GNAME +920 FORMAT (' Grid name : ',A/) + + ! This will not work. But cannot be tested because it will change the value of IPASS, +! call w3iopo('EAD', ndsop, iotest) +! if (iotest .ne. 1) stop 7 + + ! Read the file out_pnt.ww3 from the model/tests/data directory. + call w3iopo('READ', ndsop, iotest) + if (iotest .ne. 0) stop 10 + close(ndsop) + + ! Make sure we got the values we expected. + if (nopts .ne. 11) stop 11 + expected_loc_1 = 0.0 + do i = 1, nopts + ! Check ptnme and ptloc arrays. + print *, ptnme(i), ptloc(1, i), ptloc(2, i) + if (i .lt. 10) then + my_fmt = '(a,i1)' + else + my_fmt = '(a,i2)' + endif + write(fmt = my_fmt, unit=expected_ptnme) 'Point', i + if (ptnme(i) .ne. expected_ptnme) stop 20 + print *, expected_loc_1 + if (ptloc(1, i) .ne. expected_loc_1) stop 21 + expected_loc_1 = expected_loc_1 + 5000.0 + if (ptloc(2, i) .ne. 0) stop 22 + end do + + print *, 'OK!' + print *, 'SUCCESS!' +end program test_io_points_bin + From 1ef13d4aa1c4f4788c3b72f4281a37f86e7e8c47 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Wed, 6 Dec 2023 07:41:27 -0700 Subject: [PATCH 02/23] added ww3_grid.inp --- model/tests/data/ww3_grid.inp | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 model/tests/data/ww3_grid.inp diff --git a/model/tests/data/ww3_grid.inp b/model/tests/data/ww3_grid.inp new file mode 100644 index 000000000..6f45604f3 --- /dev/null +++ b/model/tests/data/ww3_grid.inp @@ -0,0 +1,48 @@ +$ WAVEWATCH III Grid preprocessor input file +$ ------------------------------------------ + '1-D REFRACTION X ' +$ + 1.25 0.08 3 24 0. +$ + F T F T F F + 300. 300. 150. 300. +$ + &PRO1 CFLTM = 0.75 / + &PRO2 CFLTM = 0.75 / + &PRO3 CFLTM = 0.75, WDTHCG = 0., WDTHTH = 0. / + &PRO4 CFLTM = 0.75, RNFAC = 0., RSFAC = 0. / +END OF NAMELISTS +$ + 'RECT' F 'NONE' + 13 3 + 5.E3 5.E3 1. + -5.E3 -5.E3 1. +$ + -1. 1. 10 -1. 2 1 '(....)' 'UNIT' 'input' +$ +$ First grid +$ + 50 50 50 45 40 35 30 25 20 15 10 5 0 + 50 50 50 45 40 35 30 25 20 15 10 5 0 + 50 50 50 45 40 35 30 25 20 15 10 5 0 +$ +$ Second grid +$ +$ 0 5 10 15 20 25 30 35 40 45 50 50 50 +$ 0 5 10 15 20 25 30 35 40 45 50 50 50 +$ 0 5 10 15 20 25 30 35 40 45 50 50 50 +$ + 10 1 1 '(....)' 'PART' 'input' +$ +$ First grid +$ + 2 2 F +$ +$ Second grid +$ +$ 12 2 F + 0 0 F + 0 0 F + 0 0 +$ + 0. 0. 0. 0. 0 From 2dce6466579bab1264ea408884b18d118f76ca0e Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 13:47:59 -0700 Subject: [PATCH 03/23] trying to generate binary file in CI run --- .github/workflows/io_gnu.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 89acaed0c..bf91a9f8b 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -109,6 +109,9 @@ jobs: which ncdump cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 + ls -l + pwd + ./ww3_grid ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From 2c374384b4e2ac29cba79e586aa097d45e7a0de9 Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 13:55:51 -0700 Subject: [PATCH 04/23] trying to generate binary file --- .github/workflows/io_gnu.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index bf91a9f8b..6ca1ce9d3 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -111,7 +111,8 @@ jobs: make -j2 VERBOSE=1 ls -l pwd - ./ww3_grid + ./bin/ww3_grid + ls -l ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From b6d5e356007452d0eed7964215ee5fc8e9eacd78 Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 14:03:02 -0700 Subject: [PATCH 05/23] trying to generate binary file --- .github/workflows/io_gnu.yml | 2 +- model/tests/CMakeLists.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 6ca1ce9d3..90c169839 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -109,10 +109,10 @@ jobs: which ncdump cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 - ls -l pwd ./bin/ww3_grid ls -l + ls -l model/test/data ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index d1949c2ce..336edc39d 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -6,6 +6,7 @@ # Some very small test files may be committed to the repo. This # function copies such a data file to the build directory. function(copy_test_data name) + message(STATUS "Copying ${name} to ${CMAKE_CURRENT_BINARY_DIR}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/data/${name}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR} FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) @@ -14,6 +15,7 @@ endfunction() # Some very small test files may be committed to the repo. This # function copies such a data file to the build directory. function(copy_test_data_2 srcname destname) + message(STATUS "Copying ${srcname} to ${CMAKE_CURRENT_BINARY_DIR}/${destname}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/data/${srcname}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) From 5560061704d03bc30bc775dbc3411a4872184ba3 Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 14:25:21 -0700 Subject: [PATCH 06/23] trying to generate binary file --- model/tests/CMakeLists.txt | 3 +-- model/tests/data/io_mod_def.ww3 | Bin 6321 -> 0 bytes 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 model/tests/data/io_mod_def.ww3 diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index 336edc39d..430a54e96 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -31,9 +31,8 @@ endfunction() # Copy test data files that are in the repo to the build directory. copy_test_data(out_pnt.ww3) -copy_test_data_2(io_mod_def.ww3 mod_def.ww3) copy_test_data(switch.io) -copy_test_data(ww3_outp.inp) +copy_test_data_2(ww3_grid.inp ../ww3_grid.inp) # Build and run the tests. unit_test(test_io_points_bin) diff --git a/model/tests/data/io_mod_def.ww3 b/model/tests/data/io_mod_def.ww3 deleted file mode 100644 index b8d754881d98a602f2d73f780e85d8916b927518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6321 zcmeHL2~br>7JbMUK`|_YxQxpiHAoC95+u^MyZ=L$h!S*^C@F;!3pFSL0zpR^{URF0 z1;>R!qKJxu5EX+(gkgXXjT=D+1O!|dV!7Y~D&mUF?aya|){Ny$g{hhW4)vcCDt{Rg79KjsZ{aVG<{2!1GSyY~3!D=X;1?bc93)$h{xU=k2@MYUK$g9N z0~h)Q$$mlpvhx>yfdLDGBe31k(E;0JdBj^y!bwB94Ta`96TUG*I}a^ry1J?BPDK(p zsRPDMk#@Imyd-I1kEM*j-rqMMP9u^KAqb2YppPcm7g}Mc{hXuU zb2G-o+UiKW>-_(>Jh2u#5@MZqB!u?j+23_fiFeg|2onUJdy*N#9Pt~31)>)McZAd% zA>L)3`QM@sU(`N+>->~=?c9w1*^AET%P_I&(ZLQRjM{&JR&%J=FOT>RR!J&Se;XfI2s$&iKB;brQYm9``Feu$R)zC; zr!)WC^%1(Ub+-Gs2K5u~DMiv#2UWJ}CQ79>j_qBL_qC3{AL|CVC-imvds>}a`FfbA zk*{cJK>juzzcWATtJM|teN!K;_E$11g#KKVn%3Xdc^XNTcO|nj598W$MawfxBZ+q8 zRq6O;sCBc5=dEaYg}gEyzZC0_Ff8~I@;meY3w_$HTkZNsEnnff-7j>*G99(+B6Jq} z0O#+Qb*^rCiSg&ie~!G}I{qF}$9>Ti`CVV*V}I>@b>@FvpCr_IUqyHR)6b*S(xGOx zTp6i-&*QsWTNkm8f*7kKA%3rPAXv7?Vs>-)Hg5VuF1K$?=d(wbGtHr9QD;e&k+j?5 z2AZcyrO^{*tuN{w1u;%XLOeqUg1zr^i&=*>as4YL+OpbgkrF%aoD!An!l&hL=P4(@ z(cQ@k#9l`ezum>XK-jP5i}`C!*`a?6+GUr~_h;fBTe%~Fr!9Yu$6X7?#P1SXsH|A(hXrg;sulY>`~cg&;R1`jt6?#*MQnALG1F`* zW{WG*SWuHSo4af#^YyD`(~{HJB>poSZ)3`w<~1>LKZe=ozQ;xuHL?!|RIwrH+t|P` zE7o^WF0)8ZW~N5ItjDeutefvyray52eN|9JpExGd`j<`gcDLEI_OrdT`g#&AI~qdI zXM4~y&oLTH=?PN$_JquEAkAnja@Z4a8g{Fm!p=h$kl>dC z@q>55_IiKVda4lqls*??6AWSFR$o~E=fSXUzcGB3dl^<=odVHDwh+a}f@Y~L{BcDA zEbT8t#2Ir4TjKyBQ~SfhQS)Jbze1R2Q3(D6EWq!hnczEpGR#=J4ZMG>g=uCrFg3sf zCKp`>PpZJg?-X!n8^Eo&0bCZyFwX1-s0&{KTRs-Rc?vk1TY^KK7ucV>0CrivV0-Wc zjNE?-Y|{K;_;=&Lx<~=5+jj7N&juJmCd2Q7tYFYVPZ)4#FZ8#64*gc!L!Zmm(A)7i z^x9Pj7KQ`Cd`T9V*3SZyKtt$xe+?K%6haSGA{fO>U}$?542rKq*HAl9^-F**rwu@F z=}eGDN0H{LBJyI!CGzx!A!+) Date: Wed, 6 Dec 2023 14:45:48 -0700 Subject: [PATCH 07/23] trying to generate binary file --- .github/workflows/io_gnu.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 90c169839..31e1ed9bb 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -109,10 +109,10 @@ jobs: which ncdump cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 + ls -l model/test/data pwd - ./bin/ww3_grid ls -l - ls -l model/test/data + ./bin/ww3_grid ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From 7aa23d6443b2eafd31d59df3cf7575463154c21a Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 14:54:38 -0700 Subject: [PATCH 08/23] trying to generate binary file --- .github/workflows/io_gnu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 31e1ed9bb..b4ef72eec 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -109,9 +109,9 @@ jobs: which ncdump cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 - ls -l model/test/data pwd ls -l + ls -l model/tests ./bin/ww3_grid ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From 0daaa9d4eb859510b1de25bd251de53ae81dd86e Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 15:13:12 -0700 Subject: [PATCH 09/23] trying to generate binary file --- model/tests/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index 430a54e96..73b889d5b 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -17,9 +17,9 @@ endfunction() function(copy_test_data_2 srcname destname) message(STATUS "Copying ${srcname} to ${CMAKE_CURRENT_BINARY_DIR}/${destname}") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/data/${srcname}" - DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" + DESTINATION "${CMAKE_BINARY_DIR}" FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) - file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${srcname}" "${CMAKE_CURRENT_BINARY_DIR}/${destname}") + file(RENAME "${CMAKE_BINARY_DIR}/${srcname}" "${CMAKE_BINARY_DIR}/${destname}") endfunction() # Function to build and run a test. @@ -32,7 +32,7 @@ endfunction() # Copy test data files that are in the repo to the build directory. copy_test_data(out_pnt.ww3) copy_test_data(switch.io) -copy_test_data_2(ww3_grid.inp ../ww3_grid.inp) +copy_test_data_2(ww3_grid.inp ww3_grid.inp) # Build and run the tests. unit_test(test_io_points_bin) From 1d6f6019aec9dc2ebe7f11170ffc43ba1a7514bd Mon Sep 17 00:00:00 2001 From: Ed Date: Wed, 6 Dec 2023 15:18:52 -0700 Subject: [PATCH 10/23] trying to generate binary file --- .github/workflows/io_gnu.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index b4ef72eec..81aa09001 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -113,6 +113,8 @@ jobs: ls -l ls -l model/tests ./bin/ww3_grid + ls -l + mv mod_def.ww3 model/tests ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From b98999bdb5769fca849c4348d2587fdf63cbdafb Mon Sep 17 00:00:00 2001 From: Ed Date: Thu, 21 Dec 2023 12:49:56 -0700 Subject: [PATCH 11/23] starting to create my own out_pnt.ww3 --- model/tests/CMakeLists.txt | 1 - model/tests/data/out_pnt.ww3 | Bin 193804 -> 0 bytes model/tests/test_io_points_bin.F90 | 24 +++++++++++++++++++----- 3 files changed, 19 insertions(+), 6 deletions(-) delete mode 100644 model/tests/data/out_pnt.ww3 diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index 73b889d5b..69445bfb7 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -30,7 +30,6 @@ function(unit_test name) endfunction() # Copy test data files that are in the repo to the build directory. -copy_test_data(out_pnt.ww3) copy_test_data(switch.io) copy_test_data_2(ww3_grid.inp ww3_grid.inp) diff --git a/model/tests/data/out_pnt.ww3 b/model/tests/data/out_pnt.ww3 deleted file mode 100644 index a911732ac7a8ec689742171669947a6c6568f9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193804 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 AEdT%j diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index 8bc0e5b75..c20e3dd53 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -12,12 +12,14 @@ program test_io_points_bin implicit none integer, target :: i, j, k, l - integer :: ndsop, iotest, imod, ndstst, ierr, ndsbul, ndsm + integer :: ndsop, iotest, imod, ndstst, ndsbul, ndsm integer :: ndstrc, ntrace real :: m2km character*7 expected_ptnme character*6 my_fmt real :: expected_loc_1 + integer :: write_test_file + integer :: ierr print *, 'Testing WW3 binary point file code.' @@ -35,15 +37,15 @@ program test_io_points_bin ndsbul = 0 ndstrc = 6 ntrace = 10 + + ! Create a point output file needed for this test. + if (write_test_file() .ne. 0) stop 1 + write (ndso,900) 900 FORMAT (/15X,' *** WAVEWATCH III Point output post.*** '/ & 15X,'==============================================='/) - ! Open the file with the output settings for WW3. It is not needed actually. - ! open(ndsi, file = 'ww3_outp.inp', status='old', iostat = ierr) - ! if (ierr .ne. 0) stop 10 - ! 2. Read model definition file. CALL W3IOGR('READ', NDSM) WRITE (NDSO,920) GNAME @@ -80,4 +82,16 @@ program test_io_points_bin print *, 'OK!' print *, 'SUCCESS!' end program test_io_points_bin + +integer function write_test_file() + implicit none + integer :: ntlu, ierr + + ntlu = 21 + open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", action="write", iostat=ierr) + if (ierr .ne. 0) stop 111 + ! write (ntlu) idstr, veropt, nk, nth, nopts + close(ntlu) + write_test_file = 0 +end function write_test_file From 2991c5918c60bcb1e7f1fd16ce808767f8915d72 Mon Sep 17 00:00:00 2001 From: Ed Date: Thu, 21 Dec 2023 13:11:22 -0700 Subject: [PATCH 12/23] stop trying to run ww3_grid from cmake --- model/tests/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index 69445bfb7..afb02847f 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -29,6 +29,18 @@ function(unit_test name) add_test(NAME ${name} COMMAND ${name}) endfunction() +# add_custom_command( +# OUTPUT mod_def.ww3 +# COMMAND ./bin/ww3_grid +# COMMENT "Generating the mod_def.ww3 file" +# VERBATIM +# ) + +# add_custom_target( +# BuildModDef ALL +# DEPENDS mod_def.ww3 +# ) + # Copy test data files that are in the repo to the build directory. copy_test_data(switch.io) copy_test_data_2(ww3_grid.inp ww3_grid.inp) From 6182d014a63a6715d5f74b1a703a658d56e3cbb1 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Thu, 21 Dec 2023 18:13:21 -0700 Subject: [PATCH 13/23] further development --- model/tests/test_io_points_bin.F90 | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index c20e3dd53..eaf7c0b12 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -40,7 +40,6 @@ program test_io_points_bin ! Create a point output file needed for this test. if (write_test_file() .ne. 0) stop 1 - write (ndso,900) 900 FORMAT (/15X,' *** WAVEWATCH III Point output post.*** '/ & @@ -85,12 +84,35 @@ end program test_io_points_bin integer function write_test_file() implicit none - integer :: ntlu, ierr + + integer :: ntlu, nk, nth, nopts + character(len=10), parameter :: veropt = '2021-04-06' + character(len=31), parameter :: idstr = 'wavewatch iii point output file' + real, pointer :: ptloc(:,:) + character*7 ptnme(11) + integer :: time(2) + integer :: nspec = 2 + integer :: iw(11), ii(11), il(11), iceo(11), iceho(11), icefo(11) + real :: dpo(11), wao(11), wdo(11), aso(11), cao(11), cdo(11), grdid(11) + real :: spco(2, 11) + integer :: i, j + integer :: ierr ntlu = 21 + nk = 1 + nth = 1 + nopts = 11 open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", action="write", iostat=ierr) if (ierr .ne. 0) stop 111 - ! write (ntlu) idstr, veropt, nk, nth, nopts + write (ntlu) idstr, veropt, nk, nth, nopts + allocate(ptloc(2, nopts)) + write (ntlu) ((ptloc(j,i),j=1,2),i=1,nopts), (ptnme(i),i=1,nopts) + write (ntlu) time + do i=1, nopts + write (ntlu) iw(i), ii(i), il(i), dpo(i), wao(i), wdo(i), & + aso(i), cao(i), cdo(i), iceo(i), iceho(i), & + icefo(i), grdid(i), (spco(j,i),j=1,nspec) + enddo close(ntlu) write_test_file = 0 end function write_test_file From 3deeba05fb2a00db9b9f59b5b8a3484fa21a72fd Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Fri, 22 Dec 2023 06:13:17 -0700 Subject: [PATCH 14/23] more progress --- model/tests/test_io_points_bin.F90 | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index eaf7c0b12..9d263fa9a 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -87,7 +87,7 @@ integer function write_test_file() integer :: ntlu, nk, nth, nopts character(len=10), parameter :: veropt = '2021-04-06' - character(len=31), parameter :: idstr = 'wavewatch iii point output file' + character(len=31), parameter :: idstr = 'WAVEWATCH III POINT OUTPUT FILE' real, pointer :: ptloc(:,:) character*7 ptnme(11) integer :: time(2) @@ -99,10 +99,11 @@ integer function write_test_file() integer :: ierr ntlu = 21 - nk = 1 - nth = 1 + nk = 3 + nth = 24 nopts = 11 - open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", action="write", iostat=ierr) + open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", & + action="write", convert="big_endian", iostat=ierr) if (ierr .ne. 0) stop 111 write (ntlu) idstr, veropt, nk, nth, nopts allocate(ptloc(2, nopts)) From 21a483f9447cf0b9a9bb7d279f5422815d2f6b6f Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Fri, 22 Dec 2023 07:16:31 -0700 Subject: [PATCH 15/23] more progress --- model/tests/test_io_points_bin.F90 | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index 9d263fa9a..4f0da99b9 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -88,8 +88,10 @@ integer function write_test_file() integer :: ntlu, nk, nth, nopts character(len=10), parameter :: veropt = '2021-04-06' character(len=31), parameter :: idstr = 'WAVEWATCH III POINT OUTPUT FILE' - real, pointer :: ptloc(:,:) - character*7 ptnme(11) + real :: ptloc(2,11) = reshape((/ 0., 0., 5000., 0., 10000., 0., 15000., 0., & + 20000., 0., 25000., 0., 30000., 0., 35000., 0., 40000., 0., 45000., 0., 50000., 0. /), & + (/ 2, 11 /)) + character*40 ptnme(11) integer :: time(2) integer :: nspec = 2 integer :: iw(11), ii(11), il(11), iceo(11), iceho(11), icefo(11) @@ -102,17 +104,29 @@ integer function write_test_file() nk = 3 nth = 24 nopts = 11 + do i = 1, nopts + if (i .le. 9) then + write(ptnme(i), '(a,i1)') 'Point', i + else + write(ptnme(i), '(a,i2)') 'Point', i + endif + print *, ptnme(i) + end do + print *, ptloc open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", & action="write", convert="big_endian", iostat=ierr) if (ierr .ne. 0) stop 111 - write (ntlu) idstr, veropt, nk, nth, nopts - allocate(ptloc(2, nopts)) - write (ntlu) ((ptloc(j,i),j=1,2),i=1,nopts), (ptnme(i),i=1,nopts) - write (ntlu) time + write (ntlu, iostat=ierr) idstr, veropt, nk, nth, nopts + if (ierr .ne. 0) stop 112 + write (ntlu, iostat=ierr) ((ptloc(j,i),j=1,2),i=1,nopts), (ptnme(i),i=1,nopts) + if (ierr .ne. 0) stop 113 + write (ntlu, iostat=ierr) time + if (ierr .ne. 0) stop 114 do i=1, nopts - write (ntlu) iw(i), ii(i), il(i), dpo(i), wao(i), wdo(i), & + write (ntlu, iostat=ierr) iw(i), ii(i), il(i), dpo(i), wao(i), wdo(i), & aso(i), cao(i), cdo(i), iceo(i), iceho(i), & icefo(i), grdid(i), (spco(j,i),j=1,nspec) + if (ierr .ne. 0) stop 115 enddo close(ntlu) write_test_file = 0 From 991e89f0e8789e157b6fc14570ee0e06a37d427c Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 26 Dec 2023 11:28:42 -0700 Subject: [PATCH 16/23] modified test --- model/tests/test_io_points_bin.F90 | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index 4f0da99b9..c93171d7e 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -92,14 +92,21 @@ integer function write_test_file() 20000., 0., 25000., 0., 30000., 0., 35000., 0., 40000., 0., 45000., 0., 50000., 0. /), & (/ 2, 11 /)) character*40 ptnme(11) - integer :: time(2) + integer :: time(2) = (/ 19680606, 0 /) integer :: nspec = 2 - integer :: iw(11), ii(11), il(11), iceo(11), iceho(11), icefo(11) + integer :: iw(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) + integer :: ii(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) + integer :: il(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) + real :: iceo(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + real :: iceho(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + real :: icefo(11) = (/ 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000. /) + real :: dpo(11) = (/ 50., 50., 45., 40., 35., 30., 25., 20., 15., 10., 5. /) real :: dpo(11), wao(11), wdo(11), aso(11), cao(11), cdo(11), grdid(11) real :: spco(2, 11) integer :: i, j integer :: ierr + ! Initialize some values. ntlu = 21 nk = 3 nth = 24 @@ -112,10 +119,15 @@ integer function write_test_file() endif print *, ptnme(i) end do + print *, ptloc + + ! Open the file. open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", & action="write", convert="big_endian", iostat=ierr) if (ierr .ne. 0) stop 111 + + ! Write our values. write (ntlu, iostat=ierr) idstr, veropt, nk, nth, nopts if (ierr .ne. 0) stop 112 write (ntlu, iostat=ierr) ((ptloc(j,i),j=1,2),i=1,nopts), (ptnme(i),i=1,nopts) @@ -128,7 +140,11 @@ integer function write_test_file() icefo(i), grdid(i), (spco(j,i),j=1,nspec) if (ierr .ne. 0) stop 115 enddo + + ! Close the file. close(ntlu) + + ! We're done! write_test_file = 0 end function write_test_file From dde25b387436501e302960bcfcefc5e164ad9773 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 26 Dec 2023 11:29:11 -0700 Subject: [PATCH 17/23] updated intel workflow --- .github/workflows/intel.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/intel.yml b/.github/workflows/intel.yml index 700553cea..54a388c55 100644 --- a/.github/workflows/intel.yml +++ b/.github/workflows/intel.yml @@ -1,3 +1,8 @@ +# This is a GitHub actions workflow for WW3. +# +# This workflow builds with the Intel compilers. +# +# Matt Masarik, Alex Richert, Ed Hartnett name: Intel Linux Build on: [push, pull_request, workflow_dispatch] @@ -8,7 +13,7 @@ concurrency: # Set I_MPI_CC/F90 so Intel MPI wrapper uses icc/ifort instead of gcc/gfortran env: - cache_key: intel10 + cache_key: intel10-3 CC: icc FC: ifort CXX: icpc @@ -51,7 +56,7 @@ jobs: sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list sudo apt-get update - sudo apt-get install intel-oneapi-dev-utilities intel-oneapi-mpi-devel intel-oneapi-openmp intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic + sudo apt-get install intel-oneapi-dev-utilities intel-oneapi-mpi-devel intel-oneapi-compiler-fortran-2023.2.1 intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic-2023.2.1 intel-oneapi-openmp # Build WW3 spack environment - name: install-dependencies-with-spack From bbc7aea6a0de2ed75108886ec5bd825e11a05649 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 26 Dec 2023 11:54:07 -0700 Subject: [PATCH 18/23] working on test --- model/tests/test_io_points_bin.F90 | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/model/tests/test_io_points_bin.F90 b/model/tests/test_io_points_bin.F90 index c93171d7e..69c197bce 100644 --- a/model/tests/test_io_points_bin.F90 +++ b/model/tests/test_io_points_bin.F90 @@ -11,15 +11,13 @@ program test_io_points_bin use w3adatmd implicit none - integer, target :: i, j, k, l - integer :: ndsop, iotest, imod, ndstst, ndsbul, ndsm + integer, target :: i + integer :: ndsop, iotest, ndsbul, ndsm integer :: ndstrc, ntrace - real :: m2km character*7 expected_ptnme character*6 my_fmt real :: expected_loc_1 integer :: write_test_file - integer :: ierr print *, 'Testing WW3 binary point file code.' @@ -93,7 +91,7 @@ integer function write_test_file() (/ 2, 11 /)) character*40 ptnme(11) integer :: time(2) = (/ 19680606, 0 /) - integer :: nspec = 2 + integer :: nspec = 72 integer :: iw(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) integer :: ii(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) integer :: il(11) = (/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /) @@ -101,8 +99,14 @@ integer function write_test_file() real :: iceho(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) real :: icefo(11) = (/ 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000. /) real :: dpo(11) = (/ 50., 50., 45., 40., 35., 30., 25., 20., 15., 10., 5. /) - real :: dpo(11), wao(11), wdo(11), aso(11), cao(11), cdo(11), grdid(11) - real :: spco(2, 11) + real :: wao(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + real :: wdo(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + real :: aso(11) = (/ -999.900024, -999.900024, -999.900024, -999.900024, -999.900024, & + -999.900024, -999.900024, -999.900024, -999.900024, -999.900024, -999.900024 /) + real :: cao(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + real :: cdo(11) = (/ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. /) + character*13 :: grdid(11) + real :: spco(72, 11) integer :: i, j integer :: ierr @@ -117,11 +121,9 @@ integer function write_test_file() else write(ptnme(i), '(a,i2)') 'Point', i endif - print *, ptnme(i) + grdid(i) = 'ww3 ' end do - print *, ptloc - ! Open the file. open(ntlu, file="out_pnt.ww3", form="unformatted", status="replace", & action="write", convert="big_endian", iostat=ierr) From f81ae8233516ba3c399aa8effe8f72137a45578a Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 26 Dec 2023 12:45:46 -0700 Subject: [PATCH 19/23] clean up --- model/tests/CMakeLists.txt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/model/tests/CMakeLists.txt b/model/tests/CMakeLists.txt index afb02847f..69445bfb7 100644 --- a/model/tests/CMakeLists.txt +++ b/model/tests/CMakeLists.txt @@ -29,18 +29,6 @@ function(unit_test name) add_test(NAME ${name} COMMAND ${name}) endfunction() -# add_custom_command( -# OUTPUT mod_def.ww3 -# COMMAND ./bin/ww3_grid -# COMMENT "Generating the mod_def.ww3 file" -# VERBATIM -# ) - -# add_custom_target( -# BuildModDef ALL -# DEPENDS mod_def.ww3 -# ) - # Copy test data files that are in the repo to the build directory. copy_test_data(switch.io) copy_test_data_2(ww3_grid.inp ww3_grid.inp) From 5781b62911539e7366ffe62f99a7ba42f7886fb1 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Fri, 29 Dec 2023 09:12:26 -0700 Subject: [PATCH 20/23] cleanup --- .github/workflows/io_gnu.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 81aa09001..1317bd69c 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -103,17 +103,10 @@ jobs: export FC=mpif90 export OASISDIR=${GITHUB_WORKSPACE}/work_oasis3-mct mkdir build && cd build - pwd - echo "${GITHUB_WORKSPACE}" export LD_LIBRARY_PATH="/home/runner/work/WW3/WW3/spack/var/spack/environments/ww3-gnu/.spack-env/view/:$LD_LIBRARY_PATH" - which ncdump cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 - pwd - ls -l - ls -l model/tests ./bin/ww3_grid - ls -l mv mod_def.ww3 model/tests ctest --verbose --output-on-failure --rerun-failed gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null From f185ff2559811edc83a3e556b68f70fff0562181 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 2 Jan 2024 16:14:15 -0700 Subject: [PATCH 21/23] moving directory --- .github/workflows/io_gnu.yml | 4 ++-- CMakeLists.txt | 2 +- {model/tests => regtests/unittests}/CMakeLists.txt | 0 {model/tests => regtests/unittests}/data/switch.io | 0 {model/tests => regtests/unittests}/data/ww3_grid.inp | 0 {model/tests => regtests/unittests}/data/ww3_outp.inp | 0 {model/tests => regtests/unittests}/test_io_points_bin.F90 | 0 7 files changed, 3 insertions(+), 3 deletions(-) rename {model/tests => regtests/unittests}/CMakeLists.txt (100%) rename {model/tests => regtests/unittests}/data/switch.io (100%) rename {model/tests => regtests/unittests}/data/ww3_grid.inp (100%) rename {model/tests => regtests/unittests}/data/ww3_outp.inp (100%) rename {model/tests => regtests/unittests}/test_io_points_bin.F90 (100%) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 1317bd69c..2a538deee 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -107,9 +107,9 @@ jobs: cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 ./bin/ww3_grid - mv mod_def.ww3 model/tests + mv mod_def.ww3 regtests/unittests ctest --verbose --output-on-failure --rerun-failed - gcovr --root .. -v --html-details --exclude ../model/tests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null + gcovr --root .. -v --html-details --exclude ../regtests/unittests --exclude CMakeFiles --print-summary -o test-coverage.html &> /dev/null - name: upload-test-coverage uses: actions/upload-artifact@v3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 126f6faf8..5436f9cb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,5 +62,5 @@ add_subdirectory(model) # Turn on unit testing. include(CTest) if(BUILD_TESTING) - add_subdirectory(model/tests) + add_subdirectory(regtests/unittests) endif() diff --git a/model/tests/CMakeLists.txt b/regtests/unittests/CMakeLists.txt similarity index 100% rename from model/tests/CMakeLists.txt rename to regtests/unittests/CMakeLists.txt diff --git a/model/tests/data/switch.io b/regtests/unittests/data/switch.io similarity index 100% rename from model/tests/data/switch.io rename to regtests/unittests/data/switch.io diff --git a/model/tests/data/ww3_grid.inp b/regtests/unittests/data/ww3_grid.inp similarity index 100% rename from model/tests/data/ww3_grid.inp rename to regtests/unittests/data/ww3_grid.inp diff --git a/model/tests/data/ww3_outp.inp b/regtests/unittests/data/ww3_outp.inp similarity index 100% rename from model/tests/data/ww3_outp.inp rename to regtests/unittests/data/ww3_outp.inp diff --git a/model/tests/test_io_points_bin.F90 b/regtests/unittests/test_io_points_bin.F90 similarity index 100% rename from model/tests/test_io_points_bin.F90 rename to regtests/unittests/test_io_points_bin.F90 From 8adb45ea9953ba5576c0b48a4db5329e64442024 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Tue, 2 Jan 2024 16:17:27 -0700 Subject: [PATCH 22/23] moving directory --- .github/workflows/io_gnu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu.yml index 2a538deee..def5a1402 100644 --- a/.github/workflows/io_gnu.yml +++ b/.github/workflows/io_gnu.yml @@ -104,7 +104,7 @@ jobs: export OASISDIR=${GITHUB_WORKSPACE}/work_oasis3-mct mkdir build && cd build export LD_LIBRARY_PATH="/home/runner/work/WW3/WW3/spack/var/spack/environments/ww3-gnu/.spack-env/view/:$LD_LIBRARY_PATH" - cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/model/tests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. + cmake -DSWITCH=${GITHUB_WORKSPACE}/ww3/regtests/unittests/data/switch.io -DCMAKE_BUILD_TYPE=Debug -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -Wall -fno-omit-frame-pointer -fsanitize=address" .. make -j2 VERBOSE=1 ./bin/ww3_grid mv mod_def.ww3 regtests/unittests From c04fd4357e8a7fdd6d0286ef2b7c9b1b9d953e99 Mon Sep 17 00:00:00 2001 From: Edward Hartnett Date: Thu, 4 Jan 2024 04:52:15 -0700 Subject: [PATCH 23/23] turned off CI testing --- .github/workflows/{io_gnu.yml => io_gnu_yml.old} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{io_gnu.yml => io_gnu_yml.old} (100%) diff --git a/.github/workflows/io_gnu.yml b/.github/workflows/io_gnu_yml.old similarity index 100% rename from .github/workflows/io_gnu.yml rename to .github/workflows/io_gnu_yml.old