!----------------------------------------------------------------------
SUBROUTINE CPNUDG ( KPROMA, KSTART, KPROF, KFNUDG, KLEV, KBLK,&
 !----------------------------------------------------------------------
 ! - INPUT 1D
 & PPNUDG,&
 & PVAENUD,&
 ! - IN/OUT 1D
 & PTS1,  PWS1,&
 & PWP1,  PSNS1,&
 & PTG1,  PQG1,  PUG1,  PVG1,&
 & PPG1,&
 & PTG0,  PQG0,  PUG0,  PVG0, PPG0, PGM, PLSM)
!****
!     ------------------------------------------------------------------

!     NUDGING OF SURFACE VARIABLES
!     ------------------------------------------------------------------

!     ARGUMENTS D ENTREE
!     ------------------
!       KPROMA : DIMENSION HORIZONTALE
!       KSTART : BORNE INITIALE HORIZONTALE DES CALCULS
!       KPROF : BORNE FINALE HORIZONTALE DES CALCULS
!       KFNUDG  : NBRE DE PAS DE TEMPS D'ANALYSE A INTERPOLER
!       KLEV  : NBRE DE NIVEAUX VERTICAUX
!       KBLK  : OFFSET (KBLK=(KSTGLO-1)/NPROMA+1)

! --- INPUT 1D
!     --------
!       PPNUDG(KFNUDG) : COEFFICIENTS TEMPORELS
!       PVAENUD(KPROMA) : MASQUE NUDGING (SI LNDRIV)
!       PTG0(KPROMA,KLEV) : TEMPERATURE AU DEBUT DU PAS DE TEMPS
!       PQG0(KPROMA,KLEV) : HUMI.SPECIFI AU DEBUT DU PAS DE TEMPS
!       PUG0(KPROMA,KLEV) : VENT.ZONAL AU DEBUT DU PAS DE TEMPS
!       PVG0(KPROMA,KLEV) : VENT.MERIDIE AU DEBUT DU PAS DE TEMPS
!       PPG0(KPROMA) : SURF.PRESSURE AU DEBUT DU PAS DE TEMPS
!       PGM(KPROMA)  : FACTEUR D'ECHELLE
!       PLSM(KPROMA) : MASQUE TERRE-MER

!     ARGUMENTS IMPLICITES
!     --------------------
!       INDICATEURS LOGIQUES    = COMMON /YOMPHY /: LSOLV,LNEIGE,LSNV
!       COEFF DE RAPPEL = COMMON /YOMNUD /

!     SORTIES
!     -------
!       PTS1,  PWS1, PWP1, PSNS1, :
!       CHAMPS DE SURFACE A FAIRE EVOLUER
!       PTG1,  PQG1, PUG1, PVG1, PPG1:
!       TENDANCE DES CHAMPS EN ALTITUDE A MODIFIER

!     IMPROVISE PAR
!     ------------- 
!       MICHEL DEQUE

!     AVEC LES MODIFS DE
!     ------------------
!       1999-02-25: Michel Deque: nudging with correction
!       2001-04-25: Michel Deque: nudging with time-variable coefficients
!       2002-02-14: Pascal Marquet: XWNUDG in YOMSNU
!       2005-06-20: Michel Deque: grid point nudging                
!       2006-10-25: A. Alias : Use of XV* fields introduced when surface fields
!                              were introduced (CY31R2)
!       2007-03-07: A. Alias : grid point nudging in stretched mode (M.Deque)
!       2006-10-15: A. Alias : Ts nudging with land-sea mask (M. Deque)
!       A.Bogatchev : 25-Oct-2007 removing of severe breaks of coding rools
!     ------------------------------------------------------------------

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
USE YOMNUD   , ONLY : LNUDRM   ,LNUDSD   ,LNUDSM   ,LNUDST   ,&
 & XNUDRM   ,XNUDSD   ,XNUDSM   ,XNUDST  ,&
 & LNDRIV   ,LNUDTG   ,LNUDQG   ,LNUDUG  ,LNUDVG   ,LNUDPG   ,&
 & XNUDTG   ,XNUDQG   ,XNUDUG   ,XNUDVG  ,XNUDPG   ,XNUVERT  ,&
 & XVUST    ,XVUSM    ,XVURM    ,XVUSD   ,XVUTG    ,XVUQG    ,&
 & XVUUG    ,XVUVG    ,XVUPG

USE YOMSNU   , ONLY : XWNUDG

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KPROMA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFNUDG 
INTEGER(KIND=JPIM),INTENT(IN)    :: KLEV 
INTEGER(KIND=JPIM),INTENT(IN)    :: KBLK 
INTEGER(KIND=JPIM),INTENT(IN)    :: KSTART 
INTEGER(KIND=JPIM),INTENT(IN)    :: KPROF 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPNUDG(KFNUDG) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVAENUD(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PTS1(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PWS1(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PWP1(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PSNS1(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PTG1(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PQG1(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PUG1(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PVG1(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(INOUT) :: PPG1(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PTG0(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PQG0(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PUG0(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PVG0(KPROMA,KLEV) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PPG0(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGM(KPROMA) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PLSM(KPROMA)

REAL(KIND=JPRB) :: ZREF(KPROMA)

INTEGER(KIND=JPIM) :: JROF, JSTEP, JLEV

REAL(KIND=JPRB) :: ZUSNUD2
REAL(KIND=JPRB) :: ZMASK(KPROMA)
REAL(KIND=JPRB) :: ZHOOK_HANDLE

!*
!     ------------------------------------------------------------------
!     1.- CALCUL DES EVOLUTIONS

IF (LHOOK) CALL DR_HOOK('CPNUDG',0,ZHOOK_HANDLE)
IF(LNDRIV) THEN
  DO JROF = KSTART,KPROF
    ZMASK(JROF)=PVAENUD(JROF)
  ENDDO
ELSE
  DO JROF = KSTART,KPROF
    ZMASK(JROF)=1.0_JPRB
  ENDDO
ENDIF
!       TEMPERATURE DE SURFACE
IF(LNUDST) THEN
  DO JROF = KSTART,KPROF
    ZREF(JROF)=0.0_JPRB
  ENDDO
  DO JSTEP=1,KFNUDG
    DO JROF = KSTART,KPROF
      ZREF(JROF)=ZREF(JROF)+XVUST(JROF,JSTEP,KBLK)*PPNUDG(JSTEP)
    ENDDO
  ENDDO
  IF(XNUDST <= 0) THEN
    ZUSNUD2=XNUDST
    DO JROF = KSTART,KPROF
      PTS1(JROF)=PTS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
    ENDDO
  ELSE
    ZUSNUD2=XNUDST*XWNUDG
    DO JROF = KSTART,KPROF
      IF(PLSM(JROF) > 0.5) THEN
      PTS1(JROF)=(PTS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF))&
       & /(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
      ELSE
      PTS1(JROF)=ZREF(JROF)
      ENDIF
    ENDDO
  ENDIF
ENDIF
!       RESERVOIR DE SURFACE
IF(LNUDSM) THEN
  DO JROF = KSTART,KPROF
    ZREF(JROF)=0.0_JPRB
  ENDDO
  DO JSTEP=1,KFNUDG
    DO JROF = KSTART,KPROF
      ZREF(JROF)=ZREF(JROF)+XVUSM(JROF,JSTEP,KBLK)*PPNUDG(JSTEP)
    ENDDO
  ENDDO
  IF(XNUDSM <= 0) THEN
    ZUSNUD2=XNUDSM
    DO JROF = KSTART,KPROF
      PWS1(JROF)=PWS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
    ENDDO
  ELSE
    ZUSNUD2=XNUDSM*XWNUDG
    DO JROF = KSTART,KPROF
      PWS1(JROF)=(PWS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF))&
       & /(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
    ENDDO
  ENDIF
ENDIF
!       RESERVOIR PROFOND
IF(LNUDRM) THEN
  DO JROF = KSTART,KPROF
    ZREF(JROF)=0.0_JPRB
  ENDDO
  DO JSTEP=1,KFNUDG
    DO JROF = KSTART,KPROF
      ZREF(JROF)=ZREF(JROF)+XVURM(JROF,JSTEP,KBLK)*PPNUDG(JSTEP)
    ENDDO
  ENDDO
  IF(XNUDRM <= 0) THEN
    ZUSNUD2=XNUDRM
    DO JROF = KSTART,KPROF
      PWP1(JROF)=PWP1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
    ENDDO
  ELSE
    ZUSNUD2=XNUDRM*XWNUDG
    DO JROF = KSTART,KPROF
      PWP1(JROF)=(PWP1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF))&
       & /(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
    ENDDO
  ENDIF
ENDIF
!       RESERVOIR DE NEIGE    
IF(LNUDSD) THEN
  DO JROF = KSTART,KPROF
    ZREF(JROF)=0.0_JPRB
  ENDDO
  DO JSTEP=1,KFNUDG
    DO JROF = KSTART,KPROF
      ZREF(JROF)=ZREF(JROF)+XVUSD(JROF,JSTEP,KBLK)*PPNUDG(JSTEP)
    ENDDO
  ENDDO
  IF(XNUDSD <= 0) THEN
    ZUSNUD2=XNUDSD
    DO JROF = KSTART,KPROF
      PSNS1(JROF)=PSNS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
    ENDDO
  ELSE
    ZUSNUD2=XNUDSD*XWNUDG
    DO JROF = KSTART,KPROF
      PSNS1(JROF)=(PSNS1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF))&
       & /(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
    ENDDO
  ENDIF
ENDIF
!       TEMPERATURE           

IF(LNUDTG) THEN
  DO JLEV=1,KLEV
    DO JROF = KSTART,KPROF
      ZREF(JROF)=0.0_JPRB
    ENDDO
    DO JSTEP=1,KFNUDG
      DO JROF = KSTART,KPROF
        ZREF(JROF)=ZREF(JROF)+XVUTG(JROF,JSTEP,JLEV,KBLK)*PPNUDG(JSTEP)
      ENDDO
    ENDDO
    IF(XNUDTG <= 0) THEN
      ZUSNUD2=XNUDTG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PTG1(JROF,JLEV)=PTG1(JROF,JLEV)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
      ENDDO
    ELSE
      ZUSNUD2=XNUDTG*XWNUDG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PTG1(JROF,JLEV)=(PTG1(JROF,JLEV)+ZUSNUD2*ZMASK(JROF)*&
         & (ZREF(JROF)-PTG0(JROF,JLEV)))/(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
      ENDDO
    ENDIF
  ENDDO
ENDIF
!       HUMI SPECIFI          
IF(LNUDQG) THEN
  DO JLEV=1,KLEV
    DO JROF = KSTART,KPROF
      ZREF(JROF)=0.0_JPRB
    ENDDO
    DO JSTEP=1,KFNUDG
      DO JROF = KSTART,KPROF
        ZREF(JROF)=ZREF(JROF)+XVUQG(JROF,JSTEP,JLEV,KBLK)*PPNUDG(JSTEP)
      ENDDO
    ENDDO
    IF(XNUDQG <= 0) THEN
      ZUSNUD2=XNUDQG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PQG1(JROF,JLEV)=PQG1(JROF,JLEV)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
      ENDDO
    ELSE
      ZUSNUD2=XNUDQG*XWNUDG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PQG1(JROF,JLEV)=(PQG1(JROF,JLEV)+ZUSNUD2*ZMASK(JROF)*&
         & (ZREF(JROF)-PQG0(JROF,JLEV)))/(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
      ENDDO
    ENDIF
  ENDDO
ENDIF
!       VENT ZONAL            
IF(LNUDUG) THEN
  DO JLEV=1,KLEV
    DO JROF = KSTART,KPROF
      ZREF(JROF)=0.0_JPRB
    ENDDO
    DO JSTEP=1,KFNUDG
      DO JROF = KSTART,KPROF
        ZREF(JROF)=ZREF(JROF)+XVUUG(JROF,JSTEP,JLEV,KBLK)*PPNUDG(JSTEP)*&
                  &PGM(JROF)
      ENDDO
    ENDDO
    IF(XNUDUG <= 0) THEN
      ZUSNUD2=XNUDUG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PUG1(JROF,JLEV)=PUG1(JROF,JLEV)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
      ENDDO
    ELSE
      ZUSNUD2=XNUDUG*XWNUDG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PUG1(JROF,JLEV)=(PUG1(JROF,JLEV)+ZUSNUD2*ZMASK(JROF)*&
         & (ZREF(JROF)-PUG0(JROF,JLEV)))/(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
      ENDDO
    ENDIF
  ENDDO
ENDIF
!       VENT MERIDIEN         
IF(LNUDVG) THEN
  DO JLEV=1,KLEV
    DO JROF = KSTART,KPROF
      ZREF(JROF)=0.0_JPRB
    ENDDO
    DO JSTEP=1,KFNUDG
      DO JROF = KSTART,KPROF
        ZREF(JROF)=ZREF(JROF)+XVUVG(JROF,JSTEP,JLEV,KBLK)*PPNUDG(JSTEP)*&
                  &PGM(JROF)
      ENDDO
    ENDDO
    IF(XNUDVG <= 0) THEN
      ZUSNUD2=XNUDVG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PVG1(JROF,JLEV)=PVG1(JROF,JLEV)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
      ENDDO
    ELSE
      ZUSNUD2=XNUDVG*XWNUDG*XNUVERT(JLEV)
      DO JROF = KSTART,KPROF
        PVG1(JROF,JLEV)=(PVG1(JROF,JLEV)+ZUSNUD2*ZMASK(JROF)*&
         & (ZREF(JROF)-PVG0(JROF,JLEV)))/(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
      ENDDO
    ENDIF
  ENDDO
ENDIF
!       PRESSION SURF         
IF(LNUDPG) THEN
  DO JROF = KSTART,KPROF
    ZREF(JROF)=0.0_JPRB
  ENDDO
  DO JSTEP=1,KFNUDG
    DO JROF = KSTART,KPROF
      ZREF(JROF)=ZREF(JROF)+XVUPG(JROF,JSTEP,KBLK)*PPNUDG(JSTEP)
    ENDDO
  ENDDO
  IF(XNUDPG <= 0) THEN
    ZUSNUD2=XNUDPG
    DO JROF = KSTART,KPROF
      PPG1(JROF)=PPG1(JROF)+ZUSNUD2*ZREF(JROF)*ZMASK(JROF)
    ENDDO
  ELSE
    ZUSNUD2=XNUDPG*XWNUDG
    DO JROF = KSTART,KPROF
!     IN CASE NLOSP IS REACTIVATED:
!     PPG1(JROF)=(PPG1(JROF)+ZUSNUD2*ZMASK(JROF)*&
!       &(ZREF(JROF)-PPG0(JROF)))/(_ONE_+ZUSNUD2*ZMASK(JROF))
      PPG1(JROF)=(PPG1(JROF)+ZUSNUD2*ZMASK(JROF)/PPG0(JROF)*&
       & (ZREF(JROF)-PPG0(JROF)))/(1.0_JPRB+ZUSNUD2*ZMASK(JROF))  
    ENDDO
  ENDIF
ENDIF

IF (LHOOK) CALL DR_HOOK('CPNUDG',1,ZHOOK_HANDLE)
END SUBROUTINE CPNUDG
