/[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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21