source: LMDZ6/trunk/libf/dyn3dmem/groupeun_loc.f90 @ 5301

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