source: trunk/mesoscale/LMDZ.MARS/libf_gcm/dyn3d/interp_horiz.F @ 57

Last change on this file since 57 was 57, checked in by aslmd, 14 years ago

mineur LMD_MM_MARS: ajout du GCM ancienne physique, systeme maintenant complet sur SVN (ne manque que la base de donnees d'etats initiaux)

File size: 6.0 KB
Line 
1      subroutine interp_horiz (varo,varn,imo,jmo,imn,jmn,lm,
2     &  rlonuo,rlatvo,rlonun,rlatvn) 
3
4c===========================================================
5c  Interpolation Horizontales des variables d'une grille LMDZ
6c (des points SCALAIRES au point SCALAIRES)
7c  dans une autre grille LMDZ en conservant la quantite
8c  totale pour les variables intensives (/m2) : ex : Pression au sol
9c
10c Francois Forget (01/1995)
11c===========================================================
12
13      IMPLICIT NONE
14
15c   Declarations:
16c ==============
17c
18c  ARGUMENTS
19c  """""""""
20       
21       INTEGER imo, jmo ! dimensions ancienne grille (input)
22       INTEGER imn,jmn  ! dimensions nouvelle grille (input)
23
24       REAL rlonuo(imo+1)     !  Latitude et
25       REAL rlatvo(jmo)       !  longitude des
26       REAL rlonun(imn+1)     !  bord des
27       REAL rlatvn(jmn)     !  cases "scalaires" (input)
28
29       INTEGER lm ! dimension verticale (input)
30       REAL varo (imo+1, jmo+1,lm) ! var dans l'ancienne grille (input)
31       REAL varn (imn+1,jmn+1,lm) ! var dans la nouvelle grille (output)
32
33c Autres variables
34c """"""""""""""""
35       INTEGER imnmx2,jmnmx2
36       parameter (imnmx2=190,jmnmx2=100)
37       REAL airetest(imnmx2+1,jmnmx2+1)
38       INTEGER ii,jj,l
39
40       REAL airen ((imnmx2+1)*(jmnmx2+1)) ! aire dans la nouvelle grille
41       REAL airentotn   ! aire totale pole nord dans la nouvelle grille
42       REAL airentots   ! aire totale pole sud dans la nouvelle grille
43c    Info sur les ktotal intersection entre les cases new/old grille
44
45c kmax: le nombre  max  d'intersections entre les 2 grilles horizontales
46c On fixe kmax a la taille de la grille des donnees martiennes (360x179)
47c + des pouiemes (cas ou une maille est a cheval sur 2 ou 4 mailles)
48c  Il y a un test dans iniinterp_h pour s'assurer que ktotal < kmax
49       INTEGER kmax, k, ktotal
50       parameter (kmax = 360*179 + 200000)
51c      parameter (kmax = 360*179 + 40000)
52
53       INTEGER iik(kmax), jjk(kmax),jk(kmax),ik(kmax)
54       REAL intersec(kmax)
55       REAL R
56       REAL totn, tots
57       REAL prev_sumdim
58       save prev_sumdim
59       
60
61       logical firsttest, aire_ok
62       save firsttest
63       data firsttest /.true./
64       data aire_ok /.true./
65
66       integer imoS,jmoS,imnS,jmnS
67       save imoS,jmoS,imnS,jmnS
68       save ktotal,iik,jjk,jk,ik,intersec,airen
69       REAL pi
70
71c Test dimensions imnmx2 jmnmx2
72c""""""""""""""""""""""""""""""
73c test dimensionnement tableau airetest
74      if (imn.GT.imnmx2.OR.jmn.GT.jmnmx2) then
75         write(*,*) 'STOP pb dimensionnement tableau airetest'
76         write(*,*) 'il faut imn < imnmx2 et jmn < jmnmx2'
77         write(*,*) 'imn imnmx2', imn,imnmx2
78         write(*,*) 'jmn jmnmx2', jmn,jmnmx2
79         call exit(1)
80      endif
81
82c initialisation
83c --------------
84c Si c'est le premier appel,  on prepare l'interpolation
85c en calculant pour chaque case autour d'un point scalaire de la
86c nouvelle grille, la surface  de intersection avec chaque
87c    case de l'ancienne grille.
88
89c  This must also be done if we change the dimension
90      if (imo+jmo+imn+jmn.ne.prev_sumdim) then
91          firsttest=.true.
92          prev_sumdim=imo+jmo+imn+jmn
93      end if       
94
95      if (firsttest) then
96        call iniinterp_h(imo,jmo,imn,jmn ,kmax,
97     &       rlonuo,rlatvo,rlonun,rlatvn,
98     &          ktotal,iik,jjk,jk,ik,intersec,airen)
99       imoS=imo
100       jmoS=jmo
101       imnS=imn
102       jmnS=jmn
103      else
104       if(imo.NE.imoS.OR.jmo.NE.jmoS.OR.imn.NE.imnS.OR.jmn.NE.jmnS) then
105        call iniinterp_h(imo,jmo,imn,jmn ,kmax,
106     &       rlonuo,rlatvo,rlonun,rlatvn,
107     &          ktotal,iik,jjk,jk,ik,intersec,airen)
108       imoS=imo
109       jmoS=jmo
110       imnS=imn
111       jmnS=jmn
112       end if
113      end if
114
115      do l=1,lm
116       do jj =1 , jmn+1
117        do ii=1, imn+1
118          varn(ii,jj,l) =0.
119        end do
120       end do
121      end do
122       
123c Interpolation horizontale
124c -------------------------
125c boucle sur toute les ktotal intersections entre les cases
126c de l'ancienne et la  nouvelle grille
127c
128     
129      do k=1,ktotal
130        do l=1,lm
131         varn(iik(k),jjk(k),l) = varn(iik(k),jjk(k),l)
132     &   + varo(ik(k), jk(k),l)*intersec(k)/airen(iik(k)
133     &   +(jjk(k)-1)*(imn+1))
134        end do
135      end do
136
137c Une seule valeur au pole pour les variables ! :
138c -----------------------------------------------
139      DO l=1, lm
140         totn =0.
141         tots =0.
142
143
144c moyenne du champ au poles (ponderee par les aires)
145c"""""""""""""""""""""""""""""""
146         airentotn=0.
147         airentots=0.
148
149         do ii =1, imn+1
150            totn = totn + varn(ii,1,l)*airen(ii)
151            tots = tots + varn (ii,jmn+1,l)*airen(jmn*(imn+1)+ii)
152            airentotn=airentotn + airen(ii)
153            airentots=airentots + airen(jmn*(imn+1)+ii)
154         end do
155
156         do ii =1, imn+1
157            varn(ii,1,l) = totn/airentotn
158            varn(ii,jmn+1,l) = tots/airentots
159         end do
160
161      ENDDO
162           
163
164c---------------------------------------------------------------
165c  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST
166      if (firsttest) then
167      pi=2.*asin(1.)
168      firsttest = .false.
169      write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:'
170
171      do jj =1 , jmn+1
172        do ii=1, imn+1
173          airetest(ii,jj) =0.
174        end do
175      end do
176      do k=1,ktotal
177         airetest(iik(k),jjk(k))= airetest(iik(k),jjk(k)) +intersec(k)
178      end do
179      do jj =1 , jmn+1
180       do ii=1, imn+1
181         r = airen(ii+(jj-1)*(imn+1))/airetest(ii,jj)
182         if ((r.gt.1.001).or.(r.lt.0.999)) then
183             write (*,*) '********** PROBLEME D'' AIRES !!!',
184     &                   ' DANS L''INTERPOLATION HORIZONTALE'
185             write(*,*)'ii,jj,airen,airetest',
186     &          ii,jj,airen(ii+(jj-1)*(imn+1)),airetest(ii,jj)
187             aire_ok = .false.
188         end if
189       end do
190      end do
191      if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK'
192      endif
193
194c FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST
195c --------------------------------------------------------------------
196
197
198        return
199        end
Note: See TracBrowser for help on using the repository browser.