diff --git a/.github/workflows/regtest_gnu.yml b/.github/workflows/regtest_gnu.yml new file mode 100644 index 000000000..d5b71673c --- /dev/null +++ b/.github/workflows/regtest_gnu.yml @@ -0,0 +1,130 @@ +name: regtest_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} + + regtest_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 + 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/regtests/unittests/data/switch.io -DCMAKE_BUILD_TYPE=Debug .. + # make -j2 VERBOSE=1 + cd ${GITHUB_WORKSPACE}/ww3 + ls -l + ${GITHUB_WORKSPACE}/ww3/model/bin/ww3_from_ftp.sh -k + cd regtests + ./bin/run_cmake_test -o all -S -T -s PR1_MPI -w work_PR1_MPI -f -p mpirun -n 24 ../model ww3_tp2.5 + cd ww3_tp2.5 + ls -l + cd work_PR1_MPI + pwd + ls -l + # ncdump -h out_pnt.ww3.nc > ncdump_out.txt + # cat ncdump_out.txt + # pwd + # cat ${GITHUB_WORKSPACE}/ww3/regtests/ww3_tp2.5/out_pnt_ncdump.txt + # cmp ${GITHUB_WORKSPACE}/ww3/regtests/ww3_tp2.5/out_pnt_ncdump.txt ncdump_out.txt + + - name: cache-data + id: cache-data + uses: actions/cache@v3 + with: + path: ww3/ww3_from_ftp.v7.14.1.tar.gz + key: ww3_from_ftp.v7.14.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5436f9cb1..5070e3aa5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ project( get_directory_property(hasParent PARENT_DIRECTORY) if(hasParent) - # Unset flags that come from Parent (ie UFS or other coupled build) + # Unset flags that come from Parent (ie UFS or other coupled build) # for potential (-r8/-r4) conflict set(CMAKE_Fortran_FLAGS "") set(CMAKE_C_FLAGS "") @@ -22,8 +22,9 @@ endif() set(MULTI_ESMF OFF CACHE BOOL "Build ww3_multi_esmf library") set(NETCDF ON CACHE BOOL "Build NetCDF programs (requires NetCDF)") -set(ENDIAN "BIG" CACHE STRING "Endianness of unformatted output files. Valid values are 'BIG', 'LITTLE', 'NATIVE'.") +set(ENDIAN "BIG" CACHE STRING "Endianness of unformatted output files. Valid values are 'BIG', 'LITTLE', 'NATIVE'.") set(EXCLUDE_FIND "" CACHE STRING "Don't try and search for these libraries (assumd to be handled by the compiler/wrapper)") +set(ENABLE_DOCS OFF CACHE BOOL "Enable building of doxygen generated documentation") # make sure all "exclude_find" entries are lower case list(TRANSFORM EXCLUDE_FIND TOLOWER) @@ -59,8 +60,15 @@ endif() add_subdirectory(model) -# Turn on unit testing. -include(CTest) -if(BUILD_TESTING) - add_subdirectory(regtests/unittests) +# Turn on doxygen documentation +if (ENABLE_DOCS) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/docs/cmake") + include(EnableDoxygen) + add_subdirectory(docs) endif() + +# Turn on unit testing. +#include(CTest) +#if(BUILD_TESTING) +# add_subdirectory(regtests/unittests) +#endif() diff --git a/README.md b/README.md index fa2c1df63..42ac91178 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,25 @@ # The WAVEWATCH III Framework -WAVEWATCH III® is a community wave modeling framework that includes the +WAVEWATCH III® is a community wave modeling framework that includes the latest scientific advancements in the field of wind-wave modeling and dynamics. ## General Features -WAVEWATCH III® solves the random phase spectral action density -balance equation for wavenumber-direction spectra. The model includes options -for shallow-water (surf zone) applications, as well as wetting and drying of -grid points. Propagation of a wave spectrum can be solved using regular -(rectilinear or curvilinear) and unstructured (triangular) grids. See -[About WW3](https://github.com/NOAA-EMC/WW3/wiki/About-WW3) for a -detailed description of WAVEWATCH III® . +WAVEWATCH III® solves the random phase spectral action density +balance equation for wavenumber-direction spectra. The model includes options +for shallow-water (surf zone) applications, as well as wetting and drying of +grid points. Propagation of a wave spectrum can be solved using regular +(rectilinear or curvilinear) and unstructured (triangular) grids. See +[About WW3](https://github.com/NOAA-EMC/WW3/wiki/About-WW3) for a +detailed description of WAVEWATCH III®. For a web-based +view of the WAVEWATCH III® source code +refer to the [WW3 doxygen documentation](https://noaa-emc.github.io/WW3). ## Installation -The WAVEWATCH III® framework package has two parts that need to be combined so -all runs smoothly: the GitHub repo itself, and a binary data file bundle that -needs to be obtained from our ftp site. Steps to successfully acquire and install +The WAVEWATCH III® framework package has two parts that need to be combined so +all runs smoothly: the GitHub repo itself, and a binary data file bundle that +needs to be obtained from our ftp site. Steps to successfully acquire and install the framework are outlined in our [Quick Start](https://github.com/NOAA-EMC/WW3/wiki/Quick-Start) guide. @@ -35,4 +37,3 @@ endorsement, recommendation or favoring by the Department of Commerce. The Department of Commerce seal and logo, or the seal and logo of a DOC bureau, shall not be used in any manner to imply endorsement of any commercial product or activity by DOC or the United States Government. - diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt new file mode 100644 index 000000000..7aa89edeb --- /dev/null +++ b/docs/CMakeLists.txt @@ -0,0 +1 @@ +EnableDoxygen(docs) diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index 23349c8da..93a26c5a2 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = docs +OUTPUT_DIRECTORY = @doc_output@ # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -829,7 +829,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = model/src +INPUT = @src_input@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -2285,7 +2285,7 @@ CLASS_DIAGRAMS = NO # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. -DIA_PATH = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. diff --git a/docs/cmake/EnableDoxygen.cmake b/docs/cmake/EnableDoxygen.cmake new file mode 100644 index 000000000..20af91e59 --- /dev/null +++ b/docs/cmake/EnableDoxygen.cmake @@ -0,0 +1,27 @@ +# Doxygen documentation- Matt Masarik 24-Jul-2024. +function(EnableDoxygen outdir) + find_package(Doxygen REQUIRED) + if (NOT DOXYGEN_FOUND) + add_custom_target(enable_docs + COMMAND false + COMMENT "Doxygen not found") + return() + endif() + + set(src_input "${CMAKE_SOURCE_DIR}/model/src") + set(doc_output "${CMAKE_BINARY_DIR}/${outdir}") + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${outdir}/html) + CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/docs/Doxyfile.in + ${CMAKE_BINARY_DIR}/${outdir}/Doxyfile @ONLY) + set(DOXYGEN_GENERATE_HTML YES) + set(DOXYGEN_QUIET YES) + add_custom_target(enable_docs + COMMAND + ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/${outdir}/Doxyfile + WORKING_DIRECTORY + ${CMAKE_BINARY_DIR}/${outdir} + COMMENT + "Generate Doxygen HTML documentation") + message("-- Doxygen HTML index page: " + ${CMAKE_BINARY_DIR}/${outdir}/html/index.html) +endfunction() diff --git a/model/bin/ww3_from_ftp.sh b/model/bin/ww3_from_ftp.sh index 67efc9284..4ab231e54 100755 --- a/model/bin/ww3_from_ftp.sh +++ b/model/bin/ww3_from_ftp.sh @@ -61,11 +61,14 @@ fi #Move to top level directory of ww3: cd $ww3dir -#Download from ftp and uptar: -echo -e "Downloading and untaring file from ftp:" -wget --no-check-certificate https://ftp.emc.ncep.noaa.gov/static_files/public/WW3/ww3_from_ftp.${ww3ver}.tar.gz +#Download from ftp (if not already present) and uptar: +echo -e "Downloading (or finding) and untaring file from ftp:" +if ! test -f ww3_from_ftp.${ww3ver}.tar.gz; then + wget --no-check-certificate https://ftp.emc.ncep.noaa.gov/static_files/public/WW3/ww3_from_ftp.${ww3ver}.tar.gz +fi tar -xvzf ww3_from_ftp.${ww3ver}.tar.gz + #Move regtest info from data_regtests to regtests: echo -e "Moving data from data_regtests to regtests" cp -r data_regtests/ww3_tp2.18/input/*.nc regtests/ww3_tp2.18/input/ diff --git a/model/src/CMakeLists.txt b/model/src/CMakeLists.txt index 7dd7d82a2..4710576a5 100644 --- a/model/src/CMakeLists.txt +++ b/model/src/CMakeLists.txt @@ -174,10 +174,9 @@ if("SCRIP" IN_LIST switches) target_sources(ww3_lib PRIVATE ${scrip_src}) endif() - -if("SCRIPNC" IN_LIST switches OR "OASIS" IN_LIST switches OR "TRKNC" IN_LIST switches) +if("SCRIPNC" IN_LIST switches OR "OASIS" IN_LIST switches OR "TRKNC" IN_LIST switches OR "BIN2NC" IN_LIST switches) if(NOT NetCDF_Fortran_FOUND) - message(FATAL_ERROR "Cannot build SCRIPNC, OASIS, or TRKNC without NetCDF") + message(FATAL_ERROR "Cannot build SCRIPNC, OASIS, TRKNC, or BIN2NC without NetCDF") endif() endif() diff --git a/model/src/cmake/switches.json b/model/src/cmake/switches.json index 30eca480c..a7b9bc94f 100644 --- a/model/src/cmake/switches.json +++ b/model/src/cmake/switches.json @@ -814,6 +814,16 @@ } ] }, + { + "name": "bin2nc", + "num_switches": "upto1", + "description": "use netcdf instead of binary model output", + "valid-options": [ + { + "name": "BIN2NC" + } + ] + }, { "name": "ascii", "num_switches": "upto1", diff --git a/model/src/gx_outp.F90 b/model/src/gx_outp.F90 index d34fdbaa7..8dce5f4d0 100644 --- a/model/src/gx_outp.F90 +++ b/model/src/gx_outp.F90 @@ -165,7 +165,11 @@ PROGRAM GXOUTP #endif USE W3ODATMD, ONLY: W3SETO, W3NOUT USE W3IOGRMD, ONLY: W3IOGR +#ifdef W3_BIN2NC + USE W3IOPOMD, ONLY: W3IOPON +#else USE W3IOPOMD, ONLY: W3IOPO +#endif USE W3SERVMD, ONLY : ITRACE, NEXTLN, EXTCDE #ifdef W3_S USE W3SERVMD, ONLY : STRACE @@ -277,7 +281,11 @@ PROGRAM GXOUTP !--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 3. Read general data and first fields from file ! +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif ALLOCATE ( FLREQ(NOPTS) ) ! WRITE (NDSO,930) @@ -369,7 +377,11 @@ PROGRAM GXOUTP DO DTEST = DSEC21 ( TIME , TOUT ) IF ( DTEST .GT. 0. ) THEN +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN WRITE (NDSO,998) EXIT diff --git a/model/src/w3bullmd.F90 b/model/src/w3bullmd.F90 index 10301e8ca..af749549a 100644 --- a/model/src/w3bullmd.F90 +++ b/model/src/w3bullmd.F90 @@ -268,8 +268,8 @@ SUBROUTINE W3BULL & ! CSVBLINE = BLANK2 ! + IPG1 = 0 IF (IOUT .EQ. 1) THEN - IPG1 = 0 DO IP=1, NPTAB HST(IP,1) = -99.9 TPT(IP,1) = -99.9 @@ -286,10 +286,12 @@ SUBROUTINE W3BULL & ! HSTOT = XPART(1,0) TP = XPART(2,0) - HSP = XPART(1,1:NPART) - TPP = XPART(2,1:NPART) - WNP = TPI / XPART(3,1:NPART) - DMP = MOD( XPART(4,1:NPART) + 180., 360.) + DO IP=1, NPART + HSP(IP) = XPART(1,IP) + TPP(IP) = XPART(2,IP) + WNP(IP) = TPI / XPART(3,IP) + DMP(IP) = MOD( XPART(4,IP) + 180., 360.) + ENDDO NZERO = 0 NZERO = COUNT( HSP <= BHSMIN .AND. HSP /= 0. ) diff --git a/model/src/w3gridmd.F90 b/model/src/w3gridmd.F90 index ecf2726a0..8bfc6521a 100644 --- a/model/src/w3gridmd.F90 +++ b/model/src/w3gridmd.F90 @@ -845,7 +845,7 @@ MODULE W3GRIDMD #ifdef W3_ST4 INTEGER :: SWELLFPAR, SDSISO, SDSBRFDF, SINTABLE,& TAUWBUG - REAL :: SDSBCHOICE + REAL :: SDSBCHOICE REAL :: ZWND, ALPHA0, Z0MAX, BETAMAX, SINTHP,& ZALP, Z0RAT, TAUWSHELTER, SWELLF, & SWELLF2,SWELLF3,SWELLF4, SWELLF5, & diff --git a/model/src/w3initmd.F90 b/model/src/w3initmd.F90 index 044a18760..fbefffc84 100644 --- a/model/src/w3initmd.F90 +++ b/model/src/w3initmd.F90 @@ -658,7 +658,6 @@ SUBROUTINE W3INIT ( IMOD, IsMulti, FEXT, MDS, MTRACE, ODAT, FLGRD, FLGR2, FLGD, STOP ENDIF #endif - ! ! 1.c Open files without unpacking MDS ,,, ! @@ -1240,7 +1239,11 @@ SUBROUTINE W3INIT ( IMOD, IsMulti, FEXT, MDS, MTRACE, ODAT, FLGRD, FLGR2, FLGD, ! ! 4.d Preprocessing for point output. ! - IF ( FLOUT(2) ) CALL W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) +#ifdef W3_MPI + IF ( FLOUT(2) ) CALL W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_WAVE ) +#else + IF ( FLOUT(2) ) CALL W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, 1 ) +#endif #ifdef W3_PDLIB CALL DEALLOCATE_PDLIB_GLOBAL(IMOD) #endif @@ -2272,22 +2275,18 @@ SUBROUTINE W3MPIO ( IMOD ) ! IF ( IAPROC .LE. NAPROC ) THEN IT = IT0 -#endif #ifdef W3_MPIT WRITE (NDST,9010) '(SEND)' #endif ! -#ifdef W3_MPI IF ( FLGRDALL( 1, 12) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (ICEF (IAPROC), 1, WW3_FIELD_VEC, IROOT, IT, & MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 1/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 1) ) THEN @@ -2295,11 +2294,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HS (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 2) ) THEN @@ -2307,11 +2304,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WLM (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 3) ) THEN @@ -2319,11 +2314,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (T02 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 4) ) THEN @@ -2331,11 +2324,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (T0M1 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 5) ) THEN @@ -2343,11 +2334,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (T01 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 6) .OR. FLGRDALL( 2,18) ) THEN @@ -2356,11 +2345,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (FP0 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 7) ) THEN @@ -2368,11 +2355,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (THM (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 8) ) THEN @@ -2380,11 +2365,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (THS (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 9) ) THEN @@ -2392,11 +2375,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (THP0 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 10) ) THEN @@ -2404,11 +2385,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HSIG (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/10', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 11) ) THEN @@ -2416,11 +2395,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (STMAXE (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/11', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 12) ) THEN @@ -2428,11 +2405,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (STMAXD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/12', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 13) ) THEN @@ -2440,11 +2415,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HMAXE (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/13', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 14) ) THEN @@ -2452,11 +2425,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HCMAXE (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/14', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 15) ) THEN @@ -2464,11 +2435,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HMAXD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/15', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 16) ) THEN @@ -2476,11 +2445,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (HCMAXD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/16', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 17) ) THEN @@ -2488,11 +2455,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WBT (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/17', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 19) ) THEN @@ -2500,11 +2465,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WNMEAN(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/19', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 3, 1) ) THEN @@ -2513,11 +2476,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (EF(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'EF', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2527,11 +2488,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TH1M(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'TH1M', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2541,11 +2500,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (STH1M(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'STH1M', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2555,11 +2512,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TH2M(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'TH2M', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2569,11 +2524,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (STH2M(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'STH2M', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2583,11 +2536,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PHS(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2597,11 +2548,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PTP(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2611,11 +2560,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PLP(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2625,11 +2572,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PDIR(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2639,11 +2584,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PSI(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2653,11 +2596,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PWS(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2667,11 +2608,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PTHP0(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2681,11 +2620,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PQP (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/08', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2695,11 +2632,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PPE (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2709,11 +2644,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PGW (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/10', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2723,11 +2656,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PSW (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/11', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2737,11 +2668,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PTM1(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/12', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2752,11 +2681,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PT1 (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/13', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2766,11 +2693,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PT2 (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/14', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2780,11 +2705,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PEP (1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/15', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -2793,11 +2716,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PWST (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/16', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 4,17) ) THEN @@ -2805,11 +2726,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PNR (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/17', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 1) ) THEN @@ -2817,29 +2736,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (UST (IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (USTDIR(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (ASF (IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 2) ) THEN @@ -2847,11 +2760,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (CHARN(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 3) ) THEN @@ -2859,11 +2770,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (CGE (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 4) ) THEN @@ -2871,11 +2780,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PHIAW(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 5) ) THEN @@ -2883,20 +2790,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUWIX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUWIY(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 6) ) THEN @@ -2904,20 +2807,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUWNX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUWNY(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 7) ) THEN @@ -2925,11 +2824,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WHITECAP(1,1),NSEALM , MPI_REAL, IROOT,& IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 8) ) THEN @@ -2937,11 +2834,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WHITECAP(1,2),NSEALM , MPI_REAL, IROOT,& IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/08', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 9) ) THEN @@ -2949,11 +2844,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WHITECAP(1,3),NSEALM , MPI_REAL, IROOT,& IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5,10) ) THEN @@ -2961,11 +2854,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (WHITECAP(1,4),NSEALM , MPI_REAL, IROOT,& IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/10', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 11) ) THEN @@ -2973,11 +2864,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TWS(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/11', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 1) ) THEN @@ -2985,29 +2874,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (SXX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (SYY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (SXY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 2) ) THEN @@ -3015,20 +2898,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUOX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUOY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 3) ) THEN @@ -3036,11 +2915,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (BHD(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 4) ) THEN @@ -3048,11 +2925,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PHIOC (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 5) ) THEN @@ -3060,20 +2935,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TUSX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TUSY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 6) ) THEN @@ -3081,20 +2952,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (USSX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (USSY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 7) ) THEN @@ -3102,20 +2969,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PRMS (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TPMS (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 8) ) THEN @@ -3124,11 +2987,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (US3D(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'US3D ', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3138,11 +2999,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (P2SMS(1,K),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'P2SMS', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3151,20 +3010,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUICE (1,1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/10', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUICE (1,2),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/10', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6,11) ) THEN @@ -3172,11 +3027,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PHICE (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/11', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 12) ) THEN @@ -3185,11 +3038,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (USSP(1,IK),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'USSP ', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3198,20 +3049,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUOCX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/13', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUOCY(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/13', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 1) ) THEN @@ -3219,20 +3066,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (ABA (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (ABD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 2) ) THEN @@ -3240,20 +3083,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (UBA (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (UBD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 3) ) THEN @@ -3261,29 +3100,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (BEDFORMS(1,1),NSEALM , MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (BEDFORMS(1,2),NSEALM , MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (BEDFORMS(1,3),NSEALM , MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 4) ) THEN @@ -3291,11 +3124,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (PHIBBL(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 5) ) THEN @@ -3303,20 +3134,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (TAUBBL(1,1),NSEALM , MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (TAUBBL(1,2),NSEALM , MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 1) ) THEN @@ -3324,20 +3151,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (MSSX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (MSSY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 2) ) THEN @@ -3345,20 +3168,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (MSCX (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (MSCY (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 3) ) THEN @@ -3366,11 +3185,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (MSSD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 4) ) THEN @@ -3378,11 +3195,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (MSCD (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 5) ) THEN @@ -3390,11 +3205,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (QP (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 6) ) THEN @@ -3402,67 +3215,49 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (QKK (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/06', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 7) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (SKEW (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/07', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 8) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (EMBIA1 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/08', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 9) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (EMBIA2 (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/09', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 9, 1) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_SEND_INIT (DTDYN(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/01', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 2) ) THEN @@ -3470,11 +3265,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (FCUT (1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/02', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 3) ) THEN @@ -3482,11 +3275,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (CFLXYMAX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/03', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 4) ) THEN @@ -3494,11 +3285,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (CFLTHMAX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/04', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 5) ) THEN @@ -3506,11 +3295,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (CFLKMAX(1),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/05', IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF ! DO I=1, NOEXTR @@ -3519,23 +3306,19 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_SEND_INIT (USERO(1,I),NSEALM , MPI_REAL, IROOT, & IT, MPI_COMM_WAVE, IRQGO(IH), IERR) -#endif #ifdef W3_MPIT WRITE (STRING,'(A3,I2.2)') '10/', I WRITE (NDST,9011) IH, STRING, IROOT, IT, IRQGO(IH), IERR #endif -#ifdef W3_MPI END IF END DO ! NRQGO = IH -#endif #ifdef W3_MPIT WRITE (NDST,9012) WRITE (NDST,9013) NRQGO, NRQMAX #endif ! -#ifdef W3_MPI END IF !IF ( IAPROC .LE. NAPROC ) THEN ! IF ( NRQGO .GT. NRQMAX ) THEN @@ -3556,12 +3339,10 @@ SUBROUTINE W3MPIO ( IMOD ) ! 1.c Receives of fields ! CALL W3XETA ( IMOD, NDSE, NDST ) -#endif #ifdef W3_MPIT WRITE (NDST,9010) '(RECV)' #endif ! -#ifdef W3_MPI IH = 0 ! DO I0=1, NAPROC @@ -3573,11 +3354,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (ICEF (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 1/09', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 1) ) THEN @@ -3585,11 +3364,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HS (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 2) ) THEN @@ -3597,11 +3374,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WLM (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 3) ) THEN @@ -3609,11 +3384,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (T02 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 4) ) THEN @@ -3621,11 +3394,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (T0M1 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 5) ) THEN @@ -3633,11 +3404,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (T01(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 6) .OR. FLGRDALL( 2,18) ) THEN @@ -3646,11 +3415,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (FP0 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 7) ) THEN @@ -3658,11 +3425,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (THM (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 8) ) THEN @@ -3670,11 +3435,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (THS (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/08', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 9) ) THEN @@ -3682,11 +3445,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (THP0 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/09', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 10) ) THEN @@ -3694,11 +3455,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HSIG (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/10', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 11) ) THEN @@ -3706,11 +3465,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (STMAXE (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/11', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 12) ) THEN @@ -3718,11 +3475,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (STMAXD(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/12', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 13) ) THEN @@ -3730,11 +3485,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HMAXE (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/13', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 14) ) THEN @@ -3742,11 +3495,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HCMAXE(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/14', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 15) ) THEN @@ -3754,11 +3505,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HMAXD (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/15', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 16) ) THEN @@ -3766,11 +3515,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (HCMAXD(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/16', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 17) ) THEN @@ -3778,11 +3525,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WBT(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/17', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 2, 19) ) THEN @@ -3790,11 +3535,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WNMEAN(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/19', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 3, 1) ) THEN @@ -3803,11 +3546,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (EF(I0,IK),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'EF', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3817,11 +3558,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TH1M(I0,IK),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'TH1M', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3831,11 +3570,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (STH1M(I0,IK),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'STH1M', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3845,11 +3582,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TH2M(I0,IK),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'TH2M', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3859,11 +3594,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (STH2M(I0,IK),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'STH2M', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3873,11 +3606,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PHS(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3887,11 +3618,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PTP(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3901,11 +3630,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PLP(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3915,11 +3642,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PDIR(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3929,11 +3654,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PSI(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3943,11 +3666,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PWS(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3957,11 +3678,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PTHP0(I0,K),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3971,11 +3690,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PQP(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/08', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3985,11 +3702,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PPE(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/09', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -3999,11 +3714,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PGW(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/10', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4013,11 +3726,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PSW(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/11', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4027,11 +3738,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PTM1(I0,K),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/12', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4041,11 +3750,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PT1(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/13', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4055,11 +3762,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PT2(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/14', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4069,11 +3774,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PEP(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/15', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4082,11 +3785,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PWST (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/16', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 4,17) ) THEN @@ -4094,11 +3795,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PNR (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 4/17', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 1) ) THEN @@ -4106,29 +3805,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (UST (I0), 1, WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (USTDIR(I0), 1, WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (ASF (I0), 1, WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 2) ) THEN @@ -4136,11 +3829,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (CHARN(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 3) ) THEN @@ -4148,11 +3839,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (CGE (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 4) ) THEN @@ -4160,11 +3849,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PHIAW(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 5) ) THEN @@ -4172,20 +3859,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUWIX(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUWIY(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 6) ) THEN @@ -4193,20 +3876,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUWNX(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUWNY(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 7) ) THEN @@ -4214,11 +3893,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WHITECAP(I0,1),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 8) ) THEN @@ -4226,11 +3903,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WHITECAP(I0,2),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/08', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5, 9) ) THEN @@ -4238,11 +3913,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WHITECAP(I0,3),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/09', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5,10) ) THEN @@ -4250,11 +3923,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (WHITECAP(I0,4),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/10', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 5,11) ) THEN @@ -4262,11 +3933,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TWS(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 5/11', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 1) ) THEN @@ -4274,29 +3943,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (SXX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (SYY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (SXY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 2) ) THEN @@ -4304,20 +3967,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUOX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUOY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 3) ) THEN @@ -4325,11 +3984,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (BHD(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 4) ) THEN @@ -4337,11 +3994,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PHIOC (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 5) ) THEN @@ -4349,20 +4004,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TUSX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TUSY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 6) ) THEN @@ -4370,20 +4021,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (USSX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (USSY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 7) ) THEN @@ -4391,20 +4038,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PRMS (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TPMS (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 8) ) THEN @@ -4413,11 +4056,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (US3D(I0,IK),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'US3D ', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4427,11 +4068,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (P2SMS(I0,K),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'P3SMS', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4440,20 +4079,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUICE (I0,1),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/10', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUICE (I0,2),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/10', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6,11) ) THEN @@ -4461,11 +4096,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PHICE (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/11', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 6, 12) ) THEN @@ -4474,11 +4107,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (USSP(I0,IK),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, 'USSP ', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END DO END IF ! @@ -4487,20 +4118,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUOCX(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/13', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUOCY(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 6/13', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 1) ) THEN @@ -4508,20 +4135,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (ABA (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (ABD (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 2) ) THEN @@ -4529,20 +4152,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (UBA (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (UBD (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 3) ) THEN @@ -4550,29 +4169,23 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (BEDFORMS(I0,1),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (BEDFORMS(I0,2),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (BEDFORMS(I0,3),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 4) ) THEN @@ -4580,11 +4193,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (PHIBBL(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 7, 5) ) THEN @@ -4592,20 +4203,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (TAUBBL(I0,1),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (TAUBBL(I0,2),1,WW3_FIELD_VEC, IFROM, & IT, MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 7/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 1) ) THEN @@ -4613,20 +4220,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (MSSX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (MSSY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 2) ) THEN @@ -4634,20 +4237,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (MSCX (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (MSCY (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 3) ) THEN @@ -4655,11 +4254,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (MSSD (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 4) ) THEN @@ -4667,11 +4264,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (MSCD (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 5) ) THEN @@ -4679,11 +4274,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (QP (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 8, 6) ) THEN @@ -4691,67 +4284,49 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (QKK (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/06', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 7) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (SKEW (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/07', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 8) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (EMBIA1 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/08', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 8, 9) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (EMBIA2 (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 8/09', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF -#endif ! -#ifdef W3_MPI IF ( FLGRDALL( 9, 1) ) THEN IH = IH + 1 IT = IT + 1 CALL MPI_RECV_INIT (DTDYN(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/01', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 2) ) THEN @@ -4759,11 +4334,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (FCUT (I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/02', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 3) ) THEN @@ -4771,11 +4344,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (CFLXYMAX(I0),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/03', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 4) ) THEN @@ -4783,11 +4354,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (CFLTHMAX(I0),1,WW3_FIELD_VEC, IFROM, IT,& MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/04', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLGRDALL( 9, 5) ) THEN @@ -4795,11 +4364,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (CFLKMAX(I0),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 9/05', IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF ! DO I=1, NOEXTR @@ -4809,25 +4376,21 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT + 1 CALL MPI_RECV_INIT (USERO(I0,I),1,WW3_FIELD_VEC, IFROM, IT, & MPI_COMM_WAVE, IRQGO2(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (STRING,'(A3,I2.2)') '10/', I WRITE (NDST,9011) IH, STRING, IFROM, IT, IRQGO2(IH), IERR #endif -#ifdef W3_MPI END IF END DO ! END DO ! NRQGO2 = IH -#endif #ifdef W3_MPIT WRITE (NDST,9012) WRITE (NDST,9014) NRQGO2, NRQMAX*NAPROC #endif ! -#ifdef W3_MPI CALL W3SETA ( IMOD, NDSE, NDST ) ! END IF ! IF ( IAPROC .EQ. NAPFLD ) THEN @@ -4853,7 +4416,6 @@ SUBROUTINE W3MPIO ( IMOD ) ALLOCATE ( OUTPTS(IMOD)%OUT4%IRQRS(3*NAPROC) ) ENDIF IRQRS => OUTPTS(IMOD)%OUT4%IRQRS -#endif ! ! 2.b Fields at end of file (always) ! @@ -4861,39 +4423,32 @@ SUBROUTINE W3MPIO ( IMOD ) WRITE (NDST,9020) #endif ! -#ifdef W3_MPI IF ( IAPROC.NE.NAPRST .AND. IAPROC.LE.NAPROC ) THEN ! IH = IH + 1 IT = IT0 + 1 CALL MPI_SEND_INIT (UST (IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S U*', IROOT, IT, IRQRS(IH), IERR #endif ! -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 2 CALL MPI_SEND_INIT (USTDIR(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S UD', IROOT, IT, IRQRS(IH), IERR #endif ! -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 3 CALL MPI_SEND_INIT (FPIS(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S FP', IROOT, IT, IRQRS(IH), IERR #endif ! -#ifdef W3_MPI ELSE IF ( IAPROC .EQ. NAPRST ) THEN DO I0=1, NAPROC IFROM = I0 - 1 @@ -4903,31 +4458,25 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 1 CALL MPI_RECV_INIT (UST (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R U*', IFROM, IT, IRQRS(IH), IERR #endif ! -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 2 CALL MPI_RECV_INIT (USTDIR(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R UD', IFROM, IT, IRQRS(IH), IERR #endif ! -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 3 CALL MPI_RECV_INIT (FPIS(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R FP', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF END DO END IF @@ -4938,20 +4487,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 4 CALL MPI_SEND_INIT (CX(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S CX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 5 CALL MPI_SEND_INIT (CY(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S CY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 1, 12) ) THEN @@ -4959,11 +4504,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 6 CALL MPI_SEND_INIT (ICEF(IAPROC), 1, WW3_FIELD_VEC, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S IF', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 1) ) THEN @@ -4971,11 +4514,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 7 CALL MPI_SEND_INIT (HS (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S HS', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 2) ) THEN @@ -4983,11 +4524,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 8 CALL MPI_SEND_INIT (WLM (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S WL', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 4) ) THEN @@ -4995,11 +4534,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 9 CALL MPI_SEND_INIT (T0M1(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S T0', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 2, 5) ) THEN @@ -5007,11 +4544,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 10 CALL MPI_SEND_INIT (T01 (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S T1', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 2, 6) ) THEN @@ -5019,11 +4554,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 11 CALL MPI_SEND_INIT (FP0 (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S FP', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 7) ) THEN @@ -5031,11 +4564,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 12 CALL MPI_SEND_INIT (THM (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S TH', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 19) ) THEN @@ -5043,11 +4574,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 13 CALL MPI_SEND_INIT (WNMEAN(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S WM', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 5, 2) ) THEN @@ -5055,11 +4584,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 14 CALL MPI_SEND_INIT (CHARN(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S CH', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 5, 5) ) THEN @@ -5067,20 +4594,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 15 CALL MPI_SEND_INIT (TAUWIX(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S WX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 16 CALL MPI_SEND_INIT (TAUWIY(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S WY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 5, 11) ) THEN @@ -5088,11 +4611,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 17 CALL MPI_SEND_INIT (TWS (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S TS', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 2) ) THEN @@ -5100,20 +4621,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 18 CALL MPI_SEND_INIT (TAUOX(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S OX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 19 CALL MPI_SEND_INIT (TAUOY(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S OY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 3) ) THEN @@ -5121,11 +4638,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 20 CALL MPI_SEND_INIT (BHD (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S BH', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 4) ) THEN @@ -5133,11 +4648,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 21 CALL MPI_SEND_INIT (PHIOC(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S PH', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 5) ) THEN @@ -5145,20 +4658,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 22 CALL MPI_SEND_INIT (TUSX (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S UX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 23 CALL MPI_SEND_INIT (TUSY (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S UY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 6) ) THEN @@ -5166,20 +4675,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 24 CALL MPI_SEND_INIT (USSX (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S SX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 25 CALL MPI_SEND_INIT (USSY (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S SY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6,10) ) THEN @@ -5187,20 +4692,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 26 CALL MPI_SEND_INIT (TAUICE(1,1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S I1', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 27 CALL MPI_SEND_INIT (TAUICE(1,2), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S I2', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6,13) ) THEN @@ -5208,20 +4709,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 28 CALL MPI_SEND_INIT (TAUOCX(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S TX', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 29 CALL MPI_SEND_INIT (TAUOCY(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S TY', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 2) ) THEN @@ -5229,20 +4726,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 30 CALL MPI_SEND_INIT (UBA (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S BA', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 31 CALL MPI_SEND_INIT (UBD (1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S BD', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 4) ) THEN @@ -5250,11 +4743,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 32 CALL MPI_SEND_INIT (PHIBBL(1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S PB', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 5) ) THEN @@ -5262,20 +4753,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 33 CALL MPI_SEND_INIT (TAUBBL(1,1), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S T1', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 34 CALL MPI_SEND_INIT (TAUBBL(1,2), NSEALM, MPI_REAL, & IROOT, IT, MPI_COMM_WAVE, IRQRS(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'S T2', IROOT, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( IAPROC .EQ. NAPRST ) THEN @@ -5289,20 +4776,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 4 CALL MPI_RECV_INIT (CX (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R CX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IT0 + 5 IT = IT + 1 CALL MPI_RECV_INIT (CY (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R CY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 1, 12) ) THEN @@ -5310,11 +4793,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 6 CALL MPI_RECV_INIT (ICEF (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R IF', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 1) ) THEN @@ -5322,11 +4803,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 7 CALL MPI_RECV_INIT (HS (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R HS', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 2) ) THEN @@ -5334,11 +4813,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 8 CALL MPI_RECV_INIT (WLM (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R WL', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 4) ) THEN @@ -5346,11 +4823,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 9 CALL MPI_RECV_INIT (T0M1(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R T0', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 2, 5) ) THEN @@ -5358,11 +4833,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 10 CALL MPI_RECV_INIT (T01 (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R T1', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 2, 6) ) THEN @@ -5370,11 +4843,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 11 CALL MPI_RECV_INIT (FP0 (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R FP', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 7) ) THEN @@ -5382,11 +4853,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 12 CALL MPI_RECV_INIT (THM (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R TH', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 2, 19) ) THEN @@ -5394,11 +4863,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 13 CALL MPI_RECV_INIT (WNMEAN(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R WM', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 5, 2) ) THEN @@ -5406,11 +4873,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 14 CALL MPI_RECV_INIT (CHARN(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R CH', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI ENDIF ! IF ( FLOGRR( 5, 5) ) THEN @@ -5418,20 +4883,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 15 CALL MPI_RECV_INIT (TAUWIX(I0),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R WX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 16 CALL MPI_RECV_INIT (TAUWIY(I0),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R WY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 5,11) ) THEN @@ -5439,11 +4900,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 17 CALL MPI_RECV_INIT (TWS (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R TS', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 2) ) THEN @@ -5451,20 +4910,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 18 CALL MPI_RECV_INIT (TAUOX(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R OX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 19 CALL MPI_RECV_INIT (TAUOY(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R OY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 3) ) THEN @@ -5472,11 +4927,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 20 CALL MPI_RECV_INIT (BHD (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R BH', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 4) ) THEN @@ -5484,11 +4937,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 21 CALL MPI_RECV_INIT (PHIOC(I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R PH', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 5) ) THEN @@ -5496,20 +4947,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 22 CALL MPI_RECV_INIT (TUSX (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R UX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 23 CALL MPI_RECV_INIT (TUSY (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R UY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6, 6) ) THEN @@ -5517,20 +4964,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 24 CALL MPI_RECV_INIT (USSX (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R SX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 25 CALL MPI_RECV_INIT (USSY (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R SY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6,10) ) THEN @@ -5538,20 +4981,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 26 CALL MPI_RECV_INIT (TAUICE(I0,1),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R I1', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 27 CALL MPI_RECV_INIT (TAUICE(I0,2),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R I2', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 6,13) ) THEN @@ -5559,20 +4998,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 28 CALL MPI_RECV_INIT (TAUOCX(I0),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R SX', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 29 CALL MPI_RECV_INIT (TAUOCY(I0),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R SY', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 2) ) THEN @@ -5580,20 +5015,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 30 CALL MPI_RECV_INIT (UBA (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R BA', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 31 CALL MPI_RECV_INIT (UBD (I0),1,WW3_FIELD_VEC, & IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R BD', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 4) ) THEN @@ -5601,11 +5032,9 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 32 CALL MPI_RECV_INIT (PHIBBL(I0),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R PB', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF ! IF ( FLOGRR( 7, 5) ) THEN @@ -5613,20 +5042,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 33 CALL MPI_RECV_INIT (TAUBBL(I0,1),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R T1', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 34 CALL MPI_RECV_INIT (TAUBBL(I0,2),1,WW3_FIELD_VEC,& IFROM, IT, MPI_COMM_WAVE, IRQRS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9021) IH, 'R T2', IFROM, IT, IRQRS(IH), IERR #endif -#ifdef W3_MPI END IF END DO ! @@ -5640,7 +5065,6 @@ SUBROUTINE W3MPIO ( IMOD ) ELSE IT0 = IT0 + 3 ENDIF -#endif ! #ifdef W3_MPIT WRITE (NDST,9022) @@ -5649,19 +5073,16 @@ SUBROUTINE W3MPIO ( IMOD ) ! ! 2.c Data server mode ! -#ifdef W3_MPI IF ( IOSTYP .GT. 0 ) THEN ! NBLKRS = 10 RSBLKS = MAX ( 5 , NSEALM/NBLKRS ) IF ( NBLKRS*RSBLKS .LT. NSEALM ) RSBLKS = RSBLKS + 1 NBLKRS = 1 + (NSEALM-1)/RSBLKS -#endif ! #ifdef W3_MPIT WRITE (NDST,9025) RSBLKS, NBLKRS #endif -#ifdef W3_MPI IH = 0 ! IF ( IAPROC .NE. NAPRST ) THEN @@ -5677,11 +5098,9 @@ SUBROUTINE W3MPIO ( IMOD ) NSEAB = 1 + JSEAN - JSEA0 CALL MPI_SEND_INIT (VA(1,JSEA0), NSPEC*NSEAB, MPI_REAL, IROOT, IT, & MPI_COMM_WAVE, IRQRSS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9026) IH, 'S', IB, IROOT, IT, IRQRSS(IH), IERR, NSEAB #endif -#ifdef W3_MPI END DO ! ELSE @@ -5703,33 +5122,27 @@ SUBROUTINE W3MPIO ( IMOD ) IBOFF = MOD(IB-1,2)*RSBLKS CALL MPI_RECV_INIT (VAAUX(1,1+IBOFF,I0), NSPEC*NSEAB, MPI_REAL, & IFROM, IT, MPI_COMM_WAVE, IRQRSS(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9026) IH, 'R', IB, IFROM, IT, IRQRSS(IH), IERR, NSEAB #endif -#ifdef W3_MPI END IF END DO END DO ! END IF -#endif ! #ifdef W3_MPIT WRITE (NDST,9027) WRITE (NDST,9028) IH #endif -#ifdef W3_MPI IT0 = IT0 + NBLKRS ! END IF ! END IF ! IF ((FLOUT(4) .OR. FLOUT(8)) .and. (.not. LPDLIB)) THEN -#endif ! ! 3. Set-up for W3IOBC ( SENDs ) ------------------------------------ / ! -#ifdef W3_MPI NRQBP = 0 NRQBP2 = 0 IH = 0 @@ -5741,7 +5154,6 @@ SUBROUTINE W3MPIO ( IMOD ) OUTPTS(IMOD)%OUT5%IRQBP2(NBO2(NFBPO)) ) IRQBP1 => OUTPTS(IMOD)%OUT5%IRQBP1 IRQBP2 => OUTPTS(IMOD)%OUT5%IRQBP2 -#endif ! ! 3.a Loops over files and points ! @@ -5749,7 +5161,6 @@ SUBROUTINE W3MPIO ( IMOD ) WRITE (NDST,9030) 'MPI_SEND_INIT' #endif ! -#ifdef W3_MPI DO J=1, NFBPO DO I=NBO2(J-1)+1, NBO2(J) ! @@ -5766,22 +5177,17 @@ SUBROUTINE W3MPIO ( IMOD ) IH = IH + 1 CALL MPI_SEND_INIT (VA(1,JSEA),NSPEC,MPI_REAL, IROOT, IT, MPI_COMM_WAVE, & IRQBP1(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9031) IH, I, J, IROOT, IT, IRQBP1(IH), IERR #endif -#ifdef W3_MPI END IF ! END DO END DO -#endif ! ! ... End of loops 4.a ! -#ifdef W3_MPI NRQBP = IH -#endif ! #ifdef W3_MPIT WRITE (NDST,9032) @@ -5790,12 +5196,10 @@ SUBROUTINE W3MPIO ( IMOD ) ! ! 3.d Set-up for W3IOBC ( RECVs ) ------------------------------------ / ! -#ifdef W3_MPI IF ( IAPROC .EQ. NAPBPT ) THEN ! IH = 0 IT = IT0 -#endif ! ! 3.e Loops over files and points ! @@ -5803,7 +5207,6 @@ SUBROUTINE W3MPIO ( IMOD ) WRITE (NDST,9030) 'MPI_RECV_INIT' #endif ! -#ifdef W3_MPI DO J=1, NFBPO DO I=NBO2(J-1)+1, NBO2(J) ! @@ -5819,17 +5222,14 @@ SUBROUTINE W3MPIO ( IMOD ) ITARG = ISPROC - 1 CALL MPI_RECV_INIT (ABPOS(1,IH),NSPEC,MPI_REAL, ITARG, IT, MPI_COMM_WAVE, & IRQBP2(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9031) IH, I, J, ITARG, IT, IRQBP2(IH), IERR #endif ! -#ifdef W3_MPI END DO END DO ! NRQBP2 = IH -#endif ! ! ... End of loops 4.e ! @@ -5838,13 +5238,11 @@ SUBROUTINE W3MPIO ( IMOD ) WRITE (NDST,9033) NRQBP2 #endif ! -#ifdef W3_MPI END IF ! IT0 = IT0 + NBO2(NFBPO) ! END IF -#endif ! #ifdef W3_MPIT WRITE (NDST,*) @@ -5852,12 +5250,10 @@ SUBROUTINE W3MPIO ( IMOD ) ! ! 4. Set-up for W3IOTR ---------------------------------------------- / ! -#ifdef W3_MPI IH = 0 IROOT = NAPTRK - 1 ! IF ( FLOUT(3) ) THEN -#endif ! ! 4.a U* ! @@ -5865,7 +5261,6 @@ SUBROUTINE W3MPIO ( IMOD ) WRITE (NDST,9040) #endif ! -#ifdef W3_MPI IF ( IAPROC .NE. NAPTRK ) THEN ALLOCATE ( OUTPTS(IMOD)%OUT3%IRQTR(2) ) IRQTR => OUTPTS(IMOD)%OUT3%IRQTR @@ -5873,20 +5268,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 1 CALL MPI_SEND_INIT (UST (IAPROC),1,WW3_FIELD_VEC, IROOT, IT, MPI_COMM_WAVE, & IRQTR(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9041) IH, 'S U*', IROOT, IT, IRQTR(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 2 CALL MPI_SEND_INIT (USTDIR(IAPROC),1,WW3_FIELD_VEC, IROOT, IT, MPI_COMM_WAVE, & IRQTR(IH), IERR ) -#endif #ifdef W3_MPIT WRITE (NDST,9041) IH, 'S U*', IROOT, IT, IRQTR(IH), IERR #endif -#ifdef W3_MPI ELSE ALLOCATE ( OUTPTS(IMOD)%OUT3%IRQTR(2*NAPROC) ) IRQTR => OUTPTS(IMOD)%OUT3%IRQTR @@ -5897,40 +5288,32 @@ SUBROUTINE W3MPIO ( IMOD ) IT = IT0 + 1 CALL MPI_RECV_INIT(UST (I0),1,WW3_FIELD_VEC, IFROM, IT, MPI_COMM_WAVE, & IRQTR(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9041) IH, 'R U*', IFROM, IT, IRQTR(IH), IERR #endif -#ifdef W3_MPI IH = IH + 1 IT = IT0 + 2 CALL MPI_RECV_INIT(USTDIR(I0),1,WW3_FIELD_VEC, IFROM, IT, MPI_COMM_WAVE, & IRQTR(IH), IERR) -#endif #ifdef W3_MPIT WRITE (NDST,9041) IH, 'R U*', IFROM, IT, IRQTR(IH), IERR #endif -#ifdef W3_MPI END IF END DO END IF ! NRQTR = IH IT0 = IT0 + 2 -#endif ! #ifdef W3_MPIT WRITE (NDST,9042) WRITE (NDST,9043) NRQTR #endif ! -#ifdef W3_MPI END IF -#endif ! ! 5. Set-up remaining counters -------------------------------------- / ! -#ifdef W3_MPI IT0PRT = IT0 IT0PNT = IT0PRT + 2*NAPROC IT0TRK = IT0PNT + 5000 diff --git a/model/src/w3iogomd.F90 b/model/src/w3iogomd.F90 index de660ded4..7a9fca02a 100644 --- a/model/src/w3iogomd.F90 +++ b/model/src/w3iogomd.F90 @@ -4663,295 +4663,248 @@ END SUBROUTINE CALC_WBT !> !> @author P. Janssen @date 29-Mar-2024 !> - SUBROUTINE SECONDHH(NKHF,FAC0,FAC1,FAC2,FAC3) -!---------------------------------------------------------------- - -!**** *SECONDHH* - COMPUTATION OF SECOND ORDER HARMONICS AND -! RELEVANT TABLES FOR THE ALTIMETER CORRECTIONS. - -! P.A.E.M. JANSSEN - -! PURPOSE. -! --------- - -! COMPUTE SECOND HARMONICS - -!** INTERFACE. -! ---------- - -! *CALL* *SECONDHH* - -! METHOD. -! ------- - -! SEE REFERENCE. - -! EXTERNALS. -! ---------- - -! VMIN_D -! VPLUS_D - -! REFERENCES. -! ----------- - -! V E ZAKHAROV(1967) - -!------------------------------------------------------------------- - -!------------------------------------------------------------------- -USE CONSTANTS, ONLY: GRAV, TPI -USE W3GDATMD, ONLY: NK, NTH, XFR, SIG, TH, DTH, ECOS, ESIN - IMPLICIT NONE - ! REAL(KIND=4) :: VMIN_D,VPLUS_D - - - - INTEGER, INTENT(IN) :: NKHF - REAL(KIND=4), DIMENSION(NTH,NTH,NKHF,NKHF), INTENT(OUT) :: FAC0, FAC1, FAC2, FAC3 - REAL(KIND=4), PARAMETER :: FRATIO = 1.1 - - - INTEGER :: M, K1, M1, K2, M2 - - REAL(KIND=4), PARAMETER :: DEL1=1.0E-8 - REAL(KIND=4), PARAMETER :: ZCONST = 0.0281349 - - !REAL(KIND=4) :: VMIN_D, VPLUS_D - REAL(KIND=4) :: CO1 - REAL(KIND=4) :: XK1, XK1SQ, XK2, XK2SQ, XK3 - REAL(KIND=4) :: COSDIFF - REAL(KIND=4) :: X12, X13, X32, OM1, OM2, OM3, F1, F2, F3 - REAL(KIND=4) :: VM, VP - REAL(KIND=4) :: DELOM1, DELOM2 - REAL(KIND=4) :: DELOM321, DELOM312 - REAL(KIND=4) :: C22, S22 - - REAL(KIND=4), DIMENSION(NTH,NTH,NKHF,NKHF) :: B - REAL(KIND=4), DIMENSION(:), ALLOCATABLE:: FAK, SIGHF, DFIMHF - - - - -!----------------------------------------------------------------------- - - - - -!* 1. INITIALISE RELEVANT QUANTITIES. - - ALLOCATE(FAK(NKHF)) - ALLOCATE(SIGHF(NKHF)) - ALLOCATE(DFIMHF(NKHF)) - - SIGHF(1) = SIG(1) - DO M=2,NKHF - SIGHF(M) = XFR*SIGHF(M-1) - ENDDO - - DO M=1,NKHF - FAK(M) = (SIGHF(M))**2/GRAV - ENDDO - - CO1 = 0.5*(XFR-1.)*DTH - DFIMHF(1) = CO1*SIGHF(1) - DO M=2,NKHF-1 - DFIMHF(M)=CO1*(SIGHF(M)+SIGHF(M-1)) - ENDDO - DFIMHF(NKHF)=CO1*SIGHF(NKHF-1) + SUBROUTINE SECONDHH(NKHF,FAC0,FAC1,FAC2,FAC3) + !---------------------------------------------------------------- + !**** *SECONDHH* - COMPUTATION OF SECOND ORDER HARMONICS AND + ! RELEVANT TABLES FOR THE ALTIMETER CORRECTIONS. + ! P.A.E.M. JANSSEN + ! PURPOSE. + ! --------- + ! COMPUTE SECOND HARMONICS + !** INTERFACE. + ! ---------- + ! *CALL* *SECONDHH* + ! METHOD. + ! ------- + ! SEE REFERENCE. + ! EXTERNALS. + ! ---------- + ! VMIN_D + ! VPLUS_D + ! REFERENCES. + ! ----------- + ! V E ZAKHAROV(1967) + !------------------------------------------------------------------- + USE CONSTANTS, ONLY: GRAV, TPI + USE W3GDATMD, ONLY: NK, NTH, XFR, SIG, TH, DTH, ECOS, ESIN + IMPLICIT NONE - DO M2=1,NKHF - XK2 = FAK(M2) - XK2SQ = FAK(M2)**2 - DO M1=1,NKHF - XK1 = FAK(M1) - XK1SQ = FAK(M1)**2 - DO K1=1,NTH - DO K2=1,NTH - COSDIFF = COS(TH(K1)-TH(K2)) - X12 = XK1*XK2*COSDIFF - XK3 = XK1SQ + XK2SQ +2.0*X12 +DEL1 - XK3 = SQRT(XK3) - X13 = XK1SQ+X12 - X32 = X12+XK2SQ - OM1 = SQRT(GRAV*XK1) - OM2 = SQRT(GRAV*XK2) - OM3 = SQRT(GRAV*XK3) - F1 = SQRT(XK1/(2.0*OM1)) - F2 = SQRT(XK2/(2.0*OM2)) - F3 = SQRT(XK3/(2.0*OM3)) - VM = TPI*VMIN_D(XK3,XK1,XK2,X13,X32,X12,OM3,OM1,OM2) - VP = TPI*VPLUS_D(-XK3,XK1,XK2,-X13,-X32,X12,OM3,OM1,OM2) - DELOM1 = OM3-OM1-OM2+DEL1 - DELOM2 = OM3+OM1+OM2+DEL1 - FAC0(K1,K2,M1,M2) = -F3/(F1*F2)*(VM/(DELOM1)+ & - & VP/(DELOM2)) - ENDDO + INTEGER, INTENT(IN) :: NKHF + REAL(KIND=4), DIMENSION(NTH,NTH,NKHF,NKHF), INTENT(OUT) :: FAC0, FAC1, FAC2, FAC3 + REAL(KIND=4), PARAMETER :: FRATIO = 1.1 + + INTEGER :: M, K1, M1, K2, M2 + + REAL(KIND=4), PARAMETER :: DEL1=1.0E-8 + REAL(KIND=4), PARAMETER :: ZCONST = 0.0281349 + + !REAL(KIND=4) :: VMIN_D, VPLUS_D + REAL(KIND=4) :: CO1 + REAL(KIND=4) :: XK1, XK1SQ, XK2, XK2SQ, XK3 + REAL(KIND=4) :: COSDIFF + REAL(KIND=4) :: X12, X13, X32, OM1, OM2, OM3, F1, F2, F3 + REAL(KIND=4) :: VM, VP + REAL(KIND=4) :: DELOM1, DELOM2 + REAL(KIND=4) :: DELOM321, DELOM312 + REAL(KIND=4) :: C22, S22 + + REAL(KIND=4), DIMENSION(NTH,NTH,NKHF,NKHF) :: B + REAL(KIND=4), DIMENSION(:), ALLOCATABLE:: FAK, SIGHF, DFIMHF + !----------------------------------------------------------------------- + !* 1. INITIALISE RELEVANT QUANTITIES. + + ALLOCATE(FAK(NKHF)) + ALLOCATE(SIGHF(NKHF)) + ALLOCATE(DFIMHF(NKHF)) + + SIGHF(1) = SIG(1) + DO M=2,NKHF + SIGHF(M) = XFR*SIGHF(M-1) + ENDDO + + DO M=1,NKHF + FAK(M) = (SIGHF(M))**2/GRAV + ENDDO + + CO1 = 0.5*(XFR-1.)*DTH + DFIMHF(1) = CO1*SIGHF(1) + DO M=2,NKHF-1 + DFIMHF(M)=CO1*(SIGHF(M)+SIGHF(M-1)) + ENDDO + DFIMHF(NKHF)=CO1*SIGHF(NKHF-1) + + DO M2=1,NKHF + XK2 = FAK(M2) + XK2SQ = FAK(M2)**2 + DO M1=1,NKHF + XK1 = FAK(M1) + XK1SQ = FAK(M1)**2 + DO K1=1,NTH + DO K2=1,NTH + COSDIFF = COS(TH(K1)-TH(K2)) + X12 = XK1*XK2*COSDIFF + XK3 = XK1SQ + XK2SQ +2.0*X12 +DEL1 + XK3 = SQRT(XK3) + X13 = XK1SQ+X12 + X32 = X12+XK2SQ + OM1 = SQRT(GRAV*XK1) + OM2 = SQRT(GRAV*XK2) + OM3 = SQRT(GRAV*XK3) + F1 = SQRT(XK1/(2.0*OM1)) + F2 = SQRT(XK2/(2.0*OM2)) + F3 = SQRT(XK3/(2.0*OM3)) + VM = TPI*VMIN_D(XK3,XK1,XK2,X13,X32,X12,OM3,OM1,OM2) + VP = TPI*VPLUS_D(-XK3,XK1,XK2,-X13,-X32,X12,OM3,OM1,OM2) + DELOM1 = OM3-OM1-OM2+DEL1 + DELOM2 = OM3+OM1+OM2+DEL1 + FAC0(K1,K2,M1,M2) = -F3/(F1*F2)*(VM/(DELOM1)+VP/(DELOM2)) ENDDO ENDDO ENDDO - - DO M2=1,NKHF - XK2 = FAK(M2) - XK2SQ = FAK(M2)**2 - DO M1=1,NKHF - XK1 = FAK(M1) - XK1SQ = FAK(M1)**2 - DO K1=1,NTH - DO K2=1,NTH - COSDIFF = COS(TH(K1)-TH(K2)) - X12 = XK1*XK2*COSDIFF - XK3 = XK1SQ + XK2SQ - 2.*X12 + DEL1 - XK3 = SQRT(XK3) - X13 = XK1SQ-X12 - X32 = X12-XK2SQ - OM1 = SQRT(GRAV*XK1) - OM2 = SQRT(GRAV*XK2) - OM3 = SQRT(GRAV*XK3)+DEL1 - F1 = SQRT(XK1/(2.0*OM1)) - F2 = SQRT(XK2/(2.0*OM2)) - F3 = SQRT(ABS(XK3)/(2.0*OM3)) - VM = TPI*VMIN_D(XK1,XK3,XK2,X13,X12,X32,OM1,OM3,OM2) - VP = TPI*VMIN_D(XK2,-XK3,XK1,-X32,X12,-X13,OM2,OM3,OM1) - DELOM321 = OM3+OM2-OM1+DEL1 - DELOM312 = OM3+OM1-OM2+DEL1 - B(K1,K2,M1,M2) = -F3/(F1*F2)*(VM/(DELOM321)+ & - & VP/(DELOM312)) - ENDDO + ENDDO + + DO M2=1,NKHF + XK2 = FAK(M2) + XK2SQ = FAK(M2)**2 + DO M1=1,NKHF + XK1 = FAK(M1) + XK1SQ = FAK(M1)**2 + DO K1=1,NTH + DO K2=1,NTH + COSDIFF = COS(TH(K1)-TH(K2)) + X12 = XK1*XK2*COSDIFF + XK3 = XK1SQ + XK2SQ - 2.*X12 + DEL1 + XK3 = SQRT(XK3) + X13 = XK1SQ-X12 + X32 = X12-XK2SQ + OM1 = SQRT(GRAV*XK1) + OM2 = SQRT(GRAV*XK2) + OM3 = SQRT(GRAV*XK3)+DEL1 + F1 = SQRT(XK1/(2.0*OM1)) + F2 = SQRT(XK2/(2.0*OM2)) + F3 = SQRT(ABS(XK3)/(2.0*OM3)) + VM = TPI*VMIN_D(XK1,XK3,XK2,X13,X12,X32,OM1,OM3,OM2) + VP = TPI*VMIN_D(XK2,-XK3,XK1,-X32,X12,-X13,OM2,OM3,OM1) + DELOM321 = OM3+OM2-OM1+DEL1 + DELOM312 = OM3+OM1-OM2+DEL1 + B(K1,K2,M1,M2) = -F3/(F1*F2)*(VM/(DELOM321)+VP/(DELOM312)) ENDDO ENDDO ENDDO + ENDDO - DO M2=1,NKHF - XK2SQ = FAK(M2)**2 - DO M1=1,NKHF - XK1SQ = FAK(M1)**2 - DO K2=1,NTH - DO K1=1,NTH - C22 = FAC0(K1,K2,M1,M2)+B(K1,K2,M1,M2) - S22 = B(K1,K2,M1,M2)-FAC0(K1,K2,M1,M2) - FAC1(K1,K2,M1,M2) = & - & (XK1SQ*ECOS(K1)**2 + XK2SQ*ECOS(K2)**2)*C22 & - & -FAK(M1)*FAK(M2)*ECOS(K1)*ECOS(K2)*S22 - FAC2(K1,K2,M1,M2) = & - & (XK1SQ*ESIN(K1)**2 + XK2SQ*ESIN(K2)**2)*C22 & - & -FAK(M1)*FAK(M2)*ESIN(K1)*ESIN(K2)*S22 - FAC3(K1,K2,M1,M2) = & - & (XK1SQ*ESIN(K1)*ECOS(K1) + & - & XK2SQ*ESIN(K2)*ECOS(K2))*C22 & - & -FAK(M1)*FAK(M2)*ECOS(K1)*ESIN(K2)*S22 - FAC0(K1,K2,M1,M2) = C22 - ENDDO + DO M2=1,NKHF + XK2SQ = FAK(M2)**2 + DO M1=1,NKHF + XK1SQ = FAK(M1)**2 + DO K2=1,NTH + DO K1=1,NTH + C22 = FAC0(K1,K2,M1,M2)+B(K1,K2,M1,M2) + S22 = B(K1,K2,M1,M2)-FAC0(K1,K2,M1,M2) + FAC1(K1,K2,M1,M2) = (XK1SQ*ECOS(K1)**2 + XK2SQ*ECOS(K2)**2)*C22 & + -FAK(M1)*FAK(M2)*ECOS(K1)*ECOS(K2)*S22 + FAC2(K1,K2,M1,M2) = (XK1SQ*ESIN(K1)**2 + XK2SQ*ESIN(K2)**2)*C22 & + -FAK(M1)*FAK(M2)*ESIN(K1)*ESIN(K2)*S22 + FAC3(K1,K2,M1,M2) = (XK1SQ*ESIN(K1)*ECOS(K1) + & + XK2SQ*ESIN(K2)*ECOS(K2))*C22 & + -FAK(M1)*FAK(M2)*ECOS(K1)*ESIN(K2)*S22 + FAC0(K1,K2,M1,M2) = C22 ENDDO ENDDO ENDDO + ENDDO + CONTAINS - CONTAINS - -!----------------------------------------------------------------------- + !----------------------------------------------------------------------- - REAL(KIND=4) FUNCTION VMIN_D(XI,XJ,XK,XIJ,XIK,XJK,XOI,XOJ,XOK) + REAL(KIND=4) FUNCTION VMIN_D(XI,XJ,XK,XIJ,XIK,XJK,XOI,XOJ,XOK) -! PETER JANSSEN - -! PURPOSE. -! -------- - -! GIVES NONLINEAR TRANSFER COEFFICIENT FOR THREE -! WAVE INTERACTIONS OF DEEP-WATER WAVES IN THE -! IDEAL CASE OF NO CURRENT. (CF.ZAKHAROV) - -! INTERFACE. -! ---------- -! *VMIN_D(XI,XJ,XK)* -! *XI* - WAVE NUMBER -! *XJ* - WAVE NUMBER -! *XK* - WAVE NUMBER -! METHOD. -! ------- -! NONE - -! EXTERNALS. -! ---------- -! NONE. - - -!*** 1. DETERMINE NONLINEAR TRANSFER. -! -------------------------------- - IMPLICIT NONE - REAL, INTENT(IN) :: XI, XJ, XK, XIJ, XIK, XJK, XOI, XOJ, XOK - REAL :: RI, RJ, RK, OI, OJ, OK, SQIJK, SQIKJ, SQJKI - - RI=ABS(XI)+DEL1 - RJ=ABS(XJ)+DEL1 - RK=ABS(XK)+DEL1 - OI=XOI+DEL1 - OJ=XOJ+DEL1 - OK=XOK+DEL1 - SQIJK=SQRT(OI*OJ*RK/(OK*RI*RJ)) - SQIKJ=SQRT(OI*OK*RJ/(OJ*RI*RK)) - SQJKI=SQRT(OJ*OK*RI/(OI*RJ*RK)) - VMIN_D=ZCONST*( (XIJ-RI*RJ)*SQIJK + (XIK-RI*RK)*SQIKJ & - & + (XJK+RJ*RK)*SQJKI ) + ! PETER JANSSEN + ! PURPOSE. + ! -------- + ! GIVES NONLINEAR TRANSFER COEFFICIENT FOR THREE + ! WAVE INTERACTIONS OF DEEP-WATER WAVES IN THE + ! IDEAL CASE OF NO CURRENT. (CF.ZAKHAROV) + ! INTERFACE. + ! ---------- + ! *VMIN_D(XI,XJ,XK)* + ! *XI* - WAVE NUMBER + ! *XJ* - WAVE NUMBER + ! *XK* - WAVE NUMBER + ! METHOD. + ! ------- + ! NONE + ! EXTERNALS. + ! ---------- + ! NONE. + + + !*** 1. DETERMINE NONLINEAR TRANSFER. + ! -------------------------------- + IMPLICIT NONE + REAL, INTENT(IN) :: XI, XJ, XK, XIJ, XIK, XJK, XOI, XOJ, XOK + REAL :: RI, RJ, RK, OI, OJ, OK, SQIJK, SQIKJ, SQJKI + + RI=ABS(XI)+DEL1 + RJ=ABS(XJ)+DEL1 + RK=ABS(XK)+DEL1 + OI=XOI+DEL1 + OJ=XOJ+DEL1 + OK=XOK+DEL1 + SQIJK=SQRT(OI*OJ*RK/(OK*RI*RJ)) + SQIKJ=SQRT(OI*OK*RJ/(OJ*RI*RK)) + SQJKI=SQRT(OJ*OK*RI/(OI*RJ*RK)) + VMIN_D=ZCONST*( (XIJ-RI*RJ)*SQIJK + (XIK-RI*RK)*SQIKJ+ (XJK+RJ*RK)*SQJKI ) END FUNCTION VMIN_D -!----------------------------------------------------------------------- + !----------------------------------------------------------------------- REAL(KIND=4) FUNCTION VPLUS_D(XI,XJ,XK,XIJ,XIK,XJK,XOI,XOJ,XOK) - -!*** *VPLUS_D* DETERMINES THE NONLINEAR TRANSFER COEFFICIENT FOR THREE -! WAVE INTERACTIONS OF DEEP-WATER WAVES. - -! PETER JANSSEN - -! PURPOSE. -! -------- - -! GIVES NONLINEAR TRANSFER COEFFICIENT FOR THREE -! WAVE INTERACTIONS OF GRAVITY-CAPILLARY WAVES IN THE -! IDEAL CASE OF NO CURRENT. (CF.ZAKHAROV) - -! INTERFACE. -! ---------- -! *VPLUS_D(XI,XJ,XK)* -! *XI* - WAVE NUMBER -! *XJ* - WAVE NUMBER -! *XK* - WAVE NUMBER -! METHOD. -! ------- -! NONE - -! EXTERNALS. -! ---------- -! NONE. - - - -!*** 1. DETERMINE NONLINEAR TRANSFER. -! -------------------------------- - - IMPLICIT NONE - REAL, INTENT(IN) :: XI, XJ, XK, XIJ, XIK, XJK, XOI, XOJ, XOK - REAL :: RI, RJ, RK, OI, OJ, OK, SQIJK, SQIKJ, SQJKI - - RI=ABS(XI)+DEL1 - RJ=ABS(XJ)+DEL1 - RK=ABS(XK)+DEL1 - OI=XOI+DEL1 - OJ=XOJ+DEL1 - OK=XOK+DEL1 - SQIJK=SQRT(OI*OJ*RK/(OK*RI*RJ)) - SQIKJ=SQRT(OI*OK*RJ/(OJ*RI*RK)) - SQJKI=SQRT(OJ*OK*RI/(OI*RJ*RK)) - VPLUS_D=ZCONST*( (XIJ+RI*RJ)*SQIJK + (XIK+RI*RK)*SQIKJ & - & + (XJK+RJ*RK)*SQJKI ) + !*** *VPLUS_D* DETERMINES THE NONLINEAR TRANSFER COEFFICIENT FOR THREE + ! WAVE INTERACTIONS OF DEEP-WATER WAVES. + ! PETER JANSSEN + ! PURPOSE. + ! -------- + ! GIVES NONLINEAR TRANSFER COEFFICIENT FOR THREE + ! WAVE INTERACTIONS OF GRAVITY-CAPILLARY WAVES IN THE + ! IDEAL CASE OF NO CURRENT. (CF.ZAKHAROV) + ! INTERFACE. + ! ---------- + ! *VPLUS_D(XI,XJ,XK)* + ! *XI* - WAVE NUMBER + ! *XJ* - WAVE NUMBER + ! *XK* - WAVE NUMBER + ! METHOD. + ! ------- + ! NONE + ! EXTERNALS. + ! ---------- + ! NONE. + + !*** 1. DETERMINE NONLINEAR TRANSFER. + ! -------------------------------- + + IMPLICIT NONE + REAL, INTENT(IN) :: XI, XJ, XK, XIJ, XIK, XJK, XOI, XOJ, XOK + REAL :: RI, RJ, RK, OI, OJ, OK, SQIJK, SQIKJ, SQJKI + + RI=ABS(XI)+DEL1 + RJ=ABS(XJ)+DEL1 + RK=ABS(XK)+DEL1 + OI=XOI+DEL1 + OJ=XOJ+DEL1 + OK=XOK+DEL1 + SQIJK=SQRT(OI*OJ*RK/(OK*RI*RJ)) + SQIKJ=SQRT(OI*OK*RJ/(OJ*RI*RK)) + SQJKI=SQRT(OJ*OK*RI/(OI*RJ*RK)) + VPLUS_D=ZCONST*( (XIJ+RI*RJ)*SQIJK + (XIK+RI*RK)*SQIKJ + (XJK+RJ*RK)*SQJKI ) END FUNCTION VPLUS_D -! ----------------------------------------------------------------- + ! ----------------------------------------------------------------- - END SUBROUTINE SECONDHH + END SUBROUTINE SECONDHH !/ ------------------------------------------------------------------- / !/ !> @@ -4971,52 +4924,40 @@ END SUBROUTINE SECONDHH !> !> @author P. Janssen @date 29-Mar-2024 !> - SUBROUTINE SKEWNESS(A) - -!-------------------------------------------------------------------- - -!*****SKEWNESS** COMPUTES PARAMETERS OF THE NEARLY-GAUSSIAN -! DISTRIBUTION OF OCEAN WAVES AT A FIXED GRID POINT. - -! P.JANSSEN JULY 1997 - -! PURPOSE -! ------- -! DETERMINES SKEWNESS PARAMETERS IN ORDER TO OBTAIN -! CORRECTION ON ALTIMETER WAVE HEIGHT. - -! INTERFACE -! --------- -! *CALL* *SKEWNESS(IU06,F1,NCOLL,XKAPPA1,DELH_ALT)* - - - -! METHOD -! ------ -! EVALUATE DEVIATIONS FROM GAUSSIANITY FOLLOWING THE WORK -! OF SROKOSZ AND LONGUET-HIGGINS. FOR SECOND ORDER -! CORRECTIONS TO SURFACE ELEVATION THE APPROACH OF -! ZAKHAROV HAS BEEN USED. - -! EXTERNALS -! --------- -! NONE - -! REFERENCES -! ---------- -! M.A. SROKOSZ, J.G.R.,91,995-1006(1986) -! V.E. ZAKHAROV, HAMILTONIAN APPROACH(1967) -!-------------------------------------------------------------------- - - - -!-------------------------------------------------------------------- -! *TH* REAL DIRECTIONS IN RADIANS. -USE CONSTANTS, ONLY: GRAV, TPI, TPIINV -USE W3GDATMD, ONLY: NK, NTH, XFR, SIG, DTH, ECOS, ESIN, NSEAL -USE W3PARALL, ONLY: INIT_GET_ISEA -USE W3ADATMD, ONLY: CG, SKEW, EMBIA1, EMBIA2 - + SUBROUTINE SKEWNESS(A) + + !-------------------------------------------------------------------- + !*****SKEWNESS** COMPUTES PARAMETERS OF THE NEARLY-GAUSSIAN + ! DISTRIBUTION OF OCEAN WAVES AT A FIXED GRID POINT. + ! P.JANSSEN JULY 1997 + ! PURPOSE + ! ------- + ! DETERMINES SKEWNESS PARAMETERS IN ORDER TO OBTAIN + ! CORRECTION ON ALTIMETER WAVE HEIGHT. + ! INTERFACE + ! --------- + ! *CALL* *SKEWNESS(IU06,F1,NCOLL,XKAPPA1,DELH_ALT)* + ! METHOD + ! ------ + ! EVALUATE DEVIATIONS FROM GAUSSIANITY FOLLOWING THE WORK + ! OF SROKOSZ AND LONGUET-HIGGINS. FOR SECOND ORDER + ! CORRECTIONS TO SURFACE ELEVATION THE APPROACH OF + ! ZAKHAROV HAS BEEN USED. + ! EXTERNALS + ! --------- + ! NONE + ! REFERENCES + ! ---------- + ! M.A. SROKOSZ, J.G.R.,91,995-1006(1986) + ! V.E. ZAKHAROV, HAMILTONIAN APPROACH(1967) + !-------------------------------------------------------------------- + + !-------------------------------------------------------------------- + ! *TH* REAL DIRECTIONS IN RADIANS. + USE CONSTANTS, ONLY: GRAV, TPI, TPIINV + USE W3GDATMD, ONLY: NK, NTH, XFR, SIG, DTH, ECOS, ESIN, NSEAL + USE W3PARALL, ONLY: INIT_GET_ISEA + USE W3ADATMD, ONLY: CG, SKEW, EMBIA1, EMBIA2 IMPLICIT NONE @@ -5035,7 +4976,7 @@ SUBROUTINE SKEWNESS(A) REAL(KIND=4), DIMENSION(0:3,0:2,0:2) :: XMU, XLAMBDA REAL(KIND=4), DIMENSION(:) , ALLOCATABLE:: SIGHF, DFIMHF, FAK -! ---------------------------------------------------------------------- + ! ---------------------------------------------------------------------- NKHF=NK+13 ! same offset as in ECWAM @@ -5049,14 +4990,13 @@ SUBROUTINE SKEWNESS(A) ALLOCATE(F2(NTH,NKHF)) ALLOCATE(SIGHF(NKHF), DFIMHF(NKHF), FAK(NKHF)) -! 1. COMPUTATION OF FREQUENCY-DIRECTION INCREMENT -! ----------------------------------------------- + ! 1. COMPUTATION OF FREQUENCY-DIRECTION INCREMENT + ! ----------------------------------------------- MSTART = 1 - #ifdef W3_OMPG - !$OMP PARALLEL DO PRIVATE(JSEA) + !$OMP PARALLEL DO PRIVATE(JSEA) #endif DO JSEA=1, NSEAL XMU(:,:,:) = 0.0 @@ -5064,8 +5004,8 @@ SUBROUTINE SKEWNESS(A) DO M=1,NK CONX = TPIINV / SIG(M) * CG(M,JSEA) F2(K,M)=A(K,M,JSEA)/ CONX - END DO END DO + END DO SIGHF(1) = SIG(1) DO M=2,NKHF @@ -5083,7 +5023,7 @@ SUBROUTINE SKEWNESS(A) FAK(M) = (SIGHF(M))**2/GRAV ENDDO -! Deals with the tail ... + ! Deals with the tail ... DO M=NK+1,NKHF FH=(SIGHF(NK)/SIGHF(M))**5 DO K=1,NTH @@ -5091,8 +5031,8 @@ SUBROUTINE SKEWNESS(A) ENDDO ENDDO -! 2. COMPUTATION OF THE SKEWNESS COEFFICIENTS -! -------------------------------------------- + ! 2. COMPUTATION OF THE SKEWNESS COEFFICIENTS + ! -------------------------------------------- DO M1=MSTART,NKHF DO M2=MSTART,NKHF @@ -5120,8 +5060,8 @@ SUBROUTINE SKEWNESS(A) ENDDO -! 3. COMPUTATION OF THE NORMALISED SKEWNESS COEFFICIENTS -! ------------------------------------------------------ + ! 3. COMPUTATION OF THE NORMALISED SKEWNESS COEFFICIENTS + ! ------------------------------------------------------ DO I=0,3 XPI = 0.5*FLOAT(I) @@ -5149,13 +5089,12 @@ SUBROUTINE SKEWNESS(A) END DO ! end of loop on JSEA ! #ifdef W3_OMPG - !$OMP END PARALLEL DO + !$OMP END PARALLEL DO #endif DEALLOCATE(FAC0,FAC1,FAC2,FAC3) DEALLOCATE(F2,SIGHF,DFIMHF,FAK) - - END SUBROUTINE SKEWNESS + END SUBROUTINE SKEWNESS END MODULE W3IOGOMD diff --git a/model/src/w3iopomd.F90 b/model/src/w3iopomd.F90 index 0c15ea8c6..fec758638 100644 --- a/model/src/w3iopomd.F90 +++ b/model/src/w3iopomd.F90 @@ -5,6 +5,7 @@ !> #include "w3macros.h" +#define nf90_err(ncerr) nf90_err_check(ncerr, __LINE__) !/ ------------------------------------------------------------------- / !> !> @brief Process point output. @@ -65,7 +66,7 @@ MODULE W3IOPOMD ! Name Type Scope Description ! ---------------------------------------------------------------- ! VEROPT C*10 Private Point output file version number. - ! IDSTR C*32 Private Point output file ID string. + ! IDSTR C*31 Private Point output file ID string. ! ---------------------------------------------------------------- ! ! 3. Subroutines and functions : @@ -118,6 +119,106 @@ MODULE W3IOPOMD CHARACTER(LEN=10), PARAMETER, PRIVATE :: VEROPT = '2021-04-06' CHARACTER(LEN=31), PARAMETER, PRIVATE :: & IDSTR = 'WAVEWATCH III POINT OUTPUT FILE' + + !> Dimension name for the netCDF point output file, for NOPTS, the + !> Number of Output Points. + character(*), parameter, private :: DNAME_NOPTS = 'NOPTS' + + !> Dimension name for the netCDF point output file, for NSPEC. + character(*), parameter, private :: DNAME_NSPEC = 'NSPEC' + + !> Dimension name for the netCDF point output file, for VSIZE. This + !> is for the vector size for points, which is 2. + character(*), parameter, private :: DNAME_VSIZE = 'VSIZE' + + !> Dimension name for the netCDF point output file, for + !> NAMELEN. This is the length of the PTNME strings, which contains + !> the names of the points. + character(*), parameter, private :: DNAME_NAMELEN = 'NAMELEN' + + !> Dimension name for the netCDF point output file, for GRDIDLEN, + !> this is the length of the GRDID character array. + character(*), parameter, private :: DNAME_GRDIDLEN = 'GRDIDLEN' + + !> Dimension name for the netCDF point output file, for TIME + character(*), parameter, private :: DNAME_TIME = 'TIME' + + !> Dimension name for the netCDF point output file, for WW3TIME + character(*), parameter, private :: DNAME_WW3TIME = 'WW3TIME' + + !> Dimension name for the netCDF point weight file, WGHTLEN + !> This is 4 the dimension of weights + character(*), parameter, private :: DNAME_WGHTLEN = 'WGHTLEN' + + !> Variable name for the netCDF point output file, for NK. + character(*), parameter, private :: VNAME_NK = 'NK' + + !> Variable name for the netCDF point output file, for MTH. + character(*), parameter, private :: VNAME_NTH = 'NTH' + + !> Variable name for the netCDF point output file, for PTLOC. + character(*), parameter, private :: VNAME_PTLOC = 'PTLOC' + + !> Variable name for the netCDF point output file, for PTNME. + character(*), parameter, private :: VNAME_PTNME = 'PTNME' + + !> Variable name for the netCDF point weight file, for IPTINT + character(*), parameter, private :: VNAME_IPTINT = 'IPTINT' + + !> Variable name for the netCDF point weight file, for PTIFAC + character(*), parameter, private :: VNAME_PTIFAC = 'PTIFAC' + + !> Variable name for the netCDF point output file, for TIME. + character(*), parameter, private :: VNAME_TIME = 'TIME' + + !> Variable name for the netCDF point output file, for WW3TIME. + character(*), parameter, private :: VNAME_WW3TIME = 'WW3TIME' + + !> Variable name for the netCDF point output file, for DPO. + character(*), parameter, private :: VNAME_DPO = 'DPO' + + !> Variable name for the netCDF point output file, for WAO. + character(*), parameter, private :: VNAME_WAO = 'WAO' + + !> Variable name for the netCDF point output file, for WDO. + character(*), parameter, private :: VNAME_WDO = 'WDO' + + !> Variable name for the netCDF point output file, for TAUAO. + character(*), parameter, private :: VNAME_TAUAO = 'TAUAO' + + !> Variable name for the netCDF point output file, for TAUDO. + character(*), parameter, private :: VNAME_TAUDO = 'TAUDO' + + !> Variable name for the netCDF point output file, for DAIRO. + character(*), parameter, private :: VNAME_DAIRO = 'DAIRO' + + !> Variable name for the netCDF point output file, for ZET_SETO. + character(*), parameter, private :: VNAME_ZET_SETO = 'ZET_SETO' + + !> Variable name for the netCDF point output file, for ASO. + character(*), parameter, private :: VNAME_ASO = 'ASO' + + !> Variable name for the netCDF point output file, for CAO. + character(*), parameter, private :: VNAME_CAO = 'CAO' + + !> Variable name for the netCDF point output file, for CDO. + character(*), parameter, private :: VNAME_CDO = 'CDO' + + !> Variable name for the netCDF point output file, for ICEO. + character(*), parameter, private :: VNAME_ICEO = 'ICEO' + + !> Variable name for the netCDF point output file, for ICEHO. + character(*), parameter, private :: VNAME_ICEHO = 'ICEHO' + + !> Variable name for the netCDF point output file, for ICEFO. + character(*), parameter, private :: VNAME_ICEFO = 'ICEFO' + + !> Variable name for the netCDF point output file, for GRDID. + character(*), parameter, private :: VNAME_GRDID = 'GRDID' + + !> Variable name for the netCDF point output file, for SPCO. + character(*), parameter, private :: VNAME_SPCO = 'SPCO' + !/ CONTAINS !/ ------------------------------------------------------------------- / @@ -135,7 +236,7 @@ MODULE W3IOPOMD !> !> @author H. L. Tolman @date 02-Sep-2012 !> - SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) + SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD, MPI_COMM_IOPP ) !/ !/ +-----------------------------------+ !/ | WAVEWATCH III NOAA/NCEP | @@ -238,7 +339,8 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) ! 10. Source code : ! !/ ------------------------------------------------------------------- / - USE W3GSRUMD + USE NETCDF + USE W3GSRUMD, ONLY: W3GRMP USE W3GDATMD, ONLY: NTH, NK, NSPEC, NX, NY, X0, Y0, SX, GSU,& RLGTYPE, CLGTYPE, UNGTYPE, GTYPE, FLAGLL, & ICLOSE,ICLOSE_NONE,ICLOSE_SMPL,ICLOSE_TRPL, & @@ -249,21 +351,25 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) USE W3GDATMD, ONLY: PoLat, PoLon, FLAGUNR USE W3SERVMD, ONLY: W3LLTOEQ #endif - USE W3ODATMD, ONLY: W3DMO2 + USE W3ODATMD, ONLY: W3DMO2, FNMPRE USE W3ODATMD, ONLY: NDSE, NDST, IAPROC, NAPERR, NAPOUT, SCREEN, & NOPTS, PTLOC, PTNME, GRDID, IPTINT, PTIFAC USE W3SERVMD, ONLY: EXTCDE #ifdef W3_S USE W3SERVMD, ONLY: STRACE #endif - USE W3TRIAMD + USE W3TRIAMD, ONLY: IS_IN_UNGRID + USE W3GDATMD, ONLY: FILEXT ! IMPLICIT NONE +#ifdef W3_MPI + INCLUDE "mpif.h" +#endif !/ !/ ------------------------------------------------------------------- / !/ Parameter list !/ - INTEGER, INTENT(IN) :: NPT, IMOD + INTEGER, INTENT(IN) :: NPT, IMOD, MPI_COMM_IOPP REAL, INTENT(INOUT) :: XPT(NPT), YPT(NPT) CHARACTER(LEN=40),INTENT(IN) :: PNAMES(NPT) !/ @@ -298,6 +404,16 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) !! Declare a few temporary variables for rotated grid. JGLi12Jun2012 REAL, ALLOCATABLE :: EquLon(:),EquLat(:),StdLon(:),StdLat(:),AnglPT(:) #endif + ! Variables for NetCDF weights file for points + character(len = 124) :: filename + logical :: pnt_wght_exists, pnt_wght_write + integer :: ncerr, fh + integer :: d_nopts, d_namelen, d_vsize, d_wghtlen + integer :: d_nopts_len, d_vsize_len,d_namelen_len,d_wghtlen_len + integer :: v_ptloc, v_ptnme, v_iptint, v_ptifac +#ifdef W3_MPI + integer :: IERR_MPI +#endif !/ !/ ------------------------------------------------------------------- / !/ @@ -332,86 +448,214 @@ SUBROUTINE W3IOPP ( NPT, XPT, YPT, PNAMES, IMOD ) #endif ! - ! Removed by F.A. 2011/04/04 /T CALL W3GSUP( GSU, NDST ) + !If unstructured grid, check to see if a netcdf point weight file exists: + filename = 'pnt_wght.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc' + IF (GTYPE .NE. UNGTYPE) THEN + !skipping weights file for non-unstructured grids. + !likely could be used after proper testing if initialization time is long + pnt_wght_exists = .FALSE. + pnt_wght_write = .FALSE. + ELSE + !for unstructured grid, use saved weights file if exists: + INQUIRE(FILE=filename, EXIST=pnt_wght_exists) + pnt_wght_write = .NOT. pnt_wght_exists + ENDIF ! - ! Loop over output points + ! Loop over output points if saved weights do not exist ! - DO IPT=1, NPT - ! + IF (.NOT. pnt_wght_exists) THEN + DO IPT=1, NPT + ! #ifdef W3_T - WRITE (NDST,9010) IPT, XPT(IPT), YPT(IPT), PNAMES(IPT) + WRITE (NDST,9010) IPT, XPT(IPT), YPT(IPT), PNAMES(IPT) #endif - ! + ! #ifdef W3_RTD - !! Need to wrap rotated Elon values greater than X0. JGLi12Jun2012 - XPT(IPT) = MOD( EquLon(IPT)+360.0, 360.0 ) - IF( XPT(IPT) .LT. X0 ) XPT(IPT) = XPT(IPT) + 360.0 + !! Need to wrap rotated Elon values greater than X0. JGLi12Jun2012 + XPT(IPT) = MOD( EquLon(IPT)+360.0, 360.0 ) + IF( XPT(IPT) .LT. X0 ) XPT(IPT) = XPT(IPT) + 360.0 #endif - ! - ! Check if point within grid and compute interpolation weights - ! - IF (GTYPE .NE. UNGTYPE) THEN - INGRID = W3GRMP( GSU, XPT(IPT), YPT(IPT), IX, IY, RD ) - ELSE - CALL IS_IN_UNGRID(IMOD, DBLE(XPT(IPT)), DBLE(YPT(IPT)), itout, IX, IY, RD) - INGRID = (ITOUT.GT.0) - END IF - ! - IF ( .NOT.INGRID ) THEN - IF ( IAPROC .EQ. NAPERR ) THEN - IF ( FLAGLL ) THEN - WRITE (NDSE,1000) XPT(IPT), YPT(IPT), PNAMES(IPT) - ELSE - WRITE (NDSE,1001) XPT(IPT), YPT(IPT), PNAMES(IPT) + ! + ! Check if point within grid and compute interpolation weights + ! + IF (GTYPE .NE. UNGTYPE) THEN + INGRID = W3GRMP( GSU, XPT(IPT), YPT(IPT), IX, IY, RD ) + ELSE + CALL IS_IN_UNGRID(IMOD, DBLE(XPT(IPT)), DBLE(YPT(IPT)), itout, IX, IY, RD) + INGRID = (ITOUT.GT.0) + END IF + ! + IF ( .NOT.INGRID ) THEN + IF ( IAPROC .EQ. NAPERR ) THEN + IF ( FLAGLL ) THEN + WRITE (NDSE,1000) XPT(IPT), YPT(IPT), PNAMES(IPT) + ELSE + WRITE (NDSE,1001) XPT(IPT), YPT(IPT), PNAMES(IPT) + END IF END IF + CYCLE END IF - CYCLE - END IF - ! + ! #ifdef W3_T - DO K = 1,4 - WRITE (NDST,9012) IX(K), IY(K), RD(K) - END DO + DO K = 1,4 + WRITE (NDST,9012) IX(K), IY(K), RD(K) + END DO #endif - ! - ! Check if point not on land - ! - IF ( MAPSTA(IY(1),IX(1)) .EQ. 0 .AND. & - MAPSTA(IY(2),IX(2)) .EQ. 0 .AND. & - MAPSTA(IY(3),IX(3)) .EQ. 0 .AND. & - MAPSTA(IY(4),IX(4)) .EQ. 0 ) THEN - IF ( IAPROC .EQ. NAPERR ) THEN - IF ( FLAGLL ) THEN - WRITE (NDSE,1002) XPT(IPT), YPT(IPT), PNAMES(IPT) - ELSE - WRITE (NDSE,1003) XPT(IPT), YPT(IPT), PNAMES(IPT) + ! + ! Check if point not on land + ! + IF ( MAPSTA(IY(1),IX(1)) .EQ. 0 .AND. & + MAPSTA(IY(2),IX(2)) .EQ. 0 .AND. & + MAPSTA(IY(3),IX(3)) .EQ. 0 .AND. & + MAPSTA(IY(4),IX(4)) .EQ. 0 ) THEN + IF ( IAPROC .EQ. NAPERR ) THEN + IF ( FLAGLL ) THEN + WRITE (NDSE,1002) XPT(IPT), YPT(IPT), PNAMES(IPT) + ELSE + WRITE (NDSE,1003) XPT(IPT), YPT(IPT), PNAMES(IPT) + END IF END IF + CYCLE END IF - CYCLE - END IF - ! - ! Store interpolation data - ! - NOPTS = NOPTS + 1 - ! - PTLOC (1,NOPTS) = XPT(IPT) - PTLOC (2,NOPTS) = YPT(IPT) + ! + ! Store interpolation data + ! + NOPTS = NOPTS + 1 + ! + PTLOC (1,NOPTS) = XPT(IPT) + PTLOC (2,NOPTS) = YPT(IPT) #ifdef W3_RTD - !! Store the standard lon/lat in PTLOC for output purpose, assuming - !! they are not used for any inside calculation. JGLi12Jun2012 - PTLOC (1,NOPTS) = StdLon(IPT) - PTLOC (2,NOPTS) = StdLat(IPT) + !! Store the standard lon/lat in PTLOC for output purpose, assuming + !! they are not used for any inside calculation. JGLi12Jun2012 + PTLOC (1,NOPTS) = StdLon(IPT) + PTLOC (2,NOPTS) = StdLat(IPT) #endif - ! - DO K = 1,4 - IPTINT(1,K,NOPTS) = IX(K) - IPTINT(2,K,NOPTS) = IY(K) - PTIFAC(K,NOPTS) = RD(K) - END DO + ! + DO K = 1,4 + IPTINT(1,K,NOPTS) = IX(K) + IPTINT(2,K,NOPTS) = IY(K) + PTIFAC(K,NOPTS) = RD(K) + END DO - PTNME(NOPTS) = PNAMES(IPT) - ! - END DO ! End loop over output points (IPT). + PTNME(NOPTS) = PNAMES(IPT) + ! + END DO ! End loop over output points (IPT). + ELSE + ! Saved weight file exists, read weights from file + IF ( IAPROC .EQ. 1 ) THEN + ! Open the netCDF file. + ncerr = nf90_open(filename, NF90_NOWRITE, fh) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for NOPTS. + ncerr = nf90_inq_dimid(fh, DNAME_NOPTS, d_nopts) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_nopts, len = d_nopts_len) + if (nf90_err(ncerr) .ne. 0) return + NOPTS=d_nopts_len + + ! Read the dimension information for VSIZE. + ncerr = nf90_inq_dimid(fh, DNAME_VSIZE, d_vsize) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_vsize, len = d_vsize_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for NAMELEN. + ncerr = nf90_inq_dimid(fh, DNAME_NAMELEN, d_namelen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_namelen, len = d_namelen_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for WGHTLEN. + ncerr = nf90_inq_dimid(fh, DNAME_WGHTLEN, d_wghtlen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_wghtlen, len = d_wghtlen_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read vars + ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ptloc, PTLOC, start = (/ 1, 1/), & + count = (/ d_vsize_len, d_nopts_len /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ptnme, PTNME, start = (/ 1, 1/), & + count = (/ d_namelen_len, d_nopts_len /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_inq_varid(fh, VNAME_IPTINT, v_iptint) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_iptint, IPTINT, start = (/ 1, 1/), & + count = (/ d_vsize_len, d_wghtlen_len, d_nopts_len /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_inq_varid(fh, VNAME_PTIFAC, v_ptifac) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ptifac, PTIFAC, start = (/ 1, 1/), & + count = (/ d_wghtlen_len, d_nopts_len /)) + if (nf90_err(ncerr) .ne. 0) return + END IF +#ifdef W3_MPI + ! Broadcast weight info to all MPI tasks: + CALL MPI_BCAST(NOPTS,1,MPI_INTEGER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI) + CALL MPI_BCAST(PTNME,40*NPT,MPI_CHARACTER,IAPROC-1,MPI_COMM_IOPP,IERR_MPI) + CALL MPI_BCAST(PTLOC,2*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI) + CALL MPI_BCAST(IPTINT,2*4*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI) + CALL MPI_BCAST(PTIFAC,4*NPT,MPI_REAL,0,MPI_COMM_IOPP,IERR_MPI) + CALL MPI_Barrier(MPI_COMM_IOPP,IERR_MPI) +#endif + ENDIF !end if point weight file exists + + !Create a weights file if there are output points: + IF ( pnt_wght_write .AND. (NOPTS > 0) ) THEN + IF ( IAPROC .EQ. 1 ) THEN + ! Create the netCDF file. + ncerr = nf90_create(filename, NF90_NETCDF4, fh) + if (nf90_err(ncerr) .ne. 0) return + + ! Define dimensions. + ncerr = nf90_def_dim(fh, DNAME_NOPTS, NOPTS, d_nopts) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_NAMELEN, 40, d_namelen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_VSIZE, 2, d_vsize) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_WGHTLEN, 4, d_wghtlen) + if (nf90_err(ncerr) .ne. 0) return + + ! Define vars with nopts as a dimension. Point location and name + ncerr = nf90_def_var(fh, VNAME_PTLOC, NF90_FLOAT, (/d_vsize, d_nopts/), v_ptloc) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_PTNME, NF90_CHAR, (/d_namelen, d_nopts/), v_ptnme) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_IPTINT, NF90_FLOAT, (/d_vsize, d_wghtlen, d_nopts/), v_iptint) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_PTIFAC, NF90_FLOAT, (/d_wghtlen, d_nopts/), v_ptifac) + if (nf90_err(ncerr) .ne. 0) return + + ! End of all variable definitions + ncerr = nf90_enddef(fh) + if (nf90_err(ncerr) .ne. 0) return + + !write variables to file + ncerr = nf90_put_var(fh, v_ptloc, PTLOC(:,1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_var(fh, v_ptnme, PTNME(1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_iptint, IPTINT(:,:,1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_var(fh, v_ptifac, PTIFAC(:,1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + + ! Close the file. + ncerr = nf90_close(fh) + if (nf90_err(ncerr) .ne. 0) return + + END IF + ENDIF ! #ifdef W3_RTD DEALLOCATE( EquLon, EquLat, StdLon, StdLat, AnglPT ) @@ -1024,6 +1268,717 @@ SUBROUTINE W3IOPE ( A ) !/ END SUBROUTINE W3IOPE + !> Handle netCDF return code. + !> + !> @param errcode NetCDF error code. 0 for no error. + !> + !> @author Edward Hartnett @date 1-Nov-2023 + !> + integer function nf90_err_check(errcode, ILINE) + USE NetCDF + USE W3ODATMD, ONLY: NDSE + implicit none + integer, intent(in) :: errcode, ILINE + + nf90_err_check = errcode + if(errcode /= nf90_noerr) then + WRITE(NDSE,*) ' *** WAVEWATCH III ERROR IN W3IOPO :' + WRITE(NDSE,*) ' LINE NUMBER ', ILINE + WRITE(NDSE,*) ' NETCDF ERROR MESSAGE: ' + WRITE(NDSE,*) 'Error: ', trim(nf90_strerror(errcode)) + return + endif + end function nf90_err_check +#ifdef W3_BIN2NC + + !> Read point output in netCDF format. + !> + !> @param[out] IOTST Test indictor for reading. + !> @param[in] IMOD_IN Model number for W3GDAT etc. + !> @param[in] filename Name of file to read. + !> @param[inout] ncerr Error code, 0 for success, netCDF error code + !> otherwise. + !> + !> @author Edward Hartnett @date 1-Nov-2023 + !> + SUBROUTINE W3IOPON_READ(IOTST, IMOD_IN, filename, ncerr) + USE NetCDF + USE W3ODATMD, ONLY: W3DMO2 + USE W3WDATMD, ONLY: TIME + USE W3GDATMD, ONLY: NTH, NK, NSPEC, FILEXT + USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, & + IL, IW, II, PTLOC, PTIFAC, DPO, WAO, WDO, & + ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, & + GRDID, ICEO, ICEHO, ICEFO, W3DMO2 + USE W3SERVMD, ONLY: EXTCDE +#ifdef W3_FLX5 + USE W3ODATMD, ONLY: TAUAO, TAUDO, DAIRO +#endif +#ifdef W3_SETUP + USE W3ODATMD, ONLY: ZET_SETO +#endif + IMPLICIT NONE + + INTEGER, INTENT(OUT) :: IOTST + INTEGER, INTENT(IN), OPTIONAL :: IMOD_IN + character(*), intent(in) :: filename + integer, intent(inout) :: ncerr + INTEGER :: IGRD,MK,MTH + integer :: fh + integer :: d_nopts, d_nspec, d_vsize, d_namelen, d_grdidlen, d_time, d_ww3time + integer :: d_nopts_len, d_nspec_len, d_vsize_len, d_namelen_len, d_grdidlen_len, d_time_len, d_ww3time_len + integer :: v_idtst, v_vertst, v_nk, v_nth, v_ptloc, v_ptnme, v_time, v_ww3time + integer :: v_dpo, v_wao, v_wdo +#ifdef W3_FLX5 + integer :: v_tauao,v_taudo, v_dairo +#endif +#ifdef W3_SETUP + integer :: v_zet_seto +#endif + integer :: v_aso, v_cao, v_cdo, v_iceo + integer :: v_iceho, v_icefo, v_grdid, v_spco + integer :: v_title_len, v_version_len + CHARACTER(LEN=31) :: IDTST + CHARACTER(LEN=10) :: VERTST + + IOTST = 0 + + IF (PRESENT(IMOD_IN)) THEN + IGRD = IMOD_IN + ELSE + IGRD = 1 + END IF + + ! Open the netCDF file. + ncerr = nf90_open(filename, NF90_NOWRITE, fh) + if (nf90_err(ncerr) .ne. 0) return + + ! Read and check the version: + ncerr = nf90_inquire_attribute(fh, NF90_GLOBAL, 'title', len = v_title_len) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_att(fh, NF90_GLOBAL, 'title', IDTST) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_attribute(fh, NF90_GLOBAL, 'version', len = v_version_len) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_att(fh, NF90_GLOBAL, 'version', VERTST) + if (nf90_err(ncerr) .ne. 0) return + + IF ( IDTST .NE. IDSTR ) THEN + WRITE (NDSE,902) IDTST, IDSTR + CALL EXTCDE ( 10 ) + END IF + IF ( VERTST .NE. VEROPT ) THEN + WRITE (NDSE,903) VERTST, VEROPT + CALL EXTCDE ( 11 ) + END IF + + ! Read the dimension information for NOPTS. + ncerr = nf90_inq_dimid(fh, DNAME_NOPTS, d_nopts) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_nopts, len = d_nopts_len) + if (nf90_err(ncerr) .ne. 0) return + NOPTS=d_nopts_len + + ! Read the dimension information for NSPEC. + ncerr = nf90_inq_dimid(fh, DNAME_NSPEC, d_nspec) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_nspec, len = d_nspec_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for VSIZE. + ncerr = nf90_inq_dimid(fh, DNAME_VSIZE, d_vsize) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_vsize, len = d_vsize_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for NAMELEN. + ncerr = nf90_inq_dimid(fh, DNAME_NAMELEN, d_namelen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_namelen, len = d_namelen_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimension information for GRDIDLEN. + ncerr = nf90_inq_dimid(fh, DNAME_GRDIDLEN, d_grdidlen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_grdidlen, len = d_grdidlen_len) + if (nf90_err(ncerr) .ne. 0) return + + ! Read the dimention information from time + ncerr = nf90_inq_dimid(fh, DNAME_TIME, d_time) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inquire_dimension(fh, d_time, len = d_time_len) + if (nf90_err(ncerr) .ne. 0) return + + IF ( IPASS .LE. d_time_len ) THEN + + IF ( IPASS.EQ.1 ) THEN + + ! Read scalar variables. + ncerr = nf90_inq_varid(fh, VNAME_NK, v_nk) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_nk, MK) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_NTH, v_nth) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_nth, MTH) + if (nf90_err(ncerr) .ne. 0) return + + !read in written variables NK, NTH as MK and MTH + !and ensure they match + IF (NK.NE.MK .OR. NTH.NE.MTH) THEN + WRITE (NDSE,904) MK, MTH, NK, NTH + CALL EXTCDE ( 12 ) + END IF + + ! Allocate variables: + IF ( .NOT. O2INIT ) & + CALL W3DMO2 ( IGRD, NDSE, NDST, NOPTS ) + + ! Read vars with nopts as a dimension. + ncerr = nf90_inq_varid(fh, VNAME_PTLOC, v_ptloc) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ptloc, PTLOC, start = (/ 1, 1/), & + count = (/ d_vsize_len, d_nopts_len /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_PTNME, v_ptnme) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ptnme, PTNME) + if (nf90_err(ncerr) .ne. 0) return + END IF + + !Variables read based on time (IPASS): + + ncerr = nf90_inq_varid(fh, VNAME_WW3TIME, v_ww3time) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_ww3time, TIME, start = (/ 1, IPASS/), & + count = (/ d_vsize_len, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ! set IW, II and IL to 0, + ! These values are set to 0 in binary file and have been removed + ! from netcdf file. Possible can be completely removed. + IW = 0 + II = 0 + IL = 0 + + ncerr = nf90_inq_varid(fh, VNAME_DPO, v_dpo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_dpo, DPO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WAO, v_wao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_wao, WAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WDO, v_wdo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_wdo, WDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return +#ifdef W3_FLX5 + ncerr = nf90_inq_varid(fh, VNAME_TAUAO, v_tauao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_tauao, TAUAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_TAUDO, v_taudo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_taudo, TAUDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_DAIRO, v_dairo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_dairo, DAIRO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return +#endif +#ifdef W3_SETUP + ncerr = nf90_inq_varid(fh, ZET_SETO, v_zet_seto) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_zet_seto, ZET_SETO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return +#endif + ncerr = nf90_inq_varid(fh, VNAME_ASO, v_aso) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_aso, ASO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CAO, v_cao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_cao, CAO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CDO, v_cdo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_cdo, CDO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEO, v_iceo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_iceo, ICEO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEHO, v_iceho) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_iceho, ICEHO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEFO, v_icefo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_icefo, ICEFO, start = (/ 1, IPASS/), & + count = (/ NOPTS, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_GRDID, v_grdid) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_grdid, GRDID, start = (/ 1, 1, IPASS/), & + count = (/ 13, nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_SPCO, v_spco) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_get_var(fh, v_spco, SPCO, start = (/ 1, 1, IPASS/), & + count = (/nspec, nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ELSE + ! Set flag to indicate IPASS > d_time_len + ! and are at the end of the + IOTST = -1 + END IF + + ! Close the file. + ncerr = nf90_close(fh) + if (nf90_err(ncerr) .ne. 0) return + +902 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPON :'/ & + ' ILEGAL IDSTR, READ : ',A/ & + ' CHECK : ',A/) +903 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPON :'/ & + ' ILEGAL VEROPT, READ : ',A/ & + ' CHECK : ',A/) +904 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPO :'/ & + ' ERROR IN SPECTRA, MK, MTH : ',2I8/ & + ' ARRAY DIMENSIONS : ',2I8/) + + + END SUBROUTINE W3IOPON_READ + + !/ ------------------------------------------------------------------- / + !> + !> @brief Write point output in netCDF format. + !> + !> @param[in] filename Name of file to write. + !> @param[in] timestep_only Will be 0 if whole model run should be + !> written, 1 if only one timestep should be written. + !> @param[inout] ncerr Error code, 0 for success, netCDF error code + !> otherwise. + !> + !> @author Edward Hartnett @date 1-Nov-2023 + !> + SUBROUTINE W3IOPON_WRITE(timestep_only,filename, ncerr) + USE NETCDF + USE W3GDATMD, ONLY: NTH, NK, NSPEC + USE W3WDATMD, ONLY: TIME + USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, NOPTS, IPTINT, & + PTLOC, PTIFAC, DPO, WAO, WDO, & + ASO, CAO, CDO, SPCO, PTNME, O2INIT, FNMPRE, & + GRDID, ICEO, ICEHO, ICEFO + USE W3TIMEMD, ONLY: CALTYPE, T2D, U2D, TSUB +#ifdef W3_FLX5 + USE W3ODATMD, ONLY: TAUAO, TAUDO, DAIRO +#endif +#ifdef W3_SETUP + USE W3ODATMD, ONLY: ZET_SETO +#endif + + IMPLICIT NONE + integer, intent(in) :: timestep_only ! 1 if only timestep should be written. + character(*), intent(in) :: filename + integer, intent(inout) :: ncerr + integer :: ndim, nvar, fmt, itime, fh + integer :: d_nopts, d_nspec, d_vsize, d_namelen, d_grdidlen, d_time + integer :: v_idtst, v_vertst, v_nk, v_nth, v_ptloc, v_ptnme, v_time, v_ww3time + integer :: v_dpo, v_wao, v_wdo +#ifdef W3_FLX5 + integer :: v_tauao, v_taudo, v_dairo +#endif +#ifdef W3_SETUP + integer :: v_zet_seto +#endif + integer :: v_aso, v_cao, v_cdo, v_iceo + integer :: v_iceho, v_icefo, v_grdid, v_spco + integer :: curdate(8), refdate(8),ierr + double precision :: outjulday + + !If first pass, or if you are writting a file for every time-step: + IF ( IPASS.EQ.1 .OR. timestep_only.EQ.1 ) THEN + ! Create the netCDF file. + ncerr = nf90_create(filename, NF90_NETCDF4, fh) + if (nf90_err(ncerr) .ne. 0) return + + ! Define dimensions. + ncerr = nf90_def_dim(fh, DNAME_NOPTS, NOPTS, d_nopts) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_NSPEC, NSPEC, d_nspec) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_VSIZE, 2, d_vsize) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_NAMELEN, 40, d_namelen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_GRDIDLEN, 13, d_grdidlen) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_dim(fh, DNAME_TIME, NF90_UNLIMITED, d_time) + if (nf90_err(ncerr) .ne. 0) return + + ! Define global attributes. + ncerr = nf90_put_att(fh, NF90_GLOBAL, 'title', IDSTR) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_att(fh, NF90_GLOBAL, 'version', VEROPT) + if (nf90_err(ncerr) .ne. 0) return + + ! Define scalar variables. + ncerr = nf90_def_var(fh, VNAME_NK, NF90_INT, v_nk) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_NTH, NF90_INT, v_nth) + if (nf90_err(ncerr) .ne. 0) return + + ! Define vars with nopts as a dimension. Point location and name + ncerr = nf90_def_var(fh, VNAME_PTLOC, NF90_FLOAT, (/d_vsize, d_nopts/), v_ptloc) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_PTNME, NF90_CHAR, (/d_namelen, d_nopts/), v_ptnme) + if (nf90_err(ncerr) .ne. 0) return + + ! Define time for each time step + ncerr = nf90_def_var(fh, VNAME_WW3TIME, NF90_INT, (/d_vsize, d_time/),v_ww3time) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_TIME, NF90_DOUBLE, (/d_time/),v_time) + if (nf90_err(ncerr) .ne. 0) return + SELECT CASE (TRIM(CALTYPE)) + CASE ('360_day') + ncerr = nf90_put_att(fh, v_time, 'long_name', 'time in 360 day calendar') + if (nf90_err(ncerr) .ne. 0) return + CASE ('365_day') + ncerr = nf90_put_att(fh, v_time, 'long_name', 'time in 365 day calendar') + if (nf90_err(ncerr) .ne. 0) return + CASE ('standard') + ncerr = nf90_put_att(fh, V_TIME, 'long_name', 'Julian day (UT)') + if (nf90_err(ncerr) .ne. 0) return + END SELECT + ncerr = nf90_put_att(fh, V_TIME, 'standard_name', 'time') + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_att(fh, V_TIME, 'units', 'days since 1990-01-01 00:00:00') + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_att(fh, V_TIME, 'conventions','Relative Julian days with decimal part (as parts of the day)') + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_att(fh, V_TIME, 'axis', 'T') + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_att(fh, V_TIME, 'calendar', TRIM(CALTYPE)) + if (nf90_err(ncerr) .ne. 0) return + + ! Define vars with nopts and time as dimensions + ncerr = nf90_def_var(fh, VNAME_DPO, NF90_FLOAT, (/d_nopts, d_time/), v_dpo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_WAO, NF90_FLOAT, (/d_nopts, d_time/), v_wao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_WDO, NF90_FLOAT, (/d_nopts, d_time/), v_wdo) + if (nf90_err(ncerr) .ne. 0) return +#ifdef W3_FLX5 + ncerr = nf90_def_var(fh, VNAME_TAUAO, NF90_FLOAT, (/d_nopts, d_time/), v_tauao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_TAUDO, NF90_FLOAT, (/d_nopts, d_time/), v_taudo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_DAIRO, NF90_FLOAT, (/d_nopts, d_time/), v_dairo) + if (nf90_err(ncerr) .ne. 0) return +#endif +#ifdef W3_SETUP + ncerr = nf90_def_var(fh, VNAME_ZET_SETO, NF90_FLOAT, (/d_nopts, d_time/), v_zet_seto) + if (nf90_err(ncerr) .ne. 0) return +#endif + ncerr = nf90_def_var(fh, VNAME_ASO, NF90_FLOAT, (/d_nopts, d_time/), v_aso) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_CAO, NF90_FLOAT, (/d_nopts, d_time/), v_cao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_CDO, NF90_FLOAT, (/d_nopts, d_time/), v_cdo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_ICEO, NF90_FLOAT, (/d_nopts, d_time/), v_iceo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_ICEHO, NF90_FLOAT, (/d_nopts, d_time/), v_iceho) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_ICEFO, NF90_FLOAT, (/d_nopts, d_time/), v_icefo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_def_var(fh, VNAME_GRDID, NF90_CHAR, (/d_grdidlen, d_nopts, d_time/), v_grdid) + if (nf90_err(ncerr) .ne. 0) return + + ! Define spectral output with dimensions nspec, nopts and time + ncerr = nf90_def_var(fh, VNAME_SPCO, NF90_FLOAT, (/d_nspec, d_nopts, d_time/), v_spco) + if (nf90_err(ncerr) .ne. 0) return + + ! End of all variable definitions + ncerr = nf90_enddef(fh) + if (nf90_err(ncerr) .ne. 0) return + + ! Write the scalar data. + ncerr = nf90_put_var(fh, v_nk, NK) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_put_var(fh, v_nth, NTH) + if (nf90_err(ncerr) .ne. 0) return + + ! Write the data with NOPTS as a dimension. (no time dimension) + if (associated(PTLOC)) then + ncerr = nf90_put_var(fh, v_ptloc, PTLOC(:,1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + endif + if (associated(PTNME)) then + ncerr = nf90_put_var(fh, v_ptnme, PTNME(1:NOPTS)) + if (nf90_err(ncerr) .ne. 0) return + endif + + ELSE + ! If we are writing to the same file, re-open the file + ncerr = nf90_open(filename, nf90_write, fh) + if (nf90_err(ncerr) .ne. 0) return + END IF + + !Determine the start for the time dimension + IF ( timestep_only.EQ.1 ) THEN + itime=1 + ELSE + itime=IPASS + END IF + + ! Write Time + IF ( itime > 1 ) THEN + ncerr = nf90_inq_varid(fh, VNAME_WW3TIME, v_ww3time) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_TIME, v_time) + if (nf90_err(ncerr) .ne. 0) return + END IF + ncerr = nf90_put_var(fh, v_ww3time, TIME, start = (/ 1, itime/), & + count = (/ 2, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + CALL U2D('days since 1990-01-01 00:00:00',REFDATE,IERR) + CALL T2D(TIME,CURDATE,IERR) + outjulday=TSUB(REFDATE,CURDATE) + + ncerr = nf90_put_var(fh, v_time, outjulday, start = (/itime/)) + if (nf90_err(ncerr) .ne. 0) return + + + ! If itime > 1 need to inquire varid + IF ( itime > 1 ) THEN + ncerr = nf90_inq_varid(fh, VNAME_DPO, v_dpo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WAO, v_wao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_WDO, v_wdo) + if (nf90_err(ncerr) .ne. 0) return +#ifdef W3_FLX5 + ncerr = nf90_inq_varid(fh, VNAME_TAUAO, v_tauao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_TAUDO, v_taudo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_DAIRO, v_dairo) + if (nf90_err(ncerr) .ne. 0) return +#endif +#ifdef W3_SETUP + ncerr = nf90_inq_varid(fh, VNAME_ZET_SETO, v_zet_seto) + if (nf90_err(ncerr) .ne. 0) return +#endif + ncerr = nf90_inq_varid(fh, VNAME_ASO, v_aso) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CAO, v_cao) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_CDO, v_cdo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEO, v_iceo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEHO, v_iceho) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_ICEFO, v_icefo) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_GRDID, v_grdid) + if (nf90_err(ncerr) .ne. 0) return + ncerr = nf90_inq_varid(fh, VNAME_SPCO, v_spco) + if (nf90_err(ncerr) .ne. 0) return + END IF + + ncerr = nf90_put_var(fh, v_dpo, DPO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_wao, WAO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_wdo, WDO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + +#ifdef W3_FLX5 + ncerr = nf90_put_var(fh, v_tauao, TAUAO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_taudo, TAUDO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_dairo, DAIRO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return +#endif +#ifdef W3_SETUP + ncerr = nf90_put_var(fh, v_zet_seto, ZET_SETO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return +#endif + ncerr = nf90_put_var(fh, v_aso, ASO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_cao, CAO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_cdo, CDO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_iceo, ICEO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_iceho, ICEHO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_icefo, ICEFO, start = (/ 1, itime/), & + count = (/ nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ncerr = nf90_put_var(fh, v_grdid, GRDID, start = (/ 1, 1, itime/), & + count = (/ 13, nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + !write spectral output + ncerr = nf90_put_var(fh, v_spco, SPCO, start = (/ 1, 1, itime/), & + count = (/nspec, nopts, 1 /)) + if (nf90_err(ncerr) .ne. 0) return + + ! Close the file. + ncerr = nf90_close(fh) + if (nf90_err(ncerr) .ne. 0) return + + END SUBROUTINE W3IOPON_WRITE + + !> Read or write the netCDF point output file, + !> depending on the value of the first parameter. + !> + !> When reading, the entire file is read with one call to this + !> subroutine. + !> + !> When writing, this subroutine can either write one timestep or + !> the whole model run. This is an option in the input file. If the + !> entire model run is to be written, then OFILES(2) is 0. If only + !> one timestep is to be written, then OFILES(2) is 1. + !> + !> If OFILES(2) is 0, the output file is names out_pnt.ww3. If + !> OFILES(2) is 1, the output file is named TIMETAG.out_pnt.ww3. + !> + !> @param[in] INXOUT String indicating read/write. Must be 'READ' or + !> 'WRITE'. + !> @param[in] NDSOP File unit number. + !> @param[out] IOTST Error code: + !> - 0 No error. + !> - -1 Unexpected end of file when reading. + !> @param[in] IMOD Model number for W3GDAT etc. + !> + !> @author Edward Hartnett @date 1-Nov-2023 + SUBROUTINE W3IOPON ( INXOUT, NDSOP, IOTST, IMOD) + USE W3GDATMD, ONLY: W3SETG + USE W3WDATMD, ONLY: W3SETW + USE W3ODATMD, ONLY: W3SETO + USE W3GDATMD, ONLY: FILEXT + USE W3WDATMD, ONLY: TIME + USE W3ODATMD, ONLY: NDST, NDSE, IPASS => IPASS2, FNMPRE + USE W3ODATMD, ONLY: OFILES + USE W3SERVMD, ONLY: EXTCDE +#ifdef W3_S + USE W3SERVMD, ONLY: STRACE +#endif + use netcdf + IMPLICIT NONE + + CHARACTER, INTENT(IN) :: INXOUT*(*) + INTEGER, INTENT(IN) :: NDSOP + INTEGER, INTENT(OUT) :: IOTST + INTEGER, INTENT(IN), OPTIONAL :: IMOD + + CHARACTER(LEN=15) :: TIMETAG + INTEGER :: IGRD + character(len = 124) :: filename + integer :: ncerr + +#ifdef W3_S + CALL STRACE (IENT, 'W3IOPON') +#endif + + ! IPASS essentially is the time variable dimension + IPASS = IPASS + 1 + + ! Optimistically assume success. + IOTST = 0 + + ! Has a model number been specified? + IF (PRESENT(IMOD)) THEN + IGRD = IMOD + ELSE + IGRD = 1 + END IF + + CALL W3SETO(IGRD, NDSE, NDST) + CALL W3SETG(IGRD, NDSE, NDST) + CALL W3SETW(IGRD, NDSE, NDST) + + ! INXOUT must be 'READ' or 'WRITE'. + IF (INXOUT .NE. 'READ' .AND. INXOUT .NE. 'WRITE') THEN + WRITE (NDSE, 900) INXOUT + CALL EXTCDE(1) + END IF + + ! Determine filename. + IF ( OFILES(2) .EQ. 1 ) THEN + ! Create TIMETAG for file name using YYYYMMDD.HHMMS prefix + WRITE(TIMETAG,"(i8.8,'.'i6.6)")TIME(1),TIME(2) + filename = FNMPRE(:LEN_TRIM(FNMPRE))//TIMETAG//'.out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc' + ELSE + filename = FNMPRE(:LEN_TRIM(FNMPRE))//'out_pnt.'//FILEXT(:LEN_TRIM(FILEXT))//'.nc' + END IF + + ! Do a read or a write of the point file. + IF (INXOUT .EQ. 'READ') THEN + CALL W3IOPON_READ(IOTST, IMOD, filename, ncerr) + ELSE + CALL W3IOPON_WRITE(OFILES(2), filename, ncerr) + ENDIF + if (nf90_err(ncerr) .ne. 0) then + WRITE(NDSE,*) ' *** WAVEWATCH III ERROR IN W3IOPO :' + WRITE(NDSE,*) 'Nonzero return at end of W3IOPON' + WRITE(NDSE,*) 'Error: ', trim(nf90_strerror(ncerr)) + CALL EXTCDE(21) + endif + + !/ + !/ End of W3IOPON ----------------------------------------------------- / + !/ + +900 FORMAT (/' *** WAVEWATCH III ERROR IN W3IOPO :'/ & + ' ILEGAL INXOUT VALUE: ',A/) + END SUBROUTINE W3IOPON +#endif + !/ ------------------------------------------------------------------- / !> Read or write point output. !> !> This subroutine can either read or write the point output file, @@ -1045,12 +2000,12 @@ END SUBROUTINE W3IOPE !> -------------|------|----------|-------- !> 40 | character*40 | IDTST | ID string !> 4 | integer | VERTST | Model definition file version number - !> 4 | integer | NK | Dimension of frequency - !> 4 | integer | MTH | Directionality of the frequency + !> 4 | integer | NK | Number of discrete wavenumbers + !> 4 | integer | NTH | Number of discrete directions. !> 4 | integer | NOPTS | Number of output points. - !> 8*NOPTS | integer(2,NOPTS) | PTLOC | Point locations + !> 8*NOPTS | real(2,NOPTS) | PTLOC | Point locations !> 7*NOPTS | character*7 | PTNME | Point names - !> 8 | integer(2) | TIME | Time + !> 8 | integer(2) | TIME | Valid time !> reclen*NOPTS | * | * | records !> !> Each record contains: @@ -1088,7 +2043,9 @@ END SUBROUTINE W3IOPE !> !> @param[in] INXOUT String indicating read/write. Must be 'READ' or !> 'WRITE'. - !> @param[in] NDSOP File unit number. + !> @param[in] NDSOP This is set by this subroutine to the netCDF + !> file ID (ncid) of the opened file. User does not have to + !> initialize this value, and should not change it. !> @param[out] IOTST Error code: !> - 0 No error. !> - -1 Unexpected end of file when reading. @@ -1254,7 +2211,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD & CALL EXTCDE ( 1 ) END IF ! - ! IF ( IPASS.EQ.1 ) THEN + ! First pass to this file and we are only writing 1 file for all time IF ( IPASS.EQ.1 .AND. OFILES(2) .EQ. 0) THEN WRITE = INXOUT.EQ.'WRITE' ELSE @@ -1267,10 +2224,10 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD & ! open file ---------------------------------------------------------- * ! IF ( IPASS.EQ.1 .AND. OFILES(2) .EQ. 0 ) THEN - ! + I = LEN_TRIM(FILEXT) J = LEN_TRIM(FNMPRE) - ! + #ifdef W3_T WRITE (NDST,9001) FNMPRE(:J)//'out_pnt.'//FILEXT(:I) #endif @@ -1389,7 +2346,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD & ! IF ( WRITE ) THEN WRITE (NDSOP) & - IDSTR, VEROPT, NK, NTH, NOPTS + IDSTR, VEROPT, NK, NTH, NOPTS #ifdef W3_ASCII WRITE (NDSOA,*) & 'IDSTR, VEROPT, NK, NTH, NOPTS:', & @@ -1495,7 +2452,7 @@ SUBROUTINE W3IOPO ( INXOUT, NDSOP, IOTST, IMOD & #endif 'ASO(I), CAO(I), CDO(I), ICEO(I), ICEHO(I):', & ASO(I), CAO(I), CDO(I), ICEO(I), ICEHO(I), & - 'ICEFO(I), GRDID(I), (SPCO(J,I),J=1,NSPEC):', & + 'ICEFO(I), GRDID(I), (SPCO(J,I),J=1,NSPEC):', & ICEFO(I), GRDID(I), (SPCO(J,I),J=1,NSPEC) #endif ELSE diff --git a/model/src/w3profsmd_pdlib.F90 b/model/src/w3profsmd_pdlib.F90 index 6759fb53e..140fdc33b 100644 --- a/model/src/w3profsmd_pdlib.F90 +++ b/model/src/w3profsmd_pdlib.F90 @@ -2854,12 +2854,24 @@ SUBROUTINE PDLIB_W3XYPUG_BLOCK_EXPLICIT(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) ! USE W3ODATMD, only: IAPROC USE W3GDATMD, only: B_JGS_USE_JACOBI + USE W3TIMEMD, only: DSEC21 + USE W3ODATMD, only: TBPI0, TBPIN, FLBPI + USE W3WDATMD, only: TIME LOGICAL, INTENT(IN) :: LCALC INTEGER, INTENT(IN) :: IMOD REAL, INTENT(IN) :: FACX, FACY, DTG, VGX, VGY + REAL :: RD1, RD2 + + IF ( FLBPI ) THEN + RD1 = DSEC21 ( TBPI0, TIME ) + RD2 = DSEC21 ( TBPI0, TBPIN ) + ELSE + RD1=1. + RD2=0. + END IF - CALL PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) + CALL PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, RD1, RD2, DTG, VGX, VGY, LCALC) !/ !/ End of W3XYPFSN ----------------------------------------------------- / !/ @@ -6328,7 +6340,7 @@ SUBROUTINE PDLIB_JACOBI_GAUSS_SEIDEL_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCAL #endif END SUBROUTINE PDLIB_JACOBI_GAUSS_SEIDEL_BLOCK !/ ------------------------------------------------------------------- / - SUBROUTINE PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) + SUBROUTINE PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, RD10, RD20, DTG, VGX, VGY, LCALC) !/ !/ +-----------------------------------+ !/ | WAVEWATCH III NOAA/NCEP | @@ -6402,7 +6414,7 @@ SUBROUTINE PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) INTEGER, INTENT(IN) :: IMOD - REAL, INTENT(IN) :: FACX, FACY, DTG, VGX, VGY + REAL, INTENT(IN) :: FACX, FACY, DTG, VGX, VGY, RD10, RD20 REAL :: KTMP(3), UTILDE(NTH), ST(NTH,NPA) REAL :: FL11(NTH), FL12(NTH), FL21(NTH), FL22(NTH), FL31(NTH), FL32(NTH), KKSUM(NTH,NPA) @@ -6411,7 +6423,7 @@ SUBROUTINE PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) REAL :: KSIG(NPA), CGSIG(NPA), CXX(NTH,NPA), CYY(NTH,NPA) REAL :: LAMBDAX(NTH), LAMBDAY(NTH) REAL :: DTMAX(NTH), DTMAXEXP(NTH), DTMAXOUT, DTMAXGL - REAL :: FIN(1), FOUT(1), REST, CFLXY, RD1, RD2, RD10, RD20 + REAL :: FIN(1), FOUT(1), REST, CFLXY, RD1, RD2 REAL :: UOLD(NTH,NPA), U(NTH,NPA) REAL, PARAMETER :: ONESIXTH = 1.0/6.0 @@ -6570,8 +6582,8 @@ SUBROUTINE PDLIB_EXPLICIT_BLOCK(IMOD, FACX, FACY, DTG, VGX, VGY, LCALC) IF ( FLBPI ) THEN DO ITH = 1, NTH ISP = ITH + (IK-1) * NTH - RD1 = RD10 - DTG * REAL(ITER(IK)-IT)/REAL(ITER(IK)) - RD2 = RD20 + RD1=RD10 - DTMAXGL * REAL(ITER(IK)-IT)/REAL(ITER(IK)) + RD2=RD20 IF ( RD2 .GT. 0.001 ) THEN RD2 = MIN(1.,MAX(0.,RD1/RD2)) RD1 = 1. - RD2 diff --git a/model/src/w3sdb1md.F90 b/model/src/w3sdb1md.F90 index 34c7ec3bf..7b4c0ce02 100644 --- a/model/src/w3sdb1md.F90 +++ b/model/src/w3sdb1md.F90 @@ -187,6 +187,7 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) USE W3ODATMD, ONLY: NDST USE W3GDATMD, ONLY: SIG USE W3ODATMD, only : IAPROC + USE W3PARALL, only : THR #ifdef W3_S USE W3SERVMD, ONLY: STRACE #endif @@ -218,7 +219,7 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) INTEGER, SAVE :: IENT = 0 #endif REAL*8 :: HM, BB, ARG, Q0, QB, B, CBJ, HRMS, EB(NK) - REAL*8 :: AUX, CBJ2, RATIO, S0, S1, THR, BR1, BR2, FAK + REAL*8 :: AUX, CBJ2, RATIO, S0, S1, BR1, BR2, FAK REAL :: ETOT, FMEAN2 #ifdef W3_T0 REAL :: DOUT(NK,NTH) @@ -231,12 +232,9 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) #endif ! ! 0. Initialzations ------------------------------------------------- / - ! Never touch this 4 lines below ... otherwise my exceptionhandling will not work. - S = 0. - D = 0. - - THR = DBLE(1.E-15) - IF (SUM(A) .LT. THR) RETURN + IF (EMEAN .LT. TINY(1.d0)) THEN + RETURN + ENDIF IWB = 1 ! diff --git a/model/src/w3sic4md.F90 b/model/src/w3sic4md.F90 index 3cc7da357..c6daacb20 100644 --- a/model/src/w3sic4md.F90 +++ b/model/src/w3sic4md.F90 @@ -89,6 +89,7 @@ MODULE W3SIC4MD ! *** Rogers et al. tech. rep. 2021 (RYW2021) ! *** Yu et al. CRST 2022 ! *** Yu JMSE 2022 + ! *** Meylan et al. Ocean Modeling 2021 ! ! 6. Switches : ! @@ -138,6 +139,7 @@ SUBROUTINE W3SIC4 (A, DEPTH, CG, IX, IY, S, D) !/ 11-Jan-2024 : Method 8 added (Meylan et al. 2018) (E. Rogers) !/ 11-Jan-2024 : Method 9 added (Rogers et al., 2021) !/ denoted "RYW2021" (E. Rogers) + !/ 14-Aug-2024 : Method 10 added (Meylan et al. 2021) (E. Thomas) !/ !/ FIXME : Move field input to W3SRCE and provide !/ (S.Zieger) input parameter to W3SIC1 to make the subroutine @@ -307,6 +309,8 @@ SUBROUTINE W3SIC4 (A, DEPTH, CG, IX, IY, S, D) ! suggested default is marked with "(*SD*)", for consistency ! with SWAN (v41.31AB or later) ! + ! 10) Meylan et al. 2021 (Ocean Modeling): ocean-wave attenuation + ! due to scattering by sea ice floes. ! ------------------------------------------------------------------ ! ! For all methods, the user can specify namelist @@ -450,6 +454,8 @@ SUBROUTINE W3SIC4 (A, DEPTH, CG, IX, IY, S, D) REAL, ALLOCATABLE :: FREQ(:) ! wave frequency REAL, ALLOCATABLE :: MARG1(:), MARG2(:) ! Arguments for M2 REAL, ALLOCATABLE :: KARG1(:), KARG2(:), KARG3(:) !Arguments for M3 + REAL :: x1,x2,x3,x1sqr,x2sqr,x3sqr !Arguments for M10 + REAL :: perfour,amhb,bmhb !Arguments for M10 LOGICAL :: NML_INPUT ! if using namelist input for M2 !/ @@ -699,6 +705,43 @@ SUBROUTINE W3SIC4 (A, DEPTH, CG, IX, IY, S, D) DO IK=1,NK WN_I(IK) = Chf*(hice**mpow)*(FREQ(IK)**npow) END DO + + CASE (10) + ! Cubic fit to Meylan, Horvat & Bitz 2021 + ! ICECOEF1 is thickness + ! ICECOEF5 is floe size + ! TPI/SIG is period + x3=min(ICECOEF1,3.5) ! limit thickness to 3.5 m + x3=max(x3,0.1) ! limit thickness >0.1 m since I make fit below + x2=min(ICECOEF5*0.5,100.0) ! convert dia to radius, limit to 100m + x2=max(2.5,x2) + x2sqr=x2*x2 + x3sqr=x3*x3 + amhb = 2.12e-3 + bmhb = 4.59e-2 + + DO IK=1, NK + x1=TPI/SIG(IK) ! period + x1sqr=x1*x1 + KARG1(ik)=-0.26982 + 1.5043*x3 - 0.70112*x3sqr + 0.011037*x2 + & + (-0.0073178)*x2*x3 + 0.00036604*x2*x3sqr + & + (-0.00045789)*x2sqr + 1.8034e-05*x2sqr*x3 + & + (-0.7246)*x1 + 0.12068*x1*x3 + & + (-0.0051311)*x1*x3sqr + 0.0059241*x1*x2 + & + 0.00010771*x1*x2*x3 - 1.0171e-05*x1*x2sqr + & + 0.0035412*x1sqr - 0.0031893*x1sqr*x3 + & + (-0.00010791)*x1sqr*x2 + & + 0.00031073*x1**3 + 1.5996e-06*x2**3 + 0.090994*x3**3 + KARG1(IK)=min(KARG1(IK),0.0) + ALPHA(IK) = 10.0**KARG1(IK) + perfour=x1sqr*x1sqr + if ((x1.gt.5.0) .and. (x1.lt.20.0)) then + ALPHA(IK) = ALPHA(IK) + amhb/x1sqr+bmhb/perfour + else if (x1.gt.20.0) then + ALPHA(IK) = amhb/x1sqr+bmhb/perfour + endif + WN_I(IK) = ALPHA(IK) * 0.5 + end do CASE DEFAULT WN_I = ICECOEF1 !Default to IC1: Uniform in k diff --git a/model/src/w3srcemd.F90 b/model/src/w3srcemd.F90 index e90ba88eb..eeb2a95a1 100644 --- a/model/src/w3srcemd.F90 +++ b/model/src/w3srcemd.F90 @@ -1,4 +1,4 @@ -!> @file + !> @brief Source term integration routine. !> !> @author H. L. Tolman @@ -1244,7 +1244,7 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & IF (.NOT. FSSOURCE .or. LSLOC) THEN #endif #ifdef W3_TR1 - CALL W3STR1 ( SPEC, SPECOLD, CG1, WN1, DEPTH, IX, VSTR, VDTR ) + CALL W3STR1 ( SPEC, CG1, WN1, DEPTH, IX, VSTR, VDTR ) #endif #ifdef W3_PDLIB ENDIF @@ -1534,8 +1534,13 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & DVS = SIGN(MIN(MAXDAC,ABS(DVS)),DVS) ENDIF PreVS = DVS / FAKS - eVS = PreVS / CG1(IK) * CLATSL - eVD = MIN(0.,VD(ISP)) + IF (IOBP_LOC(JSEA) .EQ. 3) THEN + eVS = 0 + eVD = 0 + ELSE + eVS = PreVS / CG1(IK) * CLATSL + eVD = MIN(0.,VD(ISP)) + ENDIF B_JAC(ISP,JSEA) = B_JAC(ISP,JSEA) + SIDT * (eVS - eVD*SPEC(ISP)*JAC) ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) = ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) - SIDT * eVD #ifdef W3_DB1 @@ -1548,9 +1553,9 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & evS = -evS evD = 2*evD ENDIF -#endif B_JAC(ISP,JSEA) = B_JAC(ISP,JSEA) + SIDT * eVS ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) = ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) - SIDT * eVD +#endif #ifdef W3_TR1 eVS = VSTR(ISP) * JAC @@ -1562,9 +1567,9 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & evS = -evS evD = 2*evD ENDIF -#endif B_JAC(ISP,JSEA) = B_JAC(ISP,JSEA) + SIDT * eVS ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) = ASPAR_JAC(ISP,PDLIB_I_DIAG(JSEA)) - SIDT * eVD +#endif END DO END DO diff --git a/model/src/w3str1md.F90 b/model/src/w3str1md.F90 index d8067abd7..ce14b6b36 100644 --- a/model/src/w3str1md.F90 +++ b/model/src/w3str1md.F90 @@ -180,7 +180,7 @@ MODULE W3STR1MD !> !> @author A. J. van der Westhuysen @date 13-Jan-2013 !> - SUBROUTINE W3STR1 (A, AOLD, CG, WN, DEPTH, IX, S, D) + SUBROUTINE W3STR1 (A, CG, WN, DEPTH, IX, S, D) !/ !/ +-----------------------------------+ !/ | WAVEWATCH III NOAA/NCEP | @@ -259,7 +259,6 @@ SUBROUTINE W3STR1 (A, AOLD, CG, WN, DEPTH, IX, S, D) ! CG R.A. I Group velocities. ! WN R.A. I Wavenumbers. ! DEPTH Real I Mean water depth. - ! EMEAN Real I Mean wave energy. ! FMEAN Real I Mean wave frequency. ! S R.A. O Source term (1-D version). ! D R.A. O Diagonal term of derivative (1-D version). @@ -320,7 +319,7 @@ SUBROUTINE W3STR1 (A, AOLD, CG, WN, DEPTH, IX, S, D) !/ ------------------------------------------------------------------- / !/ Parameter list !/ - REAL, INTENT(IN) :: CG(NK), WN(NK), DEPTH, A(NSPEC), AOLD(NSPEC) + REAL, INTENT(IN) :: CG(NK), WN(NK), DEPTH, A(NSPEC) INTEGER, INTENT(IN) :: IX REAL, INTENT(OUT) :: S(NSPEC), D(NSPEC) !/ @@ -391,11 +390,13 @@ SUBROUTINE W3STR1 (A, AOLD, CG, WN, DEPTH, IX, S, D) #ifdef W3_S CALL STRACE (IENT, 'W3STR1') #endif - -!AR: todo: check all PRX routines for differences, check original thesis of elderberky. ! ! 1. Integral over directions ! + IF (MAXVAL(A) .LT. TINY(1.)) THEN + RETURN + ENDIF + SIGM01 = 0. EMEAN = 0. JACEPS = 1E-12 diff --git a/model/src/w3triamd.F90 b/model/src/w3triamd.F90 index 9fac503b6..f2118ec24 100644 --- a/model/src/w3triamd.F90 +++ b/model/src/w3triamd.F90 @@ -1697,7 +1697,7 @@ SUBROUTINE IS_IN_UNGRID(IMOD, XTIN, YTIN, ITOUT, IS, JS, RW) ! 10. Source code : ! !/ ------------------------------------------------------------------- / - USE W3GDATMD + USE W3GDATMD, ONLY: GRIDS USE W3SERVMD, ONLY: EXTCDE #ifdef W3_S USE W3SERVMD, ONLY: STRACE @@ -1716,7 +1716,7 @@ SUBROUTINE IS_IN_UNGRID(IMOD, XTIN, YTIN, ITOUT, IS, JS, RW) !/ ------------------------------------------------------------------- / !local parameters - DOUBLE PRECISION :: x1, x2, x3 + DOUBLE PRECISION :: x1, x2, x3, XTINmod, xavg DOUBLE PRECISION :: y1, y2, y3 DOUBLE PRECISION :: s1, s2, s3, sg1, sg2, sg3 REAL*8 :: PT(3,2) @@ -1748,19 +1748,26 @@ SUBROUTINE IS_IN_UNGRID(IMOD, XTIN, YTIN, ITOUT, IS, JS, RW) !coordinates of the 3rd vertex C x3 = PT(3,1) y3 = PT(3,2) - !with M = (XTIN,YTIN) the target point ... + !ensure XTIN is defined with same coordinates as element + xavg=(x1+x2+x3)/3 + IF (ABS(XTIN-xavg).GT.180) THEN + XTINmod=XTIN-SIGN(360.0d0,(XTIN-xavg)) + ELSE + XTINmod=XTIN + END IF + !with M = (XTINmod,YTIN) the target point ... !vector product of AB and AC sg3=(y3-y1)*(x2-x1)-(x3-x1)*(y2-y1) !vector product of AB and AM - s3=(YTIN-y1)*(x2-x1)-(XTIN-x1)*(y2-y1) + s3=(YTIN-y1)*(x2-x1)-(XTINmod-x1)*(y2-y1) !vector product of BC and BA sg1=(y1-y2)*(x3-x2)-(x1-x2)*(y3-y2) !vector product of BC and BM - s1=(YTIN-y2)*(x3-x2)-(XTIN-x2)*(y3-y2) + s1=(YTIN-y2)*(x3-x2)-(XTINmod-x2)*(y3-y2) !vector product of CA and CB sg2=(y2-y3)*(x1-x3)-(x2-x3)*(y1-y3) !vector product of CA and CM - s2=(YTIN-y3)*(x1-x3)-(XTIN-x3)*(y1-y3) + s2=(YTIN-y3)*(x1-x3)-(XTINmod-x3)*(y1-y3) IF ((s1*sg1.GE.0).AND.(s2*sg2.GE.0).AND.(s3*sg3.GE.0)) THEN itout=ITRI nbFound=nbFound+1 diff --git a/model/src/w3wavemd.F90 b/model/src/w3wavemd.F90 index c144ab8d8..19beb5225 100644 --- a/model/src/w3wavemd.F90 +++ b/model/src/w3wavemd.F90 @@ -1453,6 +1453,12 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & call print_memcheck(memunit, 'memcheck_____:'//' WW3_WAVE TIME LOOP 13') ! #ifdef W3_PDLIB + + IF (LPDLIB .and. .not. FLSOU .and. .not. FSSOURCE) THEN + B_JAC = 0. + ASPAR_JAC = 0. + ENDIF + IF (LPDLIB .and. FLSOU .and. FSSOURCE) THEN #endif @@ -1484,78 +1490,81 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & CALL INIT_GET_ISEA(ISEA, JSEA) - IX = MAPSF(ISEA,1) - IY = MAPSF(ISEA,2) - DELA=1. - DELX=1. - DELY=1. + IF ((IOBP_LOC(JSEA).eq.1..or.IOBP_LOC(JSEA).eq. 3).and.IOBDP_LOC(JSEA).eq.1.and.IOBPA_LOC(JSEA).eq.0) THEN + + IX = MAPSF(ISEA,1) + IY = MAPSF(ISEA,2) + DELA=1. + DELX=1. + DELY=1. #ifdef W3_REF1 - IF (GTYPE.EQ.RLGTYPE) THEN - DELX=SX*CLATS(ISEA)/FACX - DELY=SY/FACX - DELA=DELX*DELY - END IF - IF (GTYPE.EQ.CLGTYPE) THEN - ! Maybe what follows works also for RLGTYPE ... to be verified - DELX=HPFAC(IY,IX)/ FACX - DELY=HQFAC(IY,IX)/ FACX - DELA=DELX*DELY - END IF - REFLEC=REFLC(:,ISEA) - REFLEC(4)=BERG(ISEA)*REFLEC(4) - REFLED=REFLD(:,ISEA) + IF (GTYPE.EQ.RLGTYPE) THEN + DELX=SX*CLATS(ISEA)/FACX + DELY=SY/FACX + DELA=DELX*DELY + END IF + IF (GTYPE.EQ.CLGTYPE) THEN + ! Maybe what follows works also for RLGTYPE ... to be verified + DELX=HPFAC(IY,IX)/ FACX + DELY=HQFAC(IY,IX)/ FACX + DELA=DELX*DELY + END IF + REFLEC=REFLC(:,ISEA) + REFLEC(4)=BERG(ISEA)*REFLEC(4) + REFLED=REFLD(:,ISEA) #endif #ifdef W3_BT4 - D50=SED_D50(ISEA) - PSIC=SED_PSIC(ISEA) + D50=SED_D50(ISEA) + PSIC=SED_PSIC(ISEA) #endif - ! + ! #ifdef W3_DEBUGSRC - IF (IX .eq. DEBUG_NODE) THEN - WRITE(740+IAPROC,*) 'NODE_SRCE_IMP_PRE : IX=', IX, ' JSEA=', JSEA - END IF - WRITE(740+IAPROC,*) 'IT/IX/IY/IMOD=', IT, IX, IY, IMOD - WRITE(740+IAPROC,*) 'ISEA/JSEA=', ISEA, JSEA - WRITE(740+IAPROC,*) 'Before sum(VA)=', sum(VA(:,JSEA)) - FLUSH(740+IAPROC) -#endif - CALL W3SRCE(srce_imp_pre, IT, ISEA, JSEA, IX, IY, IMOD, & - VAold(:,JSEA), VA(:,JSEA), & - VSioDummy, VDioDummy, SHAVETOT(JSEA), & - ALPHA(1:NK,JSEA), WN(1:NK,ISEA), & - CG(1:NK,ISEA), CLATS(ISEA), DW(ISEA), U10(ISEA), & - U10D(ISEA), & + IF (IX .eq. DEBUG_NODE) THEN + WRITE(740+IAPROC,*) 'NODE_SRCE_IMP_PRE : IX=', IX, ' JSEA=', JSEA + END IF + WRITE(740+IAPROC,*) 'IT/IX/IY/IMOD=', IT, IX, IY, IMOD + WRITE(740+IAPROC,*) 'ISEA/JSEA=', ISEA, JSEA + WRITE(740+IAPROC,*) 'Before sum(VA)=', sum(VA(:,JSEA)) + FLUSH(740+IAPROC) +#endif + CALL W3SRCE(srce_imp_pre, IT, ISEA, JSEA, IX, IY, IMOD, & + VAold(:,JSEA), VA(:,JSEA), & + VSioDummy, VDioDummy, SHAVETOT(JSEA), & + ALPHA(1:NK,JSEA), WN(1:NK,ISEA), & + CG(1:NK,ISEA), CLATS(ISEA), DW(ISEA), U10(ISEA), & + U10D(ISEA), & #ifdef W3_FLX5 - TAUA(ISEA), TAUADIR(ISEA), & -#endif - AS(ISEA), UST(ISEA), & - USTDIR(ISEA), CX(ISEA), CY(ISEA), & - ICE(ISEA), ICEH(ISEA), ICEF(ISEA), & - ICEDMAX(ISEA), & - REFLEC, REFLED, DELX, DELY, DELA, & - TRNX(IY,IX), TRNY(IY,IX), BERG(ISEA), & - FPIS(ISEA), DTDYN(JSEA), & - FCUT(JSEA), DTGpre, TAUWX(JSEA), TAUWY(JSEA), & - TAUOX(JSEA), TAUOY(JSEA), TAUWIX(JSEA), & - TAUWIY(JSEA), TAUWNX(JSEA), & - TAUWNY(JSEA), PHIAW(JSEA), CHARN(JSEA), & - TWS(JSEA), PHIOC(JSEA), TMP1, D50, PSIC, TMP2, & - PHIBBL(JSEA), TMP3, TMP4, PHICE(JSEA), & - TAUOCX(JSEA), TAUOCY(JSEA), WNMEAN(JSEA), & - RHOAIR(ISEA), ASF(ISEA)) - IF (.not. LSLOC) THEN - VSTOT(:,JSEA) = VSioDummy - VDTOT(:,JSEA) = VDioDummy - ENDIF + TAUA(ISEA), TAUADIR(ISEA), & +#endif + AS(ISEA), UST(ISEA), & + USTDIR(ISEA), CX(ISEA), CY(ISEA), & + ICE(ISEA), ICEH(ISEA), ICEF(ISEA), & + ICEDMAX(ISEA), & + REFLEC, REFLED, DELX, DELY, DELA, & + TRNX(IY,IX), TRNY(IY,IX), BERG(ISEA), & + FPIS(ISEA), DTDYN(JSEA), & + FCUT(JSEA), DTGpre, TAUWX(JSEA), TAUWY(JSEA), & + TAUOX(JSEA), TAUOY(JSEA), TAUWIX(JSEA), & + TAUWIY(JSEA), TAUWNX(JSEA), & + TAUWNY(JSEA), PHIAW(JSEA), CHARN(JSEA), & + TWS(JSEA), PHIOC(JSEA), TMP1, D50, PSIC, TMP2, & + PHIBBL(JSEA), TMP3, TMP4, PHICE(JSEA), & + TAUOCX(JSEA), TAUOCY(JSEA), WNMEAN(JSEA), & + RHOAIR(ISEA), ASF(ISEA)) + IF (.not. LSLOC) THEN + VSTOT(:,JSEA) = VSioDummy + VDTOT(:,JSEA) = VDioDummy + ENDIF #ifdef W3_DEBUGSRC - WRITE(740+IAPROC,*) 'After sum(VA)=', sum(VA(:,JSEA)) - WRITE(740+IAPROC,*) ' sum(VSTOT)=', sum(VSTOT(:,JSEA)) - WRITE(740+IAPROC,*) ' sum(VDTOT)=', sum(VDTOT(:,JSEA)) - WRITE(740+IAPROC,*) ' SHAVETOT=', SHAVETOT(JSEA) - FLUSH(740+IAPROC) + WRITE(740+IAPROC,*) 'After sum(VA)=', sum(VA(:,JSEA)) + WRITE(740+IAPROC,*) ' sum(VSTOT)=', sum(VSTOT(:,JSEA)) + WRITE(740+IAPROC,*) ' sum(VDTOT)=', sum(VDTOT(:,JSEA)) + WRITE(740+IAPROC,*) ' SHAVETOT=', SHAVETOT(JSEA) + FLUSH(740+IAPROC) #endif + ENDIF END DO ! JSEA END IF ! PDLIB #endif @@ -2158,6 +2167,7 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & ! DO JSEA=1, NSEAL CALL INIT_GET_ISEA(ISEA, JSEA) + IX = MAPSF(ISEA,1) IY = MAPSF(ISEA,2) DELA=1. @@ -2601,12 +2611,16 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & ! Gets the necessary spectral data ! CALL W3IOPE ( VA ) - CALL W3IOPO ( 'WRITE', NDS(8), ITEST, IMOD & +#ifdef W3_BIN2NC + CALL W3IOPON ( 'WRITE', NDS(8), ITEST, IMOD ) +#else + CALL W3IOPO ( 'WRITE', NDS(8), ITEST, IMOD & #ifdef W3_ASCII ,NDS(15) & #endif ) - END IF +#endif + END IF ! ELSE IF ( J .EQ. 3 ) THEN ! diff --git a/model/src/wmiopomd.F90 b/model/src/wmiopomd.F90 index 73e036535..1737e04bb 100644 --- a/model/src/wmiopomd.F90 +++ b/model/src/wmiopomd.F90 @@ -500,7 +500,7 @@ SUBROUTINE WMIOPP ( NPT, XPT, YPT, PNAMES ) #endif ! #ifdef W3_SHRD - CALL W3IOPP ( MDATAS(J)%NRUPTS, XP, YP, PN, J ) + CALL W3IOPP ( MDATAS(J)%NRUPTS, XP, YP, PN, J, 1) #endif ! ! 3.d.2 Distributed memory version @@ -535,7 +535,7 @@ SUBROUTINE WMIOPP ( NPT, XPT, YPT, PNAMES ) #endif ! #ifdef W3_MPI - CALL W3IOPP ( MDATAS(J)%NRUPTS, XP, YP, PN, J ) + CALL W3IOPP ( MDATAS(J)%NRUPTS, XP, YP, PN, J, MPI_COMM_MWAVE) #endif ! #ifdef W3_MPI @@ -714,8 +714,7 @@ SUBROUTINE WMIOPO ( TOUT ) USE W3ODATMD, ONLY: W3SETO USE WMMDATMD, ONLY: WMSETM USE W3CSPCMD, ONLY: W3CSPC - USE W3IOPOMD, ONLY: W3IOPO - ! + USE W3IOPOMD USE W3GDATMD, ONLY: NK, NTH, NSPEC, XFR, FR1, TH, SGRDS USE W3WDATMD, ONLY: TIME USE W3ODATMD, ONLY: IAPROC, NAPROC, NAPPNT, NOPTS, SPCO, DPO, & @@ -1176,11 +1175,15 @@ SUBROUTINE WMIOPO ( TOUT ) ! TIME = TOUT ! +#ifdef W3_BIN2NC + CALL W3IOPON ( 'WRITE', MDSUP, II, 0) +#else CALL W3IOPO ( 'WRITE', MDSUP, II, 0 & #ifdef W3_ASCII - ,MDSUPA & + ,MDSUPA & #endif ) +#endif ! RETURN ! diff --git a/model/src/ww3_ounp.F90 b/model/src/ww3_ounp.F90 index c35ff6e98..a1533c73b 100644 --- a/model/src/ww3_ounp.F90 +++ b/model/src/ww3_ounp.F90 @@ -184,7 +184,7 @@ PROGRAM W3OUNP USE W3ODATMD, ONLY: W3SETO, W3NOUT USE W3ODATMD, ONLY: IAPROC, NAPROC, NAPERR, NAPOUT, DIMP USE W3IOGRMD, ONLY: W3IOGR - USE W3IOPOMD, ONLY: W3IOPO + USE W3IOPOMD USE W3SERVMD, ONLY : ITRACE, NEXTLN, EXTCDE, STRSPLIT #ifdef W3_S USE W3SERVMD, ONLY : STRACE @@ -387,7 +387,11 @@ PROGRAM W3OUNP !--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 3. Read general data and first fields from file ! +#if W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif ! IF ( IAPROC .EQ. NAPOUT ) WRITE (NDSO,930) DO I=1, NOPTS @@ -604,7 +608,11 @@ PROGRAM W3OUNP DO WHILE (DTEST.NE.0) DTEST = DSEC21 ( TIME , TOUT ) IF ( DTEST .GT. 0. ) THEN +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN IF ( IAPROC .EQ. NAPOUT ) WRITE (NDSO,949) GOTO 888 @@ -1070,7 +1078,11 @@ PROGRAM W3OUNP DTEST = DSEC21 ( TIME , TOUT ) IF ( DTEST .GT. 0. ) THEN ! reads TIME from out_pnt.ww3 +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN IF ( IAPROC .EQ. NAPOUT ) WRITE (NDSO,949) GOTO 700 @@ -1215,7 +1227,11 @@ PROGRAM W3OUNP ! 7.3 Reinitiazes TIME (close open out_pnt.ww3) and TOUT to process a new bunch of stations CLOSE(NDSOP) ! closes binary file out_pnt* IPASS = 0 ! resets time counter for binary file out_pnt* +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif #ifdef W3_T WRITE(NDSE,*) 'out_pnt* closed and reopened' #endif @@ -1228,7 +1244,11 @@ PROGRAM W3OUNP DO WHILE (DTEST.NE.0) DTEST = DSEC21 ( TIME , TOUT ) IF ( DTEST .GT. 0. ) THEN +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN IF ( IAPROC .EQ. NAPOUT ) WRITE (NDSO,949) GOTO 700 diff --git a/model/src/ww3_outp.F90 b/model/src/ww3_outp.F90 index 6d750687a..d793783ca 100644 --- a/model/src/ww3_outp.F90 +++ b/model/src/ww3_outp.F90 @@ -208,13 +208,16 @@ PROGRAM W3OUTP #endif USE W3ODATMD, ONLY: W3SETO, W3NOUT USE W3IOGRMD, ONLY: W3IOGR +#ifdef W3_BIN2NC + USE W3IOPOMD, ONLY: W3IOPON, W3IOPON_READ, W3IOPON_WRITE +#else USE W3IOPOMD, ONLY: W3IOPO +#endif USE W3SERVMD, ONLY : ITRACE, NEXTLN, EXTCDE #ifdef W3_S USE W3SERVMD, ONLY : STRACE #endif USE W3TIMEMD, ONLY: STME21, TICK21, DSEC21 - !/ USE W3GDATMD USE W3WDATMD, ONLY: TIME USE W3ODATMD, ONLY: NDSE, NDST, NDSO, NOPTS, PTLOC, PTNME, & @@ -359,7 +362,11 @@ PROGRAM W3OUTP !--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 3. Read general data and first fields from file ! +#if W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif ! WRITE (NDSO,930) DO I=1, NOPTS @@ -457,7 +464,11 @@ PROGRAM W3OUTP DO CALL STME21 ( TIME , IDTIME ) WRITE (NDSO,948) IDTIME +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN WRITE (NDSO,949) GOTO 888 @@ -777,7 +788,11 @@ PROGRAM W3OUTP DO DTEST = DSEC21 ( TIME , TOUT ) IF ( DTEST .GT. 0. ) THEN +#ifdef W3_BIN2NC + CALL W3IOPON ( 'READ', NDSOP, IOTEST ) +#else CALL W3IOPO ( 'READ', NDSOP, IOTEST ) +#endif IF ( IOTEST .EQ. -1 ) THEN WRITE (NDSO,949) EXIT diff --git a/regtests/bin/matrix.base b/regtests/bin/matrix.base index 819ea0101..4b7e1e71a 100755 --- a/regtests/bin/matrix.base +++ b/regtests/bin/matrix.base @@ -180,6 +180,7 @@ if [ "$prop2D" = 'y' ] then echo ' ' >> matrix.body + echo "$rtst -s PR1_MPI_BIN2NC -w work_PR1_MPI_BIN2NC -f -p $mpi -n $np $ww3 ww3_tp2.2" >> matrix.body echo "$rtst -s PR1_MPI -w work_PR1_MPI -f -p $mpi -n $np $ww3 ww3_tp2.1" >> matrix.body echo "$rtst -s PR1_MPI -w work_PR1_MPI -f -p $mpi -n $np $ww3 ww3_tp2.2" >> matrix.body echo "$rtst -s PR1_MPI -w work_PR1_MPI -f -p $mpi -n $np $ww3 ww3_tp2.3" >> matrix.body @@ -1956,6 +1957,7 @@ echo "$rtst -w work_IC4_M7 -i input_IC4_M7 $ww3 ww3_tic1.1" >> matrix.body echo "$rtst -w work_IC4_M8 -i input_IC4_M8 $ww3 ww3_tic1.1" >> matrix.body echo "$rtst -w work_IC4_M9 -i input_IC4_M9 $ww3 ww3_tic1.1" >> matrix.body + echo "$rtst -w work_IC4_M10 -i input_IC4_M10 $ww3 ww3_tic1.1" >> matrix.body echo "$rtst -g 1000m -w work_IC5_M1 -i input_IC5_M1 $ww3 ww3_tic1.1" >> matrix.body echo "$rtst -g 1000m -w work_IC5_M2 -i input_IC5_M2 $ww3 ww3_tic1.1" >> matrix.body echo "$rtst -g 1000m -w work_IC5_M3 -i input_IC5_M3 $ww3 ww3_tic1.1" >> matrix.body diff --git a/regtests/bin/matrix_cmake_ncep b/regtests/bin/matrix_cmake_ncep index 2eafd8986..1fa1a2d6f 100755 --- a/regtests/bin/matrix_cmake_ncep +++ b/regtests/bin/matrix_cmake_ncep @@ -22,11 +22,11 @@ usage () { cat 2>&1 << EOF - Usage: $myname model_dir compiler + Usage: $myname model_dir compiler Required: model_dir : path to model dir of WW3 source - Optional: - compiler : intel (default) or gnu + Optional: + compiler : intel (default) or gnu EOF } @@ -36,16 +36,16 @@ EOF main_dir="$1" ; shift if [ ! $# = 0 ] then - compiler="$1"; shift - else + compiler="$1"; shift + else compiler='intel' - fi + fi else usage exit 1 fi - - + + # Convert main_dir to absolute path main_dir="`cd $main_dir 1>/dev/null 2>&1 && pwd`" @@ -60,51 +60,51 @@ EOF modbacio='bacio/2.4.1' modg2='g2/3.4.5' modw3emc='w3emc/2.10.0' - modesmf='esmf/8.5.0' + modesmf='esmf/8.6.0' modscotch='scotch/7.0.4' # Set batchq queue, choose modules and other custom variables to fit system and # to define headers etc (default to original version if empty) ishera=`hostname | grep hfe` - isorion=`hostname | grep Orion` + isorion=`hostname | grep orion` ishercules=`hostname | grep hercules` if [ $ishera ] then batchq='slurm' if [ $compiler = "intel" ] - then + then spackstackpath='/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.6.0/envs/unified-env-rocky8/install/modulefiles/Core' modcomp='stack-intel/2021.5.0' modmpi='stack-intel-oneapi-mpi/2021.5.1' metispath='/scratch1/NCEPDEV/climate/Matthew.Masarik/waves/opt/hera/intel/spack-stack/1.6.0/parmetis-4.0.3/install' modcmake='cmake/3.23.1' elif [ $compiler = "gnu" ] - then + then spackstackpath='/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.6.0/envs/unified-env-rocky8/install/modulefiles/Core' modcomp='stack-gcc/9.2.0' modmpi='stack-openmpi/4.1.5' metispath='/scratch1/NCEPDEV/climate/Matthew.Masarik/waves/opt/hera/gnu/spack-stack/1.6.0/parmetis-4.0.3/install' modcmake='cmake/3.23.1' - else - echo "Compiler $compiler not supported on hera" - exit 1 - fi + else + echo "Compiler $compiler not supported on hera" + exit 1 + fi elif [ $isorion ] then if [ $compiler = "intel" ] then batchq='slurm' - spackstackpath='/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core' - modcomp='stack-intel/2022.0.2' - modmpi='stack-intel-oneapi-mpi/2021.5.1' + spackstackpath='/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.6.0/envs/unified-env-rocky9/install/modulefiles/Core' + modcomp='stack-intel/2021.9.0' + modmpi='stack-intel-oneapi-mpi/2021.9.0' metispath='/work/noaa/marine/Matthew.Masarik/waves/opt/orion/intel/spack-stack/1.6.0/parmetis-4.0.3/install' modcmake='cmake/3.23.1' else - echo "Compiler $compiler not supported on orion" + echo "Compiler $compiler not supported on orion" exit 1 - fi - elif [ $ishercules ] - then + fi + elif [ $ishercules ] + then batchq='slurm' if [ $compiler = "intel" ] then @@ -114,7 +114,7 @@ EOF metispath='/work/noaa/marine/Matthew.Masarik/waves/opt/hercules/intel/spack-stack/1.6.0/parmetis-4.0.3/install' modcmake='cmake/3.23.1' elif [ $compiler = "gnu" ] - then + then spackstackpath='/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core' spackstackpath2='/work/noaa/epic/role-epic/spack-stack/hercules/modulefiles' modcomp='stack-gcc/12.2.0' @@ -122,7 +122,7 @@ EOF metispath='/work/noaa/marine/Matthew.Masarik/waves/opt/hercules/gnu/spack-stack/1.6.0/parmetis-4.0.3/install' modcmake='cmake/3.23.1' else - echo "Compiler $compiler not supported on hercules" + echo "Compiler $compiler not supported on hercules" exit 1 fi else @@ -195,7 +195,7 @@ EOF echo " module use $spackstackpath" >> matrix.head if [ ! -z $spackstackpath2 ]; then echo " module use $spackstackpath2" >> matrix.head - fi + fi echo " module load $modcomp" >> matrix.head echo " module load $modmpi" >> matrix.head echo " module load $modcmake" >> matrix.head diff --git a/regtests/bin/run_cmake_test b/regtests/bin/run_cmake_test index 07ade5a8b..d7e05497b 100755 --- a/regtests/bin/run_cmake_test +++ b/regtests/bin/run_cmake_test @@ -1358,6 +1358,16 @@ fi done fi +# copy pnt weight files from input to work directory + pntwghtfile=`\ls $path_i/pnt_wght.*.nc 2>/dev/null` + if [ ! -z "$pntwghtfile" ]; then + for pntwghtnc in $pntwghtfile + do + cp $pntwghtnc . + echo "copying $pntwghtnc to $path_w" + done + fi + if [ $multi -ge 1 ] then prog=ww3_multi diff --git a/regtests/unittests/CMakeLists.txt b/regtests/unittests/CMakeLists.txt index 69445bfb7..1d3d81f60 100644 --- a/regtests/unittests/CMakeLists.txt +++ b/regtests/unittests/CMakeLists.txt @@ -24,16 +24,25 @@ endfunction() # Function to build and run a test. function(unit_test name) - add_executable(${name} ${name}.F90) + add_executable(${name} ${name}.F90 ww3_unittest_util.F90) target_link_libraries(${name} PRIVATE ww3_lib) add_test(NAME ${name} COMMAND ${name}) endfunction() +# The binary file mod_def.ww3 is needed for testing. It's created by +# the ww3_grid utility. +#add_custom_target(create_mod_def TEST ../../bin/ww3_grid +# COMMENT "Creating mod_def.ww3 file for testing") + # 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) # Build and run the tests. unit_test(test_io_points_bin) +unit_test(test_io) +unit_test(test_io2) +unit_test(test_io3) +unit_test(test_io_restart_bin) diff --git a/regtests/unittests/test_io.F90 b/regtests/unittests/test_io.F90 new file mode 100644 index 000000000..ebe4e2385 --- /dev/null +++ b/regtests/unittests/test_io.F90 @@ -0,0 +1,117 @@ +! This is a test for model IO for WW3. +! +! Ed Hartnett 10/14/23 +program test_io + 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 + integer :: write_test_file + + print *, 'Testing WW3 netCDF 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 + imod = 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 + + ! Create a point output file needed for this test. + print *, 'Creating point output test file for this test...' + if (write_test_file() .ne. 0) stop 1 + + ! 2. Read model definition file. + CALL W3IOGR('READ', NDSM) + WRITE (NDSO,920) GNAME +920 FORMAT (' Grid name : ',A/) + + ! IF (FLAGLL) THEN + ! M2KM = 1. + ! ELSE + ! M2KM = 1.E-3 + ! END IF + + ! Read the file out_pnt.ww3 from the model/tests/data directory. + print *, 'OK!' + print *, 'Reading the point output test file for this test...' + 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 *, 'initializing some data...' + ipass2 = 0 + do i = 1, nopts + do j = 1, nspec + spco(j, i) = 0.0 + end do + end do + + print *, 'OK!' + print *, 'testing writing the WW3 binary point file in netCDF...' + + ! Write in netCDF. + call w3iopon('WRITE', ndsop, iotest, imod) + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + print *, 'testing reading the WW3 binary point file in netCDF...' + ipass2 = 0 + call w3iopon('READ', ndsop, iotest, imod) + print *, iotest + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + print *, 'OK!' + + print *, 'SUCCESS!' +end program test_io + diff --git a/regtests/unittests/test_io2.F90 b/regtests/unittests/test_io2.F90 new file mode 100644 index 000000000..b7fe5092d --- /dev/null +++ b/regtests/unittests/test_io2.F90 @@ -0,0 +1,123 @@ +! This is a test for model IO for WW3. +! +! Ed Hartnett 10/14/23 +program test_io2 + 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 + integer :: write_test_file + + print *, 'Testing WW3 netCDF point file code some more.' + + ! 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 + imod = 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 + + ! Create a point output file needed for this test. + print *, 'Creating point output test file for this test...' + if (write_test_file() .ne. 0) stop 1 + + ! 2. Read model definition file. + CALL W3IOGR('READ', NDSM) + WRITE (NDSO,920) GNAME +920 FORMAT (' Grid name : ',A/) + + ! IF (FLAGLL) THEN + ! M2KM = 1. + ! ELSE + ! M2KM = 1.E-3 + ! END IF + + ! Read the file out_pnt.ww3 from the model/tests/data directory. + print *, 'OK!' + print *, 'Reading the point output test file for this test...' + 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 *, 'initializing some data...' + ipass2 = 0 + do i = 1, nopts + do j = 1, nspec + spco(j, i) = 0.0 + end do + end do + + print *, 'OK!' + print *, 'testing writing the WW3 binary point file in netCDF...' + + ! Write in netCDF. + ofiles(2) = 1 + call w3iopon('WRITE', ndsop, iotest, imod) + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + ! Another timestep in netCDF. + call w3iopon('WRITE', ndsop, iotest, imod) + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + print *, 'testing reading the WW3 binary point file in netCDF...' + ipass2 = 0 + call w3iopon('READ', ndsop, iotest) + print *, iotest + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + print *, 'OK!' + + print *, 'SUCCESS!' +end program test_io2 + diff --git a/regtests/unittests/test_io3.F90 b/regtests/unittests/test_io3.F90 new file mode 100644 index 000000000..b5f65849c --- /dev/null +++ b/regtests/unittests/test_io3.F90 @@ -0,0 +1,110 @@ +! This is a test for model IO for WW3. +! +! Ed Hartnett 10/14/23 +program test_io3 + 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 + integer :: write_test_file + + print *, 'Testing WW3 netCDF point file code even more.' + + ! 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) + + nth = 4 + ndsm = 20 + ndsop = 20 + ndsbul = 0 + ndstrc = 6 + ntrace = 10 + imod = 1 + + ! 2. Read model definition file. + CALL W3IOGR('READ', NDSM) + WRITE (NDSO,920) GNAME +920 FORMAT (' Grid name : ',A/) + + ! Create a point output file needed for this test. + print *, 'Creating point output test file for this test...' + if (write_test_file() .ne. 0) stop 1 + + ! Read the file out_pnt.ww3 from the model/tests/data directory. + ! print *, 'OK!' + ! print *, 'Reading the point output test file for this test...' + 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 *, 'initializing some data...' + ipass2 = 0 + do i = 1, nopts + do j = 1, nspec + spco(j, i) = 0.0 + end do + end do + + print *, 'OK!' + print *, 'testing writing the WW3 binary point file in netCDF...' + + ! ! Write in netCDF. + ! ofiles(2) = 1 + ! call w3iopon('WRITE', ndsop, iotest, imod) + ! if (iotest .ne. 0) stop 100 + ! print *, 'OK!' + + ! ! Another timestep in netCDF. + ! call w3iopon('WRITE', ndsop, iotest, imod) + ! if (iotest .ne. 0) stop 100 + ! print *, 'OK!' + + print *, 'testing reading the WW3 binary point file in netCDF...' + ipass2 = 0 + call w3iopon('READ', ndsop, iotest) + print *, iotest + if (iotest .ne. 0) stop 100 + print *, 'OK!' + + print *, 'OK!' + + print *, 'SUCCESS!' +end program test_io3 + diff --git a/regtests/unittests/test_io_points_bin.F90 b/regtests/unittests/test_io_points_bin.F90 index 69c197bce..4093b24ba 100644 --- a/regtests/unittests/test_io_points_bin.F90 +++ b/regtests/unittests/test_io_points_bin.F90 @@ -79,74 +79,3 @@ program test_io_points_bin print *, 'OK!' print *, 'SUCCESS!' end program test_io_points_bin - -integer function write_test_file() - implicit none - - integer :: ntlu, nk, nth, nopts - character(len=10), parameter :: veropt = '2021-04-06' - character(len=31), parameter :: idstr = 'WAVEWATCH III POINT OUTPUT FILE' - 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) = (/ 19680606, 0 /) - 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 /) - 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 :: 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 - - ! Initialize some values. - ntlu = 21 - 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 - grdid(i) = 'ww3 ' - end do - - ! 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) - if (ierr .ne. 0) stop 113 - write (ntlu, iostat=ierr) time - if (ierr .ne. 0) stop 114 - do i=1, nopts - 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 the file. - close(ntlu) - - ! We're done! - write_test_file = 0 -end function write_test_file - diff --git a/regtests/unittests/test_io_restart_bin.F90 b/regtests/unittests/test_io_restart_bin.F90 new file mode 100644 index 000000000..026e8d3d2 --- /dev/null +++ b/regtests/unittests/test_io_restart_bin.F90 @@ -0,0 +1,59 @@ +! This is a test for model IO for WW3. This tests the legacy (binary) +! output of restart data, done by function W3IORS(). +! +! Ed Hartnett 1/13/24 +program test_io_restart_bin + use w3iorsmd + use w3iopomd + use w3gdatmd + use w3wdatmd + use w3odatmd + use w3iogrmd + use w3adatmd + implicit none + +! integer, target :: i +! integer :: ndsop, iotest, ndsbul, ndsm +! integer :: ndstrc, ntrace +! character*7 expected_ptnme +! character*6 my_fmt +! real :: expected_loc_1 +! integer :: ndsr = 11 +! real :: dumfpi = 99.9 + +! print *, 'Testing WW3 binary restart 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,'==============================================='/) + +! ! 2. Read model definition file. +! CALL W3IOGR('READ', NDSM) +! WRITE (NDSO,920) GNAME +! 920 FORMAT (' Grid name : ',A/) + +! ! Read the file out_pnt.ww3 from the model/tests/data directory. +! call w3iors('HOT', ndsr, dumfpi) +! if (iotest .ne. 0) stop 10 +! close(ndsop) + + + print *, 'OK!' + print *, 'SUCCESS!' +end program test_io_restart_bin + diff --git a/regtests/unittests/ww3_unittest_util.F90 b/regtests/unittests/ww3_unittest_util.F90 new file mode 100644 index 000000000..fe20ddb30 --- /dev/null +++ b/regtests/unittests/ww3_unittest_util.F90 @@ -0,0 +1,75 @@ +! This is test code for the WW3 I/O unit tests. +! +! This file holds a function used by multiple tests. +! +! Ed Hartnett, 1/11/24 +integer function write_test_file() + implicit none + + integer :: ntlu, nk, nth, nopts + character(len=10), parameter :: veropt = '2021-04-06' + character(len=31), parameter :: idstr = 'WAVEWATCH III POINT OUTPUT FILE' + 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) = (/ 19680606, 0 /) + 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 /) + 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 :: 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 + + ! Initialize some values. + ntlu = 21 + 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 + grdid(i) = 'ww3 ' + end do + + ! 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) + if (ierr .ne. 0) stop 113 + write (ntlu, iostat=ierr) time + if (ierr .ne. 0) stop 114 + do i=1, nopts + 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 the file. + close(ntlu) + + ! We're done! + write_test_file = 0 +end function write_test_file + diff --git a/regtests/ww3_tic1.1/info b/regtests/ww3_tic1.1/info index 589317ea5..bb3c7e84a 100644 --- a/regtests/ww3_tic1.1/info +++ b/regtests/ww3_tic1.1/info @@ -54,6 +54,7 @@ # IC4METHOD = 8 - Meylan et al. (2018) ; Liu et al. (2020) # # (NB: redundant with IC5+IC5VEMOD=3) # # IC4METHOD = 9 - RYW (2021) ; Yu et al. (2022) # +# IC4METHOD = 10 - Meylan et al. (2021) # # IC5 = Choose from three different effective medium models # # IC5VEMOD = 1 - Extended Fox and Squire model (EFS) # # IC5VEMOD = 2 - Robinson and Palmer model (RP) # @@ -101,6 +102,14 @@ # 'IC1' 19680606 000000 5.35E-6 # # 'IC2' 19680606 000000 16.05E-6 # # # +# ------------> &SIC4 IC4METHOD = 10 / # +# ...ICECOEF1, ICECOEF5 are required: # +# T T Ice parameter 1 # +# T T Ice parameter 5 # +# ... # +# 'IC1' 19680606 000000 0.2 # +# 'IC5' 19680606 000000 0.459 # +# # # Reference (w/plots): Rogers and Orzech, NRL Memorandum Report (2013) # # available from http://www7320.nrlssc.navy.mil/pubs.php # # (This report only covers IC1 and IC2, not IC3, which is newer) # diff --git a/regtests/ww3_tic1.1/input_IC4_M10/namelists_1-D.nml b/regtests/ww3_tic1.1/input_IC4_M10/namelists_1-D.nml new file mode 100644 index 000000000..53fac9fd0 --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/namelists_1-D.nml @@ -0,0 +1,2 @@ +&SIC4 IC4METHOD = 10 / +END OF NAMELISTS diff --git a/regtests/ww3_tic1.1/input_IC4_M10/points.list b/regtests/ww3_tic1.1/input_IC4_M10/points.list new file mode 100644 index 000000000..e2a0afe3d --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/points.list @@ -0,0 +1,16 @@ +0.00 0. 'Point 1 ' +1.00E3 0. 'Point 2 ' +2.00E3 0. 'Point 3 ' +3.00E3 0. 'Point 4 ' +4.00E3 0. 'Point 5 ' +5.00E3 0. 'Point 6 ' +6.00E3 0. 'Point 7 ' +7.00E3 0. 'Point 8 ' +8.00E3 0. 'Point 9 ' +9.00E3 0. 'Point 10 ' +10.00E3 0. 'Point 11 ' +11.00E3 0. 'Point 12 ' +12.00E3 0. 'Point 13 ' +13.00E3 0. 'Point 14 ' +14.00E3 0. 'Point 15 ' +15.00E3 0. 'Point 16 ' diff --git a/regtests/ww3_tic1.1/input_IC4_M10/switch b/regtests/ww3_tic1.1/input_IC4_M10/switch new file mode 100644 index 000000000..31ef85bae --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/switch @@ -0,0 +1 @@ +NOGRB SHRD PR3 UQ FLX2 LN0 ST0 NL0 BT0 DB0 TR0 BS0 IC4 IS0 REF0 WNT1 WNX1 CRT1 CRX1 O0 O1 O2 O3 O4 O5 O6 O7 diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.inp new file mode 100644 index 000000000..19e03a81c --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.inp @@ -0,0 +1,43 @@ +$ WAVEWATCH III Grid preprocessor input file +$ ------------------------------------------ + '1-D parameterized ice test ' +$ +$ 1.1 0.04118 25 24 0.0 + 1.1 0.0418 31 36 5.0 +$ + F T F F F T + 60. 60. 60. 60. +$ +$ IC4METHOD determines calculation +$ IC4METHOD = 1 - Wadhams et al. (1988) +$ IC4METHOD = 2 - Meylan et al. (2014) +$ IC4METHOD = 3 - Kohout & Meylan (2008) in Horvat & Tziperman (2015) +$ IC4METHOD = 4 - Kohout et al. (2014) +$ IC4METHOD = 5 - Simple ki step function +$ IC4METHOD = 6 - Simple ki step function via namelist +$ IC4METHOD = 7 - Doble et al. (GRL 2015) +$ IC4METHOD = 8 - Meylan et al. (2018) ; Liu et al. (2020) +$ IC4METHOD = 9 - RYW (2021) ; Yu et al. (2022) +$ IC4M8 Fit to R21A L ChfM2=0.059 +$ IC4M10 + &SIC4 IC4METHOD = 10 , IC4CN = 0.059/ +END OF NAMELISTS +$ + 'RECT' F 'NONE' + 156 3 + 1.0E3 1.0E3 1. + -1.0E3 -1.0E3 1. +$ dlim dmin file# scale layout# format# formatdescrip filetype# filenm + -0.1 0.1 401 -1.0 1 1 '(....)' 'NAME' '../input_IC1/depth1d.flat' +$ + 10 1 1 '(....)' 'PART' 'input' +$ +$ First grid +$ + 2 2 F +$ + 0 0 F + 0 0 F + 0 0 +$ + 0. 0. 0. 0. 0 diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.nml b/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.nml new file mode 100644 index 000000000..e3f8dd58a --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_grid.nml @@ -0,0 +1,81 @@ +! -------------------------------------------------------------------- ! +! WAVEWATCH III - ww3_grid.nml - Grid pre-processing ! +! -------------------------------------------------------------------- ! + +! -------------------------------------------------------------------- ! +! Define the spectrum parameterization via SPECTRUM_NML namelist +! -------------------------------------------------------------------- ! +&SPECTRUM_NML + SPECTRUM%XFR = 1.1 + SPECTRUM%FREQ1 = 0.0418 + SPECTRUM%NK = 31 + SPECTRUM%NTH = 36 + SPECTRUM%THOFF = 5.0 +/ + +! -------------------------------------------------------------------- ! +! Define the run parameterization via RUN_NML namelist +! -------------------------------------------------------------------- ! +&RUN_NML + RUN%FLCX = T + RUN%FLSOU = T +/ + +! -------------------------------------------------------------------- ! +! Define the timesteps parameterization via TIMESTEPS_NML namelist +! -------------------------------------------------------------------- ! +&TIMESTEPS_NML + TIMESTEPS%DTMAX = 60. + TIMESTEPS%DTXY = 60. + TIMESTEPS%DTKTH = 60. + TIMESTEPS%DTMIN = 60. +/ + +! -------------------------------------------------------------------- ! +! Define the grid to preprocess via GRID_NML namelist +! -------------------------------------------------------------------- ! +&GRID_NML + GRID%NAME = '1-D parameterized ice test' + GRID%NML = '../input_IC4_M10/namelists_1-D.nml' + GRID%TYPE = 'RECT' + GRID%COORD = 'CART' + GRID%CLOS = 'NONE' + GRID%ZLIM = -0.1 + GRID%DMIN = 0.1 +/ + +! -------------------------------------------------------------------- ! +! Define the rectilinear grid type via RECT_NML namelist +! -------------------------------------------------------------------- ! +&RECT_NML + RECT%NX = 156 + RECT%NY = 3 + RECT%SX = 1.0E3 + RECT%SY = 1.0E3 + RECT%X0 = -1.0E3 + RECT%Y0 = -1.0E3 +/ + +! -------------------------------------------------------------------- ! +! Define the depth to preprocess via DEPTH_NML namelist +! -------------------------------------------------------------------- ! +&DEPTH_NML + DEPTH%SF = -1.0 + DEPTH%FILENAME = '../input_IC1/depth1d.flat' +/ + +! -------------------------------------------------------------------- ! +! Define the input boundary points via INBND_COUNT_NML and +! INBND_POINT_NML namelist +! -------------------------------------------------------------------- ! +&INBND_COUNT_NML + INBND_COUNT%N_POINT = 1 +/ + +&INBND_POINT_NML + INBND_POINT(1) = 2 2 F +/ + +! -------------------------------------------------------------------- ! +! WAVEWATCH III - end of namelist ! +! -------------------------------------------------------------------- ! diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.inp new file mode 100644 index 000000000..4104d759e --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.inp @@ -0,0 +1,20 @@ +$ WAVEWATCH III Grid output post-processing (netcdf) +$--------------------------------------------------- + 19680606 000000 3600. 99 +N +$ Options: DPT CUR WND DT WLV ICE HS L T02 T01 TM1 FP DIR SPR DP EF +$ TH1M STH1M PHS PTP PLP PDIR PSP WSF TWS PNR UST CHA CGE FAW +$ TAW TWA WCC WCF WCH WCM SXY TWO BHD FOC TUS USS P2S WN USF +$ P2L ABR UBR BED FBB TBB MSS MSC DTD FCT CFX CFT CFK US1 US2 +DPT WLV HS DIR +$ + 3 4 + 0 1 2 + F + ww3. + 4 + 1 999 1 999 3 2 +$ +$ -------------------------------------------------------------------- $ +$ End of input file $ +$ -------------------------------------------------------------------- $ diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.nml b/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.nml new file mode 100644 index 000000000..46aa758fa --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_ounf.nml @@ -0,0 +1,29 @@ +! -------------------------------------------------------------------- ! +! WAVEWATCH III ww3_ounf.nml - Grid output post-processing ! +! -------------------------------------------------------------------- ! + +! -------------------------------------------------------------------- ! +! Define the output fields to postprocess via FIELD_NML namelist +! -------------------------------------------------------------------- ! +&FIELD_NML + FIELD%TIMESTART = '19680606 000000' + FIELD%TIMESTRIDE = '3600.' + FIELD%TIMECOUNT = '99' + FIELD%TIMESPLIT = 4 + FIELD%LIST = 'DPT WLV HS DIR' + FIELD%PARTITION = '0 1 2' + FIELD%SAMEFILE = F + FIELD%TYPE = 4 +/ + +! -------------------------------------------------------------------- ! +! Define the content of the output file via FILE_NML namelist +! -------------------------------------------------------------------- ! +&FILE_NML + FILE%IXN = 999 + FILE%IYN = 999 +/ + +! -------------------------------------------------------------------- ! +! WAVEWATCH III - end of namelist ! +! -------------------------------------------------------------------- ! diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_outf.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outf.inp new file mode 100644 index 000000000..2b4c6bca8 --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outf.inp @@ -0,0 +1,13 @@ +$ WAVEWATCH III Grid output post-processing +$ ----------------------------------------- + 19680606 000000 3600. 99 +N +$ Options: DPT CUR WND DT WLV ICE HS L T02 T01 TM1 FP DIR SPR DP EF +$ TH1M STH1M PHS PTP PLP PDIR PSP WSF TWS PNR UST CHA CGE FAW +$ TAW TWA WCC WCF WCH WCM SXY TWO BHD FOC TUS USS P2S WN USF +$ P2L ABR UBR BED FBB TBB MSS MSC DTD FCT CFX CFT CFK US1 US2 +DPT WLV HS DIR +$ + 3 0 +$ + 1 999 1 999 1 1 diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_spec.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_spec.inp new file mode 100644 index 000000000..b500e0ca4 --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_spec.inp @@ -0,0 +1,19 @@ +$ WAVEWATCH III Point output post-processing +$ ------------------------------------------ + 19680606 120000 3600. 1 +$ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + -1 +$ + 1 + 2 -1. 0. 33 F diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab50.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab50.inp new file mode 100644 index 000000000..826bd422d --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab50.inp @@ -0,0 +1,19 @@ +$ WAVEWATCH III Point output post-processing +$ ------------------------------------------ + 19680606 000000 600. 9999 +$ + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + -1 +$ + 2 + 2 50 diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab51.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab51.inp new file mode 100644 index 000000000..e54faed46 --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_outp_tab51.inp @@ -0,0 +1,10 @@ +$ WAVEWATCH III Point output post-processing +$ ------------------------------------------ + 19680606 000000 900. 49 +$ +$ 1 + 11 + -1 +$ + 2 + 2 51 diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_prep_icecon.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_prep_icecon.inp new file mode 100644 index 000000000..26a94221f --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_prep_icecon.inp @@ -0,0 +1,38 @@ +$ -------------------------------------------------------------------- $ +$ WAVEWATCH III Field preprocessor input file $ +$ -------------------------------------------------------------------- $ +$ Mayor types of field and time flag +$ Field types : IC1, IC2, IC3, IC4, IC5 => Ice parameters (5) +$ MDN => Mud densities +$ MTH => Mud thicknesses +$ MVS => Mud viscosities +$ ICE => Ice concentrations. +$ LEV => Water levels. +$ WND => Winds. +$ WNS => Winds (including air-sea temp. dif.) +$ CUR => Currents. +$ Format types : AI Transfer field 'as is'. +$ LL Field defined on longitude-latitude grid. +$ F1 Arbitrary grid, longitude and latitude of +$ each grid point given in separate file. +$ F2 Like F1, composite of 2 fields. +$ Time flag : If true, time is included in file. +$ Header flag : If true, write header on "*.ww3" data file +$ + 'ICE' 'AI' T T +$ +$ Additional time input ---------------------------------------------- $ +$ If time flag is .FALSE., give time of field in yyyymmdd hhmmss format. +$ +$ 19680606 000000 +$ +$ Define data files -------------------------------------------------- $ +$ The first input line identifies the file format with FROM, IDLA and +$ IDFM, the second (third) lines give the file unit number and name. +$ + 'NAME' 1 2 '(I10,1x,I10)' '(1000(F6.2))' + 2345 '../input_IC2_nondisp/icecon.156x3.txt' +$ +$ -------------------------------------------------------------------- $ +$ End of input file $ +$ -------------------------------------------------------------------- $ diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_shel.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_shel.inp new file mode 100644 index 000000000..2be39573e --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_shel.inp @@ -0,0 +1,69 @@ +$ WAVEWATCH III shell input file +$ ------------------------------ + T T Ice parameter 1 + F F Ice parameter 2 + F F Ice parameter 3 + F F Ice parameter 4 + T T Ice parameter 5 + F F Mud parameter 1 + F F Mud parameter 2 + F F Mud parameter 3 + F F Water levels + F F Currents + F F Winds + T F Ice concentrations + F F Atmospheric momentum + F F Air density + F Assimilation data : Mean parameters + F Assimilation data : 1-D spectra + F Assimilation data : 2-D spectra. +$ + 19680606 000000 + 19680606 120000 +$ + 1 +$ + 19680606 000000 900 19680606 120000 +N +$ Options: DPT CUR WND DT WLV ICE HS L T02 T01 TM1 FP DIR SPR DP EF +$ TH1M STH1M PHS PTP PLP PDIR PSP WSF TWS PNR UST CHA CGE FAW +$ TAW TWA WCC WCF WCH WCM SXY TWO BHD FOC TUS USS P2S WN USF +$ P2L ABR UBR BED FBB TBB MSS MSC DTD FCT CFX CFT CFK US1 US2 +DPT HS ICE DIR EF + 19680606 000000 900 19680606 120000 + 0.00 0. 'Point 1 ' + 1.00E3 0. 'Point 2 ' + 2.00E3 0. 'Point 3 ' + 3.00E3 0. 'Point 4 ' + 4.00E3 0. 'Point 5 ' + 5.00E3 0. 'Point 6 ' + 6.00E3 0. 'Point 7 ' + 7.00E3 0. 'Point 8 ' + 8.00E3 0. 'Point 9 ' + 9.00E3 0. 'Point 10 ' + 10.00E3 0. 'Point 11 ' + 11.00E3 0. 'Point 12 ' + 12.00E3 0. 'Point 13 ' + 13.00E3 0. 'Point 14 ' + 14.00E3 0. 'Point 15 ' + 15.00E3 0. 'Point 16 ' + 0. 0. 'STOPSTRING' + 19680606 000000 0 19680606 120000 + 19680606 000000 0 19680606 120000 + 19680606 000000 0 19680606 120000 + 19680606 000000 0 19680606 120000 +$ +$ Testing of output through parameter list (C/TPAR) ------------------ $ +$ Time for output and field flags as in above output type 1. +$ +$ 19680606 014500 +$ T T T T T T T T T T T T T T T T +$ +$ Homogeneous field data --------------------------------------------- $ +$ constant case: +$ Meylan et al. (2014) pg 5050 : a=2.12e-3 and b=4.59e-2 + 'IC1' 19680606 000000 0.2 + 'IC5' 19680606 000000 4.59E-2 + 'STP' +$ +$ -------------------------------------------------------------------- $ diff --git a/regtests/ww3_tic1.1/input_IC4_M10/ww3_strt.inp b/regtests/ww3_tic1.1/input_IC4_M10/ww3_strt.inp new file mode 100644 index 000000000..49747e41a --- /dev/null +++ b/regtests/ww3_tic1.1/input_IC4_M10/ww3_strt.inp @@ -0,0 +1,17 @@ +$ WAVEWATCH III Initial conditions input file +$ ------------------------------------------- + 2 +$ 0.1 0.0001 225. 12 0. -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 315. 12 0. -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 240. 2 0. -5.E3 0. 5.E3 1.0 +$ fp sip thm ncos xm six ym siy hmax +$ 0.1 0.0001 270. 12 0. -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 270. 2 0. -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 300. 2 0. -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 135. 12 50.E3 -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 45. 12 50.E3 -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 120. 2 50.E3 -5.E3 0. 5.E3 1.0 +$ 0.1 0.0001 60. 2 50.E3 -5.E3 0. 5.E3 1.0 +$ +$ alpha fp thm gamma sigA sigB xm six ym siy + 0.0081 0.1 270.0 1.0 0.07 0.09 0. -5.E3 0. 5.E3 diff --git a/regtests/ww3_tp2.10/input/ww3_grid.nml b/regtests/ww3_tp2.10/input/ww3_grid.nml index ee9ac10e4..26e0465dc 100644 --- a/regtests/ww3_tp2.10/input/ww3_grid.nml +++ b/regtests/ww3_tp2.10/input/ww3_grid.nml @@ -67,6 +67,13 @@ SMC%SUBTR%FILENAME = '../input/ErieObstr.dat' / +! -------------------------------------------------------------------- ! +! Scaling factor for depth input file +! -------------------------------------------------------------------- ! +&DEPTH_NML + DEPTH%SF = -1.0 +/ + ! -------------------------------------------------------------------- ! ! WAVEWATCH III - end of namelist ! ! -------------------------------------------------------------------- ! diff --git a/regtests/ww3_tp2.16/input/ww3_grid.nml b/regtests/ww3_tp2.16/input/ww3_grid.nml index 19b0fdc05..c97e3126d 100644 --- a/regtests/ww3_tp2.16/input/ww3_grid.nml +++ b/regtests/ww3_tp2.16/input/ww3_grid.nml @@ -70,6 +70,13 @@ SMC%AJSID%FILENAME = '../input/A50AJSide.dat' / +! -------------------------------------------------------------------- ! +! Scaling factor for depth input file +! -------------------------------------------------------------------- ! +&DEPTH_NML + DEPTH%SF = -1.0 +/ + ! -------------------------------------------------------------------- ! ! WAVEWATCH III - end of namelist ! ! -------------------------------------------------------------------- ! diff --git a/regtests/ww3_tp2.2/input/switch_PR1_MPI_BIN2NC b/regtests/ww3_tp2.2/input/switch_PR1_MPI_BIN2NC new file mode 100644 index 000000000..bb79e8549 --- /dev/null +++ b/regtests/ww3_tp2.2/input/switch_PR1_MPI_BIN2NC @@ -0,0 +1 @@ +NOGRB DIST MPI 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 BIN2NC diff --git a/regtests/ww3_ufs1.1/input/switch_MPI_OMPH b/regtests/ww3_ufs1.1/input/switch_MPI_OMPH index 8be0a29a5..eb4b41e90 100644 --- a/regtests/ww3_ufs1.1/input/switch_MPI_OMPH +++ b/regtests/ww3_ufs1.1/input/switch_MPI_OMPH @@ -1 +1 @@ -NCO NOGRB DIST MPI OMPG OMGH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 +NCO NOGRB DIST MPI OMPG OMPH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 diff --git a/regtests/ww3_ufs1.1/input_unstr/switch_PDLIB b/regtests/ww3_ufs1.1/input_unstr/switch_PDLIB index ff569c11f..0927be62d 100644 --- a/regtests/ww3_ufs1.1/input_unstr/switch_PDLIB +++ b/regtests/ww3_ufs1.1/input_unstr/switch_PDLIB @@ -1 +1 @@ -PDLIB SCOTCH NOGRB DIST MPI PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD1 TR0 BS0 WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 +PDLIB SCOTCH NOGRB DIST MPI PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD1 TR0 BS0 WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 BIN2NC diff --git a/regtests/ww3_ufs1.2/input/switch_MPI_OMPH b/regtests/ww3_ufs1.2/input/switch_MPI_OMPH index 8be0a29a5..eb4b41e90 100644 --- a/regtests/ww3_ufs1.2/input/switch_MPI_OMPH +++ b/regtests/ww3_ufs1.2/input/switch_MPI_OMPH @@ -1 +1 @@ -NCO NOGRB DIST MPI OMPG OMGH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 +NCO NOGRB DIST MPI OMPG OMPH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 diff --git a/regtests/ww3_ufs1.3/input/switch_MPI_OMPH b/regtests/ww3_ufs1.3/input/switch_MPI_OMPH index 8be0a29a5..eb4b41e90 100644 --- a/regtests/ww3_ufs1.3/input/switch_MPI_OMPH +++ b/regtests/ww3_ufs1.3/input/switch_MPI_OMPH @@ -1 +1 @@ -NCO NOGRB DIST MPI OMPG OMGH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0 +NCO NOGRB DIST MPI OMPG OMPH SCRIP SCRIPNC WRST PR3 UQ FLX0 SEED ST4 STAB0 NL1 BT1 DB1 MLIM FLD2 TR0 BS0 RWND WNX1 WNT1 CRX1 CRT1 O0 O1 O2 O3 O4 O5 O6 O7 O14 O15 IC0 IS0 REF0