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

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

  ViewVC Help
Powered by ViewVC 1.1.21