source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupeun_loc.f90 @ 5139

Last change on this file since 5139 was 5136, checked in by abarral, 3 months ago

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