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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21