/[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 121 by guez, Wed Jan 28 16:10:02 2015 UTC revision 254 by guez, Mon Feb 5 10:39:38 2018 UTC
# Line 1  Line 1 
1  module inifgn_m  module inifgn_m
2    
3      use dimens_m, only: iim
4    
5    IMPLICIT NONE    IMPLICIT NONE
6    
7      private iim
8    
9      real sddu(iim), sddv(iim)
10      ! sdd[uv] = sqrt(2 pi / iim * (derivative of the longitudinal zoom
11      ! function)(rlon[uv]))
12    
13      real unsddu(iim), unsddv(iim)
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 dimens_m, ONLY: iim      USE dimens_m, ONLY: iim
27      USE comgeom, ONLY: xprimu, xprimv      USE dynetat0_m, ONLY: xprimu, xprimv
28      USE coefils, ONLY: eignfnu, eignfnv, sddu, sddv, unsddu, unsddv      use jumble, only: new_unit
29        use numer_rec_95, only: jacobi, eigsrt
30    
31        real, intent(out):: eignval_v(:) ! (iim)
32        ! eigenvalues sorted in descending order
33    
34      real dv(iim)      real, intent(out):: eignfnu(:, :), eignfnv(:, :) ! (iim, iim) eigenvectors
35    
36      ! Local:      ! Local:
     REAL vec(iim, iim), vec1(iim, iim)  
     REAL du(iim)  
     real d(iim)  
     REAL pi  
     INTEGER i, j, k, imm1, nrot  
37    
38      EXTERNAL acc, jacobi      REAL delta(iim, iim) ! second derivative, symmetric, elements are angle^{-2}
39    
40        REAL deriv_u(iim, iim), deriv_v(iim, iim)
41        ! first derivative at u and v longitudes, elements are angle^{-1}
42    
43        REAL eignval_u(iim)
44        INTEGER i, unit
45    
46      !----------------------------------------------------------------      !----------------------------------------------------------------
47    
48      imm1 = iim - 1      print *, "Call sequence information: inifgn"
     pi = 2.*asin(1.)  
49    
50      DO i = 1, iim      sddv = sqrt(xprimv(:iim))
51         sddv(i) = sqrt(xprimv(i))      sddu = sqrt(xprimu(:iim))
52         sddu(i) = sqrt(xprimu(i))      unsddu = 1. / sddu
53         unsddu(i) = 1./sddu(i)      unsddv = 1. / sddv
54         unsddv(i) = 1./sddv(i)  
55      END DO      deriv_u = 0.
56        deriv_u(iim, 1) = unsddu(iim) * unsddv(1)
57      DO j = 1, iim      forall (i = 1:iim) deriv_u(i, i) = - unsddu(i) * unsddv(i)
58         DO i = 1, iim      forall (i = 1:iim - 1) deriv_u(i, i + 1) = unsddu(i) * unsddv(i + 1)
59            vec(i, j) = 0.  
60            vec1(i, j) = 0.      deriv_v = - transpose(deriv_u)
61            eignfnv(i, j) = 0.  
62            eignfnu(i, j) = 0.      delta = matmul(deriv_v, deriv_u) ! second derivative at v longitudes
63         END DO      CALL jacobi(delta, eignval_v, eignfnv)
64      END DO      CALL eigsrt(eignval_v, eignfnv)
65    
66      eignfnv(1, 1) = -1.      delta = matmul(deriv_u, deriv_v) ! second derivative at u longitudes
67      eignfnv(iim, 1) = 1.      CALL jacobi(delta, eignval_u, eignfnu)
68      DO i = 1, imm1      CALL eigsrt(eignval_u, eignfnu)
69         eignfnv(i+1, i+1) = -1.  
70         eignfnv(i, i+1) = 1.      call new_unit(unit)
71      END DO      open(unit, file = "inifgn_out.txt", status = "replace", action = "write")
72      DO j = 1, iim      write(unit, fmt = *) '"eignval_v"', eignval_v
73         DO i = 1, iim      close(unit)
           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  
   
     CALL jacobi(vec, iim, iim, dv, eignfnv, nrot)  
     CALL acc(eignfnv, d, iim)  
     CALL eigen_sort(dv, eignfnv, iim, iim)  
   
     CALL jacobi(vec1, iim, iim, du, eignfnu, nrot)  
     CALL acc(eignfnu, d, iim)  
     CALL eigen_sort(du, eignfnu, iim, iim)  
74    
75    END SUBROUTINE inifgn    END SUBROUTINE inifgn
76    

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

  ViewVC Help
Powered by ViewVC 1.1.21