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

Last change on this file since 620 was 334, checked in by aslmd, 13 years ago

LMDZ.MARS:

28/10/11 == FL + AS

ADDED THE NEW FRAMEWORK FOR PHOTOCHEMISTRY
This is not the last version. A new rewritten version of calchim.F [using LAPACK] is yet to be committed.
--> A new version for photochemistry routines : *_B.F no longer exists, new routines in aeronomars
D 333 libf/aeronomars/photochemist_B.F
D 333 libf/aeronomars/init_chimie_B.F
A 0 libf/aeronomars/read_phototable.F
M 333 libf/aeronomars/calchim.F
A 0 libf/aeronomars/photochemistry.F
M 333 libf/aeronomars/chimiedata.h
--> Changed calls to calchim and watercloud [surfdust and surfice needed] in physiq.F
--> Left commented code for outputs in physiq.F [search for FL]
--> Added settings which works for 35 levels in inidissip.F according to FL. Commented for the moment.
--> Checked compilation and run, looks fine. Note that 'jmars.20101220' is needed.

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