/[lmdze]/trunk/filtrez/inifgn.f
ViewVC logotype

Diff of /trunk/filtrez/inifgn.f

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

revision 151 by guez, Tue Jun 23 15:14:20 2015 UTC revision 167 by guez, Mon Aug 24 16:30:33 2015 UTC
# Line 6  module inifgn_m Line 6  module inifgn_m
6    
7    private iim    private iim
8    
9    real sddu(iim), sddv(iim) ! SQRT(dx / di)    real sddu(iim), sddv(iim)
10    real unsddu(iim), unsddv(iim)    ! sdd[uv] = sqrt(2 pi / iim * (derivative of the longitudinal zoom
11      ! function)(rlon[uv]))
12    
13    real eignfnu(iim, iim), eignfnv(iim, iim)    real unsddu(iim), unsddv(iim)
   ! eigenfunctions of the discrete laplacian  
14    
15  contains  contains
16    
17    SUBROUTINE inifgn(dv)    SUBROUTINE inifgn(eignval_v, eignfnu, eignfnv)
18    
19      ! From LMDZ4/libf/filtrez/inifgn.F, v 1.1.1.1 2004/05/19 12:53:09      ! From LMDZ4/libf/filtrez/inifgn.F, v 1.1.1.1 2004/05/19 12:53:09
20    
21      ! H. Upadyaya, O. Sharma      ! Authors: H. Upadyaya, O. Sharma
22    
23        ! Computes the eigenvalues and eigenvectors of the discrete analog
24        ! of the second derivative with respect to longitude.
25    
26      use acc_m, only: acc      use acc_m, only: acc
27      USE dimens_m, ONLY: iim      USE dimens_m, ONLY: iim
28      USE dynetat0_m, ONLY: xprimu, xprimv      USE dynetat0_m, ONLY: xprimu, xprimv
29      use nr_util, only: pi      use jumble, only: new_unit
30      use numer_rec_95, only: jacobi, eigsrt      use numer_rec_95, only: jacobi, eigsrt
31    
32      real, intent(out):: dv(:) ! (iim) eigenvalues sorted in descending order      real, intent(out):: eignval_v(:) ! (iim)
33        ! eigenvalues sorted in descending order
34    
35        real, intent(out):: eignfnu(:, :), eignfnv(:, :) ! (iim, iim) eigenvectors
36    
37      ! Local:      ! Local:
38      REAL vec(iim, iim), vec1(iim, iim)  
39      REAL du(iim)      REAL delta(iim, iim) ! second derivative, symmetric, elements are angle^{-2}
40      INTEGER i, j, k, nrot  
41        REAL deriv_u(iim, iim), deriv_v(iim, iim)
42        ! first derivative at u and v longitudes, elements are angle^{-1}
43    
44        REAL eignval_u(iim)
45        INTEGER i, unit
46    
47      !----------------------------------------------------------------      !----------------------------------------------------------------
48    
# Line 42  contains Line 53  contains
53      unsddu = 1. / sddu      unsddu = 1. / sddu
54      unsddv = 1. / sddv      unsddv = 1. / sddv
55    
56      DO j = 1, iim      deriv_u = 0.
57         DO i = 1, iim      deriv_u(iim, 1) = unsddu(iim) * unsddv(1)
58            vec(i, j) = 0.      forall (i = 1:iim) deriv_u(i, i) = - unsddu(i) * unsddv(i)
59            vec1(i, j) = 0.      forall (i = 1:iim - 1) deriv_u(i, i + 1) = unsddu(i) * unsddv(i + 1)
           eignfnv(i, j) = 0.  
           eignfnu(i, j) = 0.  
        END DO  
     END DO  
   
     eignfnv(1, 1) = - 1.  
     eignfnv(iim, 1) = 1.  
     DO i = 1, iim - 1  
        eignfnv(i+1, i+1) = - 1.  
        eignfnv(i, i+1) = 1.  
     END DO  
   
     DO j = 1, iim  
        DO i = 1, iim  
           eignfnv(i, j) = eignfnv(i, j) / (sddu(i) * sddv(j))  
        END DO  
     END DO  
   
     DO j = 1, iim  
        DO i = 1, iim  
           eignfnu(i, j) = - eignfnv(j, i)  
        END DO  
     END DO  
   
     DO j = 1, iim  
        DO i = 1, iim  
           vec(i, j) = 0.0  
           vec1(i, j) = 0.0  
           DO k = 1, iim  
              vec(i, j) = vec(i, j) + eignfnu(i, k) * eignfnv(k, j)  
              vec1(i, j) = vec1(i, j) + eignfnv(i, k) * eignfnu(k, j)  
           END DO  
        END DO  
     END DO  
60    
61      CALL jacobi(vec, dv, eignfnv, nrot)      deriv_v = - transpose(deriv_u)
62    
63        delta = matmul(deriv_v, deriv_u) ! second derivative at v longitudes
64        CALL jacobi(delta, eignval_v, eignfnv)
65      CALL acc(eignfnv)      CALL acc(eignfnv)
66      CALL eigsrt(dv, eignfnv)      CALL eigsrt(eignval_v, eignfnv)
67    
68      CALL jacobi(vec1, du, eignfnu, nrot)      delta = matmul(deriv_u, deriv_v) ! second derivative at u longitudes
69        CALL jacobi(delta, eignval_u, eignfnu)
70      CALL acc(eignfnu)      CALL acc(eignfnu)
71      CALL eigsrt(du, eignfnu)      CALL eigsrt(eignval_u, eignfnu)
72    
73        call new_unit(unit)
74        open(unit, file = "inifgn_out.txt", status = "replace", action = "write")
75        write(unit, fmt = *) '"eignval_v"', eignval_v
76        close(unit)
77    
78    END SUBROUTINE inifgn    END SUBROUTINE inifgn
79    

Legend:
Removed from v.151  
changed lines
  Added in v.167

  ViewVC Help
Powered by ViewVC 1.1.21