! ! $Id: interp_horiz.F90 5106 2024-07-23 20:21:18Z 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 !--------------------------------------------------------------- END SUBROUTINE interp_horiz