/[lmdze]/trunk/dyn3d/Guide/tau2alpha.f
ViewVC logotype

Diff of /trunk/dyn3d/Guide/tau2alpha.f

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

revision 114 by guez, Fri Sep 19 11:41:35 2014 UTC revision 254 by guez, Mon Feb 5 10:39:38 2018 UTC
# Line 4  module tau2alpha_m Line 4  module tau2alpha_m
4    
5  contains  contains
6    
7    SUBROUTINE tau2alpha(type, factt, taumin, taumax, alpha)    SUBROUTINE tau2alpha(lat_min_guide, lat_max_guide, factt, dxdy, rlat, &
8           taumin, taumax, alpha)
9    
10      USE comgeom, ONLY: cu_2d, cv_2d, rlatu, rlatv      use init_tau2alpha_m, only: dxdy_min, dxdy_max, gamma
11      use conf_guide_m, only: lat_min_guide, lat_max_guide      USE nr_util, ONLY: assert_eq
12      USE dimens_m, ONLY: iim, jjm  
13      USE nr_util, ONLY: pi      ! Dans le cas où on n'a les analyses que sur une bande de latitudes :
14      USE paramet_m, ONLY: iip1, jjp1      REAL, intent(in):: lat_min_guide ! minimum latitude for nudging, in rad
15      USE serre, ONLY: clat, clon, grossismx, grossismy      real, intent(in):: lat_max_guide ! maximum latitude for nudging, in rad
16      use writefield_m, only: writefield  
17        REAL, intent(in):: factt
18      INTEGER, intent(in):: type      ! pas de temps entre deux appels au guidage, en jours
19      REAL, intent(in):: factt, taumin, taumax      
20      real, intent(out):: alpha(:, :)      REAL, intent(in):: dxdy(:, :) ! (n_lon, n_lat)
21        REAL, intent(in):: rlat(:) ! (n_lat)
22        REAL, intent(in):: taumin, taumax
23        real, intent(out):: alpha(:, :) ! (n_lon, n_lat)
24    
25      ! Local:      ! Local:
26      REAL dxdy      REAL a_min, a_max, xi
27      REAL, save:: dxdy_min, dxdy_max      INTEGER i, j, n_lon, n_lat
     REAL alphamin, alphamax, xi  
     REAL, SAVE:: gamma  
     INTEGER i, j, ilon, ilat  
     LOGICAL:: first = .TRUE.  
     REAL dx(iip1, jjp1), dy(iip1, jjp1)  
     REAL zlat  
     REAL, save:: dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)  
28    
29      !------------------------------------------------------------      !------------------------------------------------------------
30    
31      IF (first) THEN      PRINT *, 'Call sequence information: tau2alpha'
        DO j = 2, jjm  
           DO i = 2, iip1  
              dx(i, j) = 0.5 * (cu_2d(i - 1, j) + cu_2d(i, j)) / cos(rlatu(j))  
           END DO  
           dx(1, j) = dx(iip1, j)  
        END DO  
        DO j = 2, jjm  
           DO i = 1, iip1  
              dy(i, j) = 0.5 * (cv_2d(i, j - 1) + cv_2d(i, j))  
           END DO  
        END DO  
        DO i = 1, iip1  
           dx(i, 1) = dx(i, 2)  
           dx(i, jjp1) = dx(i, jjm)  
           dy(i, 1) = dy(i, 2)  
           dy(i, jjp1) = dy(i, jjm)  
        END DO  
   
        DO j = 1, jjp1  
           DO i = 1, iip1  
              dxdys(i, j) = sqrt(dx(i, j)**2 + dy(i, j)**2)  
           END DO  
        END DO  
        CALL writefield("dxdys", dxdys)  
   
        DO j = 1, jjp1  
           DO i = 1, iim  
              dxdyu(i, j) = 0.5 * (dxdys(i, j) + dxdys(i + 1, j))  
           END DO  
           dxdyu(iip1, j) = dxdyu(1, j)  
        END DO  
32    
33         DO j = 1, jjm      n_lon = assert_eq(size(alpha, 1), size(dxdy, 1), "tau2alpha n_lon")
34            DO i = 1, iip1      n_lat = assert_eq(size(alpha, 2), size(dxdy, 2), size(rlat), &
35               dxdyv(i, j) = 0.5 * (dxdys(i, j) + dxdys(i, j + 1))           "tau2alpha n_lat")
36    
37        a_min = factt / taumax
38        a_max = factt / taumin
39    
40        DO j = 1, n_lat
41           IF (lat_min_guide <= rlat(j) .AND. rlat(j) <= lat_max_guide) THEN
42              DO i = 1, n_lon
43                 xi = min(((dxdy_max - dxdy(i, j)) &
44                      / (dxdy_max - dxdy_min))**gamma, 1.)
45                 alpha(i, j) = 1. - exp(- xi * a_min - (1. - xi) * a_max)
46            END DO            END DO
        END DO  
   
        ! 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 maximal de la maille :  
        dxdy_max = 0.  
        DO j = 1, jjp1  
           DO i = 1, iip1  
              dxdy_max = max(dxdy_max, dxdys(i, j))  
           END DO  
        END DO  
   
        IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN  
           PRINT *, 'Attention : modèle peu zoomé.'  
           PRINT *, 'On prend une constante de guidage constante.'  
47         ELSE         ELSE
48            gamma = (dxdy_max - 2. * dxdy_min) / (dxdy_max - dxdy_min)            alpha(:, j) = 0.
           IF (gamma < 1E-5) THEN  
              PRINT *, '(dxdy_max - 2. * dxdy_min) / (dxdy_max - dxdy_min) ' &  
                   // '< 1e-5'  
              STOP 1  
           END IF  
           gamma = log(0.5) / log(gamma)  
           PRINT *, 'gamma=', gamma  
49         END IF         END IF
        first = .false.  
     END IF  
   
     alphamin = factt / taumax  
     alphamax = factt / taumin  
   
     DO j = 1, size(alpha, 2)  
        DO i = 1, size(alpha, 1)  
           IF (type==1) THEN  
              dxdy = dxdys(i, j)  
              zlat = rlatu(j) * 180. / pi  
           ELSE IF (type==2) THEN  
              dxdy = dxdyu(i, j)  
              zlat = rlatu(j) * 180. / pi  
           ELSE IF (type==3) THEN  
              dxdy = dxdyv(i, j)  
              zlat = rlatv(j) * 180. / pi  
           END IF  
           IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN  
              ! grille regulière  
              alpha(i, j) = alphamin  
           ELSE  
              xi = ((dxdy_max - dxdy) / (dxdy_max - dxdy_min))**gamma  
              xi = min(xi, 1.)  
              IF (lat_min_guide <= zlat .AND. zlat <= lat_max_guide) THEN  
                 alpha(i, j) = xi * alphamin + (1. - xi) * alphamax  
              ELSE  
                 alpha(i, j) = 0.  
              END IF  
           END IF  
        END DO  
50      END DO      END DO
51    
52    END SUBROUTINE tau2alpha    END SUBROUTINE tau2alpha

Legend:
Removed from v.114  
changed lines
  Added in v.254

  ViewVC Help
Powered by ViewVC 1.1.21