Ignore:
Timestamp:
Jun 20, 2015, 9:22:53 AM (10 years ago)
Author:
emillour
Message:

Common dynamics: A couple of bug fixes

  • calfis[_p].F array boundaries must be explicitely specified when underlying arrays are of different sizes.
  • advect_new_p.F : missing initializations of intermediate variables at topmost layer.

EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/dyn3d/advect.F

    r1422 r1459  
    2828c   -------------
    2929
    30 #include "dimensions.h"
    31 #include "paramet.h"
    32 #include "comgeom.h"
     30      include "dimensions.h"
     31      include "paramet.h"
     32      include "comgeom.h"
    3333
    3434c   Arguments:
    3535c   ----------
    3636
    37       REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm)
    38       REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm)
    39       REAL dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm)
     37      REAL,INTENT(IN) :: vcov(ip1jm,llm)
     38      REAL,INTENT(IN) :: ucov(ip1jmp1,llm)
     39      REAL,INTENT(IN) :: teta(ip1jmp1,llm)
     40      REAL,INTENT(IN) :: massebx(ip1jmp1,llm)
     41      REAL,INTENT(IN) :: masseby(ip1jm,llm)
     42      REAL,INTENT(IN) :: w(ip1jmp1,llm)
     43      REAL,INTENT(INOUT) :: dv(ip1jm,llm)
     44      REAL,INTENT(INOUT) :: du(ip1jmp1,llm)
     45      REAL,INTENT(INOUT) :: dteta(ip1jmp1,llm)
    4046
    4147c   Local:
     
    5763         deuxjour = 2. * daysec
    5864
    59          DO   1  ij   = 1, ip1jmp1
    60          unsaire2(ij) = unsaire(ij) * unsaire(ij)
    61    1     CONTINUE
     65         DO ij   = 1, ip1jmp1
     66           unsaire2(ij) = unsaire(ij) * unsaire(ij)
     67         ENDDO
    6268      END IF
    6369
     
    100106
    101107c
    102       DO 20 l = 1, llmm1
     108      DO l = 1, llmm1
    103109
    104110
    105111c       ......   calcul de  - w/2.    au niveau  l+1   .......
    106112
    107       DO 5  ij   = 1, ip1jmp1
    108       wsur2( ij ) = - 0.5 * w( ij,l+1 )
    109    5  CONTINUE
     113        DO ij   = 1, ip1jmp1
     114          wsur2( ij ) = - 0.5 * w( ij,l+1 )
     115        ENDDO
    110116
    111117
    112118c     .....................     calcul pour  du     ..................
    113119
    114       DO 6 ij = iip2 ,ip1jm-1
    115       ww        = wsur2 (  ij  )     + wsur2( ij+1 )
    116       uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
    117       du(ij,l)  = du(ij,l)   - ww * ( uu - uav(ij, l ) )/massebx(ij, l )
    118       du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)
    119    6  CONTINUE
     120        DO ij = iip2 ,ip1jm-1
     121          ww        = wsur2 (  ij  )     + wsur2( ij+1 )
     122          uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
     123          du(ij,l)  = du(ij,l)   -ww*(uu-uav(ij,l))/massebx(ij,l)
     124          du(ij,l+1)= du(ij,l+1) +ww*(uu-uav(ij,l+1))/massebx(ij,l+1)
     125        ENDDO
    120126
    121127c     .....  correction pour  du(iip1,j,l)  ........
     
    123129
    124130CDIR$ IVDEP
    125       DO   7 ij   = iip1 +iip1, ip1jm, iip1
    126       du( ij, l  ) = du( ij -iim, l  )
    127       du( ij,l+1 ) = du( ij -iim,l+1 )
    128    7  CONTINUE
     131        DO ij   = iip1 +iip1, ip1jm, iip1
     132          du( ij, l  ) = du( ij -iim, l  )
     133          du( ij,l+1 ) = du( ij -iim,l+1 )
     134        ENDDO
    129135
    130136c     .................    calcul pour   dv      .....................
    131137
    132       DO 8 ij = 1, ip1jm
    133       ww        = wsur2( ij+iip1 )   + wsur2( ij )
    134       vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
    135       dv(ij,l)  = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l )
    136       dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)
    137    8  CONTINUE
     138        DO ij = 1, ip1jm
     139          ww        = wsur2( ij+iip1 )   + wsur2( ij )
     140          vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
     141          dv(ij,l)  = dv(ij, l ) - ww*(vv-vav(ij,l))/masseby(ij,l)
     142          dv(ij,l+1)= dv(ij,l+1) + ww*(vv-vav(ij,l+1))/masseby(ij,l+1)
     143        ENDDO
    138144
    139145c
     
    147153c                   ...............
    148154
    149         DO 15 ij = 1, ip1jmp1
     155        DO ij = 1, ip1jmp1
    150156         ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
    151157         dteta(ij, l ) = dteta(ij, l )  -  ww
    152158         dteta(ij,l+1) = dteta(ij,l+1)  +  ww
    153   15    CONTINUE
     159        ENDDO
    154160
    155       IF( conser)  THEN
    156         DO 17 ij = 1,ip1jmp1
    157         ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
    158   17    CONTINUE
    159         gt       = SSUM( ip1jmp1,ge,1 )
    160         gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
    161       END IF
     161        IF( conser)  THEN
     162          DO ij = 1,ip1jmp1
     163            ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
     164          ENDDO
     165          gt       = SSUM( ip1jmp1,ge,1 )
     166          gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
     167        END IF
    162168
    163   20  CONTINUE
     169      ENDDO ! of DO l = 1, llmm1
    164170 
    165       RETURN
    166171      END
Note: See TracChangeset for help on using the changeset viewer.