source: LMDZ5/trunk/libf/dyn3dmem/inidissip.F @ 1660

Last change on this file since 1660 was 1658, checked in by Laurent Fairhead, 12 years ago

Phasage de la dynamique parallele localisee (petite memoire) avec le tronc LMDZ4 (HEAD)
Validation effectuee par comparaison des fichiers de sorties debug (u, v, t, q, masse, etc ...) d'une simulation sans physique
faite avec la version du modele donnee par Y. Meurdesoif et la version phasee avec la r1428 (fin du tronc LMDZ4)


Phasing of the localised (low memory) parallel dynamics package with the LMDZ4 trunk version of LMDZ
Validation consisted in comparing output debug files (u, v, t, q, masse, etc... ) of a no physics simulation
run with the version of the code given by Y. Meurdesoif and this version phased with r1428 (HEAD of the LMDZ4 trunk)

File size: 6.1 KB
Line 
1!
2! $Id: inidissip.F 1403 2010-07-01 09:02:53Z fairhead $
3!
4      SUBROUTINE inidissip ( lstardis,nitergdiv,nitergrot,niterh  ,
5     *                       tetagdiv,tetagrot,tetatemp             )
6c=======================================================================
7c   initialisation de la dissipation horizontale
8c=======================================================================
9c-----------------------------------------------------------------------
10c   declarations:
11c   -------------
12
13      USE control_mod
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
23      LOGICAL lstardis
24      INTEGER nitergdiv,nitergrot,niterh
25      REAL    tetagdiv,tetagrot,tetatemp
26      REAL fact,zvert(llm),zz
27      REAL zh(ip1jmp1),zu(ip1jmp1),zv(ip1jm),deltap(ip1jmp1,llm)
28      REAL ullm,vllm,umin,vmin,zhmin,zhmax
29      REAL zllm,z1llm
30
31      INTEGER l,ij,idum,ii
32      REAL tetamin
33      REAL pseudoz
34
35      REAL ran1
36
37
38c-----------------------------------------------------------------------
39c
40c   calcul des valeurs propres des operateurs par methode iterrative:
41c   -----------------------------------------------------------------
42
43      crot     = -1.
44      cdivu    = -1.
45      cdivh    = -1.
46
47c   calcul de la valeur propre de divgrad:
48c   --------------------------------------
49      idum = 0
50      DO l = 1, llm
51       DO ij = 1, ip1jmp1
52        deltap(ij,l) = 1.
53       ENDDO
54      ENDDO
55
56      idum  = -1
57      zh(1) = RAN1(idum)-.5
58      idum  = 0
59      DO ij = 2, ip1jmp1
60        zh(ij) = RAN1(idum) -.5
61      ENDDO
62
63      CALL filtreg (zh,jjp1,1,2,1,.TRUE.,1)
64
65      CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
66
67      IF ( zhmin .GE. zhmax  )     THEN
68         PRINT*,'  Inidissip  zh min max  ',zhmin,zhmax
69         STOP'probleme generateur alleatoire dans inidissip'
70      ENDIF
71
72      zllm = ABS( zhmax )
73      DO l = 1,50
74         IF(lstardis) THEN
75            CALL divgrad2(1,zh,deltap,niterh,zh)
76         ELSE
77            CALL divgrad (1,zh,niterh,zh)
78         ENDIF
79
80        CALL minmax(iip1*jjp1,zh,zhmin,zhmax )
81
82         zllm  = ABS( zhmax )
83         z1llm = 1./zllm
84         DO ij = 1,ip1jmp1
85            zh(ij) = zh(ij)* z1llm
86         ENDDO
87      ENDDO
88
89      IF(lstardis) THEN
90         cdivh = 1./ zllm
91      ELSE
92         cdivh = zllm ** ( -1./niterh )
93      ENDIF
94
95c   calcul des valeurs propres de gradiv (ii =1) et  nxgrarot(ii=2)
96c   -----------------------------------------------------------------
97      print*,'calcul des valeurs propres'
98
99      DO  20  ii = 1, 2
100c
101         DO ij = 1, ip1jmp1
102           zu(ij)  = RAN1(idum) -.5
103         ENDDO
104         CALL filtreg (zu,jjp1,1,2,1,.TRUE.,1)
105         DO ij = 1, ip1jm
106            zv(ij) = RAN1(idum) -.5
107         ENDDO
108         CALL filtreg (zv,jjm,1,2,1,.FALSE.,1)
109
110         CALL minmax(iip1*jjp1,zu,umin,ullm )
111         CALL minmax(iip1*jjm, zv,vmin,vllm )
112
113         ullm = ABS ( ullm )
114         vllm = ABS ( vllm )
115
116         DO  5  l = 1, 50
117            IF(ii.EQ.1) THEN
118ccccc             CALL covcont( 1,zu,zv,zu,zv )
119               IF(lstardis) THEN
120                  CALL gradiv2( 1,zu,zv,nitergdiv,zu,zv )
121               ELSE
122                  CALL gradiv ( 1,zu,zv,nitergdiv,zu,zv )
123               ENDIF
124            ELSE
125               IF(lstardis) THEN
126                  CALL nxgraro2( 1,zu,zv,nitergrot,zu,zv )
127               ELSE
128                  CALL nxgrarot( 1,zu,zv,nitergrot,zu,zv )
129               ENDIF
130            ENDIF
131
132            CALL minmax(iip1*jjp1,zu,umin,ullm )
133            CALL minmax(iip1*jjm, zv,vmin,vllm )
134
135            ullm = ABS  ( ullm )
136            vllm = ABS  ( vllm )
137
138            zllm  = MAX( ullm,vllm )
139            z1llm = 1./ zllm
140            DO ij = 1, ip1jmp1
141              zu(ij) = zu(ij)* z1llm
142            ENDDO
143            DO ij = 1, ip1jm
144               zv(ij) = zv(ij)* z1llm
145            ENDDO
146 5       CONTINUE
147
148         IF ( ii.EQ.1 ) THEN
149            IF(lstardis) THEN
150               cdivu  = 1./zllm
151            ELSE
152               cdivu  = zllm **( -1./nitergdiv )
153            ENDIF
154         ELSE
155            IF(lstardis) THEN
156               crot   = 1./ zllm
157            ELSE
158               crot   = zllm **( -1./nitergrot )
159            ENDIF
160         ENDIF
161
162 20   CONTINUE
163
164c   petit test pour les operateurs non star:
165c   ----------------------------------------
166
167c     IF(.NOT.lstardis) THEN
168         fact    = rad*24./REAL(jjm)
169         fact    = fact*fact
170         PRINT*,'coef u ', fact/cdivu, 1./cdivu
171         PRINT*,'coef r ', fact/crot , 1./crot
172         PRINT*,'coef h ', fact/cdivh, 1./cdivh
173c     ENDIF
174
175c-----------------------------------------------------------------------
176c   variation verticale du coefficient de dissipation:
177c   --------------------------------------------------
178
179      if (ok_strato .and. llm==39) then
180         do l=1,llm
181            pseudoz=8.*log(preff/presnivs(l))
182            zvert(l)=1+
183     s      (tanh((pseudoz-dissip_zref)/dissip_deltaz)+1.)/2.
184     s      *(dissip_factz-1.)
185         enddo
186      else
187         DO l=1,llm
188            zvert(l)=1.
189         ENDDO
190         fact=2.
191         DO l = 1, llm
192            zz      = 1. - preff/presnivs(l)
193            zvert(l)= fact -( fact-1.)/( 1.+zz*zz )
194         ENDDO
195      endif
196
197
198      PRINT*,'Constantes de temps de la diffusion horizontale'
199
200      tetamin =  1.e+6
201
202      DO l=1,llm
203        tetaudiv(l)   = zvert(l)/tetagdiv
204        tetaurot(l)   = zvert(l)/tetagrot
205        tetah(l)      = zvert(l)/tetatemp
206
207        IF( tetamin.GT. (1./tetaudiv(l)) ) tetamin = 1./ tetaudiv(l)
208        IF( tetamin.GT. (1./tetaurot(l)) ) tetamin = 1./ tetaurot(l)
209        IF( tetamin.GT. (1./   tetah(l)) ) tetamin = 1./    tetah(l)
210      ENDDO
211
212      PRINT *,' INIDI tetamin dtvr ',tetamin,dtvr,iperiod
213      idissip = INT( tetamin/( 2.*dtvr*iperiod) ) * iperiod
214      PRINT *,' INIDI tetamin idissip ',tetamin,idissip
215      idissip = MAX(iperiod,idissip)
216      dtdiss  = idissip * dtvr
217      PRINT *,' INIDI idissip dtdiss ',idissip,dtdiss
218
219      DO l = 1,llm
220         PRINT*,zvert(l),dtdiss*tetaudiv(l),dtdiss*tetaurot(l),
221     *                   dtdiss*tetah(l)
222      ENDDO
223
224c
225      RETURN
226      END
Note: See TracBrowser for help on using the repository browser.