--- trunk/Sources/filtrez/inifgn.f 2015/05/26 17:46:03 139 +++ trunk/Sources/filtrez/inifgn.f 2015/06/09 14:32:46 143 @@ -1,42 +1,44 @@ module inifgn_m + use dimens_m, only: iim + IMPLICIT NONE + private iim + + real sddu(iim), sddv(iim) ! SQRT(dx) + real unsddu(iim), unsddv(iim) + + real eignfnu(iim, iim), eignfnv(iim, iim) + ! eigenfunctions of the discrete laplacian + contains SUBROUTINE inifgn(dv) ! From LMDZ4/libf/filtrez/inifgn.F, v 1.1.1.1 2004/05/19 12:53:09 - ! H.Upadyaya, O.Sharma + ! H. Upadyaya, O. Sharma - USE coefils, ONLY: eignfnu, eignfnv, sddu, sddv, unsddu, unsddv + use acc_m, only: acc USE dimens_m, ONLY: iim USE dynetat0_m, ONLY: xprimu, xprimv - use numer_rec_95, only: jacobi + use nr_util, only: pi + use numer_rec_95, only: jacobi, eigsrt - real, intent(out):: dv(iim) + real, intent(out):: dv(:) ! (iim) ! Local: REAL vec(iim, iim), vec1(iim, iim) REAL du(iim) - real d(iim) - REAL pi - INTEGER i, j, k, imm1, nrot - - EXTERNAL acc + INTEGER i, j, k, nrot !---------------------------------------------------------------- - imm1 = iim - 1 - pi = 2.*asin(1.) - - DO i = 1, iim - sddv(i) = sqrt(xprimv(i)) - sddu(i) = sqrt(xprimu(i)) - unsddu(i) = 1./sddu(i) - unsddv(i) = 1./sddv(i) - END DO + sddv = sqrt(xprimv(:iim)) + sddu = sqrt(xprimu(:iim)) + unsddu = 1. / sddu + unsddv = 1. / sddv DO j = 1, iim DO i = 1, iim @@ -47,20 +49,22 @@ END DO END DO - eignfnv(1, 1) = -1. + eignfnv(1, 1) = - 1. eignfnv(iim, 1) = 1. - DO i = 1, imm1 - eignfnv(i+1, i+1) = -1. + DO i = 1, iim - 1 + 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)) + 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) + eignfnu(i, j) = - eignfnv(j, i) END DO END DO @@ -69,19 +73,19 @@ 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) + 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, dv, eignfnv, nrot) - CALL acc(eignfnv, d, iim) - CALL eigen_sort(dv, eignfnv, iim, iim) + CALL acc(eignfnv) + CALL eigsrt(dv, eignfnv) CALL jacobi(vec1, du, eignfnu, nrot) - CALL acc(eignfnu, d, iim) - CALL eigen_sort(du, eignfnu, iim, iim) + CALL acc(eignfnu) + CALL eigsrt(du, eignfnu) END SUBROUTINE inifgn