/[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 143 by guez, Tue Jun 9 14:32:46 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)
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)
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        sddv = sqrt(xprimv(:iim))
39        sddu = sqrt(xprimu(:iim))
40        unsddu = 1. / sddu
41        unsddv = 1. / sddv
42    
43        DO j = 1, iim
44           DO i = 1, iim
45              vec(i, j) = 0.
46              vec1(i, j) = 0.
47              eignfnv(i, j) = 0.
48              eignfnu(i, j) = 0.
49           END DO
50        END DO
51    
52        eignfnv(1, 1) = - 1.
53        eignfnv(iim, 1) = 1.
54        DO i = 1, iim - 1
55           eignfnv(i+1, i+1) = - 1.
56           eignfnv(i, i+1) = 1.
57        END DO
58    
59        DO j = 1, iim
60           DO i = 1, iim
61              eignfnv(i, j) = eignfnv(i, j) / (sddu(i) * sddv(j))
62           END DO
63        END DO
64    
65        DO j = 1, iim
66           DO i = 1, iim
67              eignfnu(i, j) = - eignfnv(j, i)
68           END DO
69        END DO
70    
71        DO j = 1, iim
72           DO i = 1, iim
73              vec(i, j) = 0.0
74              vec1(i, j) = 0.0
75              DO k = 1, iim
76                 vec(i, j) = vec(i, j) + eignfnu(i, k) * eignfnv(k, j)
77                 vec1(i, j) = vec1(i, j) + eignfnv(i, k) * eignfnu(k, j)
78              END DO
79           END DO
80        END DO
81    
82        CALL jacobi(vec, dv, eignfnv, nrot)
83        CALL acc(eignfnv)
84        CALL eigsrt(dv, eignfnv)
85    
86        CALL jacobi(vec1, du, eignfnu, nrot)
87        CALL acc(eignfnu)
88        CALL eigsrt(du, eignfnu)
89    
90      END SUBROUTINE inifgn
91    
92    end module inifgn_m

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

  ViewVC Help
Powered by ViewVC 1.1.21