/[lmdze]/trunk/Sources/dyn3d/Guide/guide.f
ViewVC logotype

Diff of /trunk/Sources/dyn3d/Guide/guide.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC revision 39 by guez, Tue Jan 25 15:11:05 2011 UTC
# Line 1  Line 1 
1  module guide_m  MODULE guide_m
2    
3    ! From dyn3d/guide.F,v 1.3 2005/05/25 13:10:09    ! From dyn3d/guide.F, version 1.3 2005/05/25 13:10:09
4    ! and dyn3d/guide.h,v 1.1.1.1 2004/05/19 12:53:06    ! and dyn3d/guide.h, version 1.1.1.1 2004/05/19 12:53:06
5    
6    real tau_min_u,tau_max_u    IMPLICIT NONE
7    real tau_min_v,tau_max_v  
8    real tau_min_T,tau_max_T    REAL tau_min_u, tau_max_u
9    real tau_min_q,tau_max_q    REAL tau_min_v, tau_max_v
10    real tau_min_P,tau_max_P    REAL tau_min_t, tau_max_t
11    real aire_min,aire_max    REAL tau_min_q, tau_max_q
12      REAL tau_min_p, tau_max_p
13      REAL aire_min, aire_max
14    logical guide_u,guide_v,guide_T,guide_Q,guide_P  
15    real lat_min_guide,lat_max_guide  
16      LOGICAL guide_u, guide_v, guide_t, guide_q, guide_p
17    LOGICAL ncep,ini_anal    LOGICAL ncep, ini_anal
18    integer online    INTEGER online
19    
20  contains  CONTAINS
21    
22    subroutine guide(itau,ucov,vcov,teta,q,masse,ps)    SUBROUTINE guide(itau, ucov, vcov, teta, q, masse, ps)
23    
24      use dimens_m      ! Author: F.Hourdin
25      use paramet_m  
26      use comconst      USE comconst, ONLY : cpp, daysec, dtvr, kappa
27      use comdissnew      USE comvert, ONLY : ap, bp, preff, presnivs
28      use comvert      USE conf_gcm_m, ONLY : day_step, iperiod
29      use conf_gcm_m      USE comgeom, ONLY : aire, rlatu, rlonv
30      use logic      USE dimens_m, ONLY : jjm, llm
31      use comgeom      USE exner_hyb_m, ONLY : exner_hyb
32      use serre      USE inigrads_m, ONLY : inigrads
33      use temps      use netcdf, only: nf90_nowrite, nf90_open, nf90_close
34      use tracstoke      use nr_util, only: pi
35      use ener      USE paramet_m, ONLY : iip1, ip1jm, ip1jmp1, jjp1, llmp1
36      use q_sat_m, only: q_sat      USE q_sat_m, ONLY : q_sat
37      use exner_hyb_m, only: exner_hyb      USE serre, ONLY : clat, clon
38      use pression_m, only: pression      use tau2alpha_m, only: tau2alpha
     use inigrads_m, only: inigrads  
   
     IMPLICIT NONE  
   
     !      ......   Version  du 10/01/98    ..........  
   
     !             avec  coordonnees  verticales hybrides  
     !   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )  
   
     !=======================================================================  
     !  
     !   Auteur:  F.Hourdin  
     !   -------  
     !  
     !   Objet:  
     !   ------  
     !  
     !   GCM LMD nouvelle grille  
     !  
     !=======================================================================  
   
     !   ...  Dans inigeom , nouveaux calculs pour les elongations  cu , cv  
     !        et possibilite d'appeler une fonction f(y)  a derivee tangente  
     !        hyperbolique a la  place de la fonction a derivee sinusoidale.          
   
     !   ...  Possibilite de choisir le shema de Van-leer pour l'advection de  
     !         q  , en faisant iadv = 10  dans   traceur  (29/04/97) .  
     !  
     !-----------------------------------------------------------------------  
     !   Declarations:  
     !   -------------  
39    
40      include "netcdf.inc"      INCLUDE 'netcdf.inc'
41    
42      !   variables dynamiques      !   variables dynamiques
43      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants      REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants
44      REAL teta(ip1jmp1,llm)                 ! temperature potentielle      REAL, intent(inout):: teta(ip1jmp1, llm) ! temperature potentielle
45      REAL q(ip1jmp1,llm)                 ! temperature potentielle      REAL q(ip1jmp1, llm) ! temperature potentielle
46      REAL ps(ip1jmp1)                       ! pression  au sol      REAL ps(ip1jmp1) ! pression  au sol
47      REAL masse(ip1jmp1,llm)                ! masse d'air      REAL masse(ip1jmp1, llm) ! masse d'air
48    
49      !   common passe pour des sorties      !   common passe pour des sorties
50      real dxdys(iip1,jjp1),dxdyu(iip1,jjp1),dxdyv(iip1,jjm)      REAL dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)
51      common/comdxdy/dxdys,dxdyu,dxdyv      COMMON /comdxdy/dxdys, dxdyu, dxdyv
52    
53      !   variables dynamiques pour les reanalyses.      !   variables dynamiques pour les reanalyses.
54      REAL ucovrea1(ip1jmp1,llm),vcovrea1(ip1jm,llm) !vts cov reas      REAL ucovrea1(ip1jmp1, llm), vcovrea1(ip1jm, llm) !vts cov reas
55      REAL tetarea1(ip1jmp1,llm)             ! temp pot  reales      REAL tetarea1(ip1jmp1, llm) ! temp pot  reales
56      REAL qrea1(ip1jmp1,llm)             ! temp pot  reales      REAL qrea1(ip1jmp1, llm) ! temp pot  reales
57      REAL psrea1(ip1jmp1)             ! ps      REAL psrea1(ip1jmp1) ! ps
58      REAL ucovrea2(ip1jmp1,llm),vcovrea2(ip1jm,llm) !vts cov reas      REAL ucovrea2(ip1jmp1, llm), vcovrea2(ip1jm, llm) !vts cov reas
59      REAL tetarea2(ip1jmp1,llm)             ! temp pot  reales      REAL tetarea2(ip1jmp1, llm) ! temp pot  reales
60      REAL qrea2(ip1jmp1,llm)             ! temp pot  reales      REAL qrea2(ip1jmp1, llm) ! temp pot  reales
61      REAL masserea2(ip1jmp1,llm)             ! masse      REAL masserea2(ip1jmp1, llm) ! masse
62      REAL psrea2(ip1jmp1)             ! ps      REAL psrea2(ip1jmp1) ! ps
63    
64      real alpha_q(ip1jmp1)      REAL alpha_q(ip1jmp1)
65      real alpha_T(ip1jmp1),alpha_P(ip1jmp1)      REAL alpha_t(ip1jmp1), alpha_p(ip1jmp1)
66      real alpha_u(ip1jmp1),alpha_v(ip1jm)      REAL alpha_u(ip1jmp1), alpha_v(ip1jm)
67      real dday_step,toto,reste,itau_test      REAL dday_step, toto, reste, itau_test
68      INTEGER step_rea,count_no_rea      INTEGER step_rea, count_no_rea
69    
70      !IM 180305   real aire_min,aire_max      INTEGER ilon, ilat
71      integer ilon,ilat      REAL factt, ztau(ip1jmp1)
72      real factt,ztau(ip1jmp1)  
73        INTEGER, INTENT (IN) :: itau
74      INTEGER, intent(in):: itau      INTEGER ij, l
75      integer ij, l      INTEGER ncidpl, varidpl, nlev, status
76      integer ncidpl,varidpl,nlev,status      INTEGER rcod, rid
77      integer rcod,rid      REAL ditau, tau, a
78      real ditau,tau,a      SAVE nlev
     save nlev  
79    
80      !  TEST SUR QSAT      !  TEST SUR QSAT
81      real p(ip1jmp1,llmp1),pk(ip1jmp1,llm),pks(ip1jmp1)      REAL p(ip1jmp1, llmp1), pk(ip1jmp1, llm), pks(ip1jmp1)
82      real pkf(ip1jmp1,llm)      REAL pkf(ip1jmp1, llm)
83      real pres(ip1jmp1,llm)      REAL pres(ip1jmp1, llm)
84    
85      real qsat(ip1jmp1,llm)      REAL qsat(ip1jmp1, llm)
86      real unskap      REAL unskap
87      real tnat(ip1jmp1,llm)      REAL tnat(ip1jmp1, llm)
88      !cccccccccccccccc  
89        LOGICAL:: first = .TRUE.
90    
91        SAVE ucovrea1, vcovrea1, tetarea1, psrea1, qrea1
92        SAVE ucovrea2, vcovrea2, tetarea2, masserea2, psrea2, qrea2
93    
94        SAVE alpha_t, alpha_q, alpha_u, alpha_v, alpha_p, itau_test
95        SAVE step_rea, count_no_rea
96    
97        CHARACTER (10) file
98        INTEGER igrads
99        REAL dtgrads
100        SAVE igrads, dtgrads
101        DATA igrads, dtgrads/2, 100./
102    
103      LOGICAL first      !-----------------------------------------------------------------------
     save first  
     data first/.true./  
   
     save ucovrea1,vcovrea1,tetarea1,psrea1,qrea1  
     save ucovrea2,vcovrea2,tetarea2,masserea2,psrea2,qrea2  
   
     save alpha_T,alpha_q,alpha_u,alpha_v,alpha_P,itau_test  
     save step_rea,count_no_rea  
   
     character*10 file  
     integer igrads  
     real dtgrads  
     save igrads,dtgrads  
     data igrads,dtgrads/2,100./  
104    
105      print *,'Call sequence information: guide'      PRINT *, 'Call sequence information: guide'
106    
     !-----------------------------------------------------------------------  
107      ! calcul de l'humidite saturante      ! calcul de l'humidite saturante
     !-----------------------------------------------------------------------  
     CALL pression( ip1jmp1, ap, bp, ps, p )  
     call massdair(p,masse)  
     print*,'OK1'  
     CALL exner_hyb(ps,p,pks,pk,pkf)  
     print*,'OK2'  
     tnat(:,:)=pk(:,:)*teta(:,:)/cpp  
     print*,'OK3'  
     unskap   = 1./ kappa  
     pres(:,:)=preff*(pk(:,:)/cpp)**unskap  
     print*,'OK4'  
     qsat = q_sat(tnat, pres)  
108    
109      !-----------------------------------------------------------------------      forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
110        CALL massdair(p, masse)
111        PRINT *, 'OK1'
112        CALL exner_hyb(ps, p, pks, pk, pkf)
113        PRINT *, 'OK2'
114        tnat(:, :) = pk(:, :)*teta(:, :)/cpp
115        PRINT *, 'OK3'
116        unskap = 1./kappa
117        pres(:, :) = preff*(pk(:, :)/cpp)**unskap
118        PRINT *, 'OK4'
119        qsat = q_sat(tnat, pres)
120    
     !-----------------------------------------------------------------------  
121      !   initialisations pour la lecture des reanalyses.      !   initialisations pour la lecture des reanalyses.
122      !    alpha determine la part des injections de donnees a chaque etape      !    alpha determine la part des injections de donnees a chaque etape
123      !    alpha=1 signifie pas d'injection      !    alpha=1 signifie pas d'injection
124      !    alpha=0 signifie injection totale      !    alpha=0 signifie injection totale
     !-----------------------------------------------------------------------  
125    
126      print*,'ONLINE=',online      PRINT *, 'ONLINE=', online
127      if(online.eq.-1) then      IF (online==-1) THEN
128         return         RETURN
129      endif      END IF
130    
131      if (first) then      IF (first) THEN
132    
133         print*,'initialisation du guide '         PRINT *, 'initialisation du guide '
134         call conf_guide         CALL conf_guide
135         print*,'apres conf_guide'         PRINT *, 'apres conf_guide'
136    
137         file='guide'         file = 'guide'
138         call inigrads(igrads &         CALL inigrads(igrads, rlonv, 180./pi, -180., 180., rlatu, -90., 90., &
139              ,rlonv,180./pi,-180.,180.,rlatu,-90.,90.,180./pi &              180./pi, presnivs, 1., dtgrads, file, 'dyn_zon ')
             ,presnivs,1. &  
             ,dtgrads,file,'dyn_zon ')  
140    
141         print* &         PRINT *, &
142              ,'1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'              '1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'
143    
144         if(online.eq.-1) return         IF (online==-1) RETURN
145         if (online.eq.1) then         IF (online==1) THEN
146    
           !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
147            !  Constantes de temps de rappel en jour            !  Constantes de temps de rappel en jour
148            !  0.1 c'est en gros 2h30.            !  0.1 c'est en gros 2h30.
149            !  1e10  est une constante infinie donc en gros pas de guidage            !  1e10  est une constante infinie donc en gros pas de guidage
150            !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
151            !   coordonnees du centre du zoom            !   coordonnees du centre du zoom
152            call coordij(clon,clat,ilon,ilat)            CALL coordij(clon, clat, ilon, ilat)
153            !   aire de la maille au centre du zoom            !   aire de la maille au centre du zoom
154            aire_min=aire(ilon+(ilat-1)*iip1)            aire_min = aire(ilon+(ilat-1)*iip1)
155            !   aire maximale de la maille            !   aire maximale de la maille
156            aire_max=0.            aire_max = 0.
157            do ij=1,ip1jmp1            DO ij = 1, ip1jmp1
158               aire_max=max(aire_max,aire(ij))               aire_max = max(aire_max, aire(ij))
159            enddo            END DO
160            !  factt = pas de temps en fraction de jour            !  factt = pas de temps en fraction de jour
161            factt=dtvr*iperiod/daysec            factt = dtvr*iperiod/daysec
162    
163            !     subroutine tau2alpha(type,im,jm,factt,taumin,taumax,alpha)            CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
164            call tau2alpha(3,iip1,jjm ,factt,tau_min_v,tau_max_v,alpha_v)            CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
165            call tau2alpha(2,iip1,jjp1,factt,tau_min_u,tau_max_u,alpha_u)            CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
166            call tau2alpha(1,iip1,jjp1,factt,tau_min_T,tau_max_T,alpha_T)            CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
167            call tau2alpha(1,iip1,jjp1,factt,tau_min_P,tau_max_P,alpha_P)            CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
168            call tau2alpha(1,iip1,jjp1,factt,tau_min_q,tau_max_q,alpha_q)  
169              CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
170            call dump2d(iip1,jjp1,aire,'AIRE MAILLe ')            CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U   ')
171            call dump2d(iip1,jjp1,alpha_u,'COEFF U   ')            CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T   ')
           call dump2d(iip1,jjp1,alpha_T,'COEFF T   ')  
172    
           !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
173            !   Cas ou on force exactement par les variables analysees            !   Cas ou on force exactement par les variables analysees
174         else         ELSE
175            alpha_T=0.            alpha_t = 0.
176            alpha_u=0.            alpha_u = 0.
177            alpha_v=0.            alpha_v = 0.
178            alpha_P=0.            alpha_p = 0.
179            !           physic=.false.            !           physic=.false.
180         endif         END IF
181    
182         itau_test=1001         itau_test = 1001
183         step_rea=1         step_rea = 1
184         count_no_rea=0         count_no_rea = 0
185         ncidpl=-99         ncidpl = -99
186    
187         !    itau_test    montre si l'importation a deja ete faite au rang itau         !    itau_test    montre si l'importation a deja ete faite au rang itau
188         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
189         if (guide_u) then         if (guide_u) then
190            if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
191         endif         endif
192         !  
193         if (guide_v) then         if (guide_v) then
194            if (ncidpl.eq.-99) ncidpl=NCOPN('v.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
195         endif         endif
196         !  
197         if (guide_T) then         if (guide_T) then
198            if (ncidpl.eq.-99) ncidpl=NCOPN('T.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
199         endif         endif
200         !  
201         if (guide_Q) then         if (guide_Q) then
202            if (ncidpl.eq.-99) ncidpl=NCOPN('hur.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
203         endif         endif
204         !  
205         if (ncep) then         IF (ncep) THEN
206            status=NF_INQ_DIMID(ncidpl,'LEVEL',rid)            status = nf_inq_dimid(ncidpl, 'LEVEL', rid)
207         else         ELSE
208            status=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)            status = nf_inq_dimid(ncidpl, 'PRESSURE', rid)
209         endif         END IF
210         status=NF_INQ_DIMLEN(ncidpl,rid,nlev)         status = nf_inq_dimlen(ncidpl, rid, nlev)
211         print *,'nlev', nlev         PRINT *, 'nlev', nlev
212         call ncclos(ncidpl,rcod)         rcod = nf90_close(ncidpl)
213         !   Lecture du premier etat des reanalyses.         !   Lecture du premier etat des reanalyses.
214         call read_reanalyse(1,ps &         CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
215              ,ucovrea2,vcovrea2,tetarea2,qrea2,masserea2,psrea2,1,nlev)              masserea2, psrea2, 1, nlev)
216         qrea2(:,:)=max(qrea2(:,:),0.1)         qrea2(:, :) = max(qrea2(:, :), 0.1)
217    
218    
        !-----------------------------------------------------------------------  
219         !   Debut de l'integration temporelle:         !   Debut de l'integration temporelle:
220         !   ----------------------------------      END IF ! first
   
     endif ! first  
     !  
     !-----------------------------------------------------------------------  
     !----- IMPORTATION DES VENTS,PRESSION ET TEMPERATURE REELS:  
     !-----------------------------------------------------------------------  
   
     ditau=real(itau)  
     DDAY_step=real(day_step)  
     write(*,*)'ditau,dday_step'  
     write(*,*)ditau,dday_step  
     toto=4*ditau/dday_step  
     reste=toto-aint(toto)  
     !     write(*,*)'toto,reste',toto,reste  
   
     if (reste.eq.0.) then  
        if (itau_test.eq.itau) then  
           write(*,*)'deuxieme passage de advreel a itau=',itau  
           stop  
        else  
           vcovrea1(:,:)=vcovrea2(:,:)  
           ucovrea1(:,:)=ucovrea2(:,:)  
           tetarea1(:,:)=tetarea2(:,:)  
           qrea1(:,:)=qrea2(:,:)  
   
           print*,'LECTURE REANALYSES, pas ',step_rea &  
                ,'apres ',count_no_rea,' non lectures'  
           step_rea=step_rea+1  
           itau_test=itau  
           call read_reanalyse(step_rea,ps &  
                ,ucovrea2,vcovrea2,tetarea2,qrea2,masserea2,psrea2,1,nlev)  
           qrea2(:,:)=max(qrea2(:,:),0.1)  
           factt=dtvr*iperiod/daysec  
           ztau(:)=factt/max(alpha_T(:),1.e-10)  
           call wrgrads(igrads,1,aire   ,'aire      ','aire      ' )  
           call wrgrads(igrads,1,dxdys  ,'dxdy      ','dxdy      ' )  
           call wrgrads(igrads,1,alpha_u,'au        ','au        ' )  
           call wrgrads(igrads,1,alpha_T,'at        ','at        ' )  
           call wrgrads(igrads,1,ztau,'taut      ','taut      ' )  
           call wrgrads(igrads,llm,ucov,'u         ','u         ' )  
           call wrgrads(igrads,llm,ucovrea2,'ua        ','ua        ' )  
           call wrgrads(igrads,llm,teta,'T         ','T         ' )  
           call wrgrads(igrads,llm,tetarea2,'Ta        ','Ta        ' )  
           call wrgrads(igrads,llm,qrea2,'Qa        ','Qa        ' )  
           call wrgrads(igrads,llm,q,'Q         ','Q         ' )  
221    
222            call wrgrads(igrads,llm,qsat,'QSAT      ','QSAT      ' )      ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
223    
224         endif      ditau = real(itau)
225      else      dday_step = real(day_step)
226         count_no_rea=count_no_rea+1      WRITE (*, *) 'ditau, dday_step'
227      endif      WRITE (*, *) ditau, dday_step
228        toto = 4*ditau/dday_step
229        reste = toto - aint(toto)
230    
231        IF (reste==0.) THEN
232           IF (itau_test==itau) THEN
233              WRITE (*, *) 'deuxieme passage de advreel a itau=', itau
234              STOP
235           ELSE
236              vcovrea1(:, :) = vcovrea2(:, :)
237              ucovrea1(:, :) = ucovrea2(:, :)
238              tetarea1(:, :) = tetarea2(:, :)
239              qrea1(:, :) = qrea2(:, :)
240    
241              PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
242                   count_no_rea, ' non lectures'
243              step_rea = step_rea + 1
244              itau_test = itau
245              CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, &
246                   qrea2, masserea2, psrea2, 1, nlev)
247              qrea2(:, :) = max(qrea2(:, :), 0.1)
248              factt = dtvr*iperiod/daysec
249              ztau(:) = factt/max(alpha_t(:), 1.E-10)
250              CALL wrgrads(igrads, 1, aire, 'aire      ', 'aire      ')
251              CALL wrgrads(igrads, 1, dxdys, 'dxdy      ', 'dxdy      ')
252              CALL wrgrads(igrads, 1, alpha_u, 'au        ', 'au        ')
253              CALL wrgrads(igrads, 1, alpha_t, 'at        ', 'at        ')
254              CALL wrgrads(igrads, 1, ztau, 'taut      ', 'taut      ')
255              CALL wrgrads(igrads, llm, ucov, 'u         ', 'u         ')
256              CALL wrgrads(igrads, llm, ucovrea2, 'ua        ', 'ua        ')
257              CALL wrgrads(igrads, llm, teta, 'T         ', 'T         ')
258              CALL wrgrads(igrads, llm, tetarea2, 'Ta        ', 'Ta        ')
259              CALL wrgrads(igrads, llm, qrea2, 'Qa        ', 'Qa        ')
260              CALL wrgrads(igrads, llm, q, 'Q         ', 'Q         ')
261    
262              CALL wrgrads(igrads, llm, qsat, 'QSAT      ', 'QSAT      ')
263    
264           END IF
265        ELSE
266           count_no_rea = count_no_rea + 1
267        END IF
268    
     !-----------------------------------------------------------------------  
269      !   Guidage      !   Guidage
270      !    x_gcm = a * x_gcm + (1-a) * x_reanalyses      !    x_gcm = a * x_gcm + (1-a) * x_reanalyses
     !-----------------------------------------------------------------------  
271    
272      if(ini_anal) print*,'ATTENTION !!! ON PART DU GUIDAGE'      IF (ini_anal) PRINT *, 'ATTENTION !!! ON PART DU GUIDAGE'
273    
274      ditau=real(itau)      ditau = real(itau)
275      dday_step=real(day_step)      dday_step = real(day_step)
276    
277    
278      tau=4*ditau/dday_step      tau = 4*ditau/dday_step
279      tau=tau-aint(tau)      tau = tau - aint(tau)
280    
281      !  ucov      !  ucov
282      if (guide_u) then      IF (guide_u) THEN
283         do l=1,llm         DO l = 1, llm
284            do ij=1,ip1jmp1            DO ij = 1, ip1jmp1
285               a=(1.-tau)*ucovrea1(ij,l)+tau*ucovrea2(ij,l)               a = (1.-tau)*ucovrea1(ij, l) + tau*ucovrea2(ij, l)
286               ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij)*a               ucov(ij, l) = (1.-alpha_u(ij))*ucov(ij, l) + alpha_u(ij)*a
287               if (first.and.ini_anal) ucov(ij,l)=a               IF (first .AND. ini_anal) ucov(ij, l) = a
288            enddo            END DO
289         enddo         END DO
290      endif      END IF
291    
292      !  teta      IF (guide_t) THEN
293      if (guide_T) then         DO l = 1, llm
294         do l=1,llm            DO ij = 1, ip1jmp1
295            do ij=1,ip1jmp1               a = (1.-tau)*tetarea1(ij, l) + tau*tetarea2(ij, l)
296               a=(1.-tau)*tetarea1(ij,l)+tau*tetarea2(ij,l)               teta(ij, l) = (1.-alpha_t(ij))*teta(ij, l) + alpha_t(ij)*a
297               teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij)*a               IF (first .AND. ini_anal) teta(ij, l) = a
298               if (first.and.ini_anal) teta(ij,l)=a            END DO
299            enddo         END DO
300         enddo      END IF
     endif  
301    
302      !  P      !  P
303      if (guide_P) then      IF (guide_p) THEN
304         do ij=1,ip1jmp1         DO ij = 1, ip1jmp1
305            a=(1.-tau)*psrea1(ij)+tau*psrea2(ij)            a = (1.-tau)*psrea1(ij) + tau*psrea2(ij)
306            ps(ij)=(1.-alpha_P(ij))*ps(ij)+alpha_P(ij)*a            ps(ij) = (1.-alpha_p(ij))*ps(ij) + alpha_p(ij)*a
307            if (first.and.ini_anal) ps(ij)=a            IF (first .AND. ini_anal) ps(ij) = a
308         enddo         END DO
309         CALL pression(ip1jmp1,ap,bp,ps,p)         forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
310         CALL massdair(p,masse)         CALL massdair(p, masse)
311      endif      END IF
312    
313    
314      !  q      !  q
315      if (guide_Q) then      IF (guide_q) THEN
316         do l=1,llm         DO l = 1, llm
317            do ij=1,ip1jmp1            DO ij = 1, ip1jmp1
318               a=(1.-tau)*qrea1(ij,l)+tau*qrea2(ij,l)               a = (1.-tau)*qrea1(ij, l) + tau*qrea2(ij, l)
319               !   hum relative en % -> hum specif               !   hum relative en % -> hum specif
320               a=qsat(ij,l)*a*0.01               a = qsat(ij, l)*a*0.01
321               q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij)*a               q(ij, l) = (1.-alpha_q(ij))*q(ij, l) + alpha_q(ij)*a
322               if (first.and.ini_anal) q(ij,l)=a               IF (first .AND. ini_anal) q(ij, l) = a
323            enddo            END DO
324         enddo         END DO
325      endif      END IF
326    
327      ! vcov      ! vcov
328      if (guide_v) then      IF (guide_v) THEN
329         do l=1,llm         DO l = 1, llm
330            do ij=1,ip1jm            DO ij = 1, ip1jm
331               a=(1.-tau)*vcovrea1(ij,l)+tau*vcovrea2(ij,l)               a = (1.-tau)*vcovrea1(ij, l) + tau*vcovrea2(ij, l)
332               vcov(ij,l)=(1.-alpha_v(ij))*vcov(ij,l)+alpha_v(ij)*a               vcov(ij, l) = (1.-alpha_v(ij))*vcov(ij, l) + alpha_v(ij)*a
333               if (first.and.ini_anal) vcov(ij,l)=a               IF (first .AND. ini_anal) vcov(ij, l) = a
334            enddo            END DO
335            if (first.and.ini_anal) vcov(ij,l)=a            IF (first .AND. ini_anal) vcov(ij, l) = a
336         enddo         END DO
337      endif      END IF
   
     !     call dump2d(iip1,jjp1,tetarea1,'TETA REA 1     ')  
     !     call dump2d(iip1,jjp1,tetarea2,'TETA REA 2     ')  
     !     call dump2d(iip1,jjp1,teta,'TETA           ')  
   
     first=.false.  
   
     return  
   end subroutine guide  
   
   !=======================================================================  
   subroutine tau2alpha(type,pim,pjm,factt,taumin,taumax,alpha)  
     !=======================================================================  
   
     use dimens_m  
     use paramet_m  
     use comconst, only: pi  
     use comgeom  
     use serre  
     implicit none  
   
     !   arguments :  
     integer type  
     integer pim,pjm  
     real factt,taumin,taumax  
     real dxdy_,alpha(pim,pjm)  
     real dxdy_min,dxdy_max  
   
     !  local :  
     real alphamin,alphamax,gamma,xi  
     save gamma  
     integer i,j,ilon,ilat  
   
     logical first  
     save first  
     data first/.true./  
   
     real zdx(iip1,jjp1),zdy(iip1,jjp1)  
   
     real zlat  
     real dxdys(iip1,jjp1),dxdyu(iip1,jjp1),dxdyv(iip1,jjm)  
     common/comdxdy/dxdys,dxdyu,dxdyv  
   
     if (first) then  
        do j=2,jjm  
           do i=2,iip1  
              zdx(i,j)=0.5*(cu_2d(i-1,j)+cu_2d(i,j))/cos(rlatu(j))  
           enddo  
           zdx(1,j)=zdx(iip1,j)  
        enddo  
        do j=2,jjm  
           do i=1,iip1  
              zdy(i,j)=0.5*(cv_2d(i,j-1)+cv_2d(i,j))  
           enddo  
        enddo  
        do i=1,iip1  
           zdx(i,1)=zdx(i,2)  
           zdx(i,jjp1)=zdx(i,jjm)  
           zdy(i,1)=zdy(i,2)  
           zdy(i,jjp1)=zdy(i,jjm)  
        enddo  
        do j=1,jjp1  
           do i=1,iip1  
              dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))  
           enddo  
        enddo  
        do j=1,jjp1  
           do i=1,iim  
              dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))  
           enddo  
           dxdyu(iip1,j)=dxdyu(1,j)  
        enddo  
        do j=1,jjm  
           do i=1,iip1  
              dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))  
           enddo  
        enddo  
   
        call dump2d(iip1,jjp1,dxdys,'DX2DY2 SCAL  ')  
        call dump2d(iip1,jjp1,dxdyu,'DX2DY2 U     ')  
        call dump2d(iip1,jjp1,dxdyv,'DX2DY2 v     ')  
   
        !   coordonnees du centre du zoom  
        call coordij(clon,clat,ilon,ilat)  
        !   aire de la maille au centre du zoom  
        dxdy_min=dxdys(ilon,ilat)  
        !   dxdy maximale de la maille  
        dxdy_max=0.  
        do j=1,jjp1  
           do i=1,iip1  
              dxdy_max=max(dxdy_max,dxdys(i,j))  
           enddo  
        enddo  
   
        if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then  
           print*,'ATTENTION modele peu zoome'  
           print*,'ATTENTION on prend une constante de guidage cste'  
           gamma=0.  
        else  
           gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)  
           print*,'gamma=',gamma  
           if (gamma.lt.1.e-5) then  
              print*,'gamma =',gamma,'<1e-5'  
              stop  
           endif  
           print*,'gamma=',gamma  
           gamma=log(0.5)/log(gamma)  
        endif  
     endif  
   
     alphamin=factt/taumax  
     alphamax=factt/taumin  
   
     do j=1,pjm  
        do i=1,pim  
           if (type.eq.1) then  
              dxdy_=dxdys(i,j)  
              zlat=rlatu(j)*180./pi  
           elseif (type.eq.2) then  
              dxdy_=dxdyu(i,j)  
              zlat=rlatu(j)*180./pi  
           elseif (type.eq.3) then  
              dxdy_=dxdyv(i,j)  
              zlat=rlatv(j)*180./pi  
           endif  
           if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then  
              !  pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin  
              alpha(i,j)=alphamin  
           else  
              xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma  
              xi=min(xi,1.)  
              if(lat_min_guide.le.zlat .and. zlat.le.lat_max_guide) then  
                 alpha(i,j)=xi*alphamin+(1.-xi)*alphamax  
              else  
                 alpha(i,j)=0.  
              endif  
           endif  
        enddo  
     enddo  
338    
339        first = .FALSE.
340    
341      return    END SUBROUTINE guide
   end subroutine tau2alpha  
342    
343  end module guide_m  END MODULE guide_m

Legend:
Removed from v.3  
changed lines
  Added in v.39

  ViewVC Help
Powered by ViewVC 1.1.21