source: LMDZ.3.3/trunk/libf/dyn3d/nudge.F @ 189

Last change on this file since 189 was 189, checked in by lmdzadmin, 23 years ago

Ajout pour le nudge M.Bonazzola
LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
Line 
1      subroutine nudge(itau,ucov,vcov,teta,masse,ps)
2
3      IMPLICIT NONE
4
5c      ......   Version  du 10/01/98    ..........
6
7c             avec  coordonnees  verticales hybrides
8c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
9
10c=======================================================================
11c
12c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
13c   -------
14c
15c   Objet:
16c   ------
17c
18c   GCM LMD nouvelle grille
19c
20c=======================================================================
21
22c   ...  Dans inigeom , nouveaux calculs pour les elongations  cu , cv
23c        et possibilite d'appeler une fonction f(y)  a derivee tangente
24c        hyperbolique a la  place de la fonction a derivee sinusoidale.         
25
26c   ...  Possibilite de choisir le shema de Van-leer pour l'advection de
27c         q  , en faisant iadv = 3  dans   traceur  (29/04/97) .
28c
29c-----------------------------------------------------------------------
30c   Declarations:
31c   -------------
32
33#include "dimensions.h"
34#include "paramet.h"
35#include "comconst.h"
36#include "comdissnew.h"
37#include "comvert.h"
38#include "comgeom.h"
39#include "logic.h"
40#include "temps.h"
41#include "control.h"
42#include "ener.h"
43#include "netcdf.inc"
44#include "description.h"
45#include "serre.h"
46#include "tracstoke.h"
47
48
49c   variables dynamiques
50      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
51      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
52      REAL ps(ip1jmp1)                       ! pression  au sol
53      REAL masse(ip1jmp1,llm)                ! masse d'air
54
55c   variables dynamiques pour les reanalyses.
56      REAL ucovrea1(ip1jmp1,llm),vcovrea1(ip1jm,llm) !vts cov reas
57      REAL tetarea1(ip1jmp1,llm)             ! temp pot  reales
58      REAL masserea1(ip1jmp1,llm)             ! masse
59      REAL psrea1(ip1jmp1)             ! ps
60      REAL ucovrea2(ip1jmp1,llm),vcovrea2(ip1jm,llm) !vts cov reas
61      REAL tetarea2(ip1jmp1,llm)             ! temp pot  reales
62      REAL masserea2(ip1jmp1,llm)             ! masse
63      REAL psrea2(ip1jmp1)             ! ps
64      real alphaT,alphaP,alphau,alphav
65      real dday_step,toto,reste,itau_test
66      INTEGER step_rea,count_no_rea
67
68
69c
70      INTEGER itau,ij,l
71      real ditau,tau,a
72
73      LOGICAL first
74      integer online
75      save first,online
76      data first,online/.true.,-1/
77
78      save ucovrea1,vcovrea1,tetarea1,masserea1,psrea1
79      save ucovrea2,vcovrea2,tetarea2,masserea2,psrea2
80
81      save alphaT,alphau,alphav,alphaP,itau_test
82      save step_rea,count_no_rea
83
84c-----------------------------------------------------------------------
85c   initialisations pour la lecture des reanalyses.
86c    alpha determine la part des injections de donnees a chaque etape
87c    alpha=1 signifie pas d'injection
88c    alpha=0 signifie injection totale
89c-----------------------------------------------------------------------
90
91      print*,'ONLINE=',online
92      if(online.eq.-1) then
93          return
94      endif
95
96      if (first) then
97         print*
98     s   ,'1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'
99cnec         read(*,*) online
100          online=-1
101         print*,'Entrer les constantes de temps de rappel en jours'
102         print*,'alphaT,alphau,alphav,alphaP'
103cnec         read(*,*)alphaT
104cnec         read(*,*)alphau
105cnec         read(*,*)alphav
106cnec         read(*,*)alphaP
107             alphaT=0.1
108             alphau=0.1
109             alphav=0.1
110             alphaP=1.e10
111         if(online.eq.-1) return
112         print*,'alpha rappel pour T, u, v, P ',
113     s    alphaT,alphau,alphav,alphaP
114c   En fait, le coef alpha qu'on utilise est
115c   x_gcm = a * x_gcm + ( 1 - a ) * x_reanalys
116c   on a alors a=1-dt/tau
117c   ou dt est la frequence a laquelle on corrige (ici iperiod*dtvr)
118c   et tau la constante de temps lue. D'ou:
119         if (online.eq.1) then
120            alphaT=1.-iperiod*dtvr/(daysec*alphaT)
121            alphau=1.-iperiod*dtvr/(daysec*alphau)
122            alphav=1.-iperiod*dtvr/(daysec*alphav)
123            alphaP=1.-iperiod*dtvr/(daysec*alphaP)
124         else
125            alphaT=0.
126            alphau=0.
127            alphav=0.
128            alphaP=0.
129c           physic=.false.
130         endif
131         print*,'alpha rappel pour T, u, v, P ',
132     s    alphaT,alphau,alphav,alphaP
133
134         itau_test=1001
135         step_rea=1
136         count_no_rea=0
137
138c    itau_test    montre si l'importation a deja ete faite au rang itau
139
140
141c   Lecture du premier etat des reanalyses.
142         call read_reanalyse(1
143     s   ,ucovrea2,vcovrea2,tetarea2,masserea2,psrea2,1)
144
145c-----------------------------------------------------------------------
146c   Debut de l'integration temporelle:
147c   ----------------------------------
148
149         first=.false.
150      endif ! first
151c
152C-----------------------------------------------------------------------
153C----- IMPORTATION DES VENTS,PRESSION ET TEMPERATURE REELS:
154C-----------------------------------------------------------------------
155
156      ditau=real(itau)
157      dday_step=real(day_step)
158      write(*,*)'ditau,dday_step'
159      write(*,*)ditau,dday_step
160      toto=4*ditau/dday_step
161      reste=toto-aint(toto)
162c     write(*,*)'toto,reste',toto,reste
163
164      if (reste.eq.0.) then
165        if (itau_test.eq.itau) then
166          write(*,*)'deuxieme passage de advreel a itau=',itau
167          stop
168        else
169           CALL SCOPY( ijmllm ,vcovrea2, 1, vcovrea1 , 1 )
170           CALL SCOPY( ijp1llm,ucovrea2, 1, ucovrea1 , 1 )
171           CALL SCOPY( ijp1llm,tetarea2,1,tetarea1   , 1 )
172           CALL SCOPY( ijp1llm,masserea2,1,masserea1   , 1 )
173           CALL SCOPY( ip1jmp1,psrea2, 1,  psrea1, 1 )
174
175          print*,'LECTURE REANALYSES, pas ',step_rea
176     s         ,'apres ',count_no_rea,' non lectures'
177           step_rea=step_rea+1
178           itau_test=itau
179           call read_reanalyse(step_rea
180     s     ,ucovrea2,vcovrea2,tetarea2,masserea2,psrea2,1)
181        endif
182      else
183        count_no_rea=count_no_rea+1
184      endif
185 
186C-----------------------------------------------------------------------
187c   Corrrections
188c
189c    x_gcm = a * x_gcm + (1-a) * x_reanalyses
190C-----------------------------------------------------------------------
191
192      ditau=real(itau)
193      dday_step=real(day_step)
194
195c     print*,'alpha1',alphaT,alphaP,alphau,alphav
196
197      tau=4*ditau/dday_step
198      tau=tau-aint(tau)
199
200      do l=1,llm
201         do ij=1,ip1jmp1
202            a=(1.-tau)*ucovrea1(ij,l)+tau*ucovrea2(ij,l)
203            ucov(ij,l)=alphau*ucov(ij,l)+(1-alphau)*a
204            a=(1.-tau)*tetarea1(ij,l)+tau*tetarea2(ij,l)
205            teta(ij,l)=alphaT*teta(ij,l)+(1-alphaT)*a
206            a=(1.-tau)*masserea1(ij,l)+tau*masserea2(ij,l)
207            masse(ij,l)=alphaP*masse(ij,l)+(1-alphaP)*a
208         enddo
209         do ij=1,ip1jm
210            a=(1.-tau)*vcovrea1(ij,l)+tau*vcovrea2(ij,l)
211            vcov(ij,l)=alphav*vcov(ij,l)+(1-alphav)*a
212         enddo
213      enddo
214
215c     call dump2d(iip1,jjp1,tetarea1,'TETA REA 1     ')
216c     call dump2d(iip1,jjp1,tetarea2,'TETA REA 2     ')
217c     call dump2d(iip1,jjp1,teta,'TETA           ')
218Cmaf  on ne nudge pas sur la pression de surface
219c      do ij=1,ip1jmp1
220c         a=(1.-tau)*psrea1(ij)+tau*psrea2(ij)
221c         ps(ij)=alphaP*ps(ij)+(1-alphaP)*a
222c      enddo
223
224
225      return
226      end
Note: See TracBrowser for help on using the repository browser.