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

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