/[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 85 by guez, Thu Mar 6 17:35:22 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             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(in):: 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:: ucovrea2(ip1jmp1, llm), vcovrea2(ip1jm, llm) !vts cov reas
52        REAL, save:: tetarea2(ip1jmp1, llm) ! temp pot reales
53        REAL, save:: qrea2(ip1jmp1, llm) ! temp pot reales
54        REAL, save:: masserea2(ip1jmp1, llm) ! masse
55    
56        REAL, save:: alpha_q(ip1jmp1)
57        REAL, save:: alpha_t(ip1jmp1), alpha_p(ip1jmp1)
58        REAL, save:: alpha_u(ip1jmp1), alpha_v(ip1jm)
59        REAL dday_step, toto, reste
60        real, save:: itau_test
61        INTEGER, save:: step_rea, count_no_rea
62    
63        INTEGER ilon, ilat
64        REAL factt, ztau(ip1jmp1)
65    
66        INTEGER ij, l
67        INTEGER ncidpl, varidpl, status
68        INTEGER rcod, rid
69        REAL ditau, tau, a
70        INTEGER, SAVE:: nlev
71    
72        ! TEST SUR QSAT
73        REAL p(ip1jmp1, llmp1), pk(ip1jmp1, llm), pks(ip1jmp1)
74        REAL pkf(ip1jmp1, llm)
75        REAL pres(ip1jmp1, llm)
76    
77        REAL qsat(ip1jmp1, llm)
78        REAL unskap
79        REAL tnat(ip1jmp1, llm)
80    
81        LOGICAL:: first = .TRUE.
82        CHARACTER(len=10) file
83        INTEGER:: igrads = 2
84        REAL:: dtgrads = 100.
85    
86      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
     ! 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)  
87    
88      !-----------------------------------------------------------------------      PRINT *, 'Call sequence information: guide'
89    
90      !-----------------------------------------------------------------------      ! 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  
     !-----------------------------------------------------------------------  
91    
92      print*,'ONLINE=',online      forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
93      if(online.eq.-1) then      CALL massdair(p, masse)
94         return      CALL exner_hyb(ps, p, pks, pk, pkf)
95      endif      tnat(:, :) = pk(:, :)*teta(:, :)/cpp
96        unskap = 1./kappa
97      if (first) then      pres(:, :) = preff*(pk(:, :)/cpp)**unskap
98        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  
99    
100         itau_test=1001      ! initialisations pour la lecture des reanalyses.
101         step_rea=1      ! alpha determine la part des injections de donnees a chaque etape
102         count_no_rea=0      ! alpha=1 signifie pas d'injection
103         ncidpl=-99      ! alpha=0 signifie injection totale
104    
105        IF (online==-1) THEN
106           RETURN
107        END IF
108    
109        IF (first) THEN
110           CALL conf_guide
111           file = 'guide'
112           CALL inigrads(igrads, rlonv, 180./pi, -180., 180., rlatu, -90., 90., &
113                180./pi, presnivs, 1., dtgrads, file, 'dyn_zon ')
114           PRINT *, '1: en-ligne, 0: hors-ligne (x=x_rea), -1: climat (x=x_gcm)'
115           IF (online==-1) RETURN
116    
117           IF (online==1) THEN
118              ! Constantes de temps de rappel en jour
119              ! 0.1 c'est en gros 2h30.
120              ! 1e10 est une constante infinie donc en gros pas de guidage
121    
122              ! coordonnees du centre du zoom
123              CALL coordij(clon, clat, ilon, ilat)
124              ! aire de la maille au centre du zoom
125              aire_min = aire(ilon+(ilat-1)*iip1)
126              ! aire maximale de la maille
127              aire_max = 0.
128              DO ij = 1, ip1jmp1
129                 aire_max = max(aire_max, aire(ij))
130              END DO
131              ! factt = pas de temps en fraction de jour
132              factt = dtvr*iperiod/daysec
133    
134              CALL tau2alpha(3, iip1, jjm, factt, tau_min_v, tau_max_v, alpha_v)
135              CALL tau2alpha(2, iip1, jjp1, factt, tau_min_u, tau_max_u, alpha_u)
136              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_t, tau_max_t, alpha_t)
137              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_p, tau_max_p, alpha_p)
138              CALL tau2alpha(1, iip1, jjp1, factt, tau_min_q, tau_max_q, alpha_q)
139    
140              CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
141              CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
142              CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
143    
144              ! Cas ou on force exactement par les variables analysees
145           ELSE
146              alpha_t = 0.
147              alpha_u = 0.
148              alpha_v = 0.
149              alpha_p = 0.
150              ! physic=.false.
151           END IF
152    
153           itau_test = 1001
154           step_rea = 1
155           count_no_rea = 0
156           ncidpl = -99
157    
158         !    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
159         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
160         if (guide_u) then         if (guide_u) then
161            if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
162         endif         endif
163         !  
164         if (guide_v) then         if (guide_v) then
165            if (ncidpl.eq.-99) ncidpl=NCOPN('v.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
166         endif         endif
167         !  
168         if (guide_T) then         if (guide_T) then
169            if (ncidpl.eq.-99) ncidpl=NCOPN('T.nc',NCNOWRIT,rcod)            if (ncidpl.eq.-99) rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
170         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      ' )  
171    
172           if (guide_Q) then
173              if (ncidpl.eq.-99) rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
174         endif         endif
     else  
        count_no_rea=count_no_rea+1  
     endif  
175    
176      !-----------------------------------------------------------------------         IF (ncep) THEN
177      !   Guidage            status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
178      !    x_gcm = a * x_gcm + (1-a) * x_reanalyses         ELSE
179      !-----------------------------------------------------------------------            status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
180           END IF
181      if(ini_anal) print*,'ATTENTION !!! ON PART DU GUIDAGE'         status = nf90_inquire_dimension(ncidpl, rid, len=nlev)
182           PRINT *, 'nlev', nlev
183      ditau=real(itau)         rcod = nf90_close(ncidpl)
184      dday_step=real(day_step)         ! Lecture du premier etat des reanalyses.
185           CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
186                masserea2, 1, nlev)
187      tau=4*ditau/dday_step         qrea2(:, :) = max(qrea2(:, :), 0.1)
188      tau=tau-aint(tau)  
189           ! Debut de l'integration temporelle:
190      !  ucov      END IF ! first
191      if (guide_u) then  
192         do l=1,llm      ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
193            do ij=1,ip1jmp1  
194               a=(1.-tau)*ucovrea1(ij,l)+tau*ucovrea2(ij,l)      ditau = real(itau)
195               ucov(ij,l)=(1.-alpha_u(ij))*ucov(ij,l)+alpha_u(ij)*a      dday_step = real(day_step)
196               if (first.and.ini_anal) ucov(ij,l)=a      WRITE (*, *) 'ditau, dday_step'
197            enddo      WRITE (*, *) ditau, dday_step
198         enddo      toto = 4*ditau/dday_step
199      endif      reste = toto - aint(toto)
200    
201      !  teta      IF (reste==0.) THEN
202      if (guide_T) then         IF (itau_test==itau) THEN
203         do l=1,llm            WRITE (*, *) 'deuxieme passage de advreel a itau=', itau
204            do ij=1,ip1jmp1            STOP
205               a=(1.-tau)*tetarea1(ij,l)+tau*tetarea2(ij,l)         ELSE
206               teta(ij,l)=(1.-alpha_T(ij))*teta(ij,l)+alpha_T(ij)*a            vcovrea1(:, :) = vcovrea2(:, :)
207               if (first.and.ini_anal) teta(ij,l)=a            ucovrea1(:, :) = ucovrea2(:, :)
208            enddo            tetarea1(:, :) = tetarea2(:, :)
209         enddo            qrea1(:, :) = qrea2(:, :)
210      endif  
211              PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
212      !  P                 count_no_rea, ' non lectures'
213      if (guide_P) then            step_rea = step_rea + 1
214         do ij=1,ip1jmp1            itau_test = itau
215            a=(1.-tau)*psrea1(ij)+tau*psrea2(ij)            CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, &
216            ps(ij)=(1.-alpha_P(ij))*ps(ij)+alpha_P(ij)*a                 qrea2, masserea2, 1, nlev)
217            if (first.and.ini_anal) ps(ij)=a            qrea2(:, :) = max(qrea2(:, :), 0.1)
218         enddo            factt = dtvr*iperiod/daysec
219         CALL pression(ip1jmp1,ap,bp,ps,p)            ztau(:) = factt/max(alpha_t(:), 1.E-10)
220         CALL massdair(p,masse)            CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
221      endif            CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
222              CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
223              CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
224      !  q            CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
225      if (guide_Q) then            CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
226         do l=1,llm            CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
227            do ij=1,ip1jmp1            CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
228               a=(1.-tau)*qrea1(ij,l)+tau*qrea2(ij,l)            CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
229               !   hum relative en % -> hum specif            CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
230               a=qsat(ij,l)*a*0.01            CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
231               q(ij,l)=(1.-alpha_Q(ij))*q(ij,l)+alpha_Q(ij)*a  
232               if (first.and.ini_anal) q(ij,l)=a            CALL wrgrads(igrads, llm, qsat, 'QSAT ', 'QSAT ')
233            enddo  
234         enddo         END IF
235      endif      ELSE
236           count_no_rea = count_no_rea + 1
237        END IF
238    
239        ! Guidage
240        ! x_gcm = a * x_gcm + (1-a) * x_reanalyses
241    
242        IF (ini_anal) PRINT *, 'ATTENTION !!! ON PART DU GUIDAGE'
243    
244        ditau = real(itau)
245        dday_step = real(day_step)
246    
247        tau = 4*ditau/dday_step
248        tau = tau - aint(tau)
249    
250        ! ucov
251        IF (guide_u) THEN
252           DO l = 1, llm
253              DO ij = 1, ip1jmp1
254                 a = (1.-tau)*ucovrea1(ij, l) + tau*ucovrea2(ij, l)
255                 ucov(ij, l) = (1.-alpha_u(ij))*ucov(ij, l) + alpha_u(ij)*a
256                 IF (first .AND. ini_anal) ucov(ij, l) = a
257              END DO
258           END DO
259        END IF
260    
261        IF (guide_t) THEN
262           DO l = 1, llm
263              DO ij = 1, ip1jmp1
264                 a = (1.-tau)*tetarea1(ij, l) + tau*tetarea2(ij, l)
265                 teta(ij, l) = (1.-alpha_t(ij))*teta(ij, l) + alpha_t(ij)*a
266                 IF (first .AND. ini_anal) teta(ij, l) = a
267              END DO
268           END DO
269        END IF
270    
271        IF (guide_q) THEN
272           DO l = 1, llm
273              DO ij = 1, ip1jmp1
274                 a = (1.-tau)*qrea1(ij, l) + tau*qrea2(ij, l)
275                 ! hum relative en % -> hum specif
276                 a = qsat(ij, l)*a*0.01
277                 q(ij, l) = (1.-alpha_q(ij))*q(ij, l) + alpha_q(ij)*a
278                 IF (first .AND. ini_anal) q(ij, l) = a
279              END DO
280           END DO
281        END IF
282    
283      ! vcov      ! vcov
284      if (guide_v) then      IF (guide_v) THEN
285         do l=1,llm         DO l = 1, llm
286            do ij=1,ip1jm            DO ij = 1, ip1jm
287               a=(1.-tau)*vcovrea1(ij,l)+tau*vcovrea2(ij,l)               a = (1.-tau)*vcovrea1(ij, l) + tau*vcovrea2(ij, l)
288               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
289               if (first.and.ini_anal) vcov(ij,l)=a               IF (first .AND. ini_anal) vcov(ij, l) = a
290            enddo            END DO
291            if (first.and.ini_anal) vcov(ij,l)=a            IF (first .AND. ini_anal) vcov(ij, l) = a
292         enddo         END DO
293      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  
294    
295        first = .FALSE.
296    
297      return    END SUBROUTINE guide
   end subroutine tau2alpha  
298    
299  end module guide_m  END MODULE guide_m

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

  ViewVC Help
Powered by ViewVC 1.1.21