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

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

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

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

Legend:
Removed from v.22  
changed lines
  Added in v.76

  ViewVC Help
Powered by ViewVC 1.1.21