!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!

      SUBROUTINE FDTOUV(ZVAL,IMARK,KLIST,KNELE,KNVAL,KINT,KNELOUT) 3,10
      IMPLICIT NONE
#include "comcst.cdk"
#include "cparbrp.cdk"
#include "comnumbr.cdk"
      INTEGER KNELE,KNVAL,KINT,KNELOUT
      INTEGER KLIST(*)
      REAL*8 ZVAL(*)
      INTEGER IMARK(*)
*
#if defined (DOC)
************************************************************************
*
*      PURPOSE: TO CHANGE IN-PLACE THE F-D WIND COMPONENTS OF DATA BLOCK
*               EXTRACTED ROM A BURP FILE TO U-V (EAST-WEST)  COMPONENTS
*
*       AUTHOR:   P. KOCLAS (CMC/CMDA)
*
*       REVISION: P. KOCLAS (CMC/CMDA) february 1995
*                  -New call sequence to getele
*                  -Fix bug  : make sure that both (ff dd) are present
*                              in data
*                -P. KOCLAS  CMC/CMDA July 1999
*                  -FOR 3DVAR o-p o-a configuration (nconf =121 )
*                    , background check  (nconf=101)
*                   u,v components are APPENDED to output array.
*                -P. KOCLAS  CMC/CMDA august 2000
*                 restrict lladd2=.false. for old config=151
*                 -allow for treatment of surface wind elements
*                -J. Halle  CMC/CMDA june 2000
*                 -use dimension JPLNG
*
*    ARGUMENTS:
*               INPUT:
*                      -ZVAL    : DATA BLOCK
*                      -IMARK   : MARKER DATA BLOCK
*                      -KLIST   : LIST OF BUFR ELEMENTS
*                      -KNELE   : NUMBER OF ELEMENTS IN DATA BLOCK
*                      -KNVAL   : NUMBER OF LEVELS IN DATA BLOCK
*                      -KINT    : THIRD DIMENSION OF INPUT DATA BLOCK
*                      -KNELOUT : THIRD DIMENSION OF OUTPUT DATA BLOCK
*
*               OUTPUT:
*                      -MODIFIED ZVAL AND KLIST
*
*
************************************************************************
#endif
*
      REAL*8 ZPROFF(JPMXNLV),ZPROFD(JPMXNLV)
      REAL*8     ZVAL2(JPLNG)
      INTEGER IMARK2(JPLNG)
      REAL*8 ZFF,ZDD,ZTORAD
      INTEGER JJ,JN,INDEX1,INDEX2,J1,J2,J3
      INTEGER IND1,IND2,IND3,IND4
      INTEGER IFF,IDD,IUU,IVV
      logical llmis,lladd2,LLEXPAND
*
************************************************************************
*     BURP FILE ELEMENT NAMES FOR WINDS
************************************************************************
*-------------------------------------------------------
*
      ZTORAD=RPI/180.
*
************************************************************************
*     GET (F,D) WIND COMPONENTS
************************************************************************
*
      IFF=NEFF
      IDD=NEDD
      IUU=NEUU
      IVV=NEVV
      lladd2=.true.
      KNELOUT=KNELE+2
      CALL GETELE(IFF,1,KLIST,ZVAL,ZPROFF,KNELE,KNVAL,KINT,IND1)
      CALL GETELE(IDD,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND2)
      CALL GETELE(IUU,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND3)
      CALL GETELE(IVV,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND4)
C
C        FOR SURFACE (SYNOP ...etc..) WIND at 10 M iS REPORTED
C
      IF ( IND1 .EQ. -1 .AND. IND2 .EQ. -1 ) THEN
         IDD=NEDS
         IFF=NEFS
         CALL GETELE(IDD,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND1)
         CALL GETELE(IFF,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND2)
         IF ( IND1 .NE. -1 .AND. IND2 .NE. -1 ) THEN
            IUU=NEUS
            IVV=NEVS
            CALL GETELE(IUU,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND3)
            CALL GETELE(IVV,1,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND4)
         ENDIF
      ENDIF
C
      LLEXPAND=.FALSE.
      IF ( (IND1 .NE. -1) .AND. (IND2 .NE. -1) .AND.
     +   (IND3 .EQ. -1) .AND. (IND4 .EQ. -1) )THEN
       LLEXPAND=.TRUE.
      DO 2 JN=1,KINT
         CALL GETELE(IFF,JN,KLIST,ZVAL,ZPROFF,KNELE,KNVAL,KINT,IND1)
         CALL GETELE(IDD,JN,KLIST,ZVAL,ZPROFD,KNELE,KNVAL,KINT,IND2)
C
C        FOR SURFACE (SYNOP ...etc..) WIND at 10 M iS REPORTED
C
*
************************************************************************
*    -IF (F-D) COMPONENTS WERE FOUND CONVERT TO U-V
*    -REJECT IF :  DIRECTION =0 AND SPEED .NE. 0
*                  DIRECTION < 0 OR > 360
*    -CHECK IF MISSING DATA
*    -SET FLAGS TO 0
************************************************************************
*
*        for residual or background check configuration
C
         IF ( lladd2 ) THEN
            KLIST(KNELE+1)=IUU
            KLIST(KNELE+2)=IVV
         ELSE
            KLIST(IND1)=IUU
            KLIST(IND2)=IVV
         ENDIF
*
*
         DO 3 JJ=1,KNVAL
            IF ( lladd2 ) THEN
               INDEX1=KNELE+1 + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
               INDEX2=KNELE+2 + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
            ELSE
               INDEX1=IND1    + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
               INDEX2=IND2    + (JJ-1)*(KNELOUT)+(JN-1)*(KNVAL)*(KNELOUT)
            ENDIF
            IMARK2(INDEX1)=0
            IMARK2(INDEX2)=0
            zVAL2(INDEX1)=PPMIS
            zVAL2(INDEX2)=PPMIS
*
            IF ((ZPROFD(JJ).GT.360. .OR. ZPROFD(JJ).LT.0.) .OR.
     &        (ZPROFD(JJ).EQ.0.  .AND. ZPROFF(JJ).GT.0.)) THEN
               ZPROFD(JJ) = PPMIS
               ZPROFF(JJ) = PPMIS
            ENDIF
            llmis=( ZPROFD(JJ) .eq. PPMIS) .OR. (ZPROFF(JJ) .eq. PPMIS)
            if ( .NOT. LLMIS) THEN
*
*
************************************************************************
*      IF SPEED = 0 CALM WIND IS ASSUMED.
************************************************************************
*
                IF (ZPROFF(JJ) .EQ. 0.0) THEN
                   ZPROFD(JJ) = 0.
                ENDIF
*
                ZFF=ZPROFF(JJ)
                ZDD=ZPROFD(JJ) + 180.
                IF ( ZDD .GT. 360.) ZDD=ZDD-360.
                ZDD=ZDD*ZTORAD
*=============================================
C              O-a O-p  bg check CASE
                IF ( lladd2 ) THEN
                   ZVAL2(INDEX1)=ZFF*SIN(ZDD)
                   ZVAL2(INDEX2)=ZFF*COS(ZDD)
                   IMARK2(INDEX1)=0
                   IMARK2(INDEX2)=0
                ELSE
                   ZVAL (INDEX1)=ZFF*SIN(ZDD)
                   ZVAL (INDEX2)=ZFF*COS(ZDD)
                ENDIF
             else
                IF ( lladd2 ) THEN
                   ZVAL2(INDEX1)=ppmis
                   ZVAL2(INDEX2)=ppmis
                ELSE
                   ZVAL (INDEX1)=ppmis
                   ZVAL (INDEX2)=ppmis
                ENDIF
             endif
C
*=============================================
    3    CONTINUE
*
    2 CONTINUE
      ENDIF
C
C      TRANSFER BACK TO INPUT ARRAYS
C
      IF ( lladd2 .AND. LLEXPAND ) THEN
         DO J1 =1,KNELE
            DO J2 =1,KNVAL
               DO J3 =1,KINT
                  INDEX1=J1 + (J2-1)*KNELE   +(J3-1)*KNELE*KNVAL
                  INDEX2=J1 + (J2-1)*KNELOUT +(J3-1)*KNELOUT*KNVAL
                  ZVAL2 (INDEX2)= ZVAL(INDEX1)
                  IMARK2(INDEX2)=IMARK(INDEX1)
               END DO
            END DO
         END DO
C
         DO JJ =1,KNELOUT*KNVAL*KINT
            ZVAL (JJ)= ZVAL2(JJ)
            IMARK(JJ)=IMARK2(JJ)
         END DO
      ELSE
CC    NO WORK DONE BY ROUTINE
         KNELOUT=KNELE
      ENDIF
C
      RETURN
      END