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

Last change on this file since 5300 was 5285, checked in by abarral, 4 days ago

As discussed internally, remove generic ONLY: ... for new _mod_h modules

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