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

Last change on this file since 1422 was 1422, checked in by milmd, 10 years ago

In GENERIC, MARS and COMMON models replace some include files by modules (usefull for decoupling physics with dynamics).

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