source: LMDZ6/trunk/libf/dyn3d/groupeun.f90 @ 5273

Last change on this file since 5273 was 5272, checked in by abarral, 2 days ago

Turn paramet.h into a module

  • 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.8 KB
Line 
1!
2! $Header$
3!
4SUBROUTINE groupeun(jjmax,llmax,q)
5
6  USE comconst_mod, ONLY: ngroup
7
8  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
9USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
10          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
11IMPLICIT NONE
12
13
14
15  include "comgeom2.h"
16
17  INTEGER :: jjmax,llmax
18  REAL :: q(iip1,jjmax,llmax)
19
20  ! INTEGER ngroup
21  ! PARAMETER (ngroup=3)
22
23  REAL :: airecn,qn
24  REAL :: airecs,qs
25
26  INTEGER :: i,j,l,ig,ig2,j1,j2,i0,jd
27
28  !--------------------------------------------------------------------c
29  ! Strategie d'optimisation                                           c
30  ! stocker les valeurs systematiquement recalculees                   c
31  ! et identiques d'un pas de temps sur l'autre. Il s'agit des         c
32  ! aires des cellules qui sont sommees. S'il n'y a pas de changement  c
33  ! de grille au cours de la simulation tout devrait bien se passer.   c
34  ! Autre optimisation : determination des bornes entre lesquelles "j" c
35  ! varie, au lieu de faire un test à chaque fois...
36  !--------------------------------------------------------------------c
37
38  INTEGER :: j_start, j_finish
39
40  REAL, SAVE :: airen_tab(iip1,jjp1,0:1)
41  REAL, SAVE :: aires_tab(iip1,jjp1,0:1)
42
43  LOGICAL, SAVE :: first = .TRUE.
44  ! INTEGER,SAVE :: i_index(iim,ngroup)
45  INTEGER      :: offset
46  ! REAL         :: qsum(iim/ngroup)
47
48  IF (first) THEN
49     CALL INIT_GROUPEUN(airen_tab, aires_tab)
50     first = .FALSE.
51  ENDIF
52
53
54  ! Champs 3D
55  jd=jjp1-jjmax
56!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
57  DO l=1,llm
58     j1=1+jd
59     j2=2
60     DO ig=1,ngroup
61
62  ! Concerne le pole nord
63        j_start  = j1-jd
64        j_finish = j2-jd
65        DO ig2=1,ngroup-ig+1
66          offset=2**(ig2-1)
67          DO j=j_start, j_finish
68  !CDIR NODEP
69  !CDIR ON_ADB(q)
70             DO i0=1,iim,2**ig2
71               q(i0,j,l)=q(i0,j,l)+q(i0+offset,j,l)
72             ENDDO
73          ENDDO
74        ENDDO
75
76        DO j=j_start, j_finish
77  !CDIR NODEP
78  !CDIR ON_ADB(q)
79           DO i=1,iim
80             q(i,j,l)=q(i-MOD(i-1,2**(ngroup-ig+1)),j,l)
81           ENDDO
82        ENDDO
83
84        DO j=j_start, j_finish
85  !CDIR ON_ADB(airen_tab)
86  !CDIR ON_ADB(q)
87           DO i=1,iim
88             q(i,j,l)=q(i,j,l)*airen_tab(i,j,jd)
89           ENDDO
90           q(iip1,j,l)=q(1,j,l)
91        ENDDO
92
93  !c     Concerne le pole sud
94        j_start  = j1-jd
95        j_finish = j2-jd
96        DO ig2=1,ngroup-ig+1
97          offset=2**(ig2-1)
98          DO j=j_start, j_finish
99  !CDIR NODEP
100  !CDIR ON_ADB(q)
101             DO i0=1,iim,2**ig2
102               q(i0,jjp1-j+1-jd,l)= q(i0,jjp1-j+1-jd,l) &
103                     +q(i0+offset,jjp1-j+1-jd,l)
104             ENDDO
105          ENDDO
106        ENDDO
107
108
109        DO j=j_start, j_finish
110  !CDIR NODEP
111  !CDIR ON_ADB(q)
112           DO i=1,iim
113             q(i,jjp1-j+1-jd,l)=q(i-MOD(i-1,2**(ngroup-ig+1)), &
114                   jjp1-j+1-jd,l)
115           ENDDO
116        ENDDO
117
118        DO j=j_start, j_finish
119  !CDIR ON_ADB(aires_tab)
120  !CDIR ON_ADB(q)
121           DO i=1,iim
122             q(i,jjp1-j+1-jd,l)=q(i,jjp1-j+1-jd,l)* &
123                   aires_tab(i,jjp1-j+1,jd)
124           ENDDO
125           q(iip1,jjp1-j+1-jd,l)=q(1,jjp1-j+1-jd,l)
126        ENDDO
127
128
129        j1=j2+1
130        j2=j2+2**ig
131     ENDDO
132  ENDDO
133!$OMP END DO NOWAIT
134
135  RETURN
136END SUBROUTINE groupeun
137
138
139
140
141SUBROUTINE INIT_GROUPEUN(airen_tab, aires_tab)
142
143  USE comconst_mod, ONLY: ngroup
144
145  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
146USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
147          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
148IMPLICIT NONE
149
150
151
152  include "comgeom2.h"
153
154  ! INTEGER ngroup
155  ! PARAMETER (ngroup=3)
156
157  REAL :: airen,airecn
158  REAL :: aires,airecs
159
160  INTEGER :: i,j,l,ig,j1,j2,i0,jd
161
162  INTEGER :: j_start, j_finish
163
164  REAL :: airen_tab(iip1,jjp1,0:1)
165  REAL :: aires_tab(iip1,jjp1,0:1)
166
167  DO jd=0, 1
168     j1=1+jd
169     j2=2
170     DO ig=1,ngroup
171
172  ! c     Concerne le pole nord
173        j_start = j1-jd
174        j_finish = j2-jd
175        DO j=j_start, j_finish
176           DO i0=1,iim,2**(ngroup-ig+1)
177              airen=0.
178              DO i=i0,i0+2**(ngroup-ig+1)-1
179                 airen = airen+aire(i,j)
180              ENDDO
181              DO i=i0,i0+2**(ngroup-ig+1)-1
182                 airen_tab(i,j,jd) = &
183                       aire(i,j) / airen
184              ENDDO
185           ENDDO
186        ENDDO
187
188  ! c     Concerne le pole sud
189        j_start = j1-jd
190        j_finish = j2-jd
191        DO j=j_start, j_finish
192           DO i0=1,iim,2**(ngroup-ig+1)
193              aires=0.
194              DO i=i0,i0+2**(ngroup-ig+1)-1
195                 aires=aires+aire(i,jjp1-j+1)
196              ENDDO
197              DO i=i0,i0+2**(ngroup-ig+1)-1
198                 aires_tab(i,jjp1-j+1,jd) = &
199                       aire(i,jjp1-j+1) / aires
200              ENDDO
201           ENDDO
202        ENDDO
203
204        j1=j2+1
205        j2=j2+2**ig
206     ENDDO
207  ENDDO
208
209  RETURN
210END SUBROUTINE INIT_GROUPEUN
Note: See TracBrowser for help on using the repository browser.