Ignore:
Timestamp:
Feb 3, 2009, 11:00:25 AM (15 years ago)
Author:
yann meurdesoif
Message:

Optimisation Othman Bouizi : groupeun

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/groupeun.F

    r524 r1087  
    22! $Header$
    33!
    4       subroutine groupeun(jjmax,llmax,q)
    5       implicit none
     4      SUBROUTINE groupeun(jjmax,llmax,q)
     5      IMPLICIT NONE
    66
    77#include "dimensions.h"
     
    1010#include "comgeom2.h"
    1111
    12       integer jjmax,llmax
    13       real q(iip1,jjmax,llmax)
     12      INTEGER jjmax,llmax
     13      REAL q(iip1,jjmax,llmax)
    1414
    15       integer ngroup
    16       parameter (ngroup=3)
     15      INTEGER ngroup
     16      PARAMETER (ngroup=3)
    1717
    18       real airen,airecn,qn
    19       real aires,airecs,qs
     18      REAL airecn,qn
     19      REAL airecs,qs
    2020
    21       integer i,j,l,ig,j1,j2,i0,jd
     21      INTEGER i,j,l,ig,j1,j2,i0,jd
    2222
    23 Champs 3D
     23c--------------------------------------------------------------------c
     24c Strategie d'optimisation                                           c
     25c stocker les valeurs systematiquement recalculees                   c
     26c et identiques d'un pas de temps sur l'autre. Il s'agit des         c
     27c aires des cellules qui sont sommees. S'il n'y a pas de changement  c
     28c de grille au cours de la simulation tout devrait bien se passer.   c
     29c Autre optimisation : determination des bornes entre lesquelles "j" c
     30c varie, au lieu de faire un test à chaque fois...
     31c--------------------------------------------------------------------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
     38      LOGICAL, SAVE :: first = .TRUE.
     39
     40      IF (first) THEN
     41         CALL INIT_GROUPEUN(airen_tab, aires_tab)
     42         first = .FALSE.
     43      ENDIF
     44
     45c Champs 3D
    2446      jd=jjp1-jjmax
    25       do l=1,llm
    26       j1=1+jd
    27       j2=2
    28       do ig=1,ngroup
    29          do j=j1-jd,j2-jd
    30 c           print*,'groupe ',ig,'  j= ',j,2**(ngroup-ig+1),'pts groupes'
    31             do i0=1,iim,2**(ngroup-ig+1)
    32                airen=0.
    33                airecn=0.
    34                qn=0.
    35                aires=0.
    36                airecs=0.
    37                qs=0.
    38                do i=i0,i0+2**(ngroup-ig+1)-1
    39                   airen=airen+aire(i,j)
    40                   aires=aires+aire(i,jjp1-j+1)
    41                   qn=qn+q(i,j,l)
    42                   qs=qs+q(i,jjp1-j+1-jd,l)
    43                enddo
    44                airecn=0.
    45                airecs=0.
    46                do i=i0,i0+2**(ngroup-ig+1)-1
    47                   q(i,j,l)=qn*aire(i,j)/airen
    48                   q(i,jjp1-j+1-jd,l)=qs*aire(i,jjp1-j+1)/aires
    49                enddo
    50             enddo
    51             q(iip1,j,l)=q(1,j,l)
    52             q(iip1,jjp1-j+1-jd,l)=q(1,jjp1-j+1-jd,l)
    53          enddo
    54          j1=j2+1
    55          j2=j2+2**ig
    56       enddo
    57       enddo
    5847
    59       return
    60       end
     48      DO l=1,llm
     49         j1=1+jd
     50         j2=2
     51         DO ig=1,ngroup
     52
     53c     Concerne le pole nord
     54            j_start  = j1-jd
     55            j_finish = j2-jd
     56            DO j=j_start, j_finish
     57               DO i0=1,iim,2**(ngroup-ig+1)
     58                  qn=0.
     59                  DO i=i0,i0+2**(ngroup-ig+1)-1
     60                     qn=qn+q(i,j,l)
     61                  ENDDO
     62                  DO i=i0,i0+2**(ngroup-ig+1)-1
     63                     q(i,j,l)=qn*airen_tab(i,j,jd)
     64                  ENDDO
     65               ENDDO
     66               q(iip1,j,l)=q(1,j,l)
     67            ENDDO
     68       
     69!c     Concerne le pole sud
     70            j_start  = j1-jd
     71            j_finish = j2-jd
     72            DO j=j_start, j_finish
     73               DO i0=1,iim,2**(ngroup-ig+1)
     74                  qs=0.
     75                  DO i=i0,i0+2**(ngroup-ig+1)-1
     76                     qs=qs+q(i,jjp1-j+1-jd,l)
     77                  ENDDO
     78                  DO i=i0,i0+2**(ngroup-ig+1)-1
     79                     q(i,jjp1-j+1-jd,l)=qs*aires_tab(i,jjp1-j+1,jd)
     80                  ENDDO
     81               ENDDO
     82               q(iip1,jjp1-j+1-jd,l)=q(1,jjp1-j+1-jd,l)
     83            ENDDO
     84       
     85            j1=j2+1
     86            j2=j2+2**ig
     87         ENDDO
     88      ENDDO
     89
     90      RETURN
     91      END
     92
     93
     94
     95      SUBROUTINE INIT_GROUPEUN(airen_tab, aires_tab)
     96      IMPLICIT NONE
     97
     98#include "dimensions.h"
     99#include "paramet.h"
     100#include "comconst.h"
     101#include "comgeom2.h"
     102
     103      INTEGER ngroup
     104      PARAMETER (ngroup=3)
     105
     106      REAL airen,airecn
     107      REAL aires,airecs
     108
     109      INTEGER i,j,l,ig,j1,j2,i0,jd
     110
     111      INTEGER j_start, j_finish
     112
     113      REAL :: airen_tab(iip1,jjp1,0:1)
     114      REAL :: aires_tab(iip1,jjp1,0:1)
     115
     116      DO jd=0, 1
     117         j1=1+jd
     118         j2=2
     119         DO ig=1,ngroup
     120           
     121!     c     Concerne le pole nord
     122            j_start = j1-jd
     123            j_finish = j2-jd
     124            DO j=j_start, j_finish
     125               DO i0=1,iim,2**(ngroup-ig+1)
     126                  airen=0.
     127                  DO i=i0,i0+2**(ngroup-ig+1)-1
     128                     airen = airen+aire(i,j)
     129                  ENDDO
     130                  DO i=i0,i0+2**(ngroup-ig+1)-1
     131                     airen_tab(i,j,jd) =
     132     &                    aire(i,j) / airen
     133                  ENDDO
     134               ENDDO
     135            ENDDO
     136           
     137!     c     Concerne le pole sud
     138            j_start = j1-jd
     139            j_finish = j2-jd
     140            DO j=j_start, j_finish
     141               DO i0=1,iim,2**(ngroup-ig+1)
     142                  aires=0.
     143                  DO i=i0,i0+2**(ngroup-ig+1)-1
     144                     aires=aires+aire(i,jjp1-j+1)
     145                  ENDDO
     146                  DO i=i0,i0+2**(ngroup-ig+1)-1
     147                     aires_tab(i,jjp1-j+1,jd) =
     148     &                    aire(i,jjp1-j+1) / aires
     149                  ENDDO
     150               ENDDO
     151            ENDDO
     152           
     153            j1=j2+1
     154            j2=j2+2**ig
     155         ENDDO
     156      ENDDO
     157     
     158      RETURN
     159      END
Note: See TracChangeset for help on using the changeset viewer.