source: LMDZ6/trunk/libf/dyn3d_common/inidissip.f90 @ 5272

Last change on this file since 5272 was 5272, checked in by abarral, 23 hours ago

Turn paramet.h into a module

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.1 KB
Line 
1!
2! $Id: inidissip.f90 5272 2024-10-24 15:53:15Z abarral $
3!
4SUBROUTINE inidissip ( lstardis,nitergdiv,nitergrot,niterh  , &
5     tetagdiv,tetagrot,tetatemp, vert_prof_dissip)
6  !=======================================================================
7  !   initialisation de la dissipation horizontale
8  !=======================================================================
9  !-----------------------------------------------------------------------
10  !   declarations:
11  !   -------------
12
13  USE control_mod, only : dissip_period,iperiod
14  USE comconst_mod, ONLY: dissip_deltaz, dissip_factz, dissip_zref, &
15                          dtdiss, dtvr, rad
16  USE comvert_mod, ONLY: preff, presnivs
17
18  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
19USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
20          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
21IMPLICIT NONE
22
23
24  include "comdissipn.h"
25  include "iniprint.h"
26
27  LOGICAL,INTENT(in) :: lstardis
28  INTEGER,INTENT(in) :: nitergdiv,nitergrot,niterh
29  REAL,INTENT(in) :: tetagdiv,tetagrot,tetatemp
30
31  integer, INTENT(in):: vert_prof_dissip
32  ! Vertical profile of horizontal dissipation
33  ! Allowed values:
34  ! 0: rational fraction, function of pressure
35  ! 1: tanh of altitude
36
37! Local variables:
38  REAL fact,zvert(llm),zz
39  REAL zh(ip1jmp1),zu(ip1jmp1), gx(ip1jmp1), divgra(ip1jmp1)
40  real zv(ip1jm), gy(ip1jm), deltap(ip1jmp1,llm)
41  REAL ullm,vllm,umin,vmin,zhmin,zhmax
42  REAL zllm
43
44  INTEGER l,ij,idum,ii
45  REAL tetamin
46  REAL pseudoz
47  character (len=80) :: abort_message
48
49  REAL ran1
50
51
52  !-----------------------------------------------------------------------
53  !
54  !   calcul des valeurs propres des operateurs par methode iterrative:
55  !   -----------------------------------------------------------------
56
57  crot     = -1.
58  cdivu    = -1.
59  cdivh    = -1.
60
61  !   calcul de la valeur propre de divgrad:
62  !   --------------------------------------
63  idum = 0
64  DO l = 1, llm
65     DO ij = 1, ip1jmp1
66        deltap(ij,l) = 1.
67     ENDDO
68  ENDDO
69
70  idum  = -1
71  zh(1) = RAN1(idum)-.5
72  idum  = 0
73  DO ij = 2, ip1jmp1
74     zh(ij) = RAN1(idum) -.5
75  ENDDO
76
77  CALL filtreg (zh,jjp1,1,2,1,.TRUE.,1)
78
79  CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
80
81  IF ( zhmin .GE. zhmax  )     THEN
82     write(lunout,*)'  Inidissip  zh min max  ',zhmin,zhmax
83     abort_message='probleme generateur alleatoire dans inidissip'
84     call abort_gcm('inidissip',abort_message,1)
85  ENDIF
86
87  zllm = ABS( zhmax )
88  DO l = 1,50
89     IF(lstardis) THEN
90        CALL divgrad2(1,zh,deltap,niterh,divgra)
91     ELSE
92        CALL divgrad (1,zh,niterh,divgra)
93     ENDIF
94
95     zllm  = ABS(maxval(divgra))
96     zh = divgra / zllm
97  ENDDO
98
99  IF(lstardis) THEN
100     cdivh = 1./ zllm
101  ELSE
102     cdivh = zllm ** ( -1./niterh )
103  ENDIF
104
105  !   calcul des valeurs propres de gradiv (ii =1) et  nxgrarot(ii=2)
106  !   -----------------------------------------------------------------
107  write(lunout,*)'inidissip: calcul des valeurs propres'
108
109  DO    ii = 1, 2
110     !
111     DO ij = 1, ip1jmp1
112        zu(ij)  = RAN1(idum) -.5
113     ENDDO
114     CALL filtreg (zu,jjp1,1,2,1,.TRUE.,1)
115     DO ij = 1, ip1jm
116        zv(ij) = RAN1(idum) -.5
117     ENDDO
118     CALL filtreg (zv,jjm,1,2,1,.FALSE.,1)
119
120     CALL minmax(iip1*jjp1,zu,umin,ullm )
121     CALL minmax(iip1*jjm, zv,vmin,vllm )
122
123     ullm = ABS ( ullm )
124     vllm = ABS ( vllm )
125
126     DO    l = 1, 50
127        IF(ii.EQ.1) THEN
128           !cccc             CALL covcont( 1,zu,zv,zu,zv )
129           IF(lstardis) THEN
130              CALL gradiv2( 1,zu,zv,nitergdiv,gx,gy )
131           ELSE
132              CALL gradiv ( 1,zu,zv,nitergdiv,gx,gy )
133           ENDIF
134        ELSE
135           IF(lstardis) THEN
136              CALL nxgraro2( 1,zu,zv,nitergrot,gx,gy )
137           ELSE
138              CALL nxgrarot( 1,zu,zv,nitergrot,gx,gy )
139           ENDIF
140        ENDIF
141
142        zllm = max(abs(maxval(gx)), abs(maxval(gy)))
143        zu = gx / zllm
144        zv = gy / zllm
145     end DO
146
147     IF ( ii.EQ.1 ) THEN
148        IF(lstardis) THEN
149           cdivu  = 1./zllm
150        ELSE
151           cdivu  = zllm **( -1./nitergdiv )
152        ENDIF
153     ELSE
154        IF(lstardis) THEN
155           crot   = 1./ zllm
156        ELSE
157           crot   = zllm **( -1./nitergrot )
158        ENDIF
159     ENDIF
160
161  end DO
162
163  !   petit test pour les operateurs non star:
164  !   ----------------------------------------
165
166  !     IF(.NOT.lstardis) THEN
167  fact    = rad*24./REAL(jjm)
168  fact    = fact*fact
169  write(lunout,*)'inidissip: coef u ', fact/cdivu, 1./cdivu
170  write(lunout,*)'inidissip: coef r ', fact/crot , 1./crot
171  write(lunout,*)'inidissip: coef h ', fact/cdivh, 1./cdivh
172  !     ENDIF
173
174  !-----------------------------------------------------------------------
175  !   variation verticale du coefficient de dissipation:
176  !   --------------------------------------------------
177
178  if (vert_prof_dissip == 1) then
179     do l=1,llm
180        pseudoz=8.*log(preff/presnivs(l))
181        zvert(l)=1+ &
182             (tanh((pseudoz-dissip_zref)/dissip_deltaz)+1.)/2. &
183             *(dissip_factz-1.)
184     enddo
185  else
186     DO l=1,llm
187        zvert(l)=1.
188     ENDDO
189     fact=2.
190     DO l = 1, llm
191        zz      = 1. - preff/presnivs(l)
192        zvert(l)= fact -( fact-1.)/( 1.+zz*zz )
193     ENDDO
194  endif
195
196
197  write(lunout,*)'inidissip: Constantes de temps de la diffusion horizontale'
198
199  tetamin =  1.e+6
200
201  DO l=1,llm
202     tetaudiv(l)   = zvert(l)/tetagdiv
203     tetaurot(l)   = zvert(l)/tetagrot
204     tetah(l)      = zvert(l)/tetatemp
205
206     IF( tetamin.GT. (1./tetaudiv(l)) ) tetamin = 1./ tetaudiv(l)
207     IF( tetamin.GT. (1./tetaurot(l)) ) tetamin = 1./ tetaurot(l)
208     IF( tetamin.GT. (1./   tetah(l)) ) tetamin = 1./    tetah(l)
209  ENDDO
210
211  ! If dissip_period=0 calculate value for dissipation period, else keep value read from gcm.def
212  IF (dissip_period == 0) THEN
213     dissip_period = INT( tetamin/( 2.*dtvr*iperiod) ) * iperiod
214     write(lunout,*)'inidissip: tetamin dtvr iperiod dissip_period(intermed) ',tetamin,dtvr,iperiod,dissip_period
215     dissip_period = MAX(iperiod,dissip_period)
216  END IF
217
218  dtdiss  = dissip_period * dtvr
219  write(lunout,*)'inidissip: dissip_period=',dissip_period,' dtdiss=',dtdiss,' dtvr=',dtvr
220
221  DO l = 1,llm
222     write(lunout,*)zvert(l),dtdiss*tetaudiv(l),dtdiss*tetaurot(l), &
223          dtdiss*tetah(l)
224  ENDDO
225
226END SUBROUTINE inidissip
Note: See TracBrowser for help on using the repository browser.