/[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/filtrez/inifgn.f revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC trunk/Sources/filtrez/inifgn.f revision 151 by guez, Tue Jun 23 15:14:20 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  
             use coefils  
       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  
 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) ! SQRT(dx / di)
10      real unsddu(iim), unsddv(iim)
11    
12      real eignfnu(iim, iim), eignfnv(iim, iim)
13      ! eigenfunctions of the discrete laplacian
14    
15    contains
16    
17      SUBROUTINE inifgn(dv)
18    
19        ! From LMDZ4/libf/filtrez/inifgn.F, v 1.1.1.1 2004/05/19 12:53:09
20    
21        ! H. Upadyaya, O. Sharma
22    
23        use acc_m, only: acc
24        USE dimens_m, ONLY: iim
25        USE dynetat0_m, ONLY: xprimu, xprimv
26        use nr_util, only: pi
27        use numer_rec_95, only: jacobi, eigsrt
28    
29        real, intent(out):: dv(:) ! (iim) eigenvalues sorted in descending order
30    
31        ! Local:
32        REAL vec(iim, iim), vec1(iim, iim)
33        REAL du(iim)
34        INTEGER i, j, k, nrot
35    
36        !----------------------------------------------------------------
37    
38        print *, "Call sequence information: inifgn"
39    
40        sddv = sqrt(xprimv(:iim))
41        sddu = sqrt(xprimu(:iim))
42        unsddu = 1. / sddu
43        unsddv = 1. / sddv
44    
45        DO j = 1, iim
46           DO i = 1, iim
47              vec(i, j) = 0.
48              vec1(i, j) = 0.
49              eignfnv(i, j) = 0.
50              eignfnu(i, j) = 0.
51           END DO
52        END DO
53    
54        eignfnv(1, 1) = - 1.
55        eignfnv(iim, 1) = 1.
56        DO i = 1, iim - 1
57           eignfnv(i+1, i+1) = - 1.
58           eignfnv(i, i+1) = 1.
59        END DO
60    
61        DO j = 1, iim
62           DO i = 1, iim
63              eignfnv(i, j) = eignfnv(i, j) / (sddu(i) * sddv(j))
64           END DO
65        END DO
66    
67        DO j = 1, iim
68           DO i = 1, iim
69              eignfnu(i, j) = - eignfnv(j, i)
70           END DO
71        END DO
72    
73        DO j = 1, iim
74           DO i = 1, iim
75              vec(i, j) = 0.0
76              vec1(i, j) = 0.0
77              DO k = 1, iim
78                 vec(i, j) = vec(i, j) + eignfnu(i, k) * eignfnv(k, j)
79                 vec1(i, j) = vec1(i, j) + eignfnv(i, k) * eignfnu(k, j)
80              END DO
81           END DO
82        END DO
83    
84        CALL jacobi(vec, dv, eignfnv, nrot)
85        CALL acc(eignfnv)
86        CALL eigsrt(dv, eignfnv)
87    
88        CALL jacobi(vec1, du, eignfnu, nrot)
89        CALL acc(eignfnu)
90        CALL eigsrt(du, eignfnu)
91    
92      END SUBROUTINE inifgn
93    
94    end module inifgn_m

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

  ViewVC Help
Powered by ViewVC 1.1.21