--- trunk/libf/filtrez/filtreg.f90 2010/04/01 09:07:28 30 +++ trunk/filtrez/filtreg.f90 2013/11/15 18:45:49 76 @@ -4,18 +4,17 @@ contains - SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal, iter) + SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal) ! From filtrez/filtreg.F, version 1.1.1.1, 2004/05/19 12:53:09 - ! Author: P. Le Van ! Objet : filtre matriciel longitudinal, avec les matrices précalculées ! pour l'opérateur filtre. - USE dimens_m, ONLY : iim, jjm - USE parafilt, ONLY : nfilun, nfilus, nfilvn, nfilvs - USE coefils, ONLY : jfiltnu, jfiltnv, jfiltsu, jfiltsv, sddu, sddv, & - unsddu, unsddv + USE coefils, ONLY: sddu, sddv, unsddu, unsddv + USE dimens_m, ONLY: iim, jjm + use inifilr_m, only: jfiltnu, jfiltnv, jfiltsu, jfiltsv, matriceun, & + matriceus, matricevn, matricevs, matrinvn, matrinvs INTEGER, intent(in):: nlat ! nombre de latitudes a filtrer integer, intent(in):: nbniv ! nombre de niveaux verticaux a filtrer @@ -39,51 +38,40 @@ ! 1 si champ intensif ! 2 si champ extensif (pondere par les aires) - integer, intent(in):: iter - ! 1 filtre simple - LOGICAL, intent(in):: griscal ! Variables local to the procedure: INTEGER jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil INTEGER i, j, l, k - REAL matriceun, matriceus, matricevn, matricevs, matrinvn, matrinvs - COMMON /matrfil/matriceun(iim, iim, nfilun), matriceus(iim, iim, nfilus), & - matricevn(iim, iim, nfilvn), matricevs(iim, iim, nfilvs), & - matrinvn(iim, iim, nfilun), matrinvs(iim, iim, nfilus) REAL eignq(iim), sdd1(iim), sdd2(iim) INTEGER hemisph !----------------------------------------------------------- - IF (ifiltre==1 .OR. ifiltre==-1) STOP & - 'Pas de transformee simple dans cette version' - - IF (iter==2) THEN - PRINT *, ' Pas d iteration du filtre dans cette version !', & - ' Utiliser old_filtreg et repasser !' - STOP - END IF + IF (ifiltre==1 .OR. ifiltre==-1) then + print *, 'Pas de transformee simple dans cette version' + STOP 1 + end IF IF (ifiltre==-2 .AND. .NOT. griscal) THEN PRINT *, ' Cette routine ne calcule le filtre inverse que ', & ' sur la grille des scalaires !' - STOP + STOP 1 END IF IF (ifiltre/=2 .AND. ifiltre/=-2) THEN PRINT *, ' Probleme dans filtreg car ifiltre NE 2 et NE -2', & ' corriger et repasser !' - STOP + STOP 1 END IF IF (griscal) THEN IF (nlat /= jjm + 1) THEN - PRINT 1111 - STOP + PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' & + // 'filtrer, sur la grille des scalaires' + STOP 1 ELSE - IF (iaire==1) THEN sdd1 = sddv sdd2 = unsddv @@ -98,11 +86,11 @@ jffil2 = jjm END IF ELSE - IF (nlat/=jjm) THEN - PRINT 2222 - STOP + IF (nlat /= jjm) THEN + PRINT *, 'Erreur dans le dimensionnement du tableau CHAMP a ' & + // 'filtrer, sur la grille de V ou de Z' + STOP 1 ELSE - IF (iaire==1) THEN sdd1 = sddu sdd2 = unsddu @@ -118,9 +106,7 @@ END IF END IF - DO hemisph = 1, 2 - IF (hemisph==1) THEN jdfil = jdfil1 jffil = jffil1 @@ -129,21 +115,16 @@ jffil = jffil2 END IF - - DO l = 1, nbniv - DO j = jdfil, jffil - - + loop_vertical: DO l = 1, nbniv + loop_latitude: DO j = jdfil, jffil DO i = 1, iim champ(i, j, l) = champ(i, j, l)*sdd1(i) END DO - IF (hemisph==1) THEN - IF (ifiltre==-2) THEN DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO k = 1, iim DO i = 1, iim @@ -152,29 +133,29 @@ END DO ELSE IF (griscal) THEN DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO i = 1, iim DO k = 1, iim - eignq(k) = eignq(k) + matriceun(k, i, j)*champ(i, j, l) + eignq(k) = eignq(k) + matriceun(k, i, j) & + * champ(i, j, l) END DO END DO ELSE DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO i = 1, iim DO k = 1, iim - eignq(k) = eignq(k) + matricevn(k, i, j)*champ(i, j, l) + eignq(k) = eignq(k) + matricevn(k, i, j) & + * champ(i, j, l) END DO END DO END IF - ELSE - IF (ifiltre==-2) THEN DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO i = 1, iim DO k = 1, iim @@ -184,7 +165,7 @@ END DO ELSE IF (griscal) THEN DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO i = 1, iim DO k = 1, iim @@ -194,7 +175,7 @@ END DO ELSE DO k = 1, iim - eignq(k) = 0.0 + eignq(k) = 0. END DO DO i = 1, iim DO k = 1, iim @@ -203,7 +184,6 @@ END DO END DO END IF - END IF IF (ifiltre==2) THEN @@ -217,18 +197,10 @@ END IF champ(iim + 1, j, l) = champ(1, j, l) - - END DO - - END DO - + END DO loop_latitude + END DO loop_vertical end DO -1111 FORMAT (//20X, 'ERREUR dans le dimensionnement du tableau & - & CHAMP a filtrer, sur la grille des scalaires'/) -2222 FORMAT (//20X, 'ERREUR dans le dimensionnement du tableau & - &CHAMP a filtrer, sur la grille de V ou de Z'/) - END SUBROUTINE filtreg end module filtreg_m