/[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 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/dyn3d/guide.f revision 102 by guez, Tue Jul 15 13:43:24 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  
   
   
   logical guide_u,guide_v,guide_T,guide_Q,guide_P  
   real lat_min_guide,lat_max_guide  
   
   LOGICAL ncep,ini_anal  
   integer online  
   
 contains  
   
   subroutine guide(itau,ucov,vcov,teta,q,masse,ps)  
   
     use dimens_m  
     use paramet_m  
     use comconst  
     use comdissnew  
     use comvert  
     use conf_gcm_m  
     use logic  
     use comgeom  
     use serre  
     use temps  
     use tracstoke  
     use ener  
     use q_sat_m, only: q_sat  
     use exner_hyb_m, only: exner_hyb  
     use pression_m, only: pression  
     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:  
     !   -------------  
   
     include "netcdf.inc"  
   
     !   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)  
7    
8      !-----------------------------------------------------------------------    REAL aire_min, aire_max
   
     !-----------------------------------------------------------------------  
     !   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  
     !-----------------------------------------------------------------------  
9    
10      print*,'ONLINE=',online  CONTAINS
11      if(online.eq.-1) then  
12         return    SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
13      endif  
14        ! Author: F.Hourdin
15      if (first) then  
16        USE comconst, ONLY: cpp, daysec, dtvr, kappa
17         print*,'initialisation du guide '      USE comgeom, ONLY: aire, rlatu, rlonv
18         call conf_guide      USE conf_gcm_m, ONLY: day_step, iperiod
19         print*,'apres conf_guide'      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         file='guide'           tau_min_t, tau_max_t, tau_min_q, tau_max_q, tau_min_p, tau_max_p, &
22         call inigrads(igrads &           online
23              ,rlonv,180./pi,-180.,180.,rlatu,-90.,90.,180./pi &      USE dimens_m, ONLY: iim, jjm, llm
24              ,presnivs,1. &      USE disvert_m, ONLY: ap, bp, preff, presnivs
25              ,dtgrads,file,'dyn_zon ')      use dump2d_m, only: dump2d
26        USE exner_hyb_m, ONLY: exner_hyb
27         print* &      USE inigrads_m, ONLY: inigrads
28              ,'1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'      use massdair_m, only: massdair
29        use netcdf, only: nf90_nowrite, nf90_close, nf90_inq_dimid
30         if(online.eq.-1) return      use netcdf95, only: nf95_inquire_dimension, nf95_open
31         if (online.eq.1) then      use nr_util, only: pi
32        USE paramet_m, ONLY: iip1, ip1jm, ip1jmp1, jjp1, llmp1
33            !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc      USE q_sat_m, ONLY: q_sat
34            !  Constantes de temps de rappel en jour      use read_reanalyse_m, only: read_reanalyse
35            !  0.1 c'est en gros 2h30.      USE serre, ONLY: clat, clon
36            !  1e10  est une constante infinie donc en gros pas de guidage      use tau2alpha_m, only: tau2alpha, dxdys
37            !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc  
38            !   coordonnees du centre du zoom      INTEGER, INTENT(IN):: itau
39            call coordij(clon,clat,ilon,ilat)  
40            !   aire de la maille au centre du zoom      ! variables dynamiques
41            aire_min=aire(ilon+(ilat-1)*iip1)  
42            !   aire maximale de la maille      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
43            aire_max=0.      REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
44            do ij=1,ip1jmp1  
45               aire_max=max(aire_max,aire(ij))      REAL, intent(inout):: teta(iim + 1, jjm + 1, llm) ! température potentielle
46            enddo      REAL, intent(inout):: q(iim + 1, jjm + 1, llm)
47            !  factt = pas de temps en fraction de jour      REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
48            factt=dtvr*iperiod/daysec  
49        ! Local:
50            !     subroutine tau2alpha(type,im,jm,factt,taumin,taumax,alpha)  
51            call tau2alpha(3,iip1,jjm ,factt,tau_min_v,tau_max_v,alpha_v)      ! variables dynamiques pour les reanalyses.
52            call tau2alpha(2,iip1,jjp1,factt,tau_min_u,tau_max_u,alpha_u)  
53            call tau2alpha(1,iip1,jjp1,factt,tau_min_T,tau_max_T,alpha_T)      REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
54            call tau2alpha(1,iip1,jjp1,factt,tau_min_P,tau_max_P,alpha_P)      ! vents covariants reanalyses
55            call tau2alpha(1,iip1,jjp1,factt,tau_min_q,tau_max_q,alpha_q)  
56        REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
57            call dump2d(iip1,jjp1,aire,'AIRE MAILLe ')      REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
58            call dump2d(iip1,jjp1,alpha_u,'COEFF U   ')  
59            call dump2d(iip1,jjp1,alpha_T,'COEFF T   ')      REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
60        ! vents covariants reanalyses
61    
62        REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
63        REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
64        REAL, save:: masserea2(ip1jmp1, llm) ! masse
65    
66        ! alpha determine la part des injections de donnees a chaque etape
67        ! alpha=1 signifie pas d'injection
68        ! alpha=0 signifie injection totale
69        REAL, save:: alpha_q(iim + 1, jjm + 1)
70        REAL, save:: alpha_t(iim + 1, jjm + 1), alpha_p(ip1jmp1)
71        REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
72    
73        INTEGER, save:: step_rea, count_no_rea
74    
75        INTEGER ilon, ilat
76        REAL factt ! pas de temps entre deux appels au guidage, en fraction de jour
77        real ztau(iim + 1, jjm + 1)
78    
79        INTEGER ij, l
80        INTEGER ncidpl, status
81        INTEGER rcod, rid
82        REAL tau
83        INTEGER, SAVE:: nlev
84    
85        ! TEST SUR QSAT
86        REAL p(iim + 1, jjm + 1, llmp1)
87        real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
88    
89        REAL qsat(iim + 1, jjm + 1, llm)
90    
91        INTEGER, parameter:: igrads = 2
92        REAL:: dtgrads = 100.
93    
94        !-----------------------------------------------------------------------
95    
96        PRINT *, 'Call sequence information: guide'
97    
98        first_call: IF (itau == 0) THEN
99           CALL conf_guide
100           CALL inigrads(igrads, rlonv, 180. / pi, -180., 180., rlatu, -90., &
101                90., 180. / pi, presnivs, 1., dtgrads, 'guide', 'dyn_zon ')
102    
103           IF (online) THEN
104              ! Constantes de temps de rappel en jour
105    
106              ! coordonnees du centre du zoom
107              CALL coordij(clon, clat, ilon, ilat)
108              ! aire de la maille au centre du zoom
109              aire_min = aire(ilon+(ilat - 1) * iip1)
110              ! aire maximale de la maille
111              aire_max = 0.
112              DO ij = 1, ip1jmp1
113                 aire_max = max(aire_max, aire(ij))
114              END DO
115    
116              factt = dtvr * iperiod / daysec
117    
118              CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
119              CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
120              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
121              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
122              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
123    
124              CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
125              CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
126              CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
127           ELSE
128              ! Cas ou on force exactement par les variables analysees
129              alpha_t = 0.
130              alpha_u = 0.
131              alpha_v = 0.
132              alpha_p = 0.
133           END IF
134    
135           step_rea = 1
136           count_no_rea = 0
137           ncidpl = -99
138    
           !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.  
        endif  
   
        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  
139         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
140         if (guide_u) then         if (guide_u) call nf95_open('u.nc',Nf90_NOWRITe,ncidpl)
141            if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod)         if (guide_v) call nf95_open('v.nc',nf90_nowrite,ncidpl)
142         endif         if (guide_T) call nf95_open('T.nc',nf90_nowrite,ncidpl)
143         !         if (guide_Q) call nf95_open('hur.nc',nf90_nowrite, ncidpl)
144         if (guide_v) then  
145            if (ncidpl.eq.-99) ncidpl=NCOPN('v.nc',NCNOWRIT,rcod)         IF (ncep) THEN
146         endif            status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
147         !         ELSE
148         if (guide_T) then            status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
149            if (ncidpl.eq.-99) ncidpl=NCOPN('T.nc',NCNOWRIT,rcod)         END IF
150         endif         call nf95_inquire_dimension(ncidpl, rid, nclen=nlev)
151         !         PRINT *, 'nlev', nlev
152         if (guide_Q) then         rcod = nf90_close(ncidpl)
153            if (ncidpl.eq.-99) ncidpl=NCOPN('hur.nc',NCNOWRIT,rcod)         ! Lecture du premier etat des reanalyses.
154         endif         CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
155         !              masserea2, nlev)
156         if (ncep) then         qrea2 = max(qrea2, 0.1)
157            status=NF_INQ_DIMID(ncidpl,'LEVEL',rid)      END IF first_call
158    
159        ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
160    
161        ! Nudging fields are given 4 times per day:
162        IF (mod(itau, day_step / 4) == 0) THEN
163           vcovrea1 = vcovrea2
164           ucovrea1 = ucovrea2
165           tetarea1 = tetarea2
166           qrea1 = qrea2
167    
168           PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
169                count_no_rea, ' non lectures'
170           step_rea = step_rea + 1
171           CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
172                masserea2, nlev)
173           qrea2 = max(qrea2, 0.1)
174           factt = dtvr * iperiod / daysec
175           ztau = factt / max(alpha_t, 1E-10)
176           CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
177           CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
178           CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
179           CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
180           CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
181           CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
182           CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
183           CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
184           CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
185           CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
186           CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
187        ELSE
188           count_no_rea = count_no_rea + 1
189        END IF
190    
191        ! Guidage
192    
193        tau = mod(real(itau) / real(day_step / 4), 1.)
194    
195        ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
196    
197        IF (guide_u) THEN
198           IF (itau == 0 .AND. ini_anal) then
199              ucov = ucovrea1
200         else         else
201            status=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)            forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) * ucov(:, :, l) &
202         endif                 + alpha_u * ((1. - tau) * ucovrea1(:, :, l) &
203         status=NF_INQ_DIMLEN(ncidpl,rid,nlev)                 + tau * ucovrea2(:, :, l))
204         print *,'nlev', nlev         end IF
205         call ncclos(ncidpl,rcod)      END IF
206         !   Lecture du premier etat des reanalyses.  
207         call read_reanalyse(1,ps &      IF (guide_t) THEN
208              ,ucovrea2,vcovrea2,tetarea2,qrea2,masserea2,psrea2,1,nlev)         IF (itau == 0 .AND. ini_anal) then
209         qrea2(:,:)=max(qrea2(:,:),0.1)            teta = tetarea1
   
   
        !-----------------------------------------------------------------------  
        !   Debut de l'integration temporelle:  
        !   ----------------------------------  
   
     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  
210         else         else
211            vcovrea1(:,:)=vcovrea2(:,:)            forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) * teta(:, :, l) &
212            ucovrea1(:,:)=ucovrea2(:,:)                 + alpha_t * ((1. - tau) * tetarea1(:, :, l) &
213            tetarea1(:,:)=tetarea2(:,:)                 + tau * tetarea2(:, :, l))
214            qrea1(:,:)=qrea2(:,:)         end IF
215        END IF
216            print*,'LECTURE REANALYSES, pas ',step_rea &  
217                 ,'apres ',count_no_rea,' non lectures'      IF (guide_q) THEN
218            step_rea=step_rea+1         ! Calcul de l'humidité saturante :
219            itau_test=itau         forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
220            call read_reanalyse(step_rea,ps &         CALL exner_hyb(ps, p, pks, pk)
221                 ,ucovrea2,vcovrea2,tetarea2,qrea2,masserea2,psrea2,1,nlev)         qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
222            qrea2(:,:)=max(qrea2(:,:),0.1)  
223            factt=dtvr*iperiod/daysec         ! humidité relative en % -> humidité spécifique
224            ztau(:)=factt/max(alpha_T(:),1.e-10)         IF (itau == 0 .AND. ini_anal) then
225            call wrgrads(igrads,1,aire   ,'aire      ','aire      ' )            q = qsat * qrea1 * 0.01
           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      ' )  
   
        endif  
     else  
        count_no_rea=count_no_rea+1  
     endif  
   
     !-----------------------------------------------------------------------  
     !   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  
           enddo  
        enddo  
     endif  
   
     !  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  
           enddo  
        enddo  
     endif  
   
     !  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  
        enddo  
        CALL pression(ip1jmp1,ap,bp,ps,p)  
        CALL massdair(p,masse)  
     endif  
   
   
     !  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  
           enddo  
        enddo  
     endif  
   
     ! 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  
           enddo  
           if (first.and.ini_anal) vcov(ij,l)=a  
        enddo  
     endif  
   
     !     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.  
226         else         else
227            gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)            forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
228            print*,'gamma=',gamma                 + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
229            if (gamma.lt.1.e-5) then                 + tau * qrea2(:, :, l)) * 0.01)
230               print*,'gamma =',gamma,'<1e-5'         end IF
231               stop      END IF
232            endif  
233            print*,'gamma=',gamma      IF (guide_v) THEN
234            gamma=log(0.5)/log(gamma)         IF (itau == 0 .AND. ini_anal) then
235         endif            vcov = vcovrea1
236      endif         else
237              forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) * vcov(:, :, l) &
238      alphamin=factt/taumax                 + alpha_v * ((1. - tau) * vcovrea1(:, :, l) &
239      alphamax=factt/taumin                 + tau * vcovrea2(:, :, l))
240           end IF
241      do j=1,pjm      END IF
        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  
   
242    
243      return    END SUBROUTINE guide
   end subroutine tau2alpha  
244    
245  end module guide_m  END MODULE guide_m

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

  ViewVC Help
Powered by ViewVC 1.1.21