/[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.f90 revision 81 by guez, Wed Mar 5 14:38:41 2014 UTC trunk/Sources/filtrez/inifgn.f revision 152 by guez, Tue Jun 23 18:18:12 2015 UTC
# Line 1  Line 1 
1    module inifgn_m
2    
3  ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/inifgn.F,v 1.1.1.1 2004/05/19    use dimens_m, only: iim
 ! 12:53:09 lmdzadmin Exp $  
4    
5  SUBROUTINE inifgn(dv)    IMPLICIT NONE
6    
7    ! ...  H.Upadyaya , O.Sharma  ...    private iim
8    
9    USE dimens_m    real sddu(iim), sddv(iim) ! SQRT(dx / di)
10    USE paramet_m    real unsddu(iim), unsddv(iim)
11    USE comgeom  
12    USE serre    real eignfnu(iim, iim), eignfnv(iim, iim)
13    USE coefils    ! eigenfunctions of the discrete laplacian
14    IMPLICIT NONE  
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 numer_rec_95, only: jacobi, eigsrt
27    
28        real, intent(out):: dv(:) ! (iim) eigenvalues sorted in descending order
29    
30        ! Local:
31        REAL, dimension(iim, iim):: a, b, c
32        REAL du(iim)
33        INTEGER i
34    
35        !----------------------------------------------------------------
36    
37        print *, "Call sequence information: inifgn"
38    
39        sddv = sqrt(xprimv(:iim))
40        sddu = sqrt(xprimu(:iim))
41        unsddu = 1. / sddu
42        unsddv = 1. / sddv
43    
44        b = 0.
45        b(iim, 1) = 1. / (sddu(iim) * sddv(1))
46        forall (i = 1:iim) b(i, i) = - 1./ (sddu(i) * sddv(i))
47        forall (i = 1:iim - 1) b(i, i + 1) = 1. / (sddu(i) * sddv(i + 1))
48    
49        c = - transpose(b)
50    
51        a = matmul(c, b)
52        CALL jacobi(a, dv, eignfnv)
53        CALL acc(eignfnv)
54        CALL eigsrt(dv, eignfnv)
55    
56    REAL vec(iim, iim), vec1(iim, iim)      a = matmul(b, c)
57    REAL dlonu(iim), dlonv(iim)      CALL jacobi(a, du, eignfnu)
58    REAL du(iim), dv(iim), d(iim)      CALL acc(eignfnu)
59    REAL pi      CALL eigsrt(du, eignfnu)
   INTEGER i, j, k, imm1, nrot  
   
   
   EXTERNAL ssum, acc, jacobi  
   ! C      EXTERNAL eigen  
   REAL ssum  
   
   
   imm1 = iim - 1  
   pi = 2.*asin(1.)  
   
   DO i = 1, iim  
     dlonu(i) = xprimu(i)  
     dlonv(i) = xprimv(i)  
   END DO  
   
   DO i = 1, iim  
     sddv(i) = sqrt(dlonv(i))  
     sddu(i) = sqrt(dlonu(i))  
     unsddu(i) = 1./sddu(i)  
     unsddv(i) = 1./sddv(i)  
   END DO  
   
   DO j = 1, iim  
     DO i = 1, iim  
       vec(i, j) = 0.  
       vec1(i, j) = 0.  
       eignfnv(i, j) = 0.  
       eignfnu(i, j) = 0.  
     END DO  
   END DO  
   
   
   eignfnv(1, 1) = -1.  
   eignfnv(iim, 1) = 1.  
   DO i = 1, imm1  
     eignfnv(i+1, i+1) = -1.  
     eignfnv(i, i+1) = 1.  
   END DO  
   DO j = 1, iim  
     DO i = 1, iim  
       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)  
   
   ! c   ancienne version avec appels IMSL  
   
   ! CALL MXM(eignfnu,iim,eignfnv,iim,vec,iim)  
   ! CALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim)  
   ! CALL EVCSF(iim,vec,iim,dv,eignfnv,iim)  
   ! CALL acc(eignfnv,d,iim)  
   ! CALL eigen(eignfnv,dv)  
   
   ! CALL EVCSF(iim,vec1,iim,du,eignfnu,iim)  
   ! CALL acc(eignfnu,d,iim)  
   ! CALL eigen(eignfnu,du)  
60    
61    RETURN    END SUBROUTINE inifgn
 END SUBROUTINE inifgn  
62    
63    end module inifgn_m

Legend:
Removed from v.81  
changed lines
  Added in v.152

  ViewVC Help
Powered by ViewVC 1.1.21