#include "wwm_functions.h"
!#define LTESTWAMSOURCES
#undef LTESTWAMSOURCES
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE INIT_ARRAYS
       USE DATAPOOL
       IMPLICIT NONE

#ifdef MPI_PARALL_GRID
       INTEGER :: IE
#endif

       IF (DIMMODE .EQ. 1) THEN
         ALLOCATE( DX1(0:MNP+1), DX2(0:MNP+1), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 1')
         DX1 = zero
         DX2 = zero 
       ENDIF

       ALLOCATE( XP(MNP), YP(MNP), DEP(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 2')
       XP  = zero
       YP  = zero
       DEP = zero

       ALLOCATE( INVSPHTRANS(MNP,2), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 3')
       INVSPHTRANS = zero

       ALLOCATE( INE(3,MNE), IEN(6,MNE), TRIA(MNE), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 4')
       INE = 0
       IEN = zero
       TRIA = zero
#ifdef MPI_PARALL_GRID
# ifdef PDLIB
       INE(:,:) = INETMP(:,:)
# else
       INE = INETMP(1:3,:)
# endif
#endif
!
! spectral grid - shared
!
       ALLOCATE(MSC_HF(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 5')
       MSC_HF = MSC
       
!
! wave and surface roller action densities - shared
!
       ALLOCATE(AC1(MSC,MDC,MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 6')
       AC1 = zero

       ALLOCATE(AC2(MSC,MDC,MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 7')
       AC2 = zero

       IF (IROLLER == 1) THEN
         ALLOCATE(EROL1(MNP), EROL2(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 8.2')
         EROL1 = zero; EROL2 = zero; 

         ALLOCATE(KROLP(MNP), SINBETAROL(MNP), SIGROLP(MNP), DROLP(MNP), & 
           &      CROLP(MNP), CROL(2,MNP), AROL(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 8.0')
         KROLP = zero; SINBETAROL = zero; SIGROLP = zero; DROLP = zero; 
         CROLP = zero; CROL = zero; AROL = zero
       END IF

!
! Adaptive breaking coeff
!
       ALLOCATE( A_BR_COEF(MNP), BRCRIT(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 25b')
       A_BR_COEF = zero
       BRCRIT = zero


       IF ((.NOT. BLOCK_GAUSS_SEIDEL).and.(AMETHOD .eq. 7)) THEN
         ALLOCATE (U_JACOBI(MSC,MDC,MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 9a')
         U_JACOBI = zero
       END IF

       IF (ICOMP .GE. 2) THEN
         ALLOCATE (IMATRAA(MSC,MDC,MNP), IMATDAA(MSC,MDC,MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 10')
         IMATRAA = zero
         IMATDAA = zero
       END IF

!       ALLOCATE(SBR(2,MNP),SBF(2,MNP), stat=istat)
!       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 10a')
!       SBR = ZERO
!       SBF = ZERO

!       ALLOCATE(STOKES_X(NLVT,MNP), STOKES_Y(NLVT,MNP), JPRESS(MNP), stat=istat)
!       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 10b')
!       STOKES_X = ZERO
!       STOKES_Y = ZERO
!       JPRESS = ZERO

       IF (LITERSPLIT) THEN
!         ALLOCATE (AC1(MNP,MSC,MDC)); AC1 = zero
         ALLOCATE (DAC_ADV(2,MNP,MSC,MDC), DAC_THE(2,MNP,MSC,MDC), DAC_SIG(2,MNP,MSC,MDC), DAC_SOU(2,MNP,MSC,MDC), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 11')
         DAC_ADV = zero
         DAC_THE = zero
         DAC_SIG = zero
         DAC_SOU = zero
       END IF

       IF ((ICOMP .eq. 3).and.(AMETHOD .eq. 7).AND.(ASPAR_LOCAL_LEVEL .eq. 0)) THEN
#ifdef WWM_SOLVER
         IF (REFRACTION_IMPL) THEN
           allocate(CAD_THE(MSC,MDC,NP_RES), stat=istat)
           IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 11.1')
         END IF
         IF (FREQ_SHIFT_IMPL) THEN
           allocate(CAS_SIG(MSC,MDC,NP_RES), stat=istat)
           IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 11.2')
         END IF
#else
         CALL WWM_ABORT('Needs WWM_SOLVER for JACOBI_ITERATION (AMETHOD 7)')
#endif
       END IF

#ifdef SHYFEM_COUPLING
       IF (LSHYFEM) THEN
         ALLOCATE(SHYFZETA(NLVT,MNP),NLEV(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 12')
         SHYFZETA = ZERO
         NLEV = 0
         ALLOCATE(STOKES_X(NLVT,MNP), STOKES_Y(NLVT,MNP), JPRESS(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 13')
         STOKES_X = ZERO; STOKES_Y = ZERO; JPRESS = ZERO
       END IF
#endif
!
! Boundary conditions - shared
!
       ALLOCATE( IOBDP(MNP), IOBPD(MDC,MNP), IOBP(MNP), IOBWB(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 15')
       IOBDP  = 1
       IOBPD  = 0
       IOBP   = 0
       IOBWB  = 1
!
! phase velocity, wave number, group velocity, dwdh, kh
!
       ALLOCATE( WK(MSC,MNP), CG(MSC,MNP), WC(MSC,MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 16')
       WK = ZERO 
       CG = ZERO 
       WC = ZERO
!
! phase velocity, wave number, group velocity, dwdh, kh
!
       IF (MESTR .EQ. 7) THEN
         ALLOCATE( DWKDX(MNP,MSC), DCGDY(MNP,MSC), DWKDY(MNP,MSC), DCGDX(MNP,MSC), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 16')
         DWKDX = ZERO
         DCGDX = ZERO
         DWKDY = ZERO
         DCGDY = ZERO
       ENDIF
!
       ALLOCATE( TABK (0:IDISPTAB), TABCG(0:IDISPTAB), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 17')
       TABK  = zero
       TABCG = zero
!
! diffraction parameter - shared
!
       IF (LDIFR) THEN
         ALLOCATE(DIFRM(MNP), DIFRX(MNP), DIFRY(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 18')
         DIFRM = zero
         DIFRX = zero
         DIFRY = zero
       END IF
!
! friction source term
!
       IF (MESBF .EQ. 3) THEN
         ALLOCATE(D50_SHOWEX(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 18b')
         D50_SHOWEX = zero
       END IF
!
! water level, currents and depths ...
!
       ALLOCATE(WINDXY(MNP,2), PRESSURE(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 19')
       WINDXY = zero
       PRESSURE = zero
       ALLOCATE( DVWIND(MNP,2), CURTXY(MNP,2), DVCURT(MNP,2), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 20')
       DVWIND = zero
       CURTXY = zero
       DVCURT = zero
       ALLOCATE( DDEP(MNP,2), DCUX(MNP,2), DCUY(MNP,2), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 21')
       DDEP = zero
       DCUX = zero
       DCUY = zero
       ALLOCATE( WATLEV(MNP), WATLEVOLD(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 22')
       WATLEV = zero
       WATLEVOLD = zero
       ALLOCATE( DVWALV(MNP), WLDEP(MNP), DEPDT(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 23')
       DVWALV = zero
       WLDEP = zero
       DEPDT = zero
!
!  convergence analysis - shared
!
       IF (LCONV .OR. (LQSTEA .AND. LCHKCONV)) THEN
         ALLOCATE ( SUMACOLD(MNP), HSOLD(MNP), KHSOLD(MNP), TM02OLD(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 24')
         SUMACOLD = zero
         HSOLD  = zero
         TM02OLD = zero
         KHSOLD  = zero
       END IF
!
!  new stuff not ready  
!
       IF (LCONV) THEN ! more work needed ...
         ALLOCATE ( IP_IS_STEADY(MNP), IE_IS_STEADY(MNE), STAT2D(MSC,MDC), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 24')
         IP_IS_STEADY = 0
         IE_IS_STEADY = 0
         STAT2D = ZERO
       END IF
!
!  output - shared
!
       ALLOCATE( QBLOCAL(MNP), DISSIPATION(MNP), AIRMOMENTUM(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 25')
       QBLOCAL = zero
       DISSIPATION = zero
       AIRMOMENTUM = zero

       ALLOCATE( UFRIC(MNP), ALPHA_CH(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 26')
       UFRIC = zero
       ALPHA_CH = zero

       ALLOCATE( TAUW(MNP), TAUTOT(MNP), TAUWX(MNP), TAUWY(MNP), TAUHF(MNP), TAUHFT2(0:IUSTAR,0:IALPHA,0:ILEVTAIL), TAUHFT(0:IUSTAR,0:IALPHA,MSC), TAUT(0:ITAUMAX,0:JUMAX,JPLEVT), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 27')
       TAUW = zero
       TAUTOT = zero
       TAUWX = zero
       TAUWY = zero
       TAUHF = zero
       TAUHFT2 = zero

       ALLOCATE( Z0(MNP), CD(MNP), USTDIR(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 28')
       Z0 = zero
       CD = zero
       USTDIR = zero

       ALLOCATE( RSXX(MNP), RSXY(MNP), RSYY(MNP), FORCEXY(MNP,2), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 29')
       RSXX = zero
       RSXY = zero
       RSYY = zero
       FORCEXY = zero

#ifdef SCHISM
       ALLOCATE( SXX3D(NVRT,MNP), SXY3D(NVRT,MNP), SYY3D(NVRT,MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 30')
       SXX3D = zero
       SXY3D = zero
       SYY3D = zero
#endif
#ifndef SCHISM
       IF (LCPL) THEN
         IF (LTIMOR.or.LSHYFEM) THEN
           ALLOCATE( SXX3D(NLVT,MNP), SXY3D(NLVT,MNP), SYY3D(NLVT,MNP), stat=istat)
           IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 31')
           SXX3D = zero
           SXY3D = zero
           SYY3D = zero
         END IF
       END IF
#endif
       ALLOCATE(HMAX(MNP), ISHALLOW(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32')
       HMAX = zero
       ISHALLOW = 0

       IF (LSOURCESWAM .OR. MESIN == 2) THEN
         ALLOCATE( FL(MNP,MDC,MSC), FL3(MNP,MDC,MSC), SL(MNP,MDC,MSC), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32a')
         FL = ZERO
         FL3 = ZERO
         SL = ZERO
         ALLOCATE( FMEAN(MNP), EMEAN(MNP), FMEANWS(MNP), MIJ(MNP), ENH(MNP,MSC+4,1), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32b')
         FMEAN = ZERO
         EMEAN = ZERO
         FMEANWS = ZERO
         MIJ = 0
         ENH = 1.d0
         ALLOCATE( USOLD(MNP,1), THWOLD(MNP,1), THWNEW(MNP), Z0OLD(MNP,1), Z0NEW(MNP), ROAIRO(MNP,1), ROAIRN(MNP), U10OLD(MNP,1), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32c')
         U10OLD = ZERO
         USOLD = ZERO
         THWOLD = ZERO 
         THWNEW = ZERO
         Z0OLD = ZERO
         Z0NEW = ZERO 
         ROAIRO = 1.2250000238 
         ROAIRN = 1.2250000238 
         ALLOCATE( ZIDLOLD(MNP,1), ZIDLNEW(MNP), U10NEW(MNP), USNEW(MNP), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32d')
         ZIDLOLD = ZERO
         ZIDLNEW = ZERO
         U10NEW = ZERO
         USNEW = ZERO
         ALLOCATE( FCONST(MNP,MSC), stat=istat)
         IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 32e')
         FCONST = 1
       ENDIF
!
!      init source term parameter 
!      
      IF (IPHYS.EQ.0) THEN
!       ECMWF PHYSICS:
        BETAMAX = 1.20
        ZALP    = 0.008
        TAUWSHELTER=0.0
        IF(MSC.GT.30) THEN
          ALPHA   = 0.0060
        ELSE
          ALPHA   = 0.0075
        ENDIF
      ELSE IF (IPHYS.EQ.1) THEN
!       METEO FRANCE PHYSICS:
        BETAMAX = 1.52
        ZALP    = 0.0060
        TAUWSHELTER=0.6
        IF(MSC.GT.30) THEN
          ALPHA   = 0.0090
        ELSE
          ALPHA   = 0.0095
        ENDIF
      ELSE IF (IPHYS.EQ.2) THEN
!      COMBINED ECMWF/METEO FRANCE PHYSICS:
        BETAMAX = 1.52
        ZALP    = 0.0060
        TAUWSHELTER=0.0
        IF(MSC.GT.30) THEN
          ALPHA   = 0.003
        ELSE
          ALPHA   = 0.004
        ENDIF
      ELSE
         CALL WWM_ABORT('UKNOWN PHYSICS SELECTION') 
      ENDIF ! IPHYS

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'LEAVING INIT_ARRAYS'
        FLUSH(STAT%FHNDL)
      END IF
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE DEALLOC_ARRAYS
      USE DATAPOOL
      IMPLICIT NONE

      IF (DIMMODE == 1) THEN
        DEALLOCATE( DX1, DX2)
      END IF

      DEALLOCATE(XP, YP, DEP)
      DEALLOCATE(INVSPHTRANS)
      DEALLOCATE(INE, IEN, TRIA)
!
! spectral grid - shared
!
      DEALLOCATE( SPSIG, SPDIR, FR, COSTH, SINTH, COS2TH, SIN2TH)
      DEALLOCATE( SINCOSTH, SIGPOW, DS_BAND, DS_INCR)
      DEALLOCATE(MSC_HF)
!
! action densities and source terms - shared
!
      IF ((.NOT. BLOCK_GAUSS_SEIDEL).and.(AMETHOD .eq. 7)) THEN
        DEALLOCATE (U_JACOBI)
      END IF
      DEALLOCATE (AC2, AC1)
      IF (IROLLER == 1) DEALLOCATE (EROL1, EROL2, CROLP, CROL, DROLP, KROLP, SIGROLP)
      IF (ICOMP .GE. 2) THEN
        DEALLOCATE (IMATRAA, IMATDAA)
      END IF

      IF (LITERSPLIT) THEN
        DEALLOCATE (DAC_ADV, DAC_THE, DAC_SIG, DAC_SOU)
      END IF

#ifdef WWM_SOLVER
      IF ((ICOMP .eq. 3).and.(AMETHOD .eq. 7).AND.(ASPAR_LOCAL_LEVEL .eq. 0)) THEN
         IF (REFRACTION_IMPL) THEN
           deallocate(CAD_THE)
         END IF
         IF (FREQ_SHIFT_IMPL) THEN
           deallocate(CAS_SIG)
         END IF
      END IF
#endif
#ifdef SHYFEM_COUPLING
      IF (LSHYFEM) THEN
        DEALLOCATE(SHYFZETA, NLEV)
      END IF
#endif
!
! WAM Cycle 4.5 - shared
!
      IF (MESIN .EQ. 2) THEN
        DEALLOCATE ( TAUHFT, TAUT)
      ENDIF
!
! Boundary conditions - shared
!
      DEALLOCATE( IOBPD, IOBP, IOBWB)
!
! phase velocity, wave number, group velocity, dwdh, kh
!
      DEALLOCATE( WK, CG, TABK, TABCG)
!
! diffraction parameter - shared
!
      IF (LDIFR) THEN
        DEALLOCATE ( DIFRM, DIFRX, DIFRY )
      END IF
!
! water level, currents and depths ...
!
      DEALLOCATE( WINDXY, PRESSURE, DVWIND, CURTXY, DVCURT)
      DEALLOCATE( DDEP, DCUX, DCUY, WATLEV, WATLEVOLD)
      DEALLOCATE( DVWALV, WLDEP, DEPDT)
!
!  convergence analysis - shared
!
      IF (LCONV .OR. (LQSTEA .AND. LCHKCONV)) THEN
        DEALLOCATE ( SUMACOLD, HSOLD, KHSOLD, TM02OLD)
      END IF
!
!  output - shared
!
      DEALLOCATE( QBLOCAL, DISSIPATION, AIRMOMENTUM, UFRIC, ALPHA_CH)
      DEALLOCATE( TAUW, TAUTOT, TAUWX, TAUWY, TAUHF)
      DEALLOCATE( Z0, CD, USTDIR)
      DEALLOCATE( RSXX, RSXY, RSYY)
#ifdef SCHISM
      DEALLOCATE( SXX3D, SXY3D, SYY3D)
#endif
#ifndef SCHISM
      IF (LCPL) THEN
        IF (LTIMOR.or.LSHYFEM) THEN
          DEALLOCATE( SXX3D, SXY3D, SYY3D)
        END IF
      END IF
#endif
      DEALLOCATE(HMAX, ISHALLOW)
#ifdef NCDF
      IF (GRIDWRITE) THEN
        DEALLOCATE(XPtotal, YPtotal, IOBPtotal, DEPtotal, INEtotal)
      END IF
#endif
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE INITIALIZE_WWM
#if defined ROMS_WWM_PGMCL_COUPLING || defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
      USE WWMaOCN_PGMCL
#endif
#if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
      USE pgmcl_lib_WWM, only : WAV_common_initialize
#endif
      USE DATAPOOL
#ifdef SCHISM
      use schism_glbl, only: xlon,ylat
#endif
#ifdef PDLIB
      USE yowpd, only : initFromGridDim
#endif
#if !defined PDLIB && defined MPI_PARALL_GRID
      USE schism_glbl, only : ics
#endif
#ifdef PETSC
      USE PETSC_CONTROLLER, ONLY : PETSC_INIT
#endif
#ifdef ST41
      USE W3SRC4MD_OLD
#endif
#ifdef ST42
      USE W3SRC4MD
#endif
      IMPLICIT NONE
!
      INTEGER        :: i, j, IP
      REAL(rkind)    :: TIME1, TIME2
      
#ifdef TIMINGS
      CALL WAV_MY_WTIME(TIME1)
#endif
     
      CALL SET_WWMINPULNML 

! variable nx1 should be initialized in SCHISM code, not here!
#if defined MPI_PARALL_GRID && !defined PDLIB
      do i=1,3
        do j=1,2
          nx1(i,j)=i+j
          if(nx1(i,j)>3) nx1(i,j)=nx1(i,j)-3
          if(nx1(i,j)<1.or.nx1(i,j)>3) then
            write(wwmerr,*)'MAIN: nx1 wrong',i,j,nx1(i,j)
            call wwm_abort(wwmerr)
          endif
        enddo
      enddo
#endif
      CALL INIT_FILE_HANDLES
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'DONE SETTING FHNDL'
        FLUSH(STAT%FHNDL)
      END IF

      CALL READ_WWMINPUT
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'DONE READING NAMELIST'
        FLUSH(STAT%FHNDL)
      END IF


      CALL READ_SPATIAL_GRID_TOTAL

#ifndef MPI_PARALL_GRID
      MNP=NP_TOTAL
      MNE=NE_TOTAL
      NP_RES=MNP
      CALL INIT_ARRAYS
      XP=XPtotal
      YP=YPtotal
      DEP=DEPtotal
      INE=INEtotal
#else
# ifdef PDLIB
      IF (IGRIDTYPE .eq. 2) THEN
        CALL WWM_ABORT('Not yet support for PDLIB and IGRIDTYPE=2')
      END IF
      IF (WRITEDBGFLAG == 1) THEN
        WRITE(DBG%FHNDL,*) 'sum(XPtotal)=', sum(XPtotal)
        WRITE(DBG%FHNDL,*) 'sum(YPtotal)=', sum(YPtotal)
        WRITE(DBG%FHNDL,*) 'sum(DEPtotal)=', sum(DEPtotal)
        WRITE(DBG%FHNDL,*) 'sum(INEtotal)=', sum(INEtotal)
        WRITE(DBG%FHNDL,*) NP_TOTAL, NE_TOTAL, MDC, MSC
      END IF
      CALL initFromGridDim(NP_TOTAL, XPtotal, YPtotal, DEPtotal, NE_TOTAL, INEtotal, MDC, MSC, comm)
      call fillPublicVars
      CALL INIT_ARRAYS
      XP = XPTMP
      YP = YPTMP
      DEP=DEP8
      INETMP=INE
# else
#  ifndef SCHISM
      call partition_hgrid
      call aquire_hgrid(.true.)
      call msgp_tables
      call msgp_init
      call parallel_barrier
#  endif
      CALL INIT_ARRAYS

      DEP  = DEP8
      IF (ics .eq. 2) THEN
        XP = XLON*RADDEG
        YP = YLAT*RADDEG
      ELSE
        XP = XPTMP
        YP = YPTMP
      END IF
# endif
      CALL COLLECT_ALL_IPLG
      CALL SETUP_ONED_SCATTER_ARRAY
#endif
      WLDEP=DEP
      IF (CART2LATLON) THEN
        XP = XP / 111111.
        YP = YP / 111111.
      ELSE IF (LATLON2CART) THEN
        XP = XP * 111111.
        YP = YP * 111111. 
      ELSE IF (CART2LATLON .AND. LATLON2CART) THEN
        CALL  WWM_ABORT('CART2LATLON .AND. LATLON2CART cannot be T')
      ENDIF 
      CALL INIT_SPATIAL_GRID
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INIT SPATIAL GRID'
        FLUSH(STAT%FHNDL)
      END IF      
      !
      ! Main inits done, now the secondary ones.
      !
#ifdef VDISLIN
      CALL INIT_DISLIN()
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INIT DISLIN                '
        FLUSH(STAT%FHNDL)
      END IF
#endif

      CALL CHECK_LOGICS
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'CHECK LOGICS                '
        FLUSH(STAT%FHNDL)
      END IF

      IF (LADVTEST) THEN
        ALLOCATE(UTEST(MNP), stat=istat)
        IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 33')
        UTEST = 0.
        CALL ADVTEST(UTEST)
        AC2(1,1,:) = UTEST
        CALL CHECKCONS(UTEST,SUMACt0)
!AR: check the advections test if it still works ...
        DEALLOCATE(UTEST)
      END IF
#ifdef MPI_PARALL_GRID
      CALL BUILD_WILD_ARRAY
#endif
      CALL BUILD_IPSTATUS
      CALL BUILD_TRIANGLE_CORRESPONDENCES
      CALL SET_IOBPD_BY_DEP
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'SET DEPTH POINTER'
        FLUSH(STAT%FHNDL)
      END IF

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INITIALIZE SPECTRAL GRID'
        FLUSH(STAT%FHNDL)
      END IF
      CALL INIT_SPECTRAL_GRID

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INITIALIZE BOUNDARY POINTER 1/2'
        FLUSH(STAT%FHNDL)
      END IF
#if defined SCHISM
!AR: let dmin free ...
!      DMIN = DMIN_SCHISM
#endif
      CALL SET_IOBP_NEXTGENERATION
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INITIALIZE BOUNDARY POINTER 2/2'
        FLUSH(STAT%FHNDL)
      END IF
      CALL SET_IOBPD

      IF (DIMMODE .EQ. 2) THEN
        IF (WRITESTATFLAG == 1) THEN
          WRITE(STAT%FHNDL,'("+TRACE...",A)') 'THE FLUCTUATION SPLITTING PREPROCESSOR HAS STARTED'
          FLUSH(STAT%FHNDL)
        END IF
        CALL INIT_FLUCT_ARRAYS
        CALL INIT_FLUCT

        IF (AMETHOD .EQ. 4 .OR. AMETHOD .EQ. 5) THEN
#ifdef PETSC
          CALL PETSC_INIT
#endif
        END IF
        IF (AMETHOD .EQ. 6) THEN
#if defined WWM_SOLVER && defined MPI_PARALL_GRID
          CALL WWM_SOLVER_INIT
#endif
        END IF
        IF (WRITESTATFLAG == 1) THEN
          WRITE(STAT%FHNDL,'("+TRACE...",A)') 'THE FLUCTUATION SPLITTING PREPROCESSOR HAS ENDED'
          FLUSH(STAT%FHNDL)
        END IF
      END IF

      IF (LZETA_SETUP) THEN
#ifdef WWM_SETUP
        CALL INIT_WAVE_SETUP
#else
        CALL WWM_ABORT('Need WWM_SEZUP if LZETA is selected')
#endif
      END IF

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INITIALIZE WIND CURRENT WATERLEVEL'
        FLUSH(STAT%FHNDL)
      END IF
#if !defined ROMS_WWM_PGMCL_COUPLING && !defined MODEL_COUPLING_ATM_WAV && !defined MODEL_COUPLING_OCN_WAV
      IF (LWINDFROMWWM) THEN
        CALL INIT_WIND_INPUT
      END IF
#endif
#ifdef SCHISM
      IF (.NOT. LWINDFROMWWM) THEN
        WINDXY(:,1) = WINDX0
        WINDXY(:,2) = WINDY0
      END IF
      ! BM: compute a ramp for wave forces starting
      !     from the open boundary
      IF (wafo_obcramp==1) THEN
        CALL READ_WAFO_OPBND_RAMP
      END IF
#endif
#if !defined ROMS_WWM_PGMCL_COUPLING && !defined MODEL_COUPLING_OCN_WAV
      IF (.NOT. LCPL) THEN
        CALL INIT_CURRENT_INPUT
        CALL INIT_WATLEV_INPUT
      END IF
#endif
     

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'COMPUTE THE WAVE PARAMETER'
        FLUSH(STAT%FHNDL)
      END IF
      CALL INITIATE_WAVE_PARAMETER
      CALL SETSHALLOW
      CALL SET_HMAX

      IF ( (MESIN .EQ. 1 .OR. MESDS .EQ. 1) .AND. SMETHOD .GT. 0 .AND. (LSOURCESWAM .OR. LSOURCESWWIII)) THEN
        CALL WWM_ABORT('DO NOT USE MESIN = 1 OR MESDS = 1 together with LSOURCESWAM .OR. LSOURCESWWIII')
      END IF

      IF ( (MESIN .EQ. 1 .OR. MESDS .EQ. 1) .AND. SMETHOD .GT. 0 .AND. .NOT. (LSOURCESWAM .OR. LSOURCESWWIII)) THEN
        IF (WRITESTATFLAG == 1) THEN
          WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INIT ARDHUIN et al.'
          FLUSH(STAT%FHNDL)
        END IF
#ifdef ST41
        CALL PREPARE_ARDHUIN_OLD
#elif ST42
        CALL PREPARE_ARDHUIN
#endif
      ENDIF
      
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'SET THE INITIAL WAVE BOUNDARY CONDITION'
        FLUSH(STAT%FHNDL)
      END IF
      CALL INIT_WAVE_BOUNDARY_CONDITION

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'SET THE INITIAL CONDITION'
        FLUSH(STAT%FHNDL)
      END IF
      CALL INITIAL_CONDITION
!      CALL Print_SumAC2("After INITIAL_CONDITION")

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INIT STATION OUTPUT'
        FLUSH(STAT%FHNDL)
      END IF
      CALL INIT_STATION_OUTPUT

      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'WRITING INITIAL TIME STEP'
        FLUSH(STAT%FHNDL)
      END IF
#ifdef MPI_PARALL_GRID
      CALL EXCHANGE_P4D_WWM(AC2)
#endif
      CALL WWM_OUTPUT(ZERO,.TRUE.)
      IF (LWXFN) THEN
        CALL WRINPGRD_XFN
      ELSE IF(LWSHP) THEN
        CALL WRINPGRD_SHP
      END IF
#if !defined SCHISM && !defined ROMS_WWM_PGMCL_COUPLING && !defined MODEL_COUPLING_ATM_WAV && !defined MODEL_COUPLING_OCN_WAV
      IF (LCPL) THEN
        IF (WRITESTATFLAG == 1) THEN
          WRITE(STAT%FHNDL,'("+TRACE...",A)') 'OPEN PIPES FOR COUPLING'
          FLUSH(STAT%FHNDL)
        END IF
        IF (LTIMOR) THEN
          CALL INIT_PIPES_TIMOR()
#ifdef SHYFEM_COUPLING
        ELSE IF (LSHYFEM) THEN
          CALL INIT_PIPES_SHYFEM()
#endif
        ELSE IF (LROMS) THEN
          CALL INIT_PIPES_ROMS()
        END IF
      END IF
#endif
#ifdef ROMS_WWM_PGMCL_COUPLING
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'Before ROMS_COUPL_INITIALIZE'
        FLUSH(STAT%FHNDL)
      END IF
      CALL WWM_common_coupl_initialize
      CALL WWM_a_OCN_COUPL_INITIALIZE
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'After ROMS_COUPL_INITIALIZE'
        FLUSH(STAT%FHNDL)
      END IF
#endif
#if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'Before WAV_common_initialize'
        FLUSH(STAT%FHNDL)
      END IF
      CALL WAV_common_initialize
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)') 'After WAV_common_initialize'
        FLUSH(STAT%FHNDL)
      END IF
#endif
#ifdef TIMINGS
      CALL WAV_MY_WTIME(TIME2)
#endif

#if defined SCHISM
      IF (MSC_SCHISM .NE. MSC .OR. MDC_SCHISM .NE. MDC) THEN
        IF (WRITEDBGFLAG == 1) THEN
          WRITE(DBG%FHNDL,*) 'MSC_SCHISM', MSC_SCHISM
          WRITE(DBG%FHNDL,*) 'MSC', MSC
          WRITE(DBG%FHNDL,*) 'MDC_SCHISM', MDC_SCHISM
          WRITE(DBG%FHNDL,*) 'MDC', MDC
          FLUSH(DBG%FHNDL)
        END IF        
        CALL PARALLEL_ABORT('THERE IS AND ERROR IN MSC2 OR MDC2 IN PARAM.IN')
      END IF
#endif

      IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)') 'INITIALIZE_WWM'
#ifdef TIMINGS
      IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A,F15.4)') 'CPU Time for the preprocessing', TIME2-TIME1
#endif
      IF (WRITESTATFLAG == 1) FLUSH(STAT%FHNDL)
      AC1 = AC2
      IF (IROLLER == 1) EROL1 = EROL2
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE TERMINATE_WWM
#ifdef ROMS_WWM_PGMCL_COUPLING
       USE WWMaOCN_PGMCL
#endif
#if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
       USE pgmcl_lib_WWM, only : WAV_all_deallocate
#endif
       USE DATAPOOL
#ifdef ST41
       USE W3SRC4MD_OLD
#endif
#ifdef ST42
       USE W3SRC4MD
#endif

#ifdef PETSC
       USE PETSC_CONTROLLER, ONLY : PETSC_FINALIZE
#endif

       CALL CLOSE_FILE_HANDLES
       CALL DEALLOC_ARRAYS

#ifdef MPI_PARALL_GRID
       CALL DEALLOC_WILD_ARRAY
#endif
       IF (DIMMODE .EQ. 2) THEN
         CALL DEALLOC_FLUCT_ARRAYS
         CALL DEALLOC_FLUCT

         IF (AMETHOD .EQ. 4 .OR. AMETHOD .EQ. 5) THEN
#ifdef PETSC
           CALL PETSC_FINALIZE
#endif
         END IF
       END IF
       IF (LZETA_SETUP) THEN
         CALL FINALIZE_WAVE_SETUP
       END IF
       CALL DEALLOC_SPECTRAL_GRID
       CALL CLOSE_IOBP
       CALL TERMINATE_STATION_OUTPUT

#if !defined SCHISM && !defined ROMS_WWM_PGMCL_COUPLING && !defined MODEL_COUPLING_ATM_WAV && !defined MODEL_COUPLING_OCN_WAV
       IF (LCPL) THEN
         IF (LTIMOR) THEN
           CALL TERMINATE_PIPES_TIMOR()
# ifdef SHYFEM_COUPLING
         ELSE IF (LSHYFEM) THEN
           CALL TERMINATE_PIPES_SHYFEM()
# endif
         ELSE IF (LROMS) THEN
           CALL TERMINATE_PIPES_ROMS()
         END IF
       END IF
#endif
#ifdef ROMS_WWM_PGMCL_COUPLING
       CALL WWM_a_OCN_COUPL_DEALLOCATE
#endif
#if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
       CALL WAV_all_deallocate
#endif
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
#ifdef MPI_PARALL_GRID 
       SUBROUTINE BUILD_WILD_ARRAY
       USE DATAPOOL, only : MNP, NP_RES, ONE, rkind
       USE DATAPOOL, only : nwild_gb, nwild_loc, nwild_loc_res
       USE datapool, only : iplg, np_global
       USE datapool, only : istatus, itype, comm, ierr, myrank, rtype, nproc
       use datapool, only : MPI_SUM
       IMPLICIT NONE
       integer, allocatable :: nwild_i(:), nwild_gbi(:)
       integer :: iProc, istat
       INTEGER :: IP
       real(rkind), allocatable :: nwild_gb_res(:)
       ALLOCATE(nwild_i(np_global), nwild_gbi(np_global), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 33')
       !
       nwild_i=0
       nwild_gbi=0
       DO IP=1,MNP
         nwild_i(IPLG(IP))=1
       END DO
       call mpi_reduce(nwild_i,nwild_gbi,NP_GLOBAL,itype,MPI_SUM,0,comm,ierr)
       ALLOCATE(nwild_gb(NP_GLOBAL), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 34')
       IF (myrank.eq.0) THEN
         DO IP=1,NP_GLOBAL
           nwild_gb(IP)=ONE/MyREAL(nwild_gbi(IP))
         END DO
         DO iProc=2,nproc
           CALL MPI_SEND(nwild_gb,np_global,rtype, iProc-1, 2037, comm, ierr)
         END DO
       ELSE
         CALL MPI_RECV(nwild_gb,np_global,rtype, 0, 2037, comm, istatus, ierr)
       END IF
       ALLOCATE(nwild_loc(MNP), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 35')
       DO IP=1,MNP
         nwild_loc(IP)=nwild_gb(iplg(IP))
       END DO
       IF (myrank.ne.0) THEN
         deallocate(nwild_gb)
       END IF
       !
       nwild_i=0
       nwild_gbi=0
       DO IP=1,NP_RES
         nwild_i(IPLG(IP))=1
       END DO
       call mpi_reduce(nwild_i,nwild_gbi,NP_GLOBAL,itype,MPI_SUM,0,comm,ierr)
       ALLOCATE(nwild_gb_res(NP_GLOBAL), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 36')
       IF (myrank.eq.0) THEN
         DO IP=1,NP_GLOBAL
           nwild_gb_res(IP)=ONE/MyREAL(nwild_gbi(IP))
         END DO
         DO iProc=2,nproc
           CALL MPI_SEND(nwild_gb_res,np_global,rtype, iProc-1, 277, comm, ierr)
         END DO
       ELSE
         CALL MPI_RECV(nwild_gb_res,np_global,rtype, 0, 277, comm, istatus, ierr)
       END IF
       ALLOCATE(nwild_loc_res(NP_RES), stat=istat)
       IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 37')
       DO IP=1,NP_RES
         nwild_loc_res(IP)=nwild_gb_res(iplg(IP))
       END DO
       deallocate(nwild_gb_res)
       !
       DEALLOCATE(nwild_i)
       DEALLOCATE(nwild_gbi)
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE DEALLOC_WILD_ARRAY
!AR: what is this kind of shit ?
       USE DATAPOOL
       implicit none
       DEALLOCATE(nwild_loc)
       DEALLOCATE(nwild_loc_res)
       END SUBROUTINE
#endif
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE BASIC_PARAMETER
         USE DATAPOOL
         IMPLICIT NONE

         INTEGER :: IP
         REAL(rkind)    :: PPTAIL
!
!2do: Check with WAM parameterization and WW3
!
         PQUAD(1) = 0.25
         IF (MESIN .EQ. 1) THEN
           PQUAD(2) = 2.5E7
         ELSE
           PQUAD(2) = 2.78E7
         END IF
         PQUAD(3) = 5.5_rkind
         PQUAD(4) = 6._rkind/7._rkind
         PQUAD(5) = -1.25_rkind
         PQUAD(6) = zero
!
! High frequency tail integration factors as defined in the SWAN model.
!
         PTAIL(1) = 4._rkind
         PTAIL(2) = 2.5_rkind
         PTAIL(3) = PTAIL(1) + 1._rkind
         IF (MESIN .EQ. 2) THEN
           PTAIL(1) = 5._rkind
           PTAIL(3) = PTAIL(1) + 1._rkind
         ENDIF
         PTAIL(4) = 3._rkind
         DO IP = 0, 3
           PPTAIL = PTAIL(1) - MyREAL(IP)
           PTAIL(5+IP) = 1. / (PPTAIL * (1. + PPTAIL * (FRINTH-1.)))
         ENDDO
!
! Output Variables ... LVARS, NVARS
!
         OUTT_VARNAMES(1)  = 'HS'
         OUTT_VARNAMES(2)  = 'TM01'
         OUTT_VARNAMES(3)  = 'TM02'
         OUTT_VARNAMES(4)  = 'TM10'
         OUTT_VARNAMES(5)  = 'KLM'
         OUTT_VARNAMES(6)  = 'WLM'
         OUTT_VARNAMES(7)  = 'ETOTS'
         OUTT_VARNAMES(8)  = 'ETOTC'
         OUTT_VARNAMES(9)  = 'DM'
         OUTT_VARNAMES(10)  = 'DSPR'
         OUTT_VARNAMES(11) = 'TPPD'
         OUTT_VARNAMES(12) = 'TPP'
         OUTT_VARNAMES(13) = 'CPP'
         OUTT_VARNAMES(14) = 'WNPP'
         OUTT_VARNAMES(15) = 'CGPP'
         OUTT_VARNAMES(16) = 'KPP'
         OUTT_VARNAMES(17) = 'LPP'
         OUTT_VARNAMES(18) = 'PEAKD'
         OUTT_VARNAMES(19) = 'PEAKDSPR'
         OUTT_VARNAMES(20) = 'DPEAK'
         OUTT_VARNAMES(21) = 'UBOT'
         OUTT_VARNAMES(22) = 'ORBITAL'
         OUTT_VARNAMES(23) = 'BOTEXPER'
         OUTT_VARNAMES(24) = 'TMBOT'
         OUTT_VARNAMES(25) = 'URSELL'
         OUTT_VARNAMES(26) = 'USTAR'
         OUTT_VARNAMES(27) = 'ALPHA'
         OUTT_VARNAMES(28) = 'Z0'
         OUTT_VARNAMES(29) = 'WIND-X'
         OUTT_VARNAMES(30) = 'WIND-Y'
         OUTT_VARNAMES(31) = 'CD'
         OUTT_VARNAMES(32) = 'CURR-X'
         OUTT_VARNAMES(33) = 'CURR-Y'
         OUTT_VARNAMES(34) = 'DEPTH'
         OUTT_VARNAMES(35) = 'ELEVATION'
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE INITIATE_WAVE_PARAMETER
         USE DATAPOOL, ONLY: STAT, LSTCU, LSECU, MESNL, SPSIG, SPDIR, MSC, MDC, DELALP
         USE DATAPOOL, ONLY: G9, DEP, MNP, MESTR, LSOURCESWWIII, LSOURCESWAM, DELTAIL
         USE DATAPOOL, ONLY: LPRECOMP_EXIST, TAUHFT, TAUHFT2, TAUT, DELU, DELTAUW, DELUST
         USE DATAPOOL, ONLY: IPHYS, MESIN, SMETHOD, WRITESTATFLAG
#ifdef MPI_PARALL_GRID
         USE DATAPOOL, ONLY: MYRANK,COMM
#endif
         USE M_CONSTANTS
         USE M_XNLDATA
         USE M_FILEIO

         IMPLICIT NONE
         INTEGER IQGRID, INODE, IERR

         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'START WAVE PARAMETER'
           FLUSH(STAT%FHNDL)
         END IF

         CALL GRADDEP
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'GRADDEP'
           FLUSH(STAT%FHNDL)
         END IF

         IF (LSTCU .OR. LSECU) CALL GRADCURT
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'GRADCURT'
           FLUSH(STAT%FHNDL)
         END IF

         CALL BASIC_PARAMETER
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'BASIC'
           FLUSH(STAT%FHNDL)
         END IF

         CALL MAKE_WAVE_TABLE
         CALL WAVE_K_C_CG
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'WAVEKCG'
           FLUSH(STAT%FHNDL)
         END IF

         IF (.NOT. (LSOURCESWAM .OR. LSOURCESWWIII) .AND. SMETHOD .GT. 0) THEN
           IF (MESNL .LT. 5) THEN
             CALL PARAMETER4SNL
           ELSE IF (MESNL .EQ. 5) THEN
             IQGRID = 3
             INODE  = 1
             CALL XNL_INIT(REAL(SPSIG),REAL(SPDIR),MSC,MDC,-4.0,REAL(G9),REAL(DEP),MNP,1,IQGRID,INODE,IERR)
             CALL INIT_CONSTANTS
             CALL XNL_INIT(REAL(SPSIG),REAL(SPDIR),MSC,MDC,-4.0,REAL(G9),REAL(DEP),MNP,1,IQGRID,INODE,IERR)
             IF (IERR .GT. 0) CALL WWM_ABORT('IERR XNL_INIT')
           ENDIF
         ELSE IF (LSOURCESWAM .AND. .NOT. LSOURCESWWIII) THEN
           IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)')'COMPUTING NONLINEAR COEFFICIENTS' 
           CALL NLWEIGT
           IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)')'COMPUTING NONLINEAR COEFFICIENTS'
           CALL INISNONLIN
           INQUIRE(FILE='fort.5011',EXIST=LPRECOMP_EXIST)
#ifdef MPI_PARALL_GRID
           CALL MPI_BARRIER(COMM, ierr)
#endif
           IF (LPRECOMP_EXIST) THEN
             IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)')'READING STRESS TABLES'
             OPEN(5011, FILE='fort.5011', FORM='UNFORMATTED') 
             IF (IPHYS == 0) THEN
               READ(5011) DELU, DELTAUW
               READ(5011) TAUT
               READ(5011) DELALP, DELUST, DELTAIL
               READ(5011) TAUHFT
             ELSE
               READ(5011) DELU, DELTAUW
               READ(5011) TAUT
               READ(5011) DELALP, DELUST, DELTAIL
               READ(5011) TAUHFT, TAUHFT2
             ENDIF
           ELSE
             !WRITE(*,*) SIZE(TAUT)
             !WRITE(*,*) SIZE(TAUHFT)
             IF (MESIN .GT. 0) THEN 
               IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)')'COMPUTING STRESS TABLES'
               CALL STRESS
               IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,'("+TRACE...",A)')'COMPUTING HF TABLES'
               CALL TAUHF_WAM(MSC)
             ENDIF
           ENDIF

           IF (WRITESTATFLAG == 1) THEN
             WRITE(STAT%FHNDL,'("+TRACE...",A)')'INITIALIZING STRESS ARRAYS'
             FLUSH(STAT%FHNDL)
           END IF           
           IF (MESIN .GT. 0) CALL BUILDSTRESS
         ELSE IF (LSOURCESWWIII .AND. .NOT. LSOURCESWAM) THEN
         ENDIF

         IF (MESTR == 6) CALL GRAD_CG_K 
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE INITIAL_CONDITION
       USE WWM_HOTFILE_MOD
       USE DATAPOOL
#ifdef NCDF
       USE NETCDF
#endif
       IMPLICIT NONE
       INTEGER         :: IP, I, K, L, M, IS, ID
       REAL(rkind)     :: SPPAR(8)
       REAL(rkind)     :: MS
       REAL(rkind)     :: HS, TP, HSLESS, TPLESS, FDLESS
       REAL(rkind)     :: WIND10, WINDTH, VEC2DEG
       REAL(rkind)     :: WINDX, WINDY
       REAL(rkind)     :: ACLOC(MSC,MDC)
       REAL(rkind)     :: DEG
       REAL(rkind)     :: TMPPAR(8,MNP), SSBRL(MSC,MDC)
#ifdef NCDF
       CHARACTER(len=25) :: CALLFROM
#endif
       TMPPAR = 0.
       IF (.NOT. LHOTR .AND. LINID) THEN
         IF (INITSTYLE == 2 .AND. IBOUNDFORMAT == 3) THEN
#ifdef NCDF
           CALL READ_NETCDF_WW3_PARAM
#else
           CALL WWM_ABORT('compile with DNCDF PPFLAG')
#endif
           CALL INTER_STRUCT_DOMAIN(NDX_BND,NDY_BND,DX_BND,DY_BND,OFFSET_X_BND,OFFSET_Y_BND,TMPPAR)
!test the initial conditions ...
           WRITE(2001) 1.
           WRITE(2001) (TMPPAR(3,IP), TMPPAR(2,IP), TMPPAR(1,IP), IP = 1, MNP)
         END IF
         DO IP = 1, MNP
           !WRITE(*,*) 'wwm_initio.F90 l.1022', IP, SUM(AC2(:,:,IP))
           IF (ABS(IOBP(IP)) .GT. 0 .AND. .NOT. LSOUBOUND) THEN
             AC2(:,:,IP) = ZERO
             CYCLE
           ENDIF
           ACLOC = 0.
           WINDX  = WINDXY(IP,1)
           WINDY  = WINDXY(IP,2)
           WIND10 = SQRT(WINDX**2+WINDY**2)
           IF(DEP(IP) .GT. DMIN) THEN
             IF (DIMMODE .EQ. 1 .AND. IP .EQ. 1) CYCLE
             IF (INITSTYLE == 1) THEN
               IF (WIND10 .GT. 1.) THEN !AR: why one? 
                 WINDTH = VEC2DEG(WINDX,WINDY)
                 CALL DEG2NAUT(WINDTH, DEG, LNAUTIN)
                 FDLESS = G9*AVETL/WIND10**2
                 HSLESS = MIN(0.21_rkind, 0.00288_rkind*FDLESS**0.45_rkind)
                 TPLESS = MIN(ONE/0.13_rkind, 0.46_rkind*FDLESS**0.27_rkind)
                 HS = HSLESS*WIND10**2/G9
                 TP = TPLESS*WIND10/G9
                 MS = 2.0_rkind
                 SPPAR(1) = HS
                 SPPAR(2) = TP ! Check whether TP is inside of spectal representation !!!
                 SPPAR(3) = DEG
                 SPPAR(4) = MS
                 SPPAR(5) = 2.
                 SPPAR(6) = 2.
                 SPPAR(7) = 0.1
                 SPPAR(8) = 3.3
                 CALL SPECTRAL_SHAPE(SPPAR,ACLOC,.FALSE.,'INITIAL CONDITION PARA', .FALSE.)
                 AC2(:,:,IP) = ACLOC
               ELSE
                 ACLOC = 1.E-8
               END IF
             ELSE IF (INITSTYLE == 2 .AND. IBOUNDFORMAT == 3) THEN
               TMPPAR(5,IP) = 2.
               TMPPAR(6,IP) = 1.
               TMPPAR(7,IP) = 0.1
               TMPPAR(8,IP) = 3.3
               CALL SPECTRAL_SHAPE(TMPPAR(:,IP),ACLOC,.FALSE.,'INITIAL CONDITION WW3', .FALSE.)
               AC2(:,:,IP) = ACLOC
             ELSE IF (INITSTYLE == 3) THEN
               OPEN(1113,FILE='fort.10003',STATUS='OLD')
               DO ID=1,MDC
                 DO IS=1,MSC
                   READ(1113,*) K, M, AC2(IS,ID,IP)
                   AC2(IS,ID,IP) =  AC2(IS,ID,IP) / PI2 / SPSIG(IS)
                 ENDDO
               ENDDO
               REWIND(1113)
             END IF ! INITSTYLE
             IF (LMAXETOT .AND. ISHALLOW(IP) .EQ. 1) CALL BREAK_LIMIT(IP,ACLOC,SSBRL) ! Miche for initial cond.
           ELSE
             FDLESS      = 0.
             HS          = 0.
             TP          = 0.
             WINDTH      = 0.
             AC2(:,:,IP) = 0.
           END IF ! DEP(IP) .GT. DMIN .AND. WIND10 .GT. SMALL
         END DO ! IP
       ELSE IF (LHOTR .AND. .NOT. LINID) THEN
         CALL INPUT_HOTFILE
       END IF
       CALL SET_WAVE_BOUNDARY
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE INIT_FILE_HANDLES()
         USE DATAPOOL
         IMPLICIT NONE
#ifdef MPI_PARALL_GRID
         CHARACTER (LEN = 30) :: FDB
         INTEGER              :: LFDB
#endif
            CHK%FNAME  = 'wwmcheck.nml'
           QSTEA%FNAME = 'qstea.out'
         WINDBG%FNAME  = 'winddbg.out'
#if defined DEBUG && defined IOBPDOUT
         IOBPOUT%FNAME = 'iobp.out'
        IOBPDOUT%FNAME = 'iobpd.out'
#endif
        SRCDBG%FNAME = 'srcdbg.out'
!
!2do ... dinstinguish between binary and ascii stuff ...
!
             BND%FHNDL  = STARTHNDL + 1
             WIN%FHNDL  = STARTHNDL + 2
             CUR%FHNDL  = STARTHNDL + 3
             WAT%FHNDL  = STARTHNDL + 4
             WAV%FHNDL  = STARTHNDL + 5
             CHK%FHNDL  = STARTHNDL + 6
           HOTIN%FHNDL  = STARTHNDL + 7
          HOTOUT%FHNDL  = STARTHNDL + 8
             INP%FHNDL  = STARTHNDL + 9
             GRD%FHNDL  = STARTHNDL + 10
          GRDCOR%FHNDL  = STARTHNDL + 11

           IF (LQSTEA) QSTEA%FHNDL  = STARTHNDL + 12

#if defined DEBUG && defined IOBPDOUT
         IOBPOUT%FHNDL  = STARTHNDL + 13
         IOBPDOUT%FHNDL = STARTHNDL + 14
#endif

         DBG%FHNDL      = STARTHNDL + 15 
         STAT%FHNDL     = STARTHNDL + 16 
         WINDBG%FHNDL   = STARTHNDL + 17 
         SRCDBG%FHNDL   = STARTHNDL + 18

         IU06           = STAT%FHNDL

#ifndef MPI_PARALL_GRID
         open(DBG%FHNDL,file='wwmdbg.out',status='unknown') !non-fatal errors
         open(STAT%FHNDL,file='wwmstat.out',status='unknown') !non-fatal errors
         open(WINDBG%FHNDL,file='windbg.out',status='unknown') !non-fatal errors
         open(SRCDBG%FHNDL,file='srcdbg.out',status='unknown') !non-fatal errors
#else
# ifdef SCHISM
         IF (WRITEDBGFLAG == 1) THEN
           FDB  ='wwmdbg_000000'
           LFDB =len_trim(FDB)
           write(FDB(LFDB-5:LFDB),'(i6.6)') MYRANK
           open(DBG%FHNDL,file='outputs/'//fdb,status='replace')
         END IF
         IF (WRITESTATFLAG == 1) THEN
           FDB  ='wwmstat_000000'
           LFDB =len_trim(FDB)
           write(FDB(LFDB-5:LFDB),'(i6.6)') MYRANK
           open(STAT%FHNDL,file='outputs/'//fdb,status='replace') 
         END IF
         IF (WRITEWINDBGFLAG == 1) THEN
           FDB  ='windbg_000000'
           LFDB =len_trim(FDB)
           write(FDB(LFDB-5:LFDB),'(i6.6)') MYRANK
           open(WINDBG%FHNDL,file='outputs/'//fdb,status='replace') 
         END IF
# else
         FDB  ='wwmdbg_0000'
         LFDB =len_trim(FDB)
         write(FDB(LFDB-3:LFDB),'(i4.4)') MYRANK
         open(DBG%FHNDL,file=fdb,status='replace') 
         FDB  ='wwmstat_0000'
         LFDB =len_trim(FDB)
         write(FDB(LFDB-3:LFDB),'(i4.4)') MYRANK
         open(STAT%FHNDL,file=fdb,status='replace') 
         FDB  ='windbg_0000'
         LFDB =len_trim(FDB)
         write(FDB(LFDB-3:LFDB),'(i4.4)') MYRANK
         open(WINDBG%FHNDL,file=fdb,status='replace')
# endif
#endif

         IF (WRITEDBGFLAG == 1) THEN
           WRITE(DBG%FHNDL, *) 'THR=', THR
           WRITE(DBG%FHNDL, *) 'THR8=', THR8
         END IF
         CALL TEST_FILE_EXIST_DIE("Missing input file : ", TRIM(INP%FNAME))
#ifdef MPIP_PARALL_GRID
         IF (myrank == 0) THEN
#endif
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'Input Filename   =', TRIM(INP%FNAME)
           WRITE(STAT%FHNDL,*) 'Check Filename   =', TRIM(CHK%FNAME)
           WRITE(STAT%FHNDL,*) 'Qstea Filename   =', TRIM(QSTEA%FNAME)
         END IF         
#if defined DEBUG && defined IOBPDOUT
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'Iobp Filename    =', TRIM(IOBPOUT%FNAME)
           WRITE(STAT%FHNDL,*) 'Iobpd Filename   =', TRIM(IOBPDOUT%FNAME)
         END IF         
#endif
         IF (WRITESTATFLAG == 1) THEN
           WRITE(STAT%FHNDL,*) 'WindDbg Filename =', TRIM(WINDBG%FNAME)
         END IF         
#ifdef MPIP_PARALL_GRID
         ENDIF
#endif
         CALL TEST_FILE_EXIST_DIE("Missing input file : ", INP%FNAME)
         OPEN( INP%FHNDL,      FILE = TRIM(INP%FNAME))
         OPEN( CHK%FHNDL,      FILE = TRIM(CHK%FNAME))
         IF (LQSTEA) OPEN( QSTEA%FHNDL,    FILE = TRIM(QSTEA%FNAME))
#if defined DEBUG && defined IOBPDOUT
         OPEN( IOBPOUT%FHNDL,  FILE = TRIM(IOBPOUT%FNAME))
         OPEN( IOBPDOUT%FHNDL, FILE = TRIM(IOBPDOUT%FNAME))
#endif

           OUT1D%FHNDL = STARTHNDL + 19 
            MISC%FHNDL = STARTHNDL + 20 
         OUTSP1D%FHNDL = STARTHNDL + 21 
         OUTPARM%FHNDL = STARTHNDL + 22 
         OUTSP2D%FHNDL = STARTHNDL + 23 

         OUT%FHNDL     = STARTHNDL + 24
         
       FHNDL_EXPORT_BOUC_WW3 = STARTHNDL + 25
       FHNDL_EXPORT_WIND_WW3 = STARTHNDL + 26
       FHNDL_EXPORT_CURR_WW3 = STARTHNDL + 27
       FHNDL_EXPORT_WALV_WW3 = STARTHNDL + 28
       FHNDL_EXPORT_GRID_WW3 = STARTHNDL + 29

         
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
       SUBROUTINE CLOSE_FILE_HANDLES
         USE DATAPOOL
         IMPLICIT NONE
         close(DBG%FHNDL)
         close(STAT%FHNDL)
         IF (LQSTEA) close( QSTEA%FHNDL)
#if defined DEBUG && defined IOBPDOUT
         close( IOBPOUT%FHNDL)
         close( IOBPDOUT%FHNDL)
#endif
         close( WINDBG%FHNDL)
       END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE INIT_STATION_OUTPUT
      USE DATAPOOL
      IMPLICIT NONE
      INTEGER           :: I, NI(3), IP, IS
      REAL(rkind)              :: XYTMP(2,MNP)
#ifdef MPI_PARALL_GRID
      integer :: iProc
      integer :: rbuf_int(1)
#endif
!
!    set the site output
!
      IF (LOUTS) THEN
        ALLOCATE (ACLOC_STATIONS(MSC,MDC,IOUTS), CDLOC_STATIONS(IOUTS), Z0LOC_STATIONS(IOUTS), stat=istat)
        IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 38')

        ALLOCATE (ALPHALOC_STATIONS(IOUTS), WINDXLOC_STATIONS(IOUTS), WINDYLOC_STATIONS(IOUTS), USTARLOC_STATIONS(IOUTS), stat=istat)
        IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 39')

        ALLOCATE (DEPLOC_STATIONS(IOUTS), WKLOC_STATIONS(IOUTS,MSC), CURTXYLOC_STATIONS(IOUTS,2), WATLEVLOC_STATIONS(IOUTS), stat=istat)
        IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 40')
        ACLOC_STATIONS      = 0.
        DEPLOC_STATIONS     = 0.
        WKLOC_STATIONS      = 0.
        CURTXYLOC_STATIONS  = 0.
        USTARLOC_STATIONS   = 0.
        CDLOC_STATIONS      = 0.
        Z0LOC_STATIONS      = 0.
        WINDXLOC_STATIONS   = 0.
        WINDYLOC_STATIONS   = 0.
        WATLEVLOC_STATIONS  = 0.
      END IF
      IF (LOUTS .and. (DIMMODE .EQ. 2)) THEN
#ifdef MPI_PARALL_GRID
        XYTMP(1,:) = XP
        XYTMP(2,:) = YP
        IF (WRITEDBGFLAG == 1) WRITE(DBG%FHNDL,*) 'SEARCHING FOR STATION ACROSS RANKS', myrank
        DO I = 1, IOUTS
          STATION(I)%ELEMENT=0
          CALL FIND_ELE ( MNE,MNP,INE,XYTMP,STATION(I)%XCOORD, STATION(I)%YCOORD,STATION(I)%ELEMENT )
          IF (STATION(I)%ELEMENT .GT. 0) THEN
            STATION(I)%IFOUND  = 1
            NI                 = INE(:,STATION(I)%ELEMENT)
            STATION(I)%XELE(:) = XP(NI)
            STATION(I)%YELE(:) = YP(NI)
            CALL INTELEMENT_COEF(XP(NI),YP(NI), STATION(I)%XCOORD,STATION(I)%YCOORD, STATION(I)%WI)
            IF (WRITEDBGFLAG == 1) THEN
              WRITE(DBG%FHNDL,'(A10,I10,A20,I10,A15,2I10)') 'MYRANK', MYRANK, 'STATION =',I, 'IN ELEMENT =',STATION(I)%IFOUND
              FLUSH(DBG%FHNDL)
            END IF
          ELSE
            STATION(I)%IFOUND  = 0
            NI                 = 0
            STATION(I)%XELE(:) = 0.
            STATION(I)%YELE(:) = 0.
            IF (WRITEDBGFLAG == 1) THEN
              WRITE(DBG%FHNDL,'(A10,I10,A20,I10,A15,2I10)') 'MYRANK', MYRANK, 'STATION =',I, 'IN ELEMENT =', &
                            & STATION(I)%ELEMENT, STATION(I)%IFOUND
              FLUSH(DBG%FHNDL)
            END IF
          END IF
        END DO
        DO I = 1, IOUTS
          CALL MPI_REDUCE(STATION(I)%IFOUND,STATION(I)%ISUM,1, itype,MPI_SUM,0,COMM,IERR)
          IF (myrank == 0) THEN
            IF (WRITEDBGFLAG == 1) THEN
              WRITE(DBG%FHNDL,'(A30,3I10)') 'SUM OF THE FOUND STATIONS MYRANK', MYRANK, I, STATION(I)%ISUM
              FLUSH(DBG%FHNDL)
            END IF
            rbuf_int(1)=STATION(I)%ISUM
            DO iProc=2,nproc
              CALL MPI_SEND(rbuf_int,1,itype, iProc-1, 144, COMM, ierr)
            ENDDO
          ELSE
            CALL MPI_RECV(rbuf_int,1,itype, 0, 144, COMM, istatus, ierr)
            STATION(I)%ISUM=rbuf_int(1)
          END IF
        END DO
        IF (myrank == 0 .AND. WRITEDBGFLAG == 1) THEN
          DO I = 1, IOUTS
            IF (STATION(I)%ISUM .EQ. 0) THEN
              WRITE(DBG%FHNDL,'(A20,I10,A10,2F15.8)') 'STATION NOT FOUND', I, STATION(I)%NAME, STATION(I)%XCOORD, STATION(I)%YCOORD
            ELSE
              WRITE(DBG%FHNDL,'(A25,I10,A10,2F15.8)') 'STATION FOUND    ', I, STATION(I)%NAME, STATION(I)%XCOORD, STATION(I)%YCOORD
            END IF
          END DO
        END IF
        ALLOCATE (DEPLOC_SUM(IOUTS), WKLOC_SUM(IOUTS,MSC), CURTXYLOC_SUM(IOUTS,2), ACLOC_SUM(MSC,MDC,IOUTS), USTAR_SUM(IOUTS), ALPHA_SUM(IOUTS), WINDY_SUM(IOUTS), WINDX_SUM(IOUTS), Z0_SUM(IOUTS), CD_SUM(IOUTS), WATLEVLOC_SUM(IOUTS), stat=istat)
        IF (istat/=0) CALL WWM_ABORT('wwm_initio, allocate error 42')
        ACLOC_SUM           = 0.
        WKLOC_SUM           = 0.
        DEPLOC_SUM          = 0.
        CURTXYLOC_SUM       = 0.
        USTAR_SUM           = 0.
        CD_SUM              = 0.
        Z0_SUM              = 0.
        WINDX_SUM           = 0.
        WINDY_SUM           = 0.
        WATLEVLOC_SUM = 0.
#else
        XYTMP(1,:) = XP
        XYTMP(2,:) = YP
        IF (DIMMODE .EQ. 2) THEN
          IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,*) 'FINDING ELEMENT CONNECTED TO STATION'
          DO I = 1, IOUTS
            STATION(I)%ELEMENT=0
            CALL FIND_ELE ( MNE,MNP,INE,XYTMP,STATION(I)%XCOORD, STATION(I)%YCOORD,STATION(I)%ELEMENT )
            IF (STATION(I)%ELEMENT == 0) THEN
              STATION(I)%IFOUND = 0
              IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,*) STATION(I)%NAME, STATION(I)%XCOORD, STATION(I)%YCOORD, ' is out of mesh !'
            ELSE
              STATION(I)%IFOUND = 1
              NI = INE(:,STATION(I)%ELEMENT)
              STATION(I)%XELE(:) = XP(NI)
              STATION(I)%YELE(:) = YP(NI)
              CALL INTELEMENT_COEF(XP(NI),YP(NI), STATION(I)%XCOORD,STATION(I)%YCOORD, STATION(I)%WI)
              IF (WRITESTATFLAG == 1) WRITE(STAT%FHNDL,*)'Site    ',STATION(I)%NAME, STATION(I)%XCOORD,STATION(I)%YCOORD,STATION(I)%IFOUND
            END IF
          END DO
        END IF
#endif
        STATION(:)%ISMAX = MSC
        IF (LSIGMAX) THEN
          DO IP = 1, IOUTS
            DO IS = 1, MSC
              IF (SPSIG(IS)/PI2 .GT. STATION(IP)%CUTOFF) THEN
                STATION(IP)%ISMAX = IS - 1
                EXIT
              END IF
            END DO
            IF (WRITEDBGFLAG == 1) WRITE(DBG%FHNDL,*) 'CUT-OFF FREQ. OF STATION =', IP, STATION(IP)%CUTOFF, 'RAD - IS =', STATION(IP)%ISMAX
          END DO
        END IF
      END IF
      IF (WRITESTATFLAG == 1) THEN
        WRITE(STAT%FHNDL,'("+TRACE...",A)')'FINISHED WITH INIT_STATION_OUTPUT'
        FLUSH(STAT%FHNDL)
      END IF      
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE TERMINATE_STATION_OUTPUT
      USE DATAPOOL
      IMPLICIT NONE
      IF (LOUTS) THEN
        DEALLOCATE (ACLOC_STATIONS)
        DEALLOCATE (CDLOC_STATIONS)
        DEALLOCATE (Z0LOC_STATIONS)
        DEALLOCATE (ALPHALOC_STATIONS)
        DEALLOCATE (WINDXLOC_STATIONS)
        DEALLOCATE (WINDYLOC_STATIONS)
        DEALLOCATE (USTARLOC_STATIONS)
        DEALLOCATE (DEPLOC_STATIONS)
        DEALLOCATE (WKLOC_STATIONS)
        DEALLOCATE (CURTXYLOC_STATIONS)
        DEALLOCATE (WATLEVLOC_STATIONS)
#ifdef MPI_PARALL_GRID
        DEALLOCATE (DEPLOC_SUM)
        DEALLOCATE (WKLOC_SUM)
        DEALLOCATE (CURTXYLOC_SUM)
        DEALLOCATE (ACLOC_SUM)
        DEALLOCATE (USTAR_SUM, ALPHA_SUM)
        DEALLOCATE (WINDY_SUM, WINDX_SUM)
        DEALLOCATE (Z0_SUM, CD_SUM, WATLEVLOC_SUM)
#endif
      END IF
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE READWAVEPARWWM
      USE DATAPOOL
      IMPLICIT NONE
      INTEGER         :: IP
#ifdef MPI_PARALL_GRID
      INTEGER         :: IPP
      REAL(rkind)     :: RTMP
#endif

!     SPPARM(1): Hs, sign. wave height
!     SPPARM(2): Wave period given by user (either peak or mean)
!     SPPARM(3): average direction
!     SPPARM(4): directional spread
!     SPPARM(5): spectral shape (1-4),
!                (1 - Pierson-Moskowitz,
!                 2 - JONSWAP,
!                 3 - BIN,
!                 4 - Gauss)
!                     negative peak (+) 
!                     or mean frequency (-)
!     SPPARM(6): directional spreading in degree (1) or exponent (2)
!     SPPARM(7): gaussian width for the gauss spectrum 0.1
!     SPPARM(8): peak enhancement factor for the JONSWAP spectra 3.3

      IF (LINHOM) THEN
        READ(WAV%FHNDL,*)
      END IF

#ifdef MPI_PARALL_GRID
      IPP = 0
      IF (LINHOM) THEN
        DO IP = 1, IWBMNPGL
          IF(ipgl(IWBNDGL(IP))%rank == myrank) THEN ! if boundary nodes belong to local domain ...
            IPP = IPP + 1
            READ (WAV%FHNDL, *) SPPARM(:,IPP) ! ... read values into boundary array
          ELSE
            READ (WAV%FHNDL, *) RTMP, RTMP, RTMP, RTMP, RTMP, RTMP, RTMP, RTMP ! ... else ... throw them away
          ENDIF
        END DO
      ELSE
        READ (WAV%FHNDL, *) SPPARM(:,1)
        DO IP = 2, IWBMNPGL
          SPPARM(:,IP) = SPPARM(:,1)
        END DO
      END IF
#else 
      IF (LINHOM) THEN
        DO IP = 1, IWBMNP
          READ (WAV%FHNDL, *) SPPARM(:,IP)
        END DO
      ELSE
        READ (WAV%FHNDL, *) SPPARM(:,1)
      END IF
#endif
      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE SET_HMAX
        USE DATAPOOL

        HMAX = BRCR * DEP

        IF (LMONO_IN) HMAX = HMAX * SQRT(TWO)

      END SUBROUTINE
!**********************************************************************
!*                                                                    *
!**********************************************************************
      SUBROUTINE SET_WWMINPULNML
      USE DATAPOOL, only : INP
#ifdef ROMS_WWM_PGMCL_COUPLING
      USE mod_coupler, only : Iwaves, INPname
#endif
#if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
      USE coupling_var, only : WWM_InputFile
#endif
      IMPLICIT NONE
      INTEGER nbArg
#ifdef SCHISM
      INP%FNAME  = 'wwminput.nml'
#else
# if !defined ROMS_WWM_PGMCL_COUPLING && !defined MODEL_COUPLING_ATM_WAV && !defined MODEL_COUPLING_OCN_WAV
      nbArg=command_argument_count()
      IF (nbArg > 1) THEN
        CALL WWM_ABORT('Number of argument is 0 or 1')
      ENDIF
      IF (nbArg.eq.0) THEN
        INP%FNAME  = 'wwminput.nml'
      ELSE
        CALL GET_COMMAND_ARGUMENT(1, INP%FNAME)
      ENDIF
# else
#  ifdef ROMS_WWM_PGMCL_COUPLING
      INP%FNAME=INPname(Iwaves)
#  endif
#  if defined MODEL_COUPLING_ATM_WAV || defined MODEL_COUPLING_OCN_WAV
      INP%FNAME=WWM_InputFile
#  endif
# endif
#endif
      END SUBROUTINE

!**********************************************************************
!*                                                                    *
!**********************************************************************
!* This routine reads a ramp (between 0 and 1) for wave forces starting
!  from the open boundary, as defined in wafo_ramp.gr3.
!  Activation: wafo_obcramp (0/1:off/on).
!  Subroutine called at the initialization only (in INITIALIZE_WWM).
!  Then, wafo_opbnd_ramp is applied to wave forces at each time step in
!  wwm_main (routine inside wwm_coupl_selfe.F90).
!  Authors: X. Bertin & B. Mengual (05/2020)
!**********************************************************************
#ifdef SCHISM
      SUBROUTINE READ_WAFO_OPBND_RAMP
!Since the output from this routine is only used in the coupler
!(wwm_coupl_selfe.F90), geometric arrays from SCHISM are used to account
!for quads

        USE DATAPOOL
        USE schism_glbl, ONLY : xcj,ycj,xnd,ynd,ns,nsa,np_global,isidenode,wafo_opbnd_ramp
        USE schism_msgp, ONLY : parallel_abort !exchange_s2d

        IMPLICIT NONE
        LOGICAL      :: lexist
        INTEGER      :: IS,n1,n2,icount,IB,IP,j,itmp
        REAL(rkind)  :: dx,dy,xtmp,ytmp,tmp1
        REAL(rkind)  :: dist(IWBMNP),ramp_wafop(np_global)

        ! Init: no ramp
        wafo_opbnd_ramp=1.0d0 ! at sides

        ! Open wafo_ramp.gr3 and read ramp at nodes
        INQUIRE(FILE='wafo_ramp.gr3',EXIST=lexist)
        IF (lexist) THEN
          OPEN(10,FILE='wafo_ramp.gr3',STATUS='OLD')
          READ(10,*)
          READ(10,*) j,itmp
          IF(itmp/=np_global) CALL parallel_abort('WWM: Check np_global in wafo_ramp.gr3.gr3')
          DO IP = 1,np_global
            READ(10,*) itmp,xtmp,ytmp,tmp1
            IF(tmp1<0.or.tmp1>1) CALL parallel_abort('WWM: ramp_wafo <0 or >1!')
            IF(ipgl(IP)%rank == myrank) ramp_wafop(ipgl(IP)%id) = tmp1
          ENDDO !np_global
          CLOSE(10)
        ELSE
          CALL parallel_abort('wafo_obcramp=1 requires wafo_ramp.gr3')
        ENDIF !lexist


        ! Compute ramp at sides
        DO IS = 1,nsa
          n1 = isidenode(1,IS); n2 = isidenode(2,IS)
          wafo_opbnd_ramp(IS)=(ramp_wafop(n1)+ramp_wafop(n2))/2
        ENDDO

      END SUBROUTINE READ_WAFO_OPBND_RAMP
#endif
!**********************************************************************
!*                                                                    *
!**********************************************************************