source: LMDZ4/trunk/libf/dyn3d/inidissip.F @ 1403

Last change on this file since 1403 was 1403, checked in by Laurent Fairhead, 14 years ago

Merged LMDZ4V5.0-dev branch changes r1292:r1399 to trunk.

Validation:
Validation consisted in compiling the HEAD revision of the trunk,
LMDZ4V5.0-dev branch and the merged sources and running different
configurations on local and SX8 machines comparing results.

Local machine: bench configuration, 32x24x11, gfortran

  • IPSLCM5A configuration (comparison between trunk and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent
  • MH07 configuration, new physics package (comparison between LMDZ4V5.0-dev branch and merged sources):
    • numerical convergence on dynamical fields over 3 days
    • start files are equivalent (except for RN and PB fields)
    • daily history files equivalent

SX8 machine (brodie), 96x95x39 on 4 processors:

  • IPSLCM5A configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent
  • MH07 configuration:
    • start files are equivalent (except for RN and PB fields)
    • monthly history files equivalent

Changes to the makegcm and create_make_gcm scripts to take into account
main programs in F90 files


Fusion de la branche LMDZ4V5.0-dev (r1292:r1399) au tronc principal

Validation:
La validation a consisté à compiler la HEAD de le trunk et de la banche
LMDZ4V5.0-dev et les sources fusionnées et de faire tourner le modéle selon
différentes configurations en local et sur SX8 et de comparer les résultats

En local: 32x24x11, config bench/gfortran

  • pour une config IPSLCM5A (comparaison tronc/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux (à part sur RN et Pb)
    • fichiers histoire égaux
  • pour une config nlle physique (MH07) (comparaison LMDZ4v5.0-dev/fusion):
    • convergence numérique sur les champs dynamiques après 3 jours
    • restart et restartphy égaux
    • fichiers histoire équivalents

Sur brodie, 96x95x39 sur 4 proc:

  • pour une config IPSLCM5A:
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc
  • pour une config MH07
    • restart et restartphy égaux (à part sur RN et PB)
    • pas de différence dans les fichiers histmth.nc

Changement sur makegcm et create_make-gcm pour pouvoir prendre en compte des
programmes principaux en *F90

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 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.