source: LMDZ4/trunk/libf/phylmd/thermcell_dv2.F90 @ 1403

Last change on this file since 1403 was 1403, checked in by Laurent Fairhead, 14 years ago

Merged LMDZ4V5.0-dev branch changes r1292:r1399 to trunk.

Validation:
Validation consisted in compiling the HEAD revision of the trunk,
LMDZ4V5.0-dev branch and the merged sources and running different
configurations on local and SX8 machines comparing results.

Local machine: bench configuration, 32x24x11, gfortran

  • IPSLCM5A configuration (comparison between trunk and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent
  • MH07 configuration, new physics package (comparison between LMDZ4V5.0-dev branch and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent

SX8 machine (brodie), 96x95x39 on 4 processors:

  • IPSLCM5A configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent
  • MH07 configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent

Changes to the makegcm and create_make_gcm scripts to take into account
main programs in F90 files


Fusion de la branche LMDZ4V5.0-dev (r1292:r1399) au tronc principal

Validation:
La validation a consisté à compiler la HEAD de le trunk et de la banche
LMDZ4V5.0-dev et les sources fusionnées et de faire tourner le modéle selon
différentes configurations en local et sur SX8 et de comparer les résultats

En local: 32x24x11, config bench/gfortran

  • pour une config IPSLCM5A (comparaison tronc/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux (à part sur RN et Pb)
    • fichiers histoire égaux
  • pour une config nlle physique (MH07) (comparaison LMDZ4v5.0-dev/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux
    • fichiers histoire équivalents

Sur brodie, 96x95x39 sur 4 proc:

  • pour une config IPSLCM5A:
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc
  • pour une config MH07
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc

Changement sur makegcm et create_make-gcm pour pouvoir prendre en compte des
programmes principaux en *F90

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.7 KB
Line 
1      subroutine thermcell_dv2(ngrid,nlay,ptimestep,fm,entr,masse  &
2     &    ,fraca,larga  &
3     &    ,u,v,du,dv,ua,va,lev_out)
4      implicit none
5
6#include "iniprint.h"
7!=======================================================================
8!
9!   Calcul du transport verticale dans la couche limite en presence
10!   de "thermiques" explicitement representes
11!   calcul du dq/dt une fois qu'on connait les ascendances
12!
13! Vectorisation, FH : 2010/03/08
14!
15!=======================================================================
16
17
18      integer ngrid,nlay
19
20      real ptimestep
21      real masse(ngrid,nlay),fm(ngrid,nlay+1)
22      real fraca(ngrid,nlay+1)
23      real larga(ngrid)
24      real entr(ngrid,nlay)
25      real u(ngrid,nlay)
26      real ua(ngrid,nlay)
27      real du(ngrid,nlay)
28      real v(ngrid,nlay)
29      real va(ngrid,nlay)
30      real dv(ngrid,nlay)
31      integer lev_out                           ! niveau pour les print
32
33      real qa(ngrid,nlay),detr(ngrid,nlay),zf,zf2
34      real wvd(ngrid,nlay+1),wud(ngrid,nlay+1)
35      real gamma0(ngrid,nlay+1),gamma(ngrid,nlay+1)
36      real ue(ngrid,nlay),ve(ngrid,nlay)
37      LOGICAL ltherm(ngrid,nlay)
38      real dua(ngrid,nlay),dva(ngrid,nlay)
39      integer iter
40
41      integer ig,k,nlarga0
42
43!-------------------------------------------------------------------------
44
45!   calcul du detrainement
46!---------------------------
47
48      print*,'THERMCELL DV2 OPTIMISE 3'
49
50      nlarga0=0.
51
52      do k=1,nlay
53         do ig=1,ngrid
54            detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
55         enddo
56      enddo
57
58!   calcul de la valeur dans les ascendances
59      do ig=1,ngrid
60         ua(ig,1)=u(ig,1)
61         va(ig,1)=v(ig,1)
62         ue(ig,1)=u(ig,1)
63         ve(ig,1)=v(ig,1)
64      enddo
65
66      IF(prt_level>9)WRITE(lunout,*)                                    &
67     &      'WARNING on initialise gamma(1:ngrid,1)=0.'
68      gamma(1:ngrid,1)=0.
69      do k=2,nlay
70         do ig=1,ngrid
71            ltherm(ig,k)=(fm(ig,k+1)+detr(ig,k))*ptimestep > 1.e-5*masse(ig,k)
72            if(ltherm(ig,k).and.larga(ig)>0.) then
73               gamma0(ig,k)=masse(ig,k)  &
74     &         *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )  &
75     &         *0.5/larga(ig)  &
76     &         *1.
77            else
78               gamma0(ig,k)=0.
79            endif
80            if (ltherm(ig,k).and.larga(ig)<=0.) nlarga0=nlarga0+1
81         enddo
82      enddo
83
84      gamma(:,:)=0.
85
86      do k=2,nlay
87
88         do ig=1,ngrid
89            if (ltherm(ig,k)) then
90               dua(ig,k)=ua(ig,k-1)-u(ig,k-1)
91               dva(ig,k)=va(ig,k-1)-v(ig,k-1)
92            else
93               ua(ig,k)=u(ig,k)
94               va(ig,k)=v(ig,k)
95               ue(ig,k)=u(ig,k)
96               ve(ig,k)=v(ig,k)
97            endif
98         enddo
99
100
101! Debut des iterations
102!----------------------
103do iter=1,5
104         do ig=1,ngrid
105! Pour memoire : calcul prenant en compte la fraction reelle
106!              zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
107!              zf2=1./(1.-zf)
108! Calcul avec fraction infiniement petite
109               zf=0.
110               zf2=1.
111
112!  la première fois on multiplie le coefficient de freinage
113!  par le module du vent dans la couche en dessous.
114!  Mais pourquoi donc ???
115               if (ltherm(ig,k)) then
116!   On choisit une relaxation lineaire.
117!                 gamma(ig,k)=gamma0(ig,k)
118!   On choisit une relaxation quadratique.
119                  gamma(ig,k)=gamma0(ig,k)*sqrt(dua(ig,k)**2+dva(ig,k)**2)
120                  ua(ig,k)=(fm(ig,k)*ua(ig,k-1)  &
121     &               +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))  &
122     &               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2  &
123     &                 +gamma(ig,k))
124                  va(ig,k)=(fm(ig,k)*va(ig,k-1)  &
125     &               +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))  &
126     &               /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2  &
127     &                 +gamma(ig,k))
128!                 print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua(ig,k),dva(ig,k)
129                  dua(ig,k)=ua(ig,k)-u(ig,k)
130                  dva(ig,k)=va(ig,k)-v(ig,k)
131                  ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
132                  ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
133               endif
134         enddo
135! Fin des iterations
136!--------------------
137enddo
138
139      enddo ! k=2,nlay
140
141
142! Calcul du flux vertical de moment dans l'environnement.
143!---------------------------------------------------------
144      do k=2,nlay
145         do ig=1,ngrid
146            wud(ig,k)=fm(ig,k)*ue(ig,k)
147            wvd(ig,k)=fm(ig,k)*ve(ig,k)
148         enddo
149      enddo
150      do ig=1,ngrid
151         wud(ig,1)=0.
152         wud(ig,nlay+1)=0.
153         wvd(ig,1)=0.
154         wvd(ig,nlay+1)=0.
155      enddo
156
157! calcul des tendances.
158!-----------------------
159      do k=1,nlay
160         do ig=1,ngrid
161            du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)  &
162     &               -(entr(ig,k)+gamma(ig,k))*ue(ig,k)  &
163     &               -wud(ig,k)+wud(ig,k+1))  &
164     &               /masse(ig,k)
165            dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)  &
166     &               -(entr(ig,k)+gamma(ig,k))*ve(ig,k)  &
167     &               -wvd(ig,k)+wvd(ig,k+1))  &
168     &               /masse(ig,k)
169         enddo
170      enddo
171
172
173! Sorties eventuelles.
174!----------------------
175
176   if(prt_level.GE.10) then
177      do k=1,nlay
178         do ig=1,ngrid
179           print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), &
180     &   entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), &
181     &   masse(ig,k)
182         enddo
183      enddo
184   endif
185!
186     if (nlarga0>0) then
187          print*,'WARNING !!!!!! DANS THERMCELL_DV2 '
188          print*,nlarga0,' points pour lesquels laraga=0. dans un thermique'
189          print*,'Il faudrait decortiquer ces points'
190     endif
191
192      return
193      end
Note: See TracBrowser for help on using the repository browser.