--- trunk/Sources/filtrez/inifgn.f 2015/06/23 18:26:18 153 +++ trunk/Sources/filtrez/inifgn.f 2015/07/07 17:49:23 154 @@ -6,30 +6,41 @@ private iim - real sddu(iim), sddv(iim) ! SQRT(dx / di) - real unsddu(iim), unsddv(iim) + real sddu(iim), sddv(iim) + ! sdd[uv] = sqrt(2 pi / iim * (derivative of the longitudinal zoom + ! function)(rlon[uv])) - real eignfnu(iim, iim), eignfnv(iim, iim) - ! eigenfunctions of the discrete laplacian + real unsddu(iim), unsddv(iim) contains - SUBROUTINE inifgn(dv) + SUBROUTINE inifgn(eignval_v, eignfnu, eignfnv) ! From LMDZ4/libf/filtrez/inifgn.F, v 1.1.1.1 2004/05/19 12:53:09 - ! H. Upadyaya, O. Sharma + ! Authors: H. Upadyaya, O. Sharma + + ! Computes the eigenvalues and eigenvectors of the discrete analog + ! of the second derivative with respect to longitude. use acc_m, only: acc USE dimens_m, ONLY: iim USE dynetat0_m, ONLY: xprimu, xprimv use numer_rec_95, only: jacobi, eigsrt - real, intent(out):: dv(:) ! (iim) eigenvalues sorted in descending order + real, intent(out):: eignval_v(:) ! (iim) + ! eigenvalues sorted in descending order + + real, intent(out):: eignfnu(:, :), eignfnv(:, :) ! (iim, iim) eigenvectors ! Local: - REAL, dimension(iim, iim):: a, b, c - REAL du(iim) + + REAL a(iim, iim) ! second derivative, symmetric, elements are angle^{-2} + + REAL deriv_u(iim, iim), deriv_v(iim, iim) + ! first derivative at u and v longitudes, elements are angle^{-1} + + REAL eignval_u(iim) INTEGER i !---------------------------------------------------------------- @@ -41,22 +52,22 @@ unsddu = 1. / sddu unsddv = 1. / sddv - b = 0. - b(iim, 1) = unsddu(iim) * unsddv(1) - forall (i = 1:iim) b(i, i) = - unsddu(i) * unsddv(i) - forall (i = 1:iim - 1) b(i, i + 1) = unsddu(i) * unsddv(i + 1) + deriv_u = 0. + deriv_u(iim, 1) = unsddu(iim) * unsddv(1) + forall (i = 1:iim) deriv_u(i, i) = - unsddu(i) * unsddv(i) + forall (i = 1:iim - 1) deriv_u(i, i + 1) = unsddu(i) * unsddv(i + 1) - c = - transpose(b) + deriv_v = - transpose(deriv_u) - a = matmul(c, b) - CALL jacobi(a, dv, eignfnv) + a = matmul(deriv_v, deriv_u) ! second derivative at v longitudes + CALL jacobi(a, eignval_v, eignfnv) CALL acc(eignfnv) - CALL eigsrt(dv, eignfnv) + CALL eigsrt(eignval_v, eignfnv) - a = matmul(b, c) - CALL jacobi(a, du, eignfnu) + a = matmul(deriv_u, deriv_v) ! second derivative at u longitudes + CALL jacobi(a, eignval_u, eignfnu) CALL acc(eignfnu) - CALL eigsrt(du, eignfnu) + CALL eigsrt(eignval_u, eignfnu) END SUBROUTINE inifgn