source: trunk/LMDZ.MARS/libf/dyn3d/inidissip.F @ 222

Last change on this file since 222 was 64, checked in by emillour, 14 years ago

Modifs mineures:

  • ajout de 'regr_lat_time_climoz_m.txt' dans "chatier" pour rappel que cette routine merite une attention particuliere.
  • mise a jour des coeff. de dissipation dans inidissip.F (mars)

EM

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