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

Last change on this file since 5158 was 5136, checked in by abarral, 11 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
RevLine 
[5105]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
[5136]5  USE lmdz_comgeom2
6
[5105]7  IMPLICIT NONE
[1632]8
[5134]9  INCLUDE "dimensions.h"
10  INCLUDE "paramet.h"
[1632]11
[5105]12  INTEGER :: jjmax,llmax,sb,se,jjb,jje
13  REAL :: q(iip1,sb:se,llmax)
[1632]14
[5105]15  ! INTEGER ngroup
16  ! PARAMETER (ngroup=3)
[1632]17
[5105]18  REAL :: airecn,qn
19  REAL :: airecs,qs
[1632]20
[5105]21  INTEGER :: i,j,l,ig,ig2,j1,j2,i0,jd
[1632]22
[5105]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
[1632]32
[5105]33  INTEGER :: j_start, j_finish
[1632]34
[5105]35  REAL, SAVE :: airen_tab(iip1,jjp1,0:1)
36  REAL, SAVE :: aires_tab(iip1,jjp1,0:1)
[1632]37!$OMP THREADPRIVATE(airen_tab, aires_tab)
38
[5105]39  LOGICAL, SAVE :: first = .TRUE.
[1632]40!$OMP THREADPRIVATE(first)
[5105]41  ! INTEGER,SAVE :: i_index(iim,ngroup)
42  INTEGER      :: offset
43  ! REAL         :: qsum(iim/ngroup)
[1632]44
[5105]45  IF (first) THEN
46     CALL init_groupeun_loc(airen_tab, aires_tab)
47     first = .FALSE.
48  ENDIF
[1632]49
[5105]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
[1632]57
[5105]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
[1632]71
[5105]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
[1632]79
[5105]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
[1632]88
[5105]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
[1632]103
104
[5105]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
[1632]129!$OMP END DO NOWAIT
130
131
[5105]132END SUBROUTINE groupeun_loc
[1632]133
134
135
[5105]136SUBROUTINE init_groupeun_loc(airen_tab, aires_tab)
[1632]137
[5105]138  USE parallel_lmdz
139  USE comconst_mod, ONLY: ngroup
[5136]140  USE lmdz_comgeom2
141
[5105]142  IMPLICIT NONE
[1632]143
[5134]144  INCLUDE "dimensions.h"
145  INCLUDE "paramet.h"
[1632]146
[5105]147  ! INTEGER ngroup
148  ! PARAMETER (ngroup=3)
[1632]149
[5105]150  REAL :: airen,airecn
151  REAL :: aires,airecs
[1632]152
[5105]153  INTEGER :: i,j,l,ig,j1,j2,i0,jd
[1632]154
[5105]155  INTEGER :: j_start, j_finish
[1632]156
[5105]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.