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