/[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/libf/filtrez/inifgn.f revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/Sources/filtrez/inifgn.f revision 154 by guez, Tue Jul 7 17:49:23 2015 UTC
# Line 1  Line 1 
1  !  module inifgn_m
 ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/inifgn.F,v 1.1.1.1 2004/05/19 12:53:09 lmdzadmin Exp $  
 !  
       SUBROUTINE inifgn(dv)  
 c    
 c    ...  H.Upadyaya , O.Sharma  ...  
 c  
       use dimens_m  
       use paramet_m  
       use comgeom  
       use serre  
       IMPLICIT NONE  
 c  
   
 c  
       REAL vec(iim,iim),vec1(iim,iim)  
       REAL dlonu(iim),dlonv(iim)  
       REAL du(iim),dv(iim),d(iim)  
       REAL pi  
       INTEGER i,j,k,imm1,nrot  
 C  
       include "coefils.h"  
 c  
       EXTERNAL SSUM, acc, jacobi  
 CC      EXTERNAL eigen  
       REAL SSUM  
 c  
   
       imm1  = iim -1  
       pi = 2.* ASIN(1.)  
 C  
       DO 5 i=1,iim  
        dlonu(i)=  xprimu( i )  
        dlonv(i)=  xprimv( i )  
    5  CONTINUE  
   
       DO 12 i=1,iim  
       sddv(i)   = SQRT(dlonv(i))  
       sddu(i)   = SQRT(dlonu(i))  
       unsddu(i) = 1./sddu(i)  
       unsddv(i) = 1./sddv(i)  
   12  CONTINUE  
 C  
       DO 17 j=1,iim  
       DO 17 i=1,iim  
       vec(i,j)     = 0.  
       vec1(i,j)    = 0.  
       eignfnv(i,j) = 0.  
       eignfnu(i,j) = 0.  
   17  CONTINUE  
 c  
 c  
       eignfnv(1,1)    = -1.  
       eignfnv(iim,1)  =  1.  
       DO 20 i=1,imm1  
       eignfnv(i+1,i+1)= -1.  
       eignfnv(i,i+1)  =  1.  
   20  CONTINUE  
       DO 25 j=1,iim  
       DO 25 i=1,iim  
       eignfnv(i,j) = eignfnv(i,j)/(sddu(i)*sddv(j))  
   25  CONTINUE  
       DO 30 j=1,iim  
       DO 30 i=1,iim  
       eignfnu(i,j) = -eignfnv(j,i)  
   30  CONTINUE  
 c  
       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)  
        ENDDO  
       ENDDO  
       ENDDO  
   
 c  
       CALL jacobi(vec,iim,iim,dv,eignfnv,nrot)  
       CALL acc(eignfnv,d,iim)  
       CALL eigen_sort(dv,eignfnv,iim,iim)  
 c  
       CALL jacobi(vec1,iim,iim,du,eignfnu,nrot)  
       CALL acc(eignfnu,d,iim)  
       CALL eigen_sort(du,eignfnu,iim,iim)  
   
 cc   ancienne version avec appels IMSL  
 c  
 c     CALL MXM(eignfnu,iim,eignfnv,iim,vec,iim)  
 c     CALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim)  
 c     CALL EVCSF(iim,vec,iim,dv,eignfnv,iim)  
 c     CALL acc(eignfnv,d,iim)  
 c     CALL eigen(eignfnv,dv)  
 c  
 c     CALL EVCSF(iim,vec1,iim,du,eignfnu,iim)  
 c     CALL acc(eignfnu,d,iim)  
 c     CALL eigen(eignfnu,du)  
2    
3        RETURN    use dimens_m, only: iim
       END  
4    
5      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
16    
17      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
20    
21        ! 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
27        USE dimens_m, ONLY: iim
28        USE dynetat0_m, ONLY: xprimu, xprimv
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, intent(out):: eignfnu(:, :), eignfnv(:, :) ! (iim, iim) eigenvectors
35    
36        ! Local:
37    
38        REAL a(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
45    
46        !----------------------------------------------------------------
47    
48        print *, "Call sequence information: inifgn"
49    
50        sddv = sqrt(xprimv(:iim))
51        sddu = sqrt(xprimu(:iim))
52        unsddu = 1. / sddu
53        unsddv = 1. / sddv
54    
55        deriv_u = 0.
56        deriv_u(iim, 1) = unsddu(iim) * unsddv(1)
57        forall (i = 1:iim) deriv_u(i, i) = - unsddu(i) * unsddv(i)
58        forall (i = 1:iim - 1) deriv_u(i, i + 1) = unsddu(i) * unsddv(i + 1)
59    
60        deriv_v = - transpose(deriv_u)
61    
62        a = matmul(deriv_v, deriv_u) ! second derivative at v longitudes
63        CALL jacobi(a, eignval_v, eignfnv)
64        CALL acc(eignfnv)
65        CALL eigsrt(eignval_v, eignfnv)
66    
67        a = matmul(deriv_u, deriv_v) ! second derivative at u longitudes
68        CALL jacobi(a, eignval_u, eignfnu)
69        CALL acc(eignfnu)
70        CALL eigsrt(eignval_u, eignfnu)
71    
72      END SUBROUTINE inifgn
73    
74    end module inifgn_m

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

  ViewVC Help
Powered by ViewVC 1.1.21