source: trunk/LMDZ.GENERIC/libf/dyn3d/groupeun.F @ 588

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

CHANGEMENT ARBORESCENCE ETAPE 2 -- NON COMPLET

File size: 3.9 KB
Line 
1!Mars importe directement de la version martienne
2      subroutine groupeun(jjmax,llmax,q)
3      implicit none
4
5c *********************************************************
6c     lissage fort des champs aux poles pour permettre
7c     de tourner avec plafond haut.
8c     F. Hourdin, 1997.
9c     (commentaire et test sur ngroup par Francois Forget, 05/2000)
10c
11c     Technique :
12c
13c     1) Les points sont regroupes par paquet de 2**ngroup
14c     aux poles (e.g. ngroup=3 -> paquet de 8), puis 2**(ngroup-1)
15c     2**(ngroup-2), etc... aux latitude plus basse en s'eloignant du pole
16c
17c     2) Plus ngroup est eleve, plus le lissage est efficace
18c
19c     3) MAIS, il faut iim divisible par 2**ngroup !!!
20c
21c
22c *********************************************************
23
24#include "dimensions.h"
25#include "paramet.h"
26#include "comconst.h"
27#include "comgeom2.h"
28
29      integer jjmax,llmax
30      real q(iip1,jjmax,llmax)
31
32      integer ngroup
33      parameter (ngroup=2)
34
35      logical intensive
36
37      real airen,airecn,qn
38      real aires,airecs,qs
39
40      integer i,j,l,ig,j1,j2,i0,jd
41      logical firstcall
42      DATA firstcall/.true./
43
44c -------------------------------------------------------
45c   test sur ngroup :
46
47      if (firstcall) then
48        IF(MOD(iim,2**ngroup).NE.0) then
49           write(*,*) 'Problem in groupeun.F'
50           write(*,*) 'iim= ', iim, ' ngroup=', ngroup
51           write(*,*) 'iim must be divisible by par 2**ngroup= ',
52     &                 2**ngroup
53           write(*,*) ' YOU must change ngroup in groupeun.F'
54           write(*,*) ' Have fun... '
55           stop
56        END IF
57        write(*,*) 'in groupeun.F, ngroup=', ngroup
58        firstcall = .false.
59      end if
60     
61
62c Champs 3D
63      intensive=.true.
64      if (intensive) then
65      jd=jjp1-jjmax
66      do l=1,llmax
67       j1=1+jd
68       j2=2
69       do ig=1,ngroup
70         do j=j1-jd,j2-jd
71c           print*,'groupe ',ig,'  j= ',j,2**(ngroup-ig+1),'pts groupes'
72            do i0=1,iim,2**(ngroup-ig+1)
73               airen=0.
74               airecn=0.
75               qn=0.
76               aires=0.
77               airecs=0.
78               qs=0.
79               do i=i0,i0+2**(ngroup-ig+1)-1
80                  airen=airen+aire(i,j)
81                  aires=aires+aire(i,jjp1-j+1)
82                  qn=qn+q(i,j,l)*aire(i,j)
83                  qs=qs+q(i,jjp1-j+1-jd,l)*aire(i,jjp1-j+1)
84               enddo
85               airecn=0.
86               airecs=0.
87               do i=i0,i0+2**(ngroup-ig+1)-1
88                  q(i,j,l)=qn/airen
89                  q(i,jjp1-j+1-jd,l)=qs/aires
90               enddo
91            enddo
92            q(iip1,j,l)=q(1,j,l)
93            q(iip1,jjp1-j+1-jd,l)=q(1,jjp1-j+1-jd,l)
94         enddo
95         j1=j2+1
96         j2=j2+2**ig
97       enddo
98      enddo
99
100c  ---------------
101      else
102c   Cas sans multiplication par les aires.
103c  ---------------
104
105      jd=jjp1-jjmax
106      do l=1,llmax
107      j1=1+jd
108      j2=2
109      do ig=1,ngroup
110         do j=j1-jd,j2-jd
111c           print*,'groupe ',ig,'  j= ',j,2**(ngroup-ig+1),'pts groupes'
112            do i0=1,iim,2**(ngroup-ig+1)
113               airen=0.
114               airecn=0.
115               qn=0.
116               aires=0.
117               airecs=0.
118               qs=0.
119               do i=i0,i0+2**(ngroup-ig+1)-1
120                  airen=airen+aire(i,j)
121                  aires=aires+aire(i,jjp1-j+1)
122                  qn=qn+q(i,j,l)
123                  qs=qs+q(i,jjp1-j+1-jd,l)
124               enddo
125               airecn=0.
126               airecs=0.
127               do i=i0,i0+2**(ngroup-ig+1)-1
128                  q(i,j,l)=qn*aire(i,j)/airen
129                  q(i,jjp1-j+1-jd,l)=qs*aire(i,jjp1-j+1)/aires
130               enddo
131            enddo
132            q(iip1,j,l)=q(1,j,l)
133            q(iip1,jjp1-j+1-jd,l)=q(1,jjp1-j+1-jd,l)
134         enddo
135         j1=j2+1
136         j2=j2+2**ig
137      enddo
138      enddo
139
140      endif
141
142c     print*,'On groupe jusque j=',j1-1,rlatu(j1-1)*180./pi
143
144      return
145      end
Note: See TracBrowser for help on using the repository browser.