*IF DEF,W06_1A                                                             WAVEH.2      
C *****************************COPYRIGHT******************************     WAVEH.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    WAVEH.4      
C                                                                          WAVEH.5      
C Use, duplication or disclosure of this code is subject to the            WAVEH.6      
C restrictions as set forth in the contract.                               WAVEH.7      
C                                                                          WAVEH.8      
C                Meteorological Office                                     WAVEH.9      
C                London Road                                               WAVEH.10     
C                BRACKNELL                                                 WAVEH.11     
C                Berkshire UK                                              WAVEH.12     
C                RG12 2SZ                                                  WAVEH.13     
C                                                                          WAVEH.14     
C If no contract has been raised with this copy of the code, the use,      WAVEH.15     
C duplication or disclosure of it is strictly prohibited.  Permission      WAVEH.16     
C to do so must first be obtained in writing from the Head of Numerical    WAVEH.17     
C Modelling at the above address.                                          WAVEH.18     
C ******************************COPYRIGHT******************************    WAVEH.19     
C*LLL                                                                      WAVEH.20     
C     13. SUBROUTINE WAVEH                                                 WAVEH.21     
C                                                                          WAVEH.22     
!                                                                          WAVEH.23     
! Description:                                                             WAVEH.24     
!                                                                          WAVEH.25     
! Method:                                                                  WAVEH.26     
!                                                                          WAVEH.27     
!                                                                          WAVEH.28     
!                                                                          WAVEH.29     
! Current Code Owner: Martin Holt                                          WAVEH.30     
!                                                                          WAVEH.31     
! History:                                                                 WAVEH.32     
! Version   Date     Comment                                               WAVEH.33     
! -------   ----     -------                                               WAVEH.34     
! UM4.1    June 1996 Original code.  M Holt                                WAVEH.35     
!                                                                          WAVEH.36     
! Code Description:                                                        WAVEH.37     
!   Language: FORTRAN 77 + common extensions.                              WAVEH.38     
!                                                                          WAVEH.39     
!- End of header                                                           WAVEH.40     
                                                                           WAVEH.41     
C                                                                          WAVEH.42     
C     DOCUMENTATION                                                        WAVEH.43     
C                                                                          WAVEH.44     
C     SEE WAVE MODEL DOCUMENTATION PAPER.                                  WAVEH.45     
C                                                                          WAVEH.46     
C     DESCRIPTION                                                          WAVEH.47     
C                                                                          WAVEH.48     
C     THIS ROUTINE CALCULATES WAVE HEIGHTS ETC FROM 2D SPECTRA             WAVEH.49     
C                                                                          WAVEH.50     
C *********************************************************************    WAVEH.51     

       subroutine waveh(ia1,                                                1,1WAVEH.52     
*CALL ARGWVAL                                                              WAVEH.53     
*CALL ARGWVFD                                                              WAVEH.54     
     &   l_wvtra,ndata,ngrid,nfldmax,len1,energy,windsp,windir,wh,icode)   WAVEH.55     
C                                                                          WAVEH.56     
                                                                           WAVEH.57     
*CALL TYPWVAL                                                              WAVEH.58     
*CALL TYPWVFD                                                              WAVEH.59     
                                                                           WAVEH.60     
C                                                                          WAVEH.61     
c      * set max number of wavetrains to search for *                      WAVEH.62     
       parameter(kwtmax=4)                                                 WAVEH.63     
                                                                           WAVEH.64     
C UM constants                                                             WAVEH.65     
                                                                           WAVEH.66     
*CALL C_MDI                                                                WAVEH.67     
*CALL C_G                                                                  WAVEH.68     
*CALL C_PI                                                                 WAVEH.69     
                                                                           WAVEH.70     
       INTEGER ICODE                                                       WAVEH.71     
       real wh(ngrid,nfldmax) ! array for output fields ! OUT              WAVEH.72     
       real energy(len1),windir(ndata),windsp(ndata) ! IN                  WAVEH.73     
C                                                                          WAVEH.74     
C      # LOCAL arrays for use by wavetrain partitioning                    WAVEH.75     
C                                                                          WAVEH.76     
CC note can rearange and not declare these arrays here by calling          WAVEH.77     
CC with array WH - have kwtmax consec wavehts then kwtmax periods etc.     WAVEH.78     
CC       real pswh(ndata,kwtmax)  ! height of wavetrains                   WAVEH.79     
CC       real perio(ndata,kwtmax) ! period of wavetrain                    WAVEH.80     
CC       real pdir(ndata,kwtmax)  ! direction of wavetrain                 WAVEH.81     
       integer kwtot(ndata)     ! number of wavetrains present             WAVEH.82     
C                                                                          WAVEH.83     
C     LOCAL ARRAYS                                                         WAVEH.84     
C                                                                          WAVEH.85     
      REAL      ECOS(ndata),ESIN(ndata),EMAX(ndata),                       WAVEH.86     
     -          ESIN1(ndata),ECOS1(ndata),EMSW(ndata),EMWS(ndata),         WAVEH.87     
     -          ESIN2(ndata),ECOS2(ndata),EWS(ndata)                       WAVEH.88     
                                                                           WAVEH.89     
                                                                           WAVEH.90     
C                                                                          WAVEH.91     
                                                                           WAVEH.92     
CC local work arrays replacing WH(ip,??) for development of output         WAVEH.93     
CC on full grid                                                            WAVEH.94     
CC work7(ip) equates to WH(ip,7) in the original WAVEH routine             WAVEH.95     
                                                                           WAVEH.96     
      REAL    work1(ndata),work4(ndata),work5(ndata)                       WAVEH.97     
      REAL    work7(ndata),work10(ndata),work11(ndata)                     WAVEH.98     
                                                                           WAVEH.99     
C                                                                          WAVEH.100    
      INTEGER   IMAX(ndata),IMSW(ndata),IMWS(ndata)                        WAVEH.101    
C                                                                          WAVEH.102    
      LOGICAL   LFLIM,LTRUE,LWS(ndata)                                     WAVEH.103    
      LOGICAL   l_wvtra                                                    WAVEH.104    
                                                                           WAVEH.105    
      LOGICAL IA1(ngx,ngy)                                                 WAVEH.106    
C                                                                          WAVEH.107    
C ----------------------------------------------------------------------   WAVEH.108    
C        VALUES STORED IN WH(IP,I) IN THIS SUBROUTINE                      WAVEH.109    
C  I=  1       TOTAL WAVE HEIGHT                                           WAVEH.110    
C      2       MEAN DIRECTION                                              WAVEH.111    
C      3       PRINCIPAL DIRECTION                                         WAVEH.112    
C      4       ZERO UP CROSSING PERIOD                                     WAVEH.113    
C      5       MEAN PERIOD                                                 WAVEH.114    
C      6       PEAK PERIOD                                                 WAVEH.115    
C      7       TOTAL WINDSEA WAVE HEIGHT                                   WAVEH.116    
C      8       MEAN DIRECTION                                              WAVEH.117    
C      9       PRINCIPAL DIRECTION                                         WAVEH.118    
C     10       ZERO UP CROSSING PERIOD                                     WAVEH.119    
C     11       MEAN PERIOD                                                 WAVEH.120    
C     12       PEAK PERIOD                                                 WAVEH.121    
C     13       TOTAL SWELL WAVE HEIGHT                                     WAVEH.122    
C     14       MEAN DIRECTION                                              WAVEH.123    
C     15       PRINCIPAL DIRECTION                                         WAVEH.124    
C     16       ZERO UP CROSSING PERIOD                                     WAVEH.125    
C     17       MEAN PERIOD                                                 WAVEH.126    
C     18       PEAK PERIOD                                                 WAVEH.127    
C     19                                                                   WAVEH.128    
C     20                                                                   WAVEH.129    
C ----------------------------------------------------------------------   WAVEH.130    
C LOCALLY USED CONSTANTS                                                   WAVEH.131    
                                                                           WAVEH.132    
      PI2  = 2.0*PI                                                        WAVEH.133    
      PIO2 = PI/2.0                                                        WAVEH.134    
                                                                           WAVEH.135    
CCC UKMO value      G14  = 0.14*G : use 0.13*G for 10m wind -              WAVEH.136    
CCC see wavetrain code of Anne Guillaume                                   WAVEH.137    
                                                                           WAVEH.138    
      G14  = 0.13*G                                                        WAVEH.139    
                                                                           WAVEH.140    
CL 13.0 ZERO DATA ARRAY                                                    WAVEH.141    
C ---------------------                                                    WAVEH.142    
C                                                                          WAVEH.143    
c      * this loop initialises array WH                                    WAVEH.144    
                                                                           WAVEH.145    
      do i=1,nfldmax                                                       WAVEH.146    
       DO II=1,ngrid                                                       WAVEH.147    
        WH(II,I) = RMDI                                                    WAVEH.148    
       ENDDO                                                               WAVEH.149    
      ENDDO                                                                WAVEH.150    
                                                                           WAVEH.151    
      do ip=1,ndata                                                        WAVEH.152    
       if(windsp(ip).lt.0.5) then                                          WAVEH.153    
        windsp(ip)=0.5                                                     WAVEH.154    
       endif                                                               WAVEH.155    
      enddo                                                                WAVEH.156    
C                                                                          WAVEH.157    
      EMIN = 1.0E-7                                                        WAVEH.158    
      DO IP=1,NDATA                                                        WAVEH.159    
       ECOS(IP) = 0.0                                                      WAVEH.160    
       ESIN(IP) = 0.0                                                      WAVEH.161    
       ECOS1(IP) = 0.0                                                     WAVEH.162    
       ESIN1(IP) = 0.0                                                     WAVEH.163    
       EWS (IP) = 0.0                                                      WAVEH.164    
       EMAX(IP) = EMIN                                                     WAVEH.165    
       EMWS(IP) = EMIN                                                     WAVEH.166    
       EMSW(IP) = EMIN                                                     WAVEH.167    
       IMAX(IP) = 0                                                        WAVEH.168    
       IMWS(IP) = 0                                                        WAVEH.169    
       IMSW(IP) = 0                                                        WAVEH.170    
       work1(ip)=0.                                                        WAVEH.171    
       work4(ip)=0.                                                        WAVEH.172    
       work5(ip)=0.                                                        WAVEH.173    
       work7(ip)=0.                                                        WAVEH.174    
       work10(ip)=0.                                                       WAVEH.175    
       work11(ip)=0.                                                       WAVEH.176    
      ENDDO                                                                WAVEH.177    
C                                                                          WAVEH.178    
CL 13.1 FIRST GUESS AT WINDSEA ENERGY - EWS                                WAVEH.179    
C --------------------------------------------                             WAVEH.180    
C                                                                          WAVEH.181    
      DO 10 L=1,nfre                                                       WAVEH.182    
CCC    DTHDF = DTH*DF(L)                                                   WAVEH.183    
       DTHDF = DFIM(L)                                                     WAVEH.184    
       DO 11 M=1,nang                                                      WAVEH.185    
CC NOTE need to ensure this indexing is ok for energy                      WAVEH.186    
        NST = ((L-1)*nang+M-1)*NDATA                                       WAVEH.187    
        DO 12 IP=1,NDATA                                                   WAVEH.188    
         FPMC = 0.8*G14/WINDSP(IP)                                         WAVEH.189    
         LFLIM = FR(L).GT.FPMC                                             WAVEH.190    
         IF (L.EQ.nfre) LFLIM=.TRUE.                                       WAVEH.191    
         ANG = ABS(TH(M)-WINDIR(IP))                                       WAVEH.192    
         IF (ANG.GT.PI) ANG = PI2-ANG                                      WAVEH.193    
         ANG = PIO2-ANG                                                    WAVEH.194    
         LTRUE= ANG.GT.-0.01                                               WAVEH.195    
         IF (LTRUE.AND.LFLIM) THEN                   ! WINDSEA             WAVEH.196    
          EWS(IP) = EWS(IP) + ENERGY(NST+IP) * DTHDF                       WAVEH.197    
         END IF                                                            WAVEH.198    
   12   CONTINUE                                                           WAVEH.199    
   11  CONTINUE                                                            WAVEH.200    
   10 CONTINUE                                                             WAVEH.201    
C                                                                          WAVEH.202    
CL 13.2 CALCULATE VALUES USING NEW CUT OFF FREQUENCY                       WAVEH.203    
C --------------------------------------------------                       WAVEH.204    
      DO 20 L=1,nfre                                                       WAVEH.205    
ccc    DTHDF = DTH*DF(L)                                                   WAVEH.206    
       DTHDF = DFIM(L)                                                     WAVEH.207    
       DO 21 M=1,nang                                                      WAVEH.208    
        NST = ((L-1)*nang+M-1)*NDATA                                       WAVEH.209    
        DO 22 IP=1,NDATA                                                   WAVEH.210    
         FPM = G14/WINDSP(IP)                                              WAVEH.211    
         EPM = (FPM**4)*0.0001                                             WAVEH.212    
         IF (EWS(IP).GT.EPM) EWS(IP)=EPM                                   WAVEH.213    
         IF (EWS(IP).GT.0.0) THEN                                          WAVEH.214    
                                                                           WAVEH.215    
CC CHECK THIS COEFFICIENT 0.31    elsewhere is 0.33 ??                     WAVEH.216    
                                                                           WAVEH.217    
          FPMC = 0.8*FPM*((EPM/EWS(IP))**0.31)                             WAVEH.218    
         ELSE                                                              WAVEH.219    
          FPMC = 0.8*G14                                                   WAVEH.220    
         END IF                                                            WAVEH.221    
         LFLIM = FR(L).GT.FPMC                                             WAVEH.222    
         IF (L.EQ.nfre) LFLIM=.TRUE.                                       WAVEH.223    
         ANG = ABS(TH(M)-WINDIR(IP))                                       WAVEH.224    
         IF (ANG.GT.PI) ANG = PI2-ANG                                      WAVEH.225    
         ANG = PIO2-ANG                                                    WAVEH.226    
         LTRUE= ANG.GT.-0.01                                               WAVEH.227    
         LWS(IP) = LTRUE.AND.LFLIM                                         WAVEH.228    
C                                                                          WAVEH.229    
C *** WINDSEA                                                              WAVEH.230    
C                                                                          WAVEH.231    
         IF (LWS(IP)) THEN                                                 WAVEH.232    
          Work7(IP) =  Work7 (IP)+ENERGY(NST+IP) * DTHDF                   WAVEH.233    
          Work10(IP)=  Work10(IP)+ENERGY(NST+IP)*FR(L)*FR(L)*DTHDF         WAVEH.234    
          Work11(IP)=  Work11(IP)+ENERGY(NST+IP)*FR(L)*DTHDF               WAVEH.235    
          ECOS1(IP) = ECOS1(IP) + ENERGY(NST+IP)*COSTH(M)*DTHDF            WAVEH.236    
          ESIN1(IP) = ESIN1(IP) + ENERGY(NST+IP)*SINTH(M)*DTHDF            WAVEH.237    
         END IF                                                            WAVEH.238    
C                                                                          WAVEH.239    
C *** TOTAL  VALUES                                                        WAVEH.240    
C                                                                          WAVEH.241    
cccc   if(energy(nst+ip).gt.0.0001) then                                   WAVEH.242    
         Work1(IP) = Work1(IP)+ENERGY(NST+IP) * DTHDF                      WAVEH.243    
         Work4(IP) = Work4(IP)+ENERGY(NST+IP)*FR(L)*FR(L)*DTHDF            WAVEH.244    
         Work5(IP) = Work5(IP)+ENERGY(NST+IP)*FR(L)*DTHDF                  WAVEH.245    
         ECOS(IP) = ECOS(IP) + ENERGY(NST+IP)*COSTH(M)*DTHDF               WAVEH.246    
         ESIN(IP) = ESIN(IP) + ENERGY(NST+IP)*SINTH(M)*DTHDF               WAVEH.247    
cccc    endif                                                              WAVEH.248    
                                                                           WAVEH.249    
   22   CONTINUE                                                           WAVEH.250    
C                                                                          WAVEH.251    
        DO 24 IP=1,NDATA                                                   WAVEH.252    
C                                                                          WAVEH.253    
C *** WINDSEA                                                              WAVEH.254    
C                                                                          WAVEH.255    
         IF (LWS(IP)) THEN                                                 WAVEH.256    
          IF (ENERGY(NST+IP).GT.EMWS(IP)) THEN                             WAVEH.257    
           EMWS(IP) = ENERGY(NST+IP)                                       WAVEH.258    
           IMWS(IP) = L                                                    WAVEH.259    
          END IF                                                           WAVEH.260    
         ELSE                                                              WAVEH.261    
C                                                                          WAVEH.262    
C *** SWELL                                                                WAVEH.263    
C                                                                          WAVEH.264    
          IF (ENERGY(NST+IP).GT.EMSW(IP)) THEN                             WAVEH.265    
           EMSW(IP) = ENERGY(NST+IP)                                       WAVEH.266    
           IMSW(IP) = L                                                    WAVEH.267    
          END IF                                                           WAVEH.268    
         END IF                                                            WAVEH.269    
C                                                                          WAVEH.270    
C *** TOTAL  VALUES                                                        WAVEH.271    
C                                                                          WAVEH.272    
          IF (ENERGY(NST+IP).GT.EMAX(IP)) THEN                             WAVEH.273    
           EMAX(IP) = ENERGY(NST+IP)                                       WAVEH.274    
           IMAX(IP) = L                                                    WAVEH.275    
          END IF                                                           WAVEH.276    
                                                                           WAVEH.277    
   24   CONTINUE                                                           WAVEH.278    
C                                                                          WAVEH.279    
   21  CONTINUE                                                            WAVEH.280    
   20 CONTINUE                                                             WAVEH.281    
                                                                           WAVEH.282    
                                                                           WAVEH.283    
C                                                                          WAVEH.284    
C 13.3 EVALUATE SWELL VALUES FROM TOTAL AND WINDSEA                        WAVEH.285    
C -------------------------------------------------                        WAVEH.286    
C                                                                          WAVEH.287    
                                                                           WAVEH.288    
cc make this a loop over ngrid ?? with test on IA1 lsmask value ??         WAVEH.289    
                                                                           WAVEH.290    
cc    DO 30 IP=1,Ngrid                                                     WAVEH.291    
                                                                           WAVEH.292    
      idata=0                                                              WAVEH.293    
                                                                           WAVEH.294    
      do j=1,ngy                                                           WAVEH.295    
                                                                           WAVEH.296    
       do i=1,ngx                                                          WAVEH.297    
                                                                           WAVEH.298    
        ip=(j-1)*ngx + i                                                   WAVEH.299    
                                                                           WAVEH.300    
        if(.not.ia1(i,j)) then                                             WAVEH.301    
                                                                           WAVEH.302    
         idata=idata+1                                                     WAVEH.303    
                                                                           WAVEH.304    
         if(idata.gt.ndata)then                                            WAVEH.305    
          WRITE(6,*)'error idata gt ndata ',idata,ndata                    GIE0F403.673    
          WRITE(6,*)'RETURNING FROM WAVEH ERROR CODE  1'                   GIE0F403.674    
          ICODE=1                                                          WAVEH.308    
          return                                                           WAVEH.309    
         endif                                                             WAVEH.310    
                                                                           WAVEH.311    
         wh(ip,1) = work1(idata)                                           WAVEH.312    
         wh(ip,4) = work4(idata)                                           WAVEH.313    
         wh(ip,5) = work5(idata)                                           WAVEH.314    
         wh(ip,7) = work7(idata)                                           WAVEH.315    
         wh(ip,10)= work10(idata)                                          WAVEH.316    
         wh(ip,11)= work11(idata)                                          WAVEH.317    
                                                                           WAVEH.318    
C                                                                          WAVEH.319    
C *** SWELL ENERGY                                                         WAVEH.320    
C                                                                          WAVEH.321    
        WH(IP,13) = WH(IP,1) - WH(IP,7)                                    WAVEH.322    
        IF (WH(IP,13).LT.0.0) WH(IP,13) = 0.0                              WAVEH.323    
                                                                           WAVEH.324    
CC re-use work1 to hold WH(ip,13) for later use                            WAVEH.325    
        work1(idata)=wh(ip,13)                                             WAVEH.326    
                                                                           WAVEH.327    
C                                                                          WAVEH.328    
C *** SWELL INTEGRATED VALUES FOR PERIODS                                  WAVEH.329    
C                                                                          WAVEH.330    
        WH(IP,16) = WH(IP,4) - WH(IP,10)                                   WAVEH.331    
        IF (WH(IP,16).LT.0.0) WH(IP,16) = 0.0                              WAVEH.332    
        WH(IP,17) = WH(IP,5) - WH(IP,11)                                   WAVEH.333    
        IF (WH(IP,17).LT.0.0) WH(IP,17) = 0.0                              WAVEH.334    
C                                                                          WAVEH.335    
C *** TOTAL SEA DIRECTIONS - MEAN                                          WAVEH.336    
C                                                                          WAVEH.337    
C note for UM wave that WAM directions are from zero=North increasing      WAVEH.338    
C anticlockwise ( ie wind direction is atan2(u,v) which is tan -1 (u/v)    WAVEH.339    
C                                                                          WAVEH.340    
C SO here we have that ECOS is the northward component and                 WAVEH.341    
C                      ESIN is the eastward  component                     WAVEH.342    
C                                                                          WAVEH.343    
C SO taking ATAN2(ESIN, ECOS) gives tan -1 (esin/ecos) = tan -1 (u/v)      WAVEH.344    
C SO the direction evaluated here is with ZERO=NORTH                       WAVEH.345    
C                                     and increasing clockwise             WAVEH.346    
C                                                                          WAVEH.347    
C (in radians) so only need to convert to degrees                          WAVEH.348    
C                                                                          WAVEH.349    
         IF(WH(IP,1).GT.0.00001) THEN                                      WAVEH.350    
          WH(IP,2) = ATAN2(ESIN(Idata),ECOS(Idata))                        WAVEH.351    
         END IF                                                            WAVEH.352    
C                                                                          WAVEH.353    
C *** WINDSEA DIRECTIONS                                                   WAVEH.354    
C                                                                          WAVEH.355    
c             ?? 7 not 8                                                   WAVEH.356    
         IF(WH(IP,7).GT.0.00001) THEN                                      WAVEH.357    
          WH(IP,8) = ATAN2(ESIN1(Idata),ECOS1(Idata))                      WAVEH.358    
         END IF                                                            WAVEH.359    
C                                                                          WAVEH.360    
C *** NOTE CHECKS TOTAL SWELL ENERGY NONZERO                               WAVEH.361    
C                                                                          WAVEH.362    
         AA = WH(IP,13)                                                    WAVEH.363    
         IF (AA.GT.0.00001) THEN                                           WAVEH.364    
C                                                                          WAVEH.365    
C *** SWELL DIRECTIONS                                                     WAVEH.366    
C                                                                          WAVEH.367    
         ESIN2(Idata) = ESIN(Idata)-ESIN1(Idata)                           WAVEH.368    
         ECOS2(Idata) = ECOS(Idata)-ECOS1(Idata)                           WAVEH.369    
         WH(IP,14) = ATAN2(ESIN2(Idata),ECOS2(Idata))                      WAVEH.370    
        END IF                                                             WAVEH.371    
C                                                                          WAVEH.372    
C *** RESET WORK ARRAYS TO ZERO                                            WAVEH.373    
C                                                                          WAVEH.374    
       ECOS(idata) = 0.0                                                   WAVEH.375    
       ESIN(idata) = 0.0                                                   WAVEH.376    
       ECOS1(idata) = 0.0                                                  WAVEH.377    
       ESIN1(idata) = 0.0                                                  WAVEH.378    
       ECOS2(idata) = 0.0                                                  WAVEH.379    
       ESIN2(idata) = 0.0                                                  WAVEH.380    
C                                                                          WAVEH.381    
                                                                           WAVEH.382    
       endif                                                               WAVEH.383    
       enddo                                                               WAVEH.384    
       enddo                                                               WAVEH.385    
cc 30 CONTINUE                                                             WAVEH.386    
C                                                                          WAVEH.387    
C 13.4 CALCULATE PRINCIPAL DIRECTIONS                                      WAVEH.388    
C ------------------------------------                                     WAVEH.389    
C                                                                          WAVEH.390    
      DO 45 M=1,nang                                                       WAVEH.391    
       DO 42 IP=1,NDATA                                                    WAVEH.392    
        LL=IMAX(IP)                                                        WAVEH.393    
        IF (LL.GT.0) THEN                                                  WAVEH.394    
         NST = ((LL-1)*nang+M-1)*NDATA                                     WAVEH.395    
         ECOS(IP) = ECOS(IP) + ENERGY(NST+IP)*COSTH(M)                     WAVEH.396    
         ESIN(IP) = ESIN(IP) + ENERGY(NST+IP)*SINTH(M)                     WAVEH.397    
        END IF                                                             WAVEH.398    
        L1=IMWS(IP)                                                        WAVEH.399    
        IF (L1.GT.0) THEN                                                  WAVEH.400    
         NS1 = ((L1-1)*nang+M-1)*NDATA                                     WAVEH.401    
         ECOS1(IP) = ECOS1(IP) + ENERGY(NS1+IP)*COSTH(M)                   WAVEH.402    
         ESIN1(IP) = ESIN1(IP) + ENERGY(NS1+IP)*SINTH(M)                   WAVEH.403    
        END IF                                                             WAVEH.404    
CC need to sort out this use of WH(,13)                                    WAVEH.405    
CC WH(IP,13) is copied into data work array work1 in previous loop         WAVEH.406    
CC      IF (WH(IP,13).GT.0.00001) THEN                                     WAVEH.407    
        IF (Work1(IP).GT.0.00001) THEN                                     WAVEH.408    
         L2=IMSW(IP)                                                       WAVEH.409    
         NS2 = ((L2-1)*nang+M-1)*NDATA                                     WAVEH.410    
         ECOS2(IP) = ECOS2(IP) + ENERGY(NS2+IP)*COSTH(M)                   WAVEH.411    
         ESIN2(IP) = ESIN2(IP) + ENERGY(NS2+IP)*SINTH(M)                   WAVEH.412    
        END IF                                                             WAVEH.413    
   42  CONTINUE                                                            WAVEH.414    
   45 CONTINUE                                                             WAVEH.415    
C                                                                          WAVEH.416    
                                                                           WAVEH.417    
CC MAKE THIS LOOP over ngx  ngy                                            WAVEH.418    
                                                                           WAVEH.419    
      idata=0 ! must reset idata before next use                           WAVEH.420    
                                                                           WAVEH.421    
cc    DO IP=1,NDATA                                                        WAVEH.422    
      do j=1,ngy                                                           WAVEH.423    
       do i=1,ngx                                                          WAVEH.424    
                                                                           WAVEH.425    
        ip=(j-1)*ngx + i    ! counter for points on full grid              WAVEH.426    
                                                                           WAVEH.427    
        if(.not.ia1(i,j)) then                                             WAVEH.428    
                                                                           WAVEH.429    
         idata=idata+1      ! counter for data points only                 WAVEH.430    
                                                                           WAVEH.431    
         if(idata.gt.ndata)then                                            WAVEH.432    
          WRITE(6,*)'error idata gt ndata ',idata,ndata                    GIE0F403.675    
          WRITE(6,*)'setting error code and returning'                     GIE0F403.676    
          icode=99                                                         WAVEH.435    
          return                                                           WAVEH.436    
         endif                                                             WAVEH.437    
                                                                           WAVEH.438    
       IF(IMAX(idata).GT.0)WH(IP,3) = ATAN2(ESIN(idata),ECOS(idata))       WAVEH.439    
       IF(IMWS(idata).GT.0)WH(IP,9) = ATAN2(ESIN1(idata),ECOS1(idata))     WAVEH.440    
       IF (WH(IP,13).GT.0.00001.AND.IMSW(idata).GT.0) THEN                 WAVEH.441    
         WH(IP,15) = ATAN2(ESIN2(idata),ECOS2(idata))                      WAVEH.442    
       ENDIF                                                               WAVEH.443    
C                                                                          WAVEH.444    
C                                                                          WAVEH.445    
C *** TOTAL SPECTRUM  - ZERO UP CROSSING PERIOD                            WAVEH.446    
C                     - & MEAN PERIOD                                      WAVEH.447    
C                     - & PEAK PERIOD                                      WAVEH.448    
C                                                                          WAVEH.449    
        IF(WH(IP,4).GT.0.00001) THEN                                       WAVEH.450    
         WH(IP,4) = SQRT(WH(IP,1)/WH(IP,4))                                WAVEH.451    
        ENDIF                                                              WAVEH.452    
                                                                           WAVEH.453    
        IF(WH(IP,5).GT.0.00001) THEN                                       WAVEH.454    
         WH(IP,5) = WH(IP,1)/WH(IP,5)                                      WAVEH.455    
        ENDIF                                                              WAVEH.456    
                                                                           WAVEH.457    
        IF(IMAX(idata).GT.0) WH(IP,6) = 1./FR(IMAX(idata))                 WAVEH.458    
C                                                                          WAVEH.459    
C *** WIND SEA PERIODS                                                     WAVEH.460    
C                                                                          WAVEH.461    
        IF (WH(IP,10).GT.0.0) THEN                                         WAVEH.462    
         WH(IP,10) = SQRT(WH(IP,7)/WH(IP,10))                              WAVEH.463    
        ELSE                                                               WAVEH.464    
         WH(IP,10) = 0.0                                                   WAVEH.465    
        END IF                                                             WAVEH.466    
        IF (WH(IP,11).GT.0.0) THEN                                         WAVEH.467    
         WH(IP,11) = WH(IP,7)/WH(IP,11)                                    WAVEH.468    
        ELSE                                                               WAVEH.469    
         WH(IP,11) = 0.0                                                   WAVEH.470    
        ENDIF                                                              WAVEH.471    
        IF(IMWS(idata).GT.0) WH(IP,12) = 1./FR(IMWS(idata))                WAVEH.472    
C                                                                          WAVEH.473    
C *** NOTE CHECKS TOTAL SWELL ENERGY NONZERO                               WAVEH.474    
C *** SWELL PERIODS                                                        WAVEH.475    
C                                                                          WAVEH.476    
         IF (WH(IP,16).GT.0.000001) THEN                                   WAVEH.477    
          WH(IP,16) = SQRT(WH(IP,13)/WH(IP,16))                            WAVEH.478    
         ELSE                                                              WAVEH.479    
          WH(IP,16) = 0.0                                                  WAVEH.480    
         END IF                                                            WAVEH.481    
         IF (WH(IP,17).GT.0.000001) THEN                                   WAVEH.482    
          WH(IP,17) = WH(IP,13)/WH(IP,17)                                  WAVEH.483    
         ELSE                                                              WAVEH.484    
          WH(IP,17) = 0.0                                                  WAVEH.485    
         END IF                                                            WAVEH.486    
        AA = WH(IP,13)                                                     WAVEH.487    
        IF (AA.GT.0.00001) THEN                                            WAVEH.488    
         IF(IMSW(idata).GT.0) WH(IP,18) = 1./FR(IMSW(idata))               WAVEH.489    
        ELSE                                                               WAVEH.490    
         WH(IP,18) = 0.0                                                   WAVEH.491    
        END IF                                                             WAVEH.492    
C                                                                          WAVEH.493    
C *** TOTAL WAVE HEIGHT                                                    WAVEH.494    
C                                                                          WAVEH.495    
       WH(IP,1) = 4.*SQRT(WH(IP,1))                                        WAVEH.496    
C                                                                          WAVEH.497    
C *** WINDSEA  WAVE HEIGHT                                                 WAVEH.498    
C                                                                          WAVEH.499    
       WH(IP,7) = 4.*SQRT(WH(IP,7))                                        WAVEH.500    
C                                                                          WAVEH.501    
C *** SWELL WAVE HEIGHT                                                    WAVEH.502    
C                                                                          WAVEH.503    
       WH(IP,13) = 4.*SQRT(WH(IP,13))                                      WAVEH.504    
C                                                                          WAVEH.505    
                                                                           WAVEH.506    
c     convert directions to degrees in range 0-360                         WAVEH.507    
                                                                           WAVEH.508    
         WH(ip,2)=wh(ip,2)*RECIP_PI_OVER_180                               WAVEH.509    
         WH(ip,3)=wh(ip,3)*RECIP_PI_OVER_180                               WAVEH.510    
         WH(ip,8)=wh(ip,8)*RECIP_PI_OVER_180                               WAVEH.511    
         WH(ip,9)=wh(ip,9)*RECIP_PI_OVER_180                               WAVEH.512    
         WH(ip,14)=wh(ip,14)*RECIP_PI_OVER_180                             WAVEH.513    
         WH(ip,15)=wh(ip,15)*RECIP_PI_OVER_180                             WAVEH.514    
                                                                           WAVEH.515    
         if(wh(ip,2).lt.0.) wh(ip,2)=wh(ip,2)+360.                         WAVEH.516    
         if(wh(ip,3).lt.0.) wh(ip,3)=wh(ip,3)+360.                         WAVEH.517    
         if(wh(ip,8).lt.0.) wh(ip,8)=wh(ip,8)+360.                         WAVEH.518    
         if(wh(ip,9).lt.0.) wh(ip,9)=wh(ip,9)+360.                         WAVEH.519    
         if(wh(ip,14).lt.0.) wh(ip,14)=wh(ip,14)+360.                      WAVEH.520    
         if(wh(ip,15).lt.0.) wh(ip,15)=wh(ip,15)+360.                      WAVEH.521    
                                                                           WAVEH.522    
         if(wh(ip,2).gt.360.) wh(ip,2)=wh(ip,2)-360.                       WAVEH.523    
         if(wh(ip,3).gt.360.) wh(ip,3)=wh(ip,3)-360.                       WAVEH.524    
         if(wh(ip,8).gt.360.) wh(ip,8)=wh(ip,8)-360.                       WAVEH.525    
         if(wh(ip,9).gt.360.) wh(ip,9)=wh(ip,9)-360.                       WAVEH.526    
         if(wh(ip,14).gt.360.) wh(ip,14)=wh(ip,14)-360.                    WAVEH.527    
         if(wh(ip,15).gt.360.) wh(ip,15)=wh(ip,15)-360.                    WAVEH.528    
                                                                           WAVEH.529    
                                                                           WAVEH.530    
        endif ! check for sea points if(ia1....                            WAVEH.531    
       enddo                                                               WAVEH.532    
      enddo                                                                WAVEH.533    
                                                                           WAVEH.534    
C                                                                          WAVEH.535    
       if(l_wvtra) then                                                    WAVEH.536    
                                                                           WAVEH.537    
cccccc   len1=nfre*nang*ndata                                              WAVEH.538    
                                                                           WAVEH.539    
ccc      call wavetr(energy,pswh,perio,pdir,kwtot,fr,dfim,th,              WAVEH.540    
ccc  +len1,ndata,kwtmax,nfre,nang,rmdi,icode)                              WAVEH.541    
                                                                           WAVEH.542    
CC pointers to wavetrain data in array WH                                  WAVEH.543    
CC usage altered from UKMO model, so that now array WH has                 WAVEH.544    
CC all wvtrain heights together then all periods together then             WAVEH.545    
CC all directions together                                                 WAVEH.546    
CC (means we don't need array pswh / perio / pdir in this routine)         WAVEH.547    
                                                                           WAVEH.548    
       i_SWH=19                                                            WAVEH.549    
       i_PER=i_SWH + kwtmax                                                WAVEH.550    
       i_DIR=i_PER + kwtmax                                                WAVEH.551    
       i_NUM=i_DIR + kwtmax                                                WAVEH.552    
                                                                           WAVEH.553    
       call wavetr(energy,WH(1,i_swh),WH(1,i_per),WH(1,i_dir),             WAVEH.554    
     +kwtot,fr,dfim,th,                                                    WAVEH.555    
     +len1,ndata,kwtmax,nfre,nang,rmdi,icode)                              WAVEH.556    
                                                                           WAVEH.557    
C       * here add  test return code if ne 0 then error trap  *            WAVEH.558    
C                                                                          WAVEH.559    
C                                                                          WAVEH.560    
        do ip=1,ndata                                                      WAVEH.561    
C          wave heights                                                    WAVEH.562    
ccc      wh(ip,25)=pswh(ip,1)                                              WAVEH.563    
ccc      wh(ip,28)=pswh(ip,2)                                              WAVEH.564    
ccc      wh(ip,31)=pswh(ip,3)                                              WAVEH.565    
                                                                           WAVEH.566    
C          wave periods                                                    WAVEH.567    
ccc      wh(ip,26)=perio(ip,1)                                             WAVEH.568    
ccc      wh(ip,29)=perio(ip,2)                                             WAVEH.569    
ccc      wh(ip,32)=perio(ip,3)                                             WAVEH.570    
                                                                           WAVEH.571    
C          wave directions                                                 WAVEH.572    
ccc      wh(ip,27)=pdir(ip,1)                                              WAVEH.573    
ccc      wh(ip,30)=pdir(ip,2)                                              WAVEH.574    
ccc      wh(ip,33)=pdir(ip,3)                                              WAVEH.575    
                                                                           WAVEH.576    
C          number of trains                                                WAVEH.577    
         wh(ip,i_num) = 1.0*kwtot(ip)                                      WAVEH.578    
C                                                                          WAVEH.579    
        enddo                                                              WAVEH.580    
c                                                                          WAVEH.581    
       endif                                                               WAVEH.582    
                                                                           WAVEH.583    
      RETURN                                                               WAVEH.584    
      END                                                                  WAVEH.585    
*ENDIF                                                                     WAVEH.586