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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.