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

Diff of /trunk/dyn3d/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 91 by guez, Wed Mar 26 17:18:58 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        IF (online /= - 1) THEN
107           IF (first) THEN
108              CALL conf_guide
109              file = 'guide'
110              CALL inigrads(igrads, rlonv, 180. / pi, -180., 180., rlatu, -90., 90., &
111                   180. / pi, presnivs, 1., dtgrads, file, 'dyn_zon ')
112              PRINT *, '1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'
113    
114              IF (online==1) THEN
115                 ! Constantes de temps de rappel en jour
116                 ! 0.1 c'est en gros 2h30.
117                 ! 1e10 est une constante infinie donc en gros pas de guidage
118    
119                 ! coordonnees du centre du zoom
120                 CALL coordij(clon, clat, ilon, ilat)
121                 ! aire de la maille au centre du zoom
122                 aire_min = aire(ilon+(ilat - 1) * iip1)
123                 ! aire maximale de la maille
124                 aire_max = 0.
125                 DO ij = 1, ip1jmp1
126                    aire_max = max(aire_max, aire(ij))
127                 END DO
128                 ! factt = pas de temps en fraction de jour
129                 factt = dtvr * iperiod / daysec
130    
131                 CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
132                 CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
133                 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
134                 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
135                 CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
136    
137                 CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
138                 CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
139                 CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
140    
141    USE dimens_m, ONLY : jjm, llm               ! Cas ou on force exactement par les variables analysees
142    USE paramet_m, ONLY : iip1, ip1jm, ip1jmp1, jjp1, llmp1            ELSE
143    USE comconst, ONLY : cpp, daysec, dtvr, kappa, pi               alpha_t = 0.
144    USE comvert, ONLY : ap, bp, preff, presnivs               alpha_u = 0.
145    USE conf_gcm_m, ONLY : day_step, iperiod               alpha_v = 0.
146    USE comgeom, ONLY : aire, rlatu, rlonv               alpha_p = 0.
147    USE serre, ONLY : clat, clon               ! physic=.false.
148    USE q_sat_m, ONLY : q_sat            END IF
   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  
149    
150    IMPLICIT NONE            itau_test = 1001
151    INCLUDE 'netcdf.inc'            step_rea = 1
152              count_no_rea = 0
153              ncidpl = -99
154    
155              ! itau_test montre si l'importation a deja ete faite au rang itau
156              ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
157              if (guide_u) then
158                 if (ncidpl.eq. - 99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
159              endif
160    
161              if (guide_v) then
162                 if (ncidpl.eq. - 99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
163              endif
164    
165              if (guide_T) then
166                 if (ncidpl.eq. - 99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
167              endif
168    
169              if (guide_Q) then
170                 if (ncidpl.eq. - 99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
171              endif
172    
173    !      ......   Version  du 10/01/98    ..........            IF (ncep) THEN
174                 status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
175              ELSE
176                 status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
177              END IF
178              status = nf90_inquire_dimension(ncidpl, rid, len=nlev)
179              PRINT *, 'nlev', nlev
180              rcod = nf90_close(ncidpl)
181              ! Lecture du premier etat des reanalyses.
182              CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
183                   masserea2, nlev)
184              qrea2 = max(qrea2, 0.1)
185    
186              ! Debut de l'integration temporelle:
187           END IF ! first
188    
189           ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
190    
191           ditau = real(itau)
192           dday_step = real(day_step)
193           WRITE (*, *) 'ditau, dday_step'
194           WRITE (*, *) ditau, dday_step
195           toto = 4 * ditau / dday_step
196           reste = toto - aint(toto)
197    
198           IF (reste==0.) THEN
199              IF (itau_test==itau) THEN
200                 WRITE (*, *) 'deuxieme passage de advreel a itau=', itau
201                 STOP
202              ELSE
203                 vcovrea1 = vcovrea2
204                 ucovrea1 = ucovrea2
205                 tetarea1 = tetarea2
206                 qrea1 = qrea2
207    
208                 PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
209                      count_no_rea, ' non lectures'
210                 step_rea = step_rea + 1
211                 itau_test = itau
212                 CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, &
213                      qrea2, masserea2, nlev)
214                 qrea2 = max(qrea2, 0.1)
215                 factt = dtvr * iperiod / daysec
216                 ztau = factt / max(alpha_t, 1E-10)
217                 CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
218                 CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
219                 CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
220                 CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
221                 CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
222                 CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
223                 CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
224                 CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
225                 CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
226                 CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
227                 CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
228    
229    !             avec  coordonnees  verticales hybrides               CALL wrgrads(igrads, llm, qsat, 'QSAT ', 'QSAT ')
   !   avec nouveaux operat. dissipation * ( gradiv2, divgrad2, nxgraro2 )  
230    
231    !=======================================================================            END IF
232           ELSE
233              count_no_rea = count_no_rea + 1
234           END IF
235    
236    !   Auteur:  F.Hourdin         ! Guidage
237    !   -------         ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
238    
239    !   Objet:         IF (ini_anal) PRINT *, 'ATTENTION !!! ON PART DU GUIDAGE'
240    !   ------  
241           ditau = real(itau)
242    !   GCM LMD nouvelle grille         dday_step = real(day_step)
   
   !=======================================================================  
   
   ! 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:  
   !   -------------  
   
   
   !   variables dynamiques  
   REAL :: vcov(ip1jm, llm), ucov(ip1jmp1, llm) ! vents covariants  
   REAL :: teta(ip1jmp1, llm) ! temperature potentielle  
   REAL :: q(ip1jmp1, llm) ! temperature potentielle  
   REAL :: ps(ip1jmp1) ! pression  au sol  
   REAL :: masse(ip1jmp1, llm) ! masse d'air  
   
   !   common passe pour des sorties  
   REAL :: dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)  
   COMMON /comdxdy/dxdys, dxdyu, dxdyv  
   
   !   variables dynamiques pour les reanalyses.  
   REAL :: ucovrea1(ip1jmp1, llm), vcovrea1(ip1jm, llm) !vts cov reas  
   REAL :: tetarea1(ip1jmp1, llm) ! temp pot  reales  
   REAL :: qrea1(ip1jmp1, llm) ! temp pot  reales  
   REAL :: psrea1(ip1jmp1) ! ps  
   REAL :: ucovrea2(ip1jmp1, llm), vcovrea2(ip1jm, llm) !vts cov reas  
   REAL :: tetarea2(ip1jmp1, llm) ! temp pot  reales  
   REAL :: qrea2(ip1jmp1, llm) ! temp pot  reales  
   REAL :: masserea2(ip1jmp1, llm) ! masse  
   REAL :: psrea2(ip1jmp1) ! ps  
   
   REAL :: alpha_q(ip1jmp1)  
   REAL :: alpha_t(ip1jmp1), alpha_p(ip1jmp1)  
   REAL :: alpha_u(ip1jmp1), alpha_v(ip1jm)  
   REAL :: dday_step, toto, reste, itau_test  
   INTEGER :: step_rea, count_no_rea  
   
   !IM 180305   real aire_min, aire_max  
   INTEGER :: ilon, ilat  
   REAL :: factt, ztau(ip1jmp1)  
   
   INTEGER, INTENT (IN) :: itau  
   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  
   
     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))  
           END DO  
           zdx(1, j) = zdx(iip1, j)  
        END DO  
        DO j = 2, jjm  
           DO i = 1, iip1  
              zdy(i, j) = 0.5*(cv_2d(i, j-1)+cv_2d(i, j))  
           END DO  
        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  
243    
244         CALL dump2d(iip1, jjp1, dxdys, 'DX2DY2 SCAL  ')         tau = 4 * ditau / dday_step
245         CALL dump2d(iip1, jjp1, dxdyu, 'DX2DY2 U     ')         tau = tau - aint(tau)
246         CALL dump2d(iip1, jjp1, dxdyv, 'DX2DY2 v     ')  
247           ! ucov
248         !   coordonnees du centre du zoom         IF (guide_u) THEN
249         CALL coordij(clon, clat, ilon, ilat)            DO l = 1, llm
250         !   aire de la maille au centre du zoom               DO ij = 1, ip1jmp1
251         dxdy_min = dxdys(ilon, ilat)                  a = (1. - tau) * ucovrea1(ij, l) + tau * ucovrea2(ij, l)
252         !   dxdy maximale de la maille                  ucov(ij, l) = (1. - alpha_u(ij)) * ucov(ij, l) + alpha_u(ij) * a
253         dxdy_max = 0.                  IF (first .AND. ini_anal) ucov(ij, l) = a
254         DO j = 1, jjp1               END DO
           DO i = 1, iip1  
              dxdy_max = max(dxdy_max, dxdys(i, j))  
255            END DO            END DO
256         END DO         END IF
257    
258         IF (abs(grossismx-1.)<0.1 .OR. abs(grossismy-1.)<0.1) THEN         IF (guide_t) THEN
259            PRINT *, 'ATTENTION modele peu zoome'            DO l = 1, llm
260            PRINT *, 'ATTENTION on prend une constante de guidage cste'               do j = 1, jjm + 1
261            gamma = 0.                  DO i = 1, iim + 1
262         ELSE                     a = (1. - tau) * tetarea1(i, j, l) + tau * tetarea2(i, j, l)
263            gamma = (dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)                     teta(i, j, l) = (1. - alpha_t(i, j)) * teta(i, j, l) &
264            PRINT *, 'gamma=', gamma                          + alpha_t(i, j) * a
265            IF (gamma<1.E-5) THEN                     IF (first .AND. ini_anal) teta(i, j, l) = a
266               PRINT *, 'gamma =', gamma, '<1e-5'                  END DO
267               STOP               end do
268            END IF            END DO
           PRINT *, 'gamma=', gamma  
           gamma = log(0.5)/log(gamma)  
269         END IF         END IF
     END IF  
270    
271      alphamin = factt/taumax         IF (guide_q) THEN
272      alphamax = factt/taumin            DO l = 1, llm
273                 do j = 1, jjm + 1
274                    DO i = 1, iim + 1
275                       a = (1. - tau) * qrea1(i, j, l) + tau * qrea2(i, j, l)
276                       ! hum relative en % -> hum specif
277                       a = qsat(i, j, l) * a * 0.01
278                       q(i, j, l) = (1. - alpha_q(i, j)) * q(i, j, l) &
279                            + alpha_q(i, j) * a
280                       IF (first .AND. ini_anal) q(i, j, l) = a
281                    END DO
282                 end do
283              END DO
284           END IF
285    
286      DO j = 1, pjm         ! vcov
287         DO i = 1, pim         IF (guide_v) THEN
288            IF (type==1) THEN            DO l = 1, llm
289               dxdy_ = dxdys(i, j)               DO ij = 1, ip1jm
290               zlat = rlatu(j)*180./pi                  a = (1. - tau) * vcovrea1(ij, l) + tau * vcovrea2(ij, l)
291            ELSE IF (type==2) THEN                  vcov(ij, l) = (1. - alpha_v(ij)) * vcov(ij, l) + alpha_v(ij) * a
292               dxdy_ = dxdyu(i, j)                  IF (first .AND. ini_anal) vcov(ij, l) = a
293               zlat = rlatu(j)*180./pi               END DO
294            ELSE IF (type==3) THEN               IF (first .AND. ini_anal) vcov(ij, l) = a
295               dxdy_ = dxdyv(i, j)            END DO
296               zlat = rlatv(j)*180./pi         END IF
           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  
        END DO  
     END DO  
297    
298           first = .FALSE.
299        end IF
300    
301      RETURN    END SUBROUTINE guide
   END SUBROUTINE tau2alpha  
302    
303  END MODULE guide_m  END MODULE guide_m

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

  ViewVC Help
Powered by ViewVC 1.1.21