! ! $Id: interp_horiz.f90 5246 2024-10-21 12:58:45Z 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