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

Diff of /trunk/Sources/dyn3d/Guide/guide.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

  ViewVC Help
Powered by ViewVC 1.1.21