source: trunk/LMDZ.GENERIC/libf/dyn3d/inidissip.F @ 1153

Last change on this file since 1153 was 253, checked in by emillour, 13 years ago

Generic GCM

  • Massive update to version 0.7

EM+RW

File size: 9.0 KB
Line 
1      SUBROUTINE inidissip ( lstardis,nitergdiv,nitergrot,niterh  ,
2     *                       tetagdiv,tetagrot,tetatemp             )
3c=======================================================================
4c   initialisation de la dissipation horizontale
5c=======================================================================
6c-----------------------------------------------------------------------
7c   declarations:
8c   -------------
9
10      IMPLICIT NONE
11#include "dimensions.h"
12#include "paramet.h"
13#include "comdissipn.h"
14#include "comconst.h"
15#include "comvert.h"
16#include "control.h"
17
18      LOGICAL lstardis
19      INTEGER nitergdiv,nitergrot,niterh
20      REAL    tetagdiv,tetagrot,tetatemp
21      REAL zvert(llm),zz
22      REAL zh(ip1jmp1),zu(ip1jmp1),zv(ip1jm),deltap(ip1jmp1,llm)
23      REAL ullm,vllm,umin,vmin,zhmin,zhmax
24      REAL zllm,z1llm
25
26      INTEGER l,ij,idum,ii
27      REAL tetamin
28
29      EXTERNAL ran1
30      REAL ran1
31      real sig_s(llm)
32      save sig_s
33      logical firstcall
34      data firstcall/.true./
35      save firstcall
36
37      REAL fac_mid
38      REAL fac_up
39      REAL delta
40      REAL middle,startalt
41      SAVE fac_mid, fac_up, delta, startalt, middle
42
43c ------------------------------------------------------
44      if (firstcall) then
45         firstcall=.false.
46         do l=1,llm
47            sig_s(l)=aps(l)/preff + bps(l)
48         enddo
49
50c        COMPUTING THE VARIATION OF DISSIPATION AS A FUNCTION OF MODEL TOP :
51c         FF 2004       
52         if (pseudoalt(llm).lt.160.) then
53!     currently disabled for the universal model!!!
54             fac_mid=2  ! coeff  pour dissipation aux basses/moyennes altitudes
55             fac_up=10 ! coeff multiplicateur pour dissipation hautes altitudes
56             startalt=90. ! altitude en Km de la transition mid / up
57             delta=20.! Intervalle (km) pour le changement mid / up
58
59!             fac_mid=1  ! coeff  pour dissipation aux basses/moyennes altitudes
60!             fac_up=1 ! coeff multiplicateur pour dissipation hautes altitudes
61!             startalt=100. ! altitude en Km de la transition mid / up
62!             delta=20.! Intervalle (km) pour le changement mid / up
63
64         else ! thermosphere model
65             fac_mid=2 ! coeff pour dissipation aux basses/moyennes altitudes
66             fac_up=25 ! coeff multiplicateur pour dissipation hautes altitudes
67c            startalt: 95 OK for MY24
68             startalt=95. ! altitude en Km de la transition mid / up
69             delta=30.! Intervalle (km) pour le changement mid /up
70         end if
71         middle=startalt+delta/2
72         write(*,*) 'Dissipation : '
73         write(*,*) 'Multiplication de la dissipation en altitude :',
74     &          ' fac_mid, fac_up =', fac_mid, fac_up
75         write(*,*) 'Transition mid /up : startalt, delta =',
76     &             startalt, delta , '(km)'
77      endif
78
79c-----------------------------------------------------------------------
80c
81c   calcul des valeurs propres des operateurs par methode iterrative:
82c   -----------------------------------------------------------------
83
84      crot     = -1.
85      cdivu    = -1.
86      cdivh    = -1.
87
88c   calcul de la valeur propre de divgrad:
89c   --------------------------------------
90      idum = 0
91      DO l = 1, llm
92       DO ij = 1, ip1jmp1
93        deltap(ij,l) = 1.
94       ENDDO
95      ENDDO
96
97      idum  = -1
98      zh(1) = RAN1(idum)-.5
99      idum  = 0
100      DO ij = 2, ip1jmp1
101        zh(ij) = RAN1(idum) -.5
102      ENDDO
103
104      CALL filtreg (zh,jjp1,1,2,1,.TRUE.,1)
105
106      CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
107
108      IF ( zhmin .GE. zhmax  )     THEN
109         PRINT*,'  Inidissip  zh min max  ',zhmin,zhmax
110         STOP'probleme generateur alleatoire dans inidissip'
111      ENDIF
112
113      zllm = ABS( zhmax )
114      DO l = 1,50
115         IF(lstardis) THEN
116            CALL divgrad2(1,zh,deltap,niterh,zh)
117         ELSE
118            CALL divgrad (1,zh,niterh,zh)
119         ENDIF
120
121        CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
122
123         zllm  = ABS( zhmax )
124         z1llm = 1./zllm
125         DO ij = 1,ip1jmp1
126            zh(ij) = zh(ij)* z1llm
127         ENDDO
128      ENDDO
129
130      IF(lstardis) THEN
131         cdivh = 1./ zllm
132      ELSE
133         cdivh = zllm ** ( -1./niterh )
134      ENDIF
135
136c   calcul des valeurs propres de gradiv (ii =1) et  nxgrarot(ii=2)
137c   -----------------------------------------------------------------
138      print*,'calcul des valeurs propres'
139
140      DO  20  ii = 1, 2
141c
142         DO ij = 1, ip1jmp1
143           zu(ij)  = RAN1(idum) -.5
144         ENDDO
145         CALL filtreg (zu,jjp1,1,2,1,.TRUE.,1)
146         DO ij = 1, ip1jm
147            zv(ij) = RAN1(idum) -.5
148         ENDDO
149         CALL filtreg (zv,jjm,1,2,1,.FALSE.,1)
150
151         CALL minmax(iip1*jjp1,zu,umin,ullm )
152         CALL minmax(iip1*jjm, zv,vmin,vllm )
153
154         ullm = ABS ( ullm )
155         vllm = ABS ( vllm )
156
157         DO  5  l = 1, 50
158            IF(ii.EQ.1) THEN
159               IF(lstardis) THEN
160                  CALL gradiv2( 1,zu,zv,nitergdiv,zu,zv )
161               ELSE
162                  CALL gradiv ( 1,zu,zv,nitergdiv,zu,zv )
163               ENDIF
164            ELSE
165               IF(lstardis) THEN
166                  CALL nxgraro2( 1,zu,zv,nitergrot,zu,zv )
167               ELSE
168                  CALL nxgrarot( 1,zu,zv,nitergrot,zu,zv )
169               ENDIF
170            ENDIF
171
172            CALL minmax(iip1*jjp1,zu,umin,ullm )
173            CALL minmax(iip1*jjm, zv,vmin,vllm )
174
175            ullm = ABS  ( ullm )
176            vllm = ABS  ( vllm )
177
178            zllm  = MAX( ullm,vllm )
179            z1llm = 1./ zllm
180            DO ij = 1, ip1jmp1
181              zu(ij) = zu(ij)* z1llm
182            ENDDO
183            DO ij = 1, ip1jm
184               zv(ij) = zv(ij)* z1llm
185            ENDDO
186 5       CONTINUE
187
188         IF ( ii.EQ.1 ) THEN
189            IF(lstardis) THEN
190               cdivu  = 1./zllm
191            ELSE
192               cdivu  = zllm **( -1./nitergdiv )
193            ENDIF
194         ELSE
195            IF(lstardis) THEN
196               crot   = 1./ zllm
197            ELSE
198               crot   = zllm **( -1./nitergrot )
199            ENDIF
200         ENDIF
201
202 20   CONTINUE
203
204c   petit test pour les operateurs non star:
205c   ----------------------------------------
206
207c     IF(.NOT.lstardis) THEN
208c        fac_mid    = rad*24./float(jjm)
209c        fac_mid    = fac_mid*fac_mid
210c        PRINT*,'coef u ', fac_mid/cdivu, 1./cdivu
211c        PRINT*,'coef r ', fac_mid/crot , 1./crot
212c        PRINT*,'coef h ', fac_mid/cdivh, 1./cdivh
213c     ENDIF
214
215c-----------------------------------------------------------------------
216c   variation verticale du coefficient de dissipation:
217c   --------------------------------------------------
218
219      DO l=1,llm
220         zvert(l)=1.
221      ENDDO
222
223c
224      DO l = 1, llm
225         zz   = 1. -1./sig_s(l)
226         zvert(l)= fac_mid -( fac_mid-1.)/( 1.+zz*zz )
227
228c ---------------------------------------------------------------
229c Utilisation de la fonction tangente hyperbolique pour augmenter
230c arbitrairement la dissipation et donc la stabilite du modele a
231c partir d'une certaine altitude.
232
233c   Le facteur multiplicatif de basse atmosphere etant deja pris
234c   en compte, il faut diviser le facteur multiplicatif de haute
235c   atmosphere par celui-ci.
236c   ============================================================
237
238         zvert(l)= zvert(l)*(1.0+((fac_up/fac_mid-1)
239     &   *(1-(0.5*(1+tanh(-6./delta*   
240     &   (10.*(-log(sig_s(l)))-middle)))))
241     &   ))
242      ENDDO
243 
244c -----------------------------------------------------------------------------
245
246c
247
248      PRINT*,'Constantes de temps de la diffusion horizontale'
249
250      tetamin =  1.e+6
251
252
253      DO l=1,llm
254        tetaudiv(l)   = zvert(l)/tetagdiv
255        tetaurot(l)   = zvert(l)/tetagrot
256        tetah(l)      = zvert(l)/tetatemp
257
258        IF( tetamin.GT. (1./tetaudiv(l)) ) tetamin = 1./ tetaudiv(l)
259        IF( tetamin.GT. (1./tetaurot(l)) ) tetamin = 1./ tetaurot(l)
260        IF( tetamin.GT. (1./   tetah(l)) ) tetamin = 1./    tetah(l)
261      ENDDO
262
263c     Calcul automatique de idissip
264c     -----------------------------
265c    :::::::::::::::::::::
266c     A Commenter pour garder la valeur de run.def :
267c     idissip = INT( tetamin/( 2.*dtvr*iperiod) ) * iperiod
268c     idissip = MAX(iperiod,idissip)
269c    :::::::::::::::::::::
270      dtdiss  = idissip * dtvr
271 
272      PRINT *,' INIDI tetamin dtvr ',tetamin,dtvr,iperiod
273      PRINT *,' INIDI tetamin idissip ',tetamin,idissip
274      PRINT *,' INIDI idissip dtdiss ',idissip,dtdiss
275
276      PRINT*,'pseudoZ(km)  zvert  dt(tetagdiv) dt(tetagrot) dt(divgrad)'
277      DO l = 1,llm
278         PRINT*,pseudoalt(l),zvert(l),dtdiss*tetaudiv(l),
279     *        dtdiss*tetaurot(l),dtdiss*tetah(l)
280         if ( (dtdiss*tetaudiv(l).gt.1.9).or.
281     &        (dtdiss*tetaurot(l).gt.1.9).or.
282     &        (dtdiss*tetah(l).gt.1.9)) then
283          PRINT *,'STOP : your dissipation is too intense for the '     
284          PRINT *,'dissipation timestep : unstable model !'
285          PRINT *,'in run.def, you must increase tetagdiv,'
286          PRINT *,'(or tetagrot and tetatemp if they are smaller than'
287          PRINT *,'tetagdiv) OR decrease idissip OR increase day_step)'
288          stop
289         end if
290 
291      ENDDO
292c
293      RETURN
294      END
Note: See TracBrowser for help on using the repository browser.