source: LMDZ6/branches/Amaury_dev/libf/dyn3d/interp_horiz.F90 @ 5106

Last change on this file since 5106 was 5106, checked in by abarral, 4 months ago

Turn coefils.h into lmdz_coefils.f90
Put filtreg.F90 inside lmdz_filtreg.F90
Turn mod_filtreg_p.F90 into lmdz_filtreg_p.F90
Delete obsolete parafilt.h*
(lint) remove spaces between routine name and args

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1!
2! $Id: interp_horiz.F90 5106 2024-07-23 20:21:18Z abarral $
3!
4SUBROUTINE interp_horiz(varo, varn, imo, jmo, imn, jmn, lm, &
5        rlonuo, rlatvo, rlonun, rlatvn)
6
7  !===========================================================
8  !  Interpolation Horizontales des variables d'une grille LMDZ
9  ! (des points SCALAIRES au point SCALAIRES)
10  !  dans une autre grille LMDZ en conservant la quantite
11  !  totale pour les variables intensives (/m2) : ex : Pression au sol
12  !
13  ! Francois Forget (01/1995)
14  !===========================================================
15
16  IMPLICIT NONE
17
18  !   Declarations:
19  ! ==============
20  !
21  !  ARGUMENTS
22  !  """""""""
23
24  integer :: imo, jmo ! dimensions ancienne grille (input)
25  integer :: imn, jmn  ! dimensions nouvelle grille (input)
26
27  real :: rlonuo(imo + 1)     !  Latitude et
28  real :: rlatvo(jmo)       !  longitude des
29  real :: rlonun(imn + 1)     !  bord des
30  real :: rlatvn(jmn)     !  cases "scalaires" (input)
31
32  integer :: lm ! dimension verticale (input)
33  real :: varo (imo + 1, jmo + 1, lm) ! var dans l'ancienne grille (input)
34  real :: varn (imn + 1, jmn + 1, lm) ! var dans la nouvelle grille (output)
35
36  ! Autres variables
37  ! """"""""""""""""
38  real :: airetest(imn + 1, jmn + 1)
39  integer :: ii, jj, l
40
41  real :: airen (imn + 1, jmn + 1) ! aire dans la nouvelle grille
42  !    Info sur les ktotal intersection entre les cases new/old grille
43  integer :: kllm, k, ktotal
44  parameter (kllm = 400 * 200 * 10)
45  integer :: iik(kllm), jjk(kllm), jk(kllm), ik(kllm)
46  real :: intersec(kllm)
47  real :: R
48  real :: totn, tots
49
50  logical :: firstcall, firsttest, aire_ok
51  save firsttest
52  data firsttest /.TRUE./
53  data aire_ok /.TRUE./
54
55
56
57
58
59  ! initialisation
60  ! --------------
61  ! Si c'est le premier appel, on prepare l'interpolation
62  ! en calculant pour chaque case autour d'un point scalaire de la
63  ! nouvelle grille, la surface  de intersection avec chaque
64  !    case de l'ancienne grille.
65
66  CALL iniinterp_horiz (imo, jmo, imn, jmn, kllm, &
67          rlonuo, rlatvo, rlonun, rlatvn, &
68          ktotal, iik, jjk, jk, ik, intersec, airen)
69
70  do l = 1, lm
71    do jj = 1, jmn + 1
72      do ii = 1, imn + 1
73        varn(ii, jj, l) = 0.
74      END DO
75    END DO
76  END DO
77
78  ! Interpolation horizontale
79  ! -------------------------
80  ! boucle sur toute les ktotal intersections entre les cases
81  ! de l'ancienne et la  nouvelle grille
82  !
83  PRINT *, 'ktotal 1 = ', ktotal
84
85  do k = 1, ktotal
86    do l = 1, lm
87      varn(iik(k), jjk(k), l) = varn(iik(k), jjk(k), l) &
88              + varo(ik(k), jk(k), l) * intersec(k) / airen(iik(k), jjk(k))
89    END DO
90  END DO
91
92  ! Une seule valeur au pole pour les variables ! :
93  ! -----------------------------------------------
94  do l = 1, lm
95    totn = 0.
96    tots = 0.
97    do ii = 1, imn + 1
98      totn = totn + varn(ii, 1, l)
99      tots = tots + varn (ii, jmn + 1, l)
100    END DO
101    do ii = 1, imn + 1
102      varn(ii, 1, l) = totn / REAL(imn + 1)
103      varn(ii, jmn + 1, l) = tots / REAL(imn + 1)
104    END DO
105  END DO
106
107
108  !---------------------------------------------------------------
109  !  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST
110  !!       if (.not.(firsttest)) goto 99
111  !!       firsttest = .FALSE.
112  !! !     write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:'
113  !!       do jj =1 , jmn+1
114  !!         do ii=1, imn+1
115  !!           airetest(ii,jj) =0.
116  !!         END DO
117  !!       END DO
118  !!       PRINT *, 'ktotal = ', ktotal
119  !!       PRINT *, 'jmn+1 =', jmn+1, 'imn+1', imn+1
120  !!
121  !!       do k=1,ktotal
122  !!          airetest(iik(k),jjk(k))= airetest(iik(k),jjk(k)) +intersec(k)
123  !!       end DO
124  !!
125  !!
126  !!       PRINT *, 'fin boucle'
127  !!       do jj =1 , jmn+1
128  !!        do ii=1, imn+1
129  !!          r = airen(ii,jj)/airetest(ii,jj)
130  !!          if ((r.gt.1.001).or.(r.lt.0.999)) then
131  !! !             write (*,*) '********** PROBLEME D'' AIRES !!!',
132  !! !     &                   ' DANS L''INTERPOLATION HORIZONTALE'
133  !! !             write(*,*)'ii,jj,airen,airetest',
134  !! !     &          ii,jj,airen(ii,jj),airetest(ii,jj)
135  !!              aire_ok = .FALSE.
136  !!          end if
137  !!        END DO
138  !!       END DO
139  !! !      if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK'
140  !!  99   continue
141
142  ! FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST
143  !---------------------------------------------------------------
144
145
146END SUBROUTINE  interp_horiz
Note: See TracBrowser for help on using the repository browser.