/[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 103 by guez, Fri Aug 29 13:00:05 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:  
     !   -------------  
7    
8      include "netcdf.inc"    REAL aire_min, aire_max
9    
10      !   variables dynamiques  CONTAINS
     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./  
11    
12      print *,'Call sequence information: guide'    SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
13    
14      !-----------------------------------------------------------------------      ! Author: F.Hourdin
     ! 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)  
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, online
22        USE dimens_m, ONLY: iim, jjm, llm
23        USE disvert_m, ONLY: ap, bp, preff, presnivs
24        use dump2d_m, only: dump2d
25        USE exner_hyb_m, ONLY: exner_hyb
26        USE inigrads_m, ONLY: inigrads
27        use netcdf, only: nf90_nowrite, nf90_close, nf90_inq_dimid
28        use netcdf95, only: nf95_inquire_dimension, nf95_open
29        use nr_util, only: pi
30        USE paramet_m, ONLY: iip1, ip1jmp1, jjp1, llmp1
31        USE q_sat_m, ONLY: q_sat
32        use read_reanalyse_m, only: read_reanalyse
33        USE serre, ONLY: clat, clon
34        use tau2alpha_m, only: tau2alpha, dxdys
35    
36      !-----------------------------------------------------------------------      INTEGER, INTENT(IN):: itau
     !   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  
     !-----------------------------------------------------------------------  
37    
38      print*,'ONLINE=',online      ! variables dynamiques
     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   ')  
39    
40            !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc      REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
41            !   Cas ou on force exactement par les variables analysees      REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
        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  
42    
43         !    itau_test    montre si l'importation a deja ete faite au rang itau      REAL, intent(inout):: teta(iim + 1, jjm + 1, llm) ! température potentielle
44         ! lecture d'un fichier netcdf pour determiner le nombre de niveaux      REAL, intent(inout):: q(iim + 1, jjm + 1, llm)
45         if (guide_u) then      REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
           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:  
        !   ----------------------------------  
46    
47      endif ! first      ! Local:
     !  
     !-----------------------------------------------------------------------  
     !----- IMPORTATION DES VENTS,PRESSION ET TEMPERATURE REELS:  
     !-----------------------------------------------------------------------  
48    
49      ditau=real(itau)      ! variables dynamiques pour les reanalyses.
50      DDAY_step=real(day_step)  
51      write(*,*)'ditau,dday_step'      REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
52      write(*,*)ditau,dday_step      ! vents covariants reanalyses
53      toto=4*ditau/dday_step  
54      reste=toto-aint(toto)      REAL, save:: tetarea1(iim + 1, jjm + 1, llm) ! temp pot reales
55      !     write(*,*)'toto,reste',toto,reste      REAL, save:: qrea1(iim + 1, jjm + 1, llm) ! temp pot reales
56    
57      if (reste.eq.0.) then      REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
58         if (itau_test.eq.itau) then      ! vents covariants reanalyses
59            write(*,*)'deuxieme passage de advreel a itau=',itau  
60            stop      REAL, save:: tetarea2(iim + 1, jjm + 1, llm) ! temp pot reales
61         else      REAL, save:: qrea2(iim + 1, jjm + 1, llm) ! temp pot reales
62            vcovrea1(:,:)=vcovrea2(:,:)      REAL, save:: masserea2(ip1jmp1, llm) ! masse
63            ucovrea1(:,:)=ucovrea2(:,:)  
64            tetarea1(:,:)=tetarea2(:,:)      ! alpha determine la part des injections de donnees a chaque etape
65            qrea1(:,:)=qrea2(:,:)      ! alpha=1 signifie pas d'injection
66        ! alpha=0 signifie injection totale
67            print*,'LECTURE REANALYSES, pas ',step_rea &      REAL, save:: alpha_q(iim + 1, jjm + 1)
68                 ,'apres ',count_no_rea,' non lectures'      REAL, save:: alpha_t(iim + 1, jjm + 1)
69            step_rea=step_rea+1      REAL, save:: alpha_u(iim + 1, jjm + 1), alpha_v(iim + 1, jjm)
70            itau_test=itau  
71            call read_reanalyse(step_rea,ps &      INTEGER, save:: step_rea, count_no_rea
72                 ,ucovrea2,vcovrea2,tetarea2,qrea2,masserea2,psrea2,1,nlev)  
73            qrea2(:,:)=max(qrea2(:,:),0.1)      INTEGER ilon, ilat
74            factt=dtvr*iperiod/daysec      REAL factt ! pas de temps entre deux appels au guidage, en fraction de jour
75            ztau(:)=factt/max(alpha_T(:),1.e-10)      real ztau(iim + 1, jjm + 1)
76            call wrgrads(igrads,1,aire   ,'aire      ','aire      ' )  
77            call wrgrads(igrads,1,dxdys  ,'dxdy      ','dxdy      ' )      INTEGER ij, l
78            call wrgrads(igrads,1,alpha_u,'au        ','au        ' )      INTEGER ncidpl, status
79            call wrgrads(igrads,1,alpha_T,'at        ','at        ' )      INTEGER rcod, rid
80            call wrgrads(igrads,1,ztau,'taut      ','taut      ' )      REAL tau
81            call wrgrads(igrads,llm,ucov,'u         ','u         ' )      INTEGER, SAVE:: nlev
82            call wrgrads(igrads,llm,ucovrea2,'ua        ','ua        ' )  
83            call wrgrads(igrads,llm,teta,'T         ','T         ' )      ! TEST SUR QSAT
84            call wrgrads(igrads,llm,tetarea2,'Ta        ','Ta        ' )      REAL p(iim + 1, jjm + 1, llmp1)
85            call wrgrads(igrads,llm,qrea2,'Qa        ','Qa        ' )      real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
86            call wrgrads(igrads,llm,q,'Q         ','Q         ' )  
87        REAL qsat(iim + 1, jjm + 1, llm)
88            call wrgrads(igrads,llm,qsat,'QSAT      ','QSAT      ' )  
89        INTEGER, parameter:: igrads = 2
90         endif      REAL:: dtgrads = 100.
     else  
        count_no_rea=count_no_rea+1  
     endif  
91    
     !-----------------------------------------------------------------------  
     !   Guidage  
     !    x_gcm = a * x_gcm + (1-a) * x_reanalyses  
92      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
93    
94      if(ini_anal) print*,'ATTENTION !!! ON PART DU GUIDAGE'      PRINT *, 'Call sequence information: guide'
95    
96      ditau=real(itau)      first_call: IF (itau == 0) THEN
97      dday_step=real(day_step)         CALL conf_guide
98           CALL inigrads(igrads, rlonv, 180. / pi, -180., 180., rlatu, -90., &
99                90., 180. / pi, presnivs, 1., dtgrads, 'guide', 'dyn_zon ')
100    
101           IF (online) THEN
102              ! Constantes de temps de rappel en jour
103    
104      tau=4*ditau/dday_step            ! coordonnees du centre du zoom
105      tau=tau-aint(tau)            CALL coordij(clon, clat, ilon, ilat)
106              ! aire de la maille au centre du zoom
107              aire_min = aire(ilon+(ilat - 1) * iip1)
108              ! aire maximale de la maille
109              aire_max = 0.
110              DO ij = 1, ip1jmp1
111                 aire_max = max(aire_max, aire(ij))
112              END DO
113    
114      !  ucov            factt = dtvr * iperiod / daysec
     if (guide_u) then  
        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  
           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  
115    
116              CALL tau2alpha(3, factt, tau_min_v, tau_max_v, alpha_v)
117              CALL tau2alpha(2, factt, tau_min_u, tau_max_u, alpha_u)
118              CALL tau2alpha(1, factt, tau_min_t, tau_max_t, alpha_t)
119              CALL tau2alpha(1, factt, tau_min_q, tau_max_q, alpha_q)
120    
121              CALL dump2d(iip1, jjp1, aire, 'AIRE MAILLe ')
122              CALL dump2d(iip1, jjp1, alpha_u, 'COEFF U ')
123              CALL dump2d(iip1, jjp1, alpha_t, 'COEFF T ')
124           ELSE
125              ! Cas ou on force exactement par les variables analysees
126              alpha_t = 0.
127              alpha_u = 0.
128              alpha_v = 0.
129              alpha_q = 0.
130           END IF
131    
132           step_rea = 1
133           count_no_rea = 0
134           ncidpl = -99
135    
136           ! lecture d'un fichier netcdf pour determiner le nombre de niveaux
137           if (guide_u) call nf95_open('u.nc',Nf90_NOWRITe,ncidpl)
138           if (guide_v) call nf95_open('v.nc',nf90_nowrite,ncidpl)
139           if (guide_T) call nf95_open('T.nc',nf90_nowrite,ncidpl)
140           if (guide_Q) call nf95_open('hur.nc',nf90_nowrite, ncidpl)
141    
142           IF (ncep) THEN
143              status = nf90_inq_dimid(ncidpl, 'LEVEL', rid)
144           ELSE
145              status = nf90_inq_dimid(ncidpl, 'PRESSURE', rid)
146           END IF
147           call nf95_inquire_dimension(ncidpl, rid, nclen=nlev)
148           PRINT *, 'nlev', nlev
149           rcod = nf90_close(ncidpl)
150           ! Lecture du premier etat des reanalyses.
151           CALL read_reanalyse(1, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
152                masserea2, nlev)
153           qrea2 = max(qrea2, 0.1)
154        END IF first_call
155    
156        ! IMPORTATION DES VENTS, PRESSION ET TEMPERATURE REELS:
157    
158        ! Nudging fields are given 4 times per day:
159        IF (mod(itau, day_step / 4) == 0) THEN
160           vcovrea1 = vcovrea2
161           ucovrea1 = ucovrea2
162           tetarea1 = tetarea2
163           qrea1 = qrea2
164    
165           PRINT *, 'LECTURE REANALYSES, pas ', step_rea, 'apres ', &
166                count_no_rea, ' non lectures'
167           step_rea = step_rea + 1
168           CALL read_reanalyse(step_rea, ps, ucovrea2, vcovrea2, tetarea2, qrea2, &
169                masserea2, nlev)
170           qrea2 = max(qrea2, 0.1)
171           factt = dtvr * iperiod / daysec
172           ztau = factt / max(alpha_t, 1E-10)
173           CALL wrgrads(igrads, 1, aire, 'aire ', 'aire ')
174           CALL wrgrads(igrads, 1, dxdys, 'dxdy ', 'dxdy ')
175           CALL wrgrads(igrads, 1, alpha_u, 'au ', 'au ')
176           CALL wrgrads(igrads, 1, alpha_t, 'at ', 'at ')
177           CALL wrgrads(igrads, 1, ztau, 'taut ', 'taut ')
178           CALL wrgrads(igrads, llm, ucov, 'u ', 'u ')
179           CALL wrgrads(igrads, llm, ucovrea2, 'ua ', 'ua ')
180           CALL wrgrads(igrads, llm, teta, 'T ', 'T ')
181           CALL wrgrads(igrads, llm, tetarea2, 'Ta ', 'Ta ')
182           CALL wrgrads(igrads, llm, qrea2, 'Qa ', 'Qa ')
183           CALL wrgrads(igrads, llm, q, 'Q ', 'Q ')
184        ELSE
185           count_no_rea = count_no_rea + 1
186        END IF
187    
188        ! Guidage
189    
190        tau = mod(real(itau) / real(day_step / 4), 1.)
191    
192        ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
193    
194        IF (guide_u) THEN
195           IF (itau == 0 .AND. ini_anal) then
196              ucov = ucovrea1
197           else
198              forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) * ucov(:, :, l) &
199                   + alpha_u * ((1. - tau) * ucovrea1(:, :, l) &
200                   + tau * ucovrea2(:, :, l))
201           end IF
202        END IF
203    
204        IF (guide_t) THEN
205           IF (itau == 0 .AND. ini_anal) then
206              teta = tetarea1
207           else
208              forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) * teta(:, :, l) &
209                   + alpha_t * ((1. - tau) * tetarea1(:, :, l) &
210                   + tau * tetarea2(:, :, l))
211           end IF
212        END IF
213    
214        IF (guide_q) THEN
215           ! Calcul de l'humidité saturante :
216           forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
217           CALL exner_hyb(ps, p, pks, pk)
218           qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
219    
220           ! humidité relative en % -> humidité spécifique
221           IF (itau == 0 .AND. ini_anal) then
222              q = qsat * qrea1 * 0.01
223           else
224              forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
225                   + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
226                   + tau * qrea2(:, :, l)) * 0.01)
227           end IF
228        END IF
229    
230        IF (guide_v) THEN
231           IF (itau == 0 .AND. ini_anal) then
232              vcov = vcovrea1
233           else
234              forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) * vcov(:, :, l) &
235                   + alpha_v * ((1. - tau) * vcovrea1(:, :, l) &
236                   + tau * vcovrea2(:, :, l))
237           end IF
238        END IF
239    
240      return    END SUBROUTINE guide
   end subroutine tau2alpha  
241    
242  end module guide_m  END MODULE guide_m

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

  ViewVC Help
Powered by ViewVC 1.1.21