!
! $Id: interp_horiz.F90 5103 2024-07-23 13:29:36Z abarral $
!
SUBROUTINE interp_horiz (varo, varn, imo, jmo, imn, jmn, lm, &
        rlonuo, rlatvo, rlonun, rlatvn)

  !===========================================================
  !  Interpolation Horizontales des variables d'une grille LMDZ
  ! (des points SCALAIRES au point SCALAIRES)
  !  dans une autre grille LMDZ en conservant la quantite
  !  totale pour les variables intensives (/m2) : ex : Pression au sol
  !
  ! Francois Forget (01/1995)
  !===========================================================

  IMPLICIT NONE

  !   Declarations:
  ! ==============
  !
  !  ARGUMENTS
  !  """""""""

  integer :: imo, jmo ! dimensions ancienne grille (input)
  integer :: imn, jmn  ! dimensions nouvelle grille (input)

  real :: rlonuo(imo + 1)     !  Latitude et
  real :: rlatvo(jmo)       !  longitude des
  real :: rlonun(imn + 1)     !  bord des
  real :: rlatvn(jmn)     !  cases "scalaires" (input)

  integer :: lm ! dimension verticale (input)
  real :: varo (imo + 1, jmo + 1, lm) ! var dans l'ancienne grille (input)
  real :: varn (imn + 1, jmn + 1, lm) ! var dans la nouvelle grille (output)

  ! Autres variables
  ! """"""""""""""""
  real :: airetest(imn + 1, jmn + 1)
  integer :: ii, jj, l

  real :: airen (imn + 1, jmn + 1) ! aire dans la nouvelle grille
  !    Info sur les ktotal intersection entre les cases new/old grille
  integer :: kllm, k, ktotal
  parameter (kllm = 400 * 200 * 10)
  integer :: iik(kllm), jjk(kllm), jk(kllm), ik(kllm)
  real :: intersec(kllm)
  real :: R
  real :: totn, tots

  logical :: firstcall, firsttest, aire_ok
  save firsttest
  data firsttest /.TRUE./
  data aire_ok /.TRUE./





  ! initialisation
  ! --------------
  ! Si c'est le premier appel, on prepare l'interpolation
  ! en calculant pour chaque case autour d'un point scalaire de la
  ! nouvelle grille, la surface  de intersection avec chaque
  !    case de l'ancienne grille.

  CALL iniinterp_horiz (imo, jmo, imn, jmn, kllm, &
          rlonuo, rlatvo, rlonun, rlatvn, &
          ktotal, iik, jjk, jk, ik, intersec, airen)

  do l = 1, lm
    do jj = 1, jmn + 1
      do ii = 1, imn + 1
        varn(ii, jj, l) = 0.
      END DO
    END DO
  END DO

  ! Interpolation horizontale
  ! -------------------------
  ! boucle sur toute les ktotal intersections entre les cases
  ! de l'ancienne et la  nouvelle grille
  !
  PRINT *, 'ktotal 1 = ', ktotal

  do k = 1, ktotal
    do l = 1, lm
      varn(iik(k), jjk(k), l) = varn(iik(k), jjk(k), l) &
              + varo(ik(k), jk(k), l) * intersec(k) / airen(iik(k), jjk(k))
    END DO
  END DO

  ! Une seule valeur au pole pour les variables ! :
  ! -----------------------------------------------
  do l = 1, lm
    totn = 0.
    tots = 0.
    do ii = 1, imn + 1
      totn = totn + varn(ii, 1, l)
      tots = tots + varn (ii, jmn + 1, l)
    END DO
    do ii = 1, imn + 1
      varn(ii, 1, l) = totn / REAL(imn + 1)
      varn(ii, jmn + 1, l) = tots / REAL(imn + 1)
    END DO
  END DO


  !---------------------------------------------------------------
  !  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST
  !!       if (.not.(firsttest)) goto 99
  !!       firsttest = .FALSE.
  !! !     write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:'
  !!       do jj =1 , jmn+1
  !!         do ii=1, imn+1
  !!           airetest(ii,jj) =0.
  !!         END DO
  !!       END DO
  !!       PRINT *, 'ktotal = ', ktotal
  !!       PRINT *, 'jmn+1 =', jmn+1, 'imn+1', imn+1
  !!
  !!       do k=1,ktotal
  !!          airetest(iik(k),jjk(k))= airetest(iik(k),jjk(k)) +intersec(k)
  !!       end DO
  !!
  !!
  !!       PRINT *, 'fin boucle'
  !!       do jj =1 , jmn+1
  !!        do ii=1, imn+1
  !!          r = airen(ii,jj)/airetest(ii,jj)
  !!          if ((r.gt.1.001).or.(r.lt.0.999)) then
  !! !             write (*,*) '********** PROBLEME D'' AIRES !!!',
  !! !     &                   ' DANS L''INTERPOLATION HORIZONTALE'
  !! !             write(*,*)'ii,jj,airen,airetest',
  !! !     &          ii,jj,airen(ii,jj),airetest(ii,jj)
  !!              aire_ok = .FALSE.
  !!          end if
  !!        END DO
  !!       END DO
  !! !      if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK'
  !!  99   continue

  ! FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST
  !---------------------------------------------------------------

  return
END SUBROUTINE  interp_horiz
