!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***S/R SERFIN - NORMALISATION DES UNITES DES DIVERSES SERIES
*
#include "phy_macros_f.h"

      SUBROUTINE SERFIN(VS,VV,SURFACE,PROFILS,NT,NK,NSURF,NPROF, 1,6
     +                  DGRW, MAP, LAT, LON,
     +                  DEGRAD, MODELE, IG)
#include "impnone.cdk"
*
      INTEGER NSURF,NK,NT,NPROF
      REAL VS(NT,NSURF),VV(NK,NT,NPROF)
      CHARACTER *(*) SURFACE(*),PROFILS(*)
      REAL MAP,LAT,LON
      REAL DGRW, DEGRAD
      CHARACTER*3 MODELE
      INTEGER IG(4)
*
*Author
*          R. Benoit
*
*Revision
* 001      V.Alex.(Feb 87) Documentation
* 002      N. Brunet  (May90)
*                Standardization of thermodynamic functions
* 003      N. Brunet  (May91)
*                New version of thermodynamic functions
*                and file of constants
* 004      B. Bilodeau  (July 1991)- Adaptation to UNIX
* 005      B. Bilodeau  (Jan94) - Add rotation of GU and GV
* 006      B. Bilodeau  (Feb94) - Remove calculations involving
*                                 TSTAR, QSTAR and PSTAR
* 007      B. Bilodeau (Feb 1997) - Rotation of winds from GEF grid
* 008      B. Bilodeau (Jan 2001) - Automatic arrays
*
*Object
*          to normalize units of the extracted time-series data
*
*Arguments
*
*          - Input/Output -
* VS       time-serie values of surface variables requested
* VV       time-serie values of profile variables requested
*
*          - Input -
* SURFACE  names of time series surface variables requested
* PROFILS  names of time series profile variables requested
* NT       timestep number
* NK       vertical dimension
* NSURF    number of surface variables requested
* NPROF    number of profile variables requested
* DGRW     angle between the Greenwich meridian and the X
*          axis of the model
* MAP      scale factor for the station
* LAT      latitude of the station
* LON      longitude of the station
* DEGRAD   conversion constant from degrees to radians
* MODELE   model name (EFR or GEF)
* IG       IG1,IG2,IG3 and IG4 of the GEF grid descriptors
*
*MODULES
      INTEGER INDSERI
      EXTERNAL INDSERI
*
**
      INTEGER I,J
      INTEGER IELA,IELAU,IELAV,IELATU
      INTEGER IELATV,IELAGU,IELAGV
      SAVE    IELA,IELAU,IELAV,IELATU
      SAVE    IELATV,IELAGU,IELAGV
      REAL EPSIL,X,Y,PSIMLON,HNOR,CON
      REAL DEG2RAD, THETA
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
      AUTOMATIC ( LAT2 , REAL , (NK,NT))
      AUTOMATIC ( LON2 , REAL , (NK,NT))
      AUTOMATIC ( X2   , REAL , (NK,NT))
      AUTOMATIC ( Y2   , REAL , (NK,NT))
*
************************************************************************
*
#include "consphy.cdk"
*
      DEG2RAD = PI/180.
*
*
*  UU , VV , TU , TV , VE
      IELAU=INDSERI('UU',PROFILS,NPROF)
      IELAV=INDSERI('VV',PROFILS,NPROF)
      IELATU=INDSERI('TU',PROFILS,NPROF)
      IELATV=INDSERI('TV',PROFILS,NPROF)
      IELAGU=INDSERI('GU',PROFILS,NPROF)
      IELAGV=INDSERI('GV',PROFILS,NPROF)
*
      IF ( MODELE.EQ.'EFR' ) THEN
*
*  FORMULES PRISES DANS 'LONGITUDE LATITUDE GRIDS'(D.ROBERTSON,'78)
*
         EPSIL=1.E-30
*
      IF ( IELAU*IELAV.GT.0 ) THEN
         DO 46 J=1,NT
         DO 46 I=1,NK
            X=VV(I,J,IELAU)
            Y=VV(I,J,IELAV)
            PSIMLON=-(DGRW+LON)*DEGRAD+ATAN2(Y+EPSIL,X+EPSIL)
            HNOR=SQRT(X**2+Y**2)
            VV(I,J,IELAU)=HNOR*SIN(PSIMLON)
   46       VV(I,J,IELAV)=-HNOR*COS(PSIMLON)
      ENDIF
      IF ( IELATU*IELATV.GT.0 ) THEN
         DO 47 J=1,NT
         DO 47 I=1,NK
            X=VV(I,J,IELATU)
            Y=VV(I,J,IELATV)
            PSIMLON=-(DGRW+LON)*DEGRAD+ATAN2(Y+EPSIL,X+EPSIL)
            HNOR=SQRT(X**2+Y**2)
            VV(I,J,IELATU)=HNOR*SIN(PSIMLON)
   47       VV(I,J,IELATV)=-HNOR*COS(PSIMLON)
      ENDIF
      IF ( IELAGU*IELAGV.GT.0 ) THEN
         DO 48 J=1,NT
         DO 48 I=1,NK
            X=VV(I,J,IELAGU)
            Y=VV(I,J,IELAGV)
            PSIMLON=-(DGRW+LON)*DEGRAD+ATAN2(Y+EPSIL,X+EPSIL)
            HNOR=SQRT(X**2+Y**2)
            VV(I,J,IELAGU)=HNOR*SIN(PSIMLON)
   48       VV(I,J,IELAGV)=-HNOR*COS(PSIMLON)
*
      ENDIF
*
      ELSE IF (MODELE.EQ.'GEF') THEN
*
      IF ( IELAU*IELAV.GT.0 ) THEN
*
         DO J=1,NT
            DO I=1,NK
               LAT2(I,J) = LAT
               LON2(I,J) = LON
               X2  (I,J) = VV(I,J,IELAU) 
               Y2  (I,J) = VV(I,J,IELAV) 
            END DO
         END DO
*
         CALL LLWFGFW(X2,Y2,LAT2,LON2,NT*NK,1,
     +        'E',IG(1),IG(2),IG(3),IG(4))
*
         DO J=1,NT
            DO I=1,NK
               THETA = PI/2 - Y2(I,J)*DEG2RAD
               VV(I,J,IELAU) = -X2(I,J)*COS(THETA)
               VV(I,J,IELAV) = -X2(I,J)*SIN(THETA)
            END DO
         END DO
*
      ENDIF
*
      IF ( IELATU*IELATV.GT.0 ) THEN
*
*
         DO J=1,NT
            DO I=1,NK
               LAT2(I,J) = LAT
               LON2(I,J) = LON
               X2  (I,J) = VV(I,J,IELATU)
               Y2  (I,J) = VV(I,J,IELATV)
            END DO
         END DO
*
         CALL LLWFGFW(X2,Y2,LAT2,LON2,NT*NK,1,
     +        'E',IG(1),IG(2),IG(3),IG(4))
*
         DO J=1,NT
            DO I=1,NK
               THETA = PI/2 - Y2(I,J)*DEG2RAD
               VV(I,J,IELATU) = -X2(I,J)*COS(THETA)
               VV(I,J,IELATV) = -X2(I,J)*SIN(THETA)
            END DO
         END DO
*
      ENDIF
*
      IF ( IELAGU*IELAGV.GT.0 ) THEN
*
*
         DO J=1,NT
            DO I=1,NK
               LAT2(I,J) = LAT
               LON2(I,J) = LON
               X2  (I,J) = VV(I,J,IELAGU)
               Y2  (I,J) = VV(I,J,IELAGV)
            END DO
         END DO
*
         CALL LLWFGFW(X2,Y2,LAT2,LON2,NT*NK,1,
     +        'E',IG(1),IG(2),IG(3),IG(4))
*
         DO J=1,NT
            DO I=1,NK
               THETA = PI/2 - Y2(I,J)*DEG2RAD
               VV(I,J,IELAGU) = -X2(I,J)*COS(THETA)
               VV(I,J,IELAGV) = -X2(I,J)*SIN(THETA)
            END DO
         END DO
*
      ENDIF
*
      ENDIF
*
      RETURN
      END