Ignore:
Timestamp:
Jul 23, 2024, 7:14:34 PM (4 months ago)
Author:
abarral
Message:

Replace 1DUTILS.h by module lmdz_1dutils.f90
Replace 1DConv.h by module lmdz_old_1dconv.f90 (it's only used by old_* files)
Convert *.F to *.f90
Fix gradsdef.h formatting
Remove unnecessary "RETURN" at the end of functions/subroutines

File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Amaury_dev/libf/dyn3dmem/groupeun_loc.f90

    r5104 r5105  
    1       SUBROUTINE groupeun_loc(jjmax,llmax,sb,se,jjb,jje,q)
    2       USE parallel_lmdz
    3       USE Write_Field_p
    4       USE comconst_mod, ONLY: ngroup
    5       IMPLICIT NONE
    6 
    7       include "dimensions.h"
    8       include "paramet.h"
    9       include "comgeom2.h"
    10 
    11       INTEGER jjmax,llmax,sb,se,jjb,jje
    12       REAL q(iip1,sb:se,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 a 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)
     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
     5  IMPLICIT NONE
     6
     7  include "dimensions.h"
     8  include "paramet.h"
     9  include "comgeom2.h"
     10
     11  INTEGER :: jjmax,llmax,sb,se,jjb,jje
     12  REAL :: q(iip1,sb:se,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
     23  ! Strategie d'optimisation                                           c
     24  ! stocker les valeurs systematiquement recalculees                   c
     25  ! et identiques d'un pas de temps sur l'autre. Il s'agit des         c
     26  ! aires des cellules qui sont sommees. S'il n'y a pas de changement  c
     27  ! de grille au cours de la simulation tout devrait bien se passer.   c
     28  ! Autre optimisation : determination des bornes entre lesquelles "j" c
     29  ! varie, au lieu de faire un test a chaque fois...
     30  !--------------------------------------------------------------------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)
    3636!$OMP THREADPRIVATE(airen_tab, aires_tab)
    3737
    38       LOGICAL, SAVE :: first = .TRUE.
     38  LOGICAL, SAVE :: first = .TRUE.
    3939!$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_loc(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
     40  ! INTEGER,SAVE :: i_index(iim,ngroup)
     41  INTEGER      :: offset
     42  ! REAL         :: qsum(iim/ngroup)
     43
     44  IF (first) THEN
     45     CALL init_groupeun_loc(airen_tab, aires_tab)
     46     first = .FALSE.
     47  ENDIF
     48
     49  ! Champs 3D
     50  jd=jjp1-jjmax
     51!$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  ! 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
    128128!$OMP END DO NOWAIT
    129129
    130       RETURN
    131       END
    132 
    133 
    134 
    135       SUBROUTINE init_groupeun_loc(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
     130
     131END SUBROUTINE groupeun_loc
     132
     133
     134
     135SUBROUTINE init_groupeun_loc(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
     201END SUBROUTINE init_groupeun_loc
Note: See TracChangeset for help on using the changeset viewer.