LMDZ
inidissip.F90
Go to the documentation of this file.
1 !
2 ! $Id: inidissip.F90 1952 2014-01-28 13:05:47Z lguez $
3 !
4 SUBROUTINE 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 
14 
15  IMPLICIT NONE
16  include "dimensions.h"
17  include "paramet.h"
18  include "comdissipn.h"
19  include "comconst.h"
20  include "comvert.h"
21  include "logic.h"
22  include "iniprint.h"
23 
24  LOGICAL,INTENT(in) :: lstardis
25  INTEGER,INTENT(in) :: nitergdiv,nitergrot,niterh
26  REAL,INTENT(in) :: tetagdiv,tetagrot,tetatemp
27 
28  integer, INTENT(in):: vert_prof_dissip
29  ! Vertical profile of horizontal dissipation
30  ! Allowed values:
31  ! 0: rational fraction, function of pressure
32  ! 1: tanh of altitude
33 
34 ! Local variables:
35  REAL fact,zvert(llm),zz
36  REAL zh(ip1jmp1),zu(ip1jmp1), gx(ip1jmp1), divgra(ip1jmp1)
37  real zv(ip1jm), gy(ip1jm), deltap(ip1jmp1,llm)
38  REAL ullm,vllm,umin,vmin,zhmin,zhmax
39  REAL zllm
40 
41  INTEGER l,ij,idum,ii
42  REAL tetamin
43  REAL pseudoz
44  character (len=80) :: abort_message
45 
46  REAL ran1
47 
48 
49  !-----------------------------------------------------------------------
50  !
51  ! calcul des valeurs propres des operateurs par methode iterrative:
52  ! -----------------------------------------------------------------
53 
54  crot = -1.
55  cdivu = -1.
56  cdivh = -1.
57 
58  ! calcul de la valeur propre de divgrad:
59  ! --------------------------------------
60  idum = 0
61  DO l = 1, llm
62  DO ij = 1, ip1jmp1
63  deltap(ij,l) = 1.
64  ENDDO
65  ENDDO
66 
67  idum = -1
68  zh(1) = ran1(idum)-.5
69  idum = 0
70  DO ij = 2, ip1jmp1
71  zh(ij) = ran1(idum) -.5
72  ENDDO
73 
74  CALL filtreg (zh,jjp1,1,2,1,.true.,1)
75 
76  CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
77 
78  IF ( zhmin .GE. zhmax ) THEN
79  write(lunout,*)' Inidissip zh min max ',zhmin,zhmax
80  abort_message='probleme generateur alleatoire dans inidissip'
81  call abort_gcm('inidissip',abort_message,1)
82  ENDIF
83 
84  zllm = abs( zhmax )
85  DO l = 1,50
86  IF(lstardis) THEN
87  CALL divgrad2(1,zh,deltap,niterh,divgra)
88  ELSE
89  CALL divgrad (1,zh,niterh,divgra)
90  ENDIF
91 
92  zllm = abs(maxval(divgra))
93  zh = divgra / zllm
94  ENDDO
95 
96  IF(lstardis) THEN
97  cdivh = 1./ zllm
98  ELSE
99  cdivh = zllm ** ( -1./niterh )
100  ENDIF
101 
102  ! calcul des valeurs propres de gradiv (ii =1) et nxgrarot(ii=2)
103  ! -----------------------------------------------------------------
104  write(lunout,*)'inidissip: calcul des valeurs propres'
105 
106  DO ii = 1, 2
107  !
108  DO ij = 1, ip1jmp1
109  zu(ij) = ran1(idum) -.5
110  ENDDO
111  CALL filtreg (zu,jjp1,1,2,1,.true.,1)
112  DO ij = 1, ip1jm
113  zv(ij) = ran1(idum) -.5
114  ENDDO
115  CALL filtreg (zv,jjm,1,2,1,.false.,1)
116 
117  CALL minmax(iip1*jjp1,zu,umin,ullm )
118  CALL minmax(iip1*jjm, zv,vmin,vllm )
119 
120  ullm = abs( ullm )
121  vllm = abs( vllm )
122 
123  DO l = 1, 50
124  IF(ii.EQ.1) THEN
125  !cccc CALL covcont( 1,zu,zv,zu,zv )
126  IF(lstardis) THEN
127  CALL gradiv2( 1,zu,zv,nitergdiv,gx,gy )
128  ELSE
129  CALL gradiv ( 1,zu,zv,nitergdiv,gx,gy )
130  ENDIF
131  ELSE
132  IF(lstardis) THEN
133  CALL nxgraro2( 1,zu,zv,nitergrot,gx,gy )
134  ELSE
135  CALL nxgrarot( 1,zu,zv,nitergrot,gx,gy )
136  ENDIF
137  ENDIF
138 
139  zllm = max(abs(maxval(gx)), abs(maxval(gy)))
140  zu = gx / zllm
141  zv = gy / zllm
142  end DO
143 
144  IF ( ii.EQ.1 ) THEN
145  IF(lstardis) THEN
146  cdivu = 1./zllm
147  ELSE
148  cdivu = zllm **( -1./nitergdiv )
149  ENDIF
150  ELSE
151  IF(lstardis) THEN
152  crot = 1./ zllm
153  ELSE
154  crot = zllm **( -1./nitergrot )
155  ENDIF
156  ENDIF
157 
158  end DO
159 
160  ! petit test pour les operateurs non star:
161  ! ----------------------------------------
162 
163  ! IF(.NOT.lstardis) THEN
164  fact = rad*24./REAL(jjm)
165  fact = fact*fact
166  write(lunout,*)'inidissip: coef u ', fact/cdivu, 1./cdivu
167  write(lunout,*)'inidissip: coef r ', fact/crot , 1./crot
168  write(lunout,*)'inidissip: coef h ', fact/cdivh, 1./cdivh
169  ! ENDIF
170 
171  !-----------------------------------------------------------------------
172  ! variation verticale du coefficient de dissipation:
173  ! --------------------------------------------------
174 
175  if (vert_prof_dissip == 1) then
176  do l=1,llm
177  pseudoz=8.*log(preff/presnivs(l))
178  zvert(l)=1+ &
179  (tanh((pseudoz-dissip_zref)/dissip_deltaz)+1.)/2. &
180  *(dissip_factz-1.)
181  enddo
182  else
183  DO l=1,llm
184  zvert(l)=1.
185  ENDDO
186  fact=2.
187  DO l = 1, llm
188  zz = 1. - preff/presnivs(l)
189  zvert(l)= fact -( fact-1.)/( 1.+zz*zz )
190  ENDDO
191  endif
192 
193 
194  write(lunout,*)'inidissip: Constantes de temps de la diffusion horizontale'
195 
196  tetamin = 1.e+6
197 
198  DO l=1,llm
199  tetaudiv(l) = zvert(l)/tetagdiv
200  tetaurot(l) = zvert(l)/tetagrot
201  tetah(l) = zvert(l)/tetatemp
202 
203  IF( tetamin.GT. (1./tetaudiv(l)) ) tetamin = 1./ tetaudiv(l)
204  IF( tetamin.GT. (1./tetaurot(l)) ) tetamin = 1./ tetaurot(l)
205  IF( tetamin.GT. (1./ tetah(l)) ) tetamin = 1./ tetah(l)
206  ENDDO
207 
208  ! If dissip_period=0 calculate value for dissipation period, else keep value read from gcm.def
209  IF (dissip_period == 0) THEN
210  dissip_period = int( tetamin/( 2.*dtvr*iperiod) ) * iperiod
211  write(lunout,*)'inidissip: tetamin dtvr iperiod dissip_period(intermed) ',tetamin,dtvr,iperiod,dissip_period
213  END IF
214 
216  write(lunout,*)'inidissip: dissip_period=',dissip_period,' dtdiss=',dtdiss,' dtvr=',dtvr
217 
218  DO l = 1,llm
219  write(lunout,*)zvert(l),dtdiss*tetaudiv(l),dtdiss*tetaurot(l), &
220  dtdiss*tetah(l)
221  ENDDO
222 
223 END SUBROUTINE inidissip
!$Id mode_top_bound COMMON comconstr dtdiss
Definition: comconst.h:7
!$Id tetagdiv
Definition: comdissnew.h:13
!$Id mode_top_bound COMMON comconstr omeg dissip_factz
Definition: comconst.h:7
!$Header llmm1 INTEGER ip1jmp1
Definition: paramet.h:14
subroutine divgrad2(klevel, h, deltapres, lh, divgra)
Definition: divgrad2.F:5
!$Id preff
Definition: comvert.h:8
!$Header cdivh!COMMON comdissipn tetaudiv(llm)
!$Header cdivu
Definition: comdissipn.h:11
subroutine abort_gcm(modname, message, ierr)
Definition: abort_gcm.F:7
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
subroutine nxgraro2(klevel, xcov, ycov, lr, grx, gry)
Definition: nxgraro2.F:5
!$Id presnivs(llm)
!$Header llmm1 INTEGER ip1jm
Definition: paramet.h:14
!$Header crot
Definition: comdissipn.h:11
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
integer, save dissip_period
Definition: control_mod.F90:22
!$Id mode_top_bound COMMON comconstr rad
Definition: comconst.h:7
!$Header jjp1
Definition: paramet.h:14
subroutine divgrad(klevel, h, lh, divgra)
Definition: divgrad.F:5
subroutine minmax(imax, xi, zmin, zmax)
Definition: minmax.F:5
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
!$Id && tetagrot
Definition: comdissnew.h:13
!$Id mode_top_bound COMMON comconstr omeg dissip_deltaz
Definition: comconst.h:7
!$Id mode_top_bound COMMON comconstr dtvr
Definition: comconst.h:7
subroutine gradiv(klevel, xcov, ycov, ld, gdx, gdy)
Definition: gradiv.F:5
!$Header!INCLUDE comdissip h COMMON comdissip tetatemp
Definition: comdissip.h:8
subroutine filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal, iter)
Definition: filtreg.F:6
integer, save iperiod
Definition: control_mod.F90:16
subroutine nxgrarot(klevel, xcov, ycov, lr, grx, gry)
Definition: nxgrarot.F:5
subroutine inidissip(lstardis, nitergdiv, nitergrot, niterh, tetagdiv, tetagrot, tetatemp, vert_prof_dissip)
Definition: inidissip.F90:6
!$Header tetaurot
Definition: comdissipn.h:11
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
Definition: iniprint.h:7
!$Header tetah
Definition: comdissipn.h:11
subroutine gradiv2(klevel, xcov, ycov, ld, gdx, gdy)
Definition: gradiv2.F:5