source: trunk/LMDZ.PLUTO.old/libf/dyn3d/interp_horiz.F @ 3436

Last change on this file since 3436 was 3175, checked in by emillour, 11 months ago

Pluto PCM:
Add the old Pluto LMDZ for reference (required prior step to making
an LMDZ.PLUTO using the same framework as the other physics packages).
TB+EM

File size: 6.2 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,INTENT(IN) :: imo, jmo ! dimensions ancienne grille (input)
22       INTEGER,INTENT(IN) :: imn,jmn  ! dimensions nouvelle grille (input)
23
24       REAL,INTENT(IN) :: rlonuo(imo+1)     !  Latitude et
25       REAL,INTENT(IN) :: rlatvo(jmo)       !  longitude des
26       REAL,INTENT(IN) :: rlonun(imn+1)     !  bord des
27       REAL,INTENT(IN) :: rlatvn(jmn)     !  cases "scalaires" (input)
28
29       INTEGER,INTENT(IN) :: lm ! dimension verticale (input)
30       REAL,INTENT(IN) :: varo (imo+1, jmo+1,lm) ! var dans l'ancienne grille (input)
31       REAL,INTENT(OUT) :: 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,SAVE :: 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
51       integer,save :: ktotal
52       !parameter (kmax = 360*179 + 200000)
53       parameter (kmax = 5440*5400)
54c      parameter (kmax = 360*179 + 40000)
55
56       INTEGER,SAVE :: iik(kmax), jjk(kmax),jk(kmax),ik(kmax)
57       REAL,SAVE :: intersec(kmax)
58       REAL rrr
59       REAL totn, tots
60       integer,save :: prev_sumdim=0
61
62       logical,save :: firsttest=.true. , aire_ok=.true.
63
64       integer,save :: imoS,jmoS,imnS,jmnS
65
66       write(*,*) 'Start interpolation horiz'
67c Test dimensions imnmx2 jmnmx2
68c""""""""""""""""""""""""""""""
69c test dimensionnement tableau airetest
70      if (imn.GT.imnmx2.OR.jmn.GT.jmnmx2) then
71         write(*,*) 'STOP pb dimensionnement tableau airetest'
72         write(*,*) 'il faut imn < imnmx2 et jmn < jmnmx2'
73         write(*,*) 'imn imnmx2', imn,imnmx2
74         write(*,*) 'jmn jmnmx2', jmn,jmnmx2
75         call exit(1)
76      endif
77      !write(*,*) 'TB17: imo,jmo,imn,jmn',imo,jmo,imn,jmn
78
79c initialisation
80c --------------
81c Si c'est le premier appel,  on prepare l'interpolation
82c en calculant pour chaque case autour d'un point scalaire de la
83c nouvelle grille, la surface  de intersection avec chaque
84c    case de l'ancienne grille.
85
86c  This must also be done if we change the dimension
87      if (imo+jmo+imn+jmn.ne.prev_sumdim) then
88          firsttest=.true.
89          prev_sumdim=imo+jmo+imn+jmn
90      end if       
91
92      if (firsttest) then
93        call iniinterp_h(imo,jmo,imn,jmn ,kmax,
94     &       rlonuo,rlatvo,rlonun,rlatvn,
95     &          ktotal,iik,jjk,jk,ik,intersec,airen)
96       imoS=imo
97       jmoS=jmo
98       imnS=imn
99       jmnS=jmn
100      else
101       if(imo.NE.imoS.OR.jmo.NE.jmoS.OR.imn.NE.imnS.OR.jmn.NE.jmnS) then
102        call iniinterp_h(imo,jmo,imn,jmn ,kmax,
103     &       rlonuo,rlatvo,rlonun,rlatvn,
104     &          ktotal,iik,jjk,jk,ik,intersec,airen)
105       imoS=imo
106       jmoS=jmo
107       imnS=imn
108       jmnS=jmn
109       end if
110      end if
111     
112     
113      !write(*,*) 'TB17: rlatvo=',rlatvo
114      !write(*,*) 'TB17: rlatvn=',rlatvn
115
116! initialize varn() to zero
117      !varn(1:imn+1,1:jmn+1,1:lm)=0.
118      varn(:,:,:)=0.
119       
120c Interpolation horizontale
121c -------------------------
122c boucle sur toute les ktotal intersections entre les cases
123c de l'ancienne et la  nouvelle grille
124c
125      !write(*,*) 'TB17 ktotal=',ktotal
126      do l=1,lm
127        do k=1,ktotal
128         varn(iik(k),jjk(k),l) = varn(iik(k),jjk(k),l)
129     &   + varo(ik(k), jk(k),l)*intersec(k)/airen(iik(k)
130     &   +(jjk(k)-1)*(imn+1))
131        end do
132      end do
133     
134c Une seule valeur au pole pour les variables ! :
135c -----------------------------------------------
136      DO l=1, lm
137         totn =0.
138         tots =0.
139
140
141c moyenne du champ au poles (ponderee par les aires)
142c"""""""""""""""""""""""""""""""
143         airentotn=0.
144         airentots=0.
145
146         do ii =1, imn+1
147            totn = totn + varn(ii,1,l)*airen(ii)
148            tots = tots + varn (ii,jmn+1,l)*airen(jmn*(imn+1)+ii)
149            airentotn=airentotn + airen(ii)
150            airentots=airentots + airen(jmn*(imn+1)+ii)
151         end do
152
153         do ii =1, imn+1
154            varn(ii,1,l) = totn/airentotn
155            varn(ii,jmn+1,l) = tots/airentots
156         end do
157
158      ENDDO
159           
160
161c---------------------------------------------------------------
162c  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST  TEST
163      if (firsttest) then
164      firsttest = .false.
165      write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:'
166
167      do jj =1 , jmn+1
168        do ii=1, imn+1
169          airetest(ii,jj) =0.
170        end do
171      end do
172      do k=1,ktotal
173         airetest(iik(k),jjk(k))= airetest(iik(k),jjk(k)) +intersec(k)
174      end do
175      do jj =1 , jmn+1
176       do ii=1, imn+1
177         rrr = airen(ii+(jj-1)*(imn+1))/airetest(ii,jj)
178         if ((rrr.gt.1.001).or.(rrr.lt.0.999)) then
179             write (*,*) '********** PROBLEME D'' AIRES !!!',
180     &                   ' DANS L''INTERPOLATION HORIZONTALE'
181             write(*,*)'ii,jj,airen,airetest',
182     &          ii,jj,airen(ii+(jj-1)*(imn+1)),airetest(ii,jj)
183             aire_ok = .false.
184         end if
185       end do
186      end do
187      if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK'
188      endif
189
190c FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST  FIN TEST
191c --------------------------------------------------------------------
192
193
194        end
Note: See TracBrowser for help on using the repository browser.