4       SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire,
 
   48 #include "dimensions.h" 
   52       INTEGER    nlat,nbniv,ifiltre,iter
 
   55       INTEGER    jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
 
   57       REAL       champ( iip1,nlat,nbniv)
 
   59       REAL       eignq(
iim,nlat,nbniv), sdd1(
iim),sdd2(
iim)
 
   61       INTEGER    hemisph, iaire
 
   63       LOGICAL,
SAVE     :: first=.
true.
 
   65       REAL, 
SAVE :: sdd12(
iim,4)
 
   67       INTEGER, 
PARAMETER :: type_sddu=1
 
   68       INTEGER, 
PARAMETER :: type_sddv=2
 
   69       INTEGER, 
PARAMETER :: type_unsddu=3
 
   70       INTEGER, 
PARAMETER :: type_unsddv=4
 
   72       INTEGER :: sdd1_type, sdd2_type
 
   83       IF(ifiltre.EQ.1.or.ifiltre.EQ.-1) 
 
   84      &     stop
'Pas de transformee simple dans cette version' 
   87          print *,
' Pas d iteration du filtre dans cette version !' 
   88      &        , 
' Utiliser old_filtreg et repasser !' 
   92       IF( ifiltre.EQ. -2 .AND..NOT.griscal )     
THEN 
   93          print *,
' Cette routine ne calcule le filtre inverse que ' 
   94      &        , 
' sur la grille des scalaires !' 
   98       IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )  
THEN 
   99          print *,
' Probleme dans filtreg car ifiltre NE 2 et NE -2' 
  100      &        , 
' corriger et repasser !' 
  108          IF( nlat. ne. 
jjp1 )  
THEN 
  113             IF( iaire.EQ.1 )  
THEN 
  114                sdd1_type = type_sddv
 
  115                sdd2_type = type_unsddv
 
  117                sdd1_type = type_unsddv
 
  118                sdd2_type = type_sddv
 
  135          IF( nlat.NE.jjm )  
THEN 
  140             IF( iaire.EQ.1 )  
THEN 
  141                sdd1_type = type_sddu
 
  142                sdd2_type = type_unsddu
 
  144                sdd1_type = type_unsddu
 
  145                sdd2_type = type_sddu
 
  165          IF ( hemisph.EQ.1 )  
THEN 
  176                   champ(i,j,l) = champ(i,j,l) * sdd12(i,sdd1_type) 
 
  181          IF( hemisph. eq. 1 )      
THEN 
  183             IF( ifiltre. eq. -2 )   
THEN 
  187                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  189      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  190      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  197             ELSE IF ( griscal )     
THEN 
  201                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  203      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  204      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  215                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  217      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  218      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  229             IF( ifiltre. eq. -2 )   
THEN 
  233                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  235      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  236      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  245             ELSE IF ( griscal )     
THEN 
  249                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  251      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  252      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  264                   CALL sgemm(
"N", 
"N", 
iim, nbniv, 
iim, 1.0, 
 
  266      &                 
iim, champ(1,j,1), iip1*nlat, 0.0,
 
  267      &                 eignq(1,j-jdfil+1,1), 
iim*nlat)
 
  279          IF( ifiltre.EQ. 2 )  
THEN 
  285      &                    (champ(i,j,l) + eignq(i,j-jdfil+1,l))
 
  286      &                    * sdd12(i,sdd2_type) 
 
  297      &                    (champ(i,j,l) - eignq(i,j-jdfil+1,l))
 
  298      &                    * sdd12(i,sdd2_type) 
 
  307                champ( iip1,j,l ) = champ( 1,j,l )
 
  314 1111  
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau  CHAMP a  
  315      &     filtrer, sur la grille des scalaires'/)
 
  316 2222  
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau CHAMP a fi 
  317      &     ltrer, sur la grille de V ou de Z'/)
 
!$Id!COMMON coefils sddu(iim)
 
!$Id!COMMON coefils jfiltsu
 
!$Id!COMMON coefils unsddu(iim)
 
real, dimension(:,:,:), allocatable matriceus
 
real, dimension(:,:,:), allocatable matrinvs
 
!$Id!COMMON coefils jfiltsv
 
!$Id!COMMON coefils jfiltnu
 
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
 
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
 
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
 
!$Id!COMMON coefils sddv(iim)&&
 
!$Id!COMMON coefils unsddv(iim)
 
real, dimension(:,:,:), allocatable matrinvn
 
!$Id!COMMON coefils jfiltnv
 
c c zjulian c cym CALL iim cym klev iim
 
subroutine filtreg(champ, nlat, nbniv, ifiltre, iaire, griscal, iter)
 
real, dimension(:,:,:), allocatable matriceun
 
real, dimension(:,:,:), allocatable matricevn
 
real, dimension(:,:,:), allocatable matricevs