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

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

  ViewVC Help
Powered by ViewVC 1.1.21