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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21