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

Diff of /trunk/filtrez/inifgn.f

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

trunk/Sources/filtrez/inifgn.f revision 153 by guez, Tue Jun 23 18:26:18 2015 UTC trunk/filtrez/inifgn.f revision 265 by guez, Tue Mar 20 09:35:59 2018 UTC
# Line 1  Line 1 
1  module inifgn_m  module inifgn_m
2    
3    use dimens_m, only: iim    use dimensions, only: iim
4    
5    IMPLICIT NONE    IMPLICIT NONE
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      use acc_m, only: acc      ! Computes the eigenvalues and eigenvectors of the discrete analog
24      USE dimens_m, ONLY: iim      ! of the second derivative with respect to longitude.
25    
26        USE dimensions, ONLY: iim
27      USE dynetat0_m, ONLY: xprimu, xprimv      USE dynetat0_m, ONLY: xprimu, xprimv
28        use jumble, only: new_unit
29      use numer_rec_95, only: jacobi, eigsrt      use numer_rec_95, only: jacobi, eigsrt
30    
31      real, intent(out):: dv(:) ! (iim) eigenvalues sorted in descending order      real, intent(out):: eignval_v(:) ! (iim)
32        ! eigenvalues sorted in descending order
33    
34        real, intent(out):: eignfnu(:, :), eignfnv(:, :) ! (iim, iim) eigenvectors
35    
36      ! Local:      ! Local:
37      REAL, dimension(iim, iim):: a, b, c  
38      REAL du(iim)      REAL delta(iim, iim) ! second derivative, symmetric, elements are angle^{-2}
39      INTEGER i  
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    
# Line 41  contains Line 52  contains
52      unsddu = 1. / sddu      unsddu = 1. / sddu
53      unsddv = 1. / sddv      unsddv = 1. / sddv
54    
55      b = 0.      deriv_u = 0.
56      b(iim, 1) = unsddu(iim) * unsddv(1)      deriv_u(iim, 1) = unsddu(iim) * unsddv(1)
57      forall (i = 1:iim) b(i, i) = - unsddu(i) * unsddv(i)      forall (i = 1:iim) deriv_u(i, i) = - unsddu(i) * unsddv(i)
58      forall (i = 1:iim - 1) b(i, i + 1) = unsddu(i) * unsddv(i + 1)      forall (i = 1:iim - 1) deriv_u(i, i + 1) = unsddu(i) * unsddv(i + 1)
59    
60      c = - transpose(b)      deriv_v = - transpose(deriv_u)
61    
62      a = matmul(c, b)      delta = matmul(deriv_v, deriv_u) ! second derivative at v longitudes
63      CALL jacobi(a, dv, eignfnv)      CALL jacobi(delta, eignval_v, eignfnv)
64      CALL acc(eignfnv)      CALL eigsrt(eignval_v, eignfnv)
65      CALL eigsrt(dv, eignfnv)  
66        delta = matmul(deriv_u, deriv_v) ! second derivative at u longitudes
67      a = matmul(b, c)      CALL jacobi(delta, eignval_u, eignfnu)
68      CALL jacobi(a, du, eignfnu)      CALL eigsrt(eignval_u, eignfnu)
69      CALL acc(eignfnu)  
70      CALL eigsrt(du, eignfnu)      call new_unit(unit)
71        open(unit, file = "inifgn_out.txt", status = "replace", action = "write")
72        write(unit, fmt = *) '"eignval_v"', eignval_v
73        close(unit)
74    
75    END SUBROUTINE inifgn    END SUBROUTINE inifgn
76    

Legend:
Removed from v.153  
changed lines
  Added in v.265

  ViewVC Help
Powered by ViewVC 1.1.21