Changeset 1190 for LMDZ4


Ignore:
Timestamp:
Jun 23, 2009, 11:35:20 PM (15 years ago)
Author:
yann meurdesoif
Message:

Correction de FH sur la sponge layer de top_bound + parallelisation des corrections.

YM

Location:
LMDZ4/branches/LMDZ4-dev/libf
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/comconst.h

    r1176 r1190  
    88     & dtvr,daysec,                                                     &
    99     & pi,dtphys,dtdiss,rad,r,cpp,kappa,cotot,unsim,g,omeg              &
    10      &                   ,dissip_factz,dissip_deltaz,dissip_zref
     10     &                   ,dissip_factz,dissip_deltaz,dissip_zref        &
     11     &                   ,iflag_top_bound,tau_top_bound
    1112
    1213
     
    1617      REAL cotot,unsim,g,omeg
    1718      REAL dissip_factz,dissip_deltaz,dissip_zref
     19      INTEGER iflag_top_bound
     20      REAL tau_top_bound
     21
    1822
    1923!-----------------------------------------------------------------------
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/conf_gcm.F

    r1176 r1190  
    280280       CALL getin('dissip_deltaz',dissip_deltaz )
    281281       CALL getin('dissip_zref',dissip_zref )
     282
     283       iflag_top_bound=1
     284       tau_top_bound=1.e-5
     285       CALL getin('iflag_top_bound',iflag_top_bound)
     286       CALL getin('tau_top_bound',tau_top_bound)
    282287
    283288!Config  Key  = coefdis
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/leapfrog.F

    r1170 r1190  
    386386
    387387         IF (ok_strato) THEN
    388            CALL top_bound( vcov,ucov,teta, dufi,dvfi,dtetafi)
     388           CALL top_bound( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
    389389         ENDIF
    390390       
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3d/top_bound.F

    r999 r1190  
    1       SUBROUTINE top_bound( vcov,ucov,teta, du,dv,dh )
     1      SUBROUTINE top_bound( vcov,ucov,teta,masse, du,dv,dh )
    22      IMPLICIT NONE
    33c
     
    55#include "paramet.h"
    66#include "comconst.h"
    7 CC#include "comgeom2.h"
     7#include "comvert.h"
     8#include "comgeom2.h"
    89
    910
     
    2728c   -------------
    2829
    29 #include "comgeom.h"
     30! #include "comgeom.h"
    3031#include "comdissipn.h"
    3132
     
    3435
    3536      REAL ucov(iip1,jjp1,llm),vcov(iip1,jjm,llm),teta(iip1,jjp1,llm)
     37      REAL masse(iip1,jjp1,llm)
    3638      REAL dv(iip1,jjm,llm),du(iip1,jjp1,llm),dh(iip1,jjp1,llm)
    3739
     
    3941c   ------
    4042
     43      REAL massebx(iip1,jjp1,llm),masseby(iip1,jjm,llm),zm
    4144      REAL uzon(jjp1,llm),vzon(jjm,llm),tzon(jjp1,llm)
    4245     
    4346      INTEGER NDAMP
    4447      PARAMETER (NDAMP=4)
    45       integer i
    46       REAL :: rdamp(llm) =
    47      &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
     48      integer i
     49      REAL,SAVE :: rdamp(llm)
     50!     &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
     51
     52      LOGICAL,SAVE :: first=.true.
    4853
    4954      INTEGER j,l
     
    5257C  CALCUL DES CHAMPS EN MOYENNE ZONALE:
    5358     
     59      if (iflag_top_bound.eq.0) return
     60
     61      if (first) then
     62         if (iflag_top_bound.eq.1) then
     63! couche eponge dans les 4 dernieres couches du modele
     64             rdamp(:)=0.
     65             rdamp(llm)=tau_top_bound
     66             rdamp(llm-1)=tau_top_bound/2.
     67             rdamp(llm-2)=tau_top_bound/4.
     68             rdamp(llm-3)=tau_top_bound/8.
     69         else if (iflag_top_bound.eq.2) then
     70! couce eponge dans toutes les couches de pression plus faible que
     71! 100 fois la pression de la derniere couche
     72             rdamp(:)=tau_top_bound
     73     s       *max(presnivs(llm)/presnivs(:)-0.01,0.)
     74         endif
     75         first=.false.
     76         print*,'TOP_BOUND rdamp=',rdamp
     77      endif
     78
     79      CALL massbar(masse,massebx,masseby)
     80
    5481      do l=1,llm
    5582        do j=1,jjm
    5683          vzon(j,l)=0.
     84          zm=0.
    5785          do i=1,iim
    58             vzon(j,l)=vzon(j,l)+vcov(i,j,l)/float(iim)
     86! Rm: on peut travailler directement avec la moyenne zonale de vcov
     87! plutot qu'avec celle de v car le coefficient cv qui relie les deux
     88! ne varie qu'en latitude
     89            vzon(j,l)=vzon(j,l)+vcov(i,j,l)*masseby(i,j,l)
     90            zm=zm+masseby(i,j,l)
    5991          enddo
     92          vzon(j,l)=vzon(j,l)/zm
    6093        enddo
    6194      enddo
     
    72105        do j=2,jjm
    73106          uzon(j,l)=0.
     107          zm=0.
     108          do i=1,iim
     109            uzon(j,l)=uzon(j,l)+massebx(i,j,l)*ucov(i,j,l)/cu(i,j)
     110            zm=zm+massebx(i,j,l)
     111          enddo
     112          uzon(j,l)=uzon(j,l)/zm
     113        enddo
     114      enddo
     115
     116      do l=1,llm
     117        do j=2,jjm
     118          zm=0.
    74119          tzon(j,l)=0.
    75120          do i=1,iim
    76             uzon(j,l)=uzon(j,l)+ucov(i,j,l)/float(iim)
    77             tzon(j,l)=tzon(j,l)+teta(i,j,l)/float(iim)
     121            tzon(j,l)=tzon(j,l)+teta(i,j,l)*masse(i,j,l)
     122            zm=zm+masse(i,j,l)
    78123          enddo
     124          tzon(j,l)=tzon(j,l)/zm
    79125        enddo
    80126      enddo
     
    85131        do i=1,iip1
    86132          do j=2,jjm
    87             du(i,j,l)=du(i,j,l)-rdamp(l)*(ucov(i,j,l)-uzon(j,l))
     133            du(i,j,l)=du(i,j,l)
     134     s               -rdamp(l)*(ucov(i,j,l)-cu(i,j)*uzon(j,l))
    88135            dh(i,j,l)=dh(i,j,l)-rdamp(l)*(teta(i,j,l)-tzon(j,l))
    89136          enddo
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/comconst.h

    r1176 r1190  
    88     & dtvr,daysec,                                                     &
    99     & pi,dtphys,dtdiss,rad,r,cpp,kappa,cotot,unsim,g,omeg              &
    10      &                   ,dissip_factz,dissip_deltaz,dissip_zref
     10     &                   ,dissip_factz,dissip_deltaz,dissip_zref        &
     11     &                   ,iflag_top_bound,tau_top_bound
    1112
    1213
     
    1617      REAL cotot,unsim,g,omeg
    1718      REAL dissip_factz,dissip_deltaz,dissip_zref
     19      INTEGER iflag_top_bound
     20      REAL tau_top_bound
     21
    1822
    1923!-----------------------------------------------------------------------
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/conf_gcm.F

    r1176 r1190  
    291291       CALL getin('dissip_zref',dissip_zref )
    292292
     293       iflag_top_bound=1
     294       tau_top_bound=1.e-5
     295       CALL getin('iflag_top_bound',iflag_top_bound)
     296       CALL getin('tau_top_bound',tau_top_bound)
     297
     298!
    293299!Config  Key  = coefdis
    294300!Config  Desc = coefficient pour gamdissip
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/leapfrog_p.F

    r1172 r1190  
    722722     *                               jj_Nb_physic,2,2,Request_physic)
    723723       
     724        call Register_SwapFieldHallo(masse,masse,ip1jmp1,llm,
     725     *                               jj_Nb_physic,1,2,Request_physic)
     726
    724727        call Register_SwapFieldHallo(p,p,ip1jmp1,llmp1,
    725728     *                               jj_Nb_physic,2,2,Request_physic)
     
    863866c      ------------------------------
    864867         IF (ok_strato) THEN
    865            CALL top_bound_p( vcov,ucov,teta, dufi,dvfi,dtetafi)
     868           CALL top_bound_p( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
    866869         ENDIF
    867870       
     
    887890     *                               jj_Nb_caldyn,Request_physic)
    888891       
     892        call Register_SwapField(masse,masse,ip1jmp1,llm,
     893     *                               jj_Nb_caldyn,Request_physic)
     894
    889895        call Register_SwapField(p,p,ip1jmp1,llmp1,
    890896     *                               jj_Nb_caldyn,Request_physic)
  • LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/top_bound_p.F

    r1000 r1190  
    1       SUBROUTINE top_bound_p( vcov,ucov,teta, du,dv,dh )
     1      SUBROUTINE top_bound_p( vcov,ucov,teta,masse, du,dv,dh )
    22      USE parallel
    33      IMPLICIT NONE
     
    66#include "paramet.h"
    77#include "comconst.h"
    8 CC#include "comgeom2.h"
     8#include "comvert.h"
     9#include "comgeom2.h"
    910
    1011
     
    2829c   -------------
    2930
    30 #include "comgeom.h"
    3131#include "comdissipn.h"
    3232
     
    3535
    3636      REAL ucov(iip1,jjp1,llm),vcov(iip1,jjm,llm),teta(iip1,jjp1,llm)
     37      REAL masse(iip1,jjp1,llm)
    3738      REAL dv(iip1,jjm,llm),du(iip1,jjp1,llm),dh(iip1,jjp1,llm)
    3839
    3940c   Local:
    4041c   ------
    41 
     42      REAL massebx(iip1,jjp1,llm),masseby(iip1,jjm,llm),zm
    4243      REAL uzon(jjp1,llm),vzon(jjm,llm),tzon(jjp1,llm)
    4344     
     
    4546      PARAMETER (NDAMP=4)
    4647      integer i
    47       REAL :: rdamp(llm) =
    48      &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
    49 
     48      REAL,SAVE :: rdamp(llm)
     49!     &   (/(0., i =1,llm-NDAMP),0.125E-5,.25E-5,.5E-5,1.E-5/)
     50      LOGICAL,SAVE :: first=.true.
    5051      INTEGER j,l,jjb,jje
    5152
    5253
     54      if (iflag_top_bound == 0) return
     55      if (first) then
     56c$OMP BARRIER
     57c$OMP MASTER
     58         if (iflag_top_bound == 1) then
     59! couche eponge dans les 4 dernieres couches du modele
     60             rdamp(:)=0.
     61             rdamp(llm)=tau_top_bound
     62             rdamp(llm-1)=tau_top_bound/2.
     63             rdamp(llm-2)=tau_top_bound/4.
     64             rdamp(llm-3)=tau_top_bound/8.
     65         else if (iflag_top_bound == 2) then
     66! couce eponge dans toutes les couches de pression plus faible que
     67! 100 fois la pression de la derniere couche
     68             rdamp(:)=tau_top_bound
     69     s       *max(presnivs(llm)/presnivs(:)-0.01,0.)
     70         endif
     71         first=.false.
     72         print*,'TOP_BOUND rdamp=',rdamp
     73c$OMP END MASTER
     74c$OMP BARRIER
     75      endif
     76
     77
     78      CALL massbar_p(masse,massebx,masseby)
    5379C  CALCUL DES CHAMPS EN MOYENNE ZONALE:
    5480
     
    6086      do l=1,llm
    6187        do j=jjb,jje
    62           vzon(j,l)=0.
     88          zm=0.
     89          vzon(j,l)=0
    6390          do i=1,iim
    64             vzon(j,l)=vzon(j,l)+vcov(i,j,l)/float(iim)
     91! Rm: on peut travailler directement avec la moyenne zonale de vcov
     92! plutot qu'avec celle de v car le coefficient cv qui relie les deux
     93! ne varie qu'en latitude
     94            vzon(j,l)=vzon(j,l)+vcov(i,j,l)*masseby(i,j,l)
     95            zm=zm+masseby(i,j,l)
    6596          enddo
     97          vzon(j,l)=vzon(j,l)/zm
    6698        enddo
    6799      enddo
     
    87119        do j=jjb,jje
    88120          uzon(j,l)=0.
     121          zm=0.
     122          do i=1,iim
     123            uzon(j,l)=uzon(j,l)+massebx(i,j,l)*ucov(i,j,l)/cu(i,j)
     124            zm=zm+massebx(i,j,l)
     125          enddo
     126          uzon(j,l)=uzon(j,l)/zm
     127        enddo
     128      enddo
     129c$OMP END DO NOWAIT
     130
     131c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     132      do l=1,llm
     133        do j=jjb,jje
     134          zm=0.
    89135          tzon(j,l)=0.
    90136          do i=1,iim
    91             uzon(j,l)=uzon(j,l)+ucov(i,j,l)/float(iim)
    92             tzon(j,l)=tzon(j,l)+teta(i,j,l)/float(iim)
     137            tzon(j,l)=tzon(j,l)+teta(i,j,l)*masse(i,j,l)
     138            zm=zm+masse(i,j,l)
    93139          enddo
     140          tzon(j,l)=tzon(j,l)/zm
    94141        enddo
    95142      enddo
     
    102149        do j=jjb,jje
    103150          do i=1,iip1
    104             du(i,j,l)=du(i,j,l)-rdamp(l)*(ucov(i,j,l)-uzon(j,l))
     151            du(i,j,l)=du(i,j,l)
     152     s               -rdamp(l)*(ucov(i,j,l)-cu(i,j)*uzon(j,l))
    105153            dh(i,j,l)=dh(i,j,l)-rdamp(l)*(teta(i,j,l)-tzon(j,l))
    106154          enddo
Note: See TracChangeset for help on using the changeset viewer.