source: trunk/LMDZ.MARS/libf/dyn3d/interp_horiz.F @ 314

Last change on this file since 314 was 38, checked in by emillour, 14 years ago

Ajout du modè Martien (mon LMDZ.MARS.BETA, du 28/01/2011) dans le rértoire mars, pour pouvoir suivre plus facilement les modifs.
EM

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