5       SUBROUTINE filtreg_p ( champ,jjb,jje, ibeg, iend, nlat, nbniv, 
 
    6      &     ifiltre, iaire, griscal ,iter)
 
    9      &                              filtre_v_fft, filtre_inv_fft
 
   13      &                       matricevn, matricevs
 
   57 #include "dimensions.h" 
   61       INTEGER,
INTENT(IN) :: jjb,jje,ibeg,iend,nlat,nbniv,ifiltre,iter
 
   62       INTEGER,
INTENT(IN) :: iaire
 
   63       LOGICAL,
INTENT(IN) :: griscal
 
   64       REAL,
INTENT(INOUT) ::  champ( iip1,jjb:jje,nbniv)
 
   68       INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
 
   70       REAL :: champ_fft(iip1,jjb:jje,nbniv)
 
   73       LOGICAL,
SAVE     :: first=.
true.
 
   76       REAL, 
DIMENSION(iip1,jjb:jje,nbniv) :: champ_loc
 
   77       INTEGER :: ll_nb, nbniv_loc
 
   78       REAL, 
SAVE :: sdd12(
iim,4)
 
   81       INTEGER, 
PARAMETER :: type_sddu=1
 
   82       INTEGER, 
PARAMETER :: type_sddv=2
 
   83       INTEGER, 
PARAMETER :: type_unsddu=3
 
   84       INTEGER, 
PARAMETER :: type_unsddv=4
 
   86       INTEGER :: sdd1_type, sdd2_type
 
  104       IF(ifiltre.EQ.1.or.ifiltre.EQ.-1) 
 
  105      &     stop
'Pas de transformee simple dans cette version' 
  107       IF( iter.EQ. 2 )  
THEN 
  108          print *,
' Pas d iteration du filtre dans cette version !' 
  109      &        , 
' Utiliser old_filtreg et repasser !' 
  113       IF( ifiltre.EQ. -2 .AND..NOT.griscal )     
THEN 
  114          print *,
' Cette routine ne calcule le filtre inverse que ' 
  115      &        , 
' sur la grille des scalaires !' 
  119       IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )  
THEN 
  120          print *,
' Probleme dans filtreg car ifiltre NE 2 et NE -2' 
  121      &        , 
' corriger et repasser !' 
  131          IF( nlat. ne. 
jjp1 )  
THEN 
  136             IF( iaire.EQ.1 )  
THEN 
  137                sdd1_type = type_sddv
 
  138                sdd2_type = type_unsddv
 
  140                sdd1_type = type_unsddv
 
  141                sdd2_type = type_sddv
 
  150          IF( nlat.NE.jjm )  
THEN 
  155             IF( iaire.EQ.1 )  
THEN 
  156                sdd1_type = type_sddu
 
  157                sdd2_type = type_unsddu
 
  159                sdd1_type = type_unsddu
 
  160                sdd2_type = type_sddu
 
  172          IF ( hemisph.EQ.1 )  
THEN 
  174             jdfil = max(jdfil1,ibeg)
 
  175             jffil = min(jffil1,iend)
 
  178             jdfil = max(jdfil2,ibeg)
 
  179             jffil = min(jffil2,iend)
 
  200                      champ_loc(i,j,ll_nb) = 
 
  201      &                    champ(i,j,l) * sdd12(i,sdd1_type)
 
  209             IF( hemisph.EQ.1 )      
THEN 
  211                IF( ifiltre.EQ.-2 )   
THEN 
  214                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  216      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0,
 
  217      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  219                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  221      &                    champ_loc(1:
iim,j,1:nbniv_loc))
 
  225                ELSE IF ( griscal )     
THEN 
  228                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  230      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0,
 
  231      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  233                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  235      &                           champ_loc(1:
iim,j,1:nbniv_loc))
 
  242                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  243      &                    matricevn(1,1,j), 
iim, 
 
  244      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0, 
 
  245      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  247                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  248      &                    matmul(matricevn(1:
iim,1:
iim,j),           
 
  249      &                           champ_loc(1:
iim,j,1:nbniv_loc))
 
  257                IF( ifiltre.EQ.-2 )   
THEN 
  260                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  262      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0, 
 
  263      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  265                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  267      &                           champ_loc(1:
iim,j,1:nbniv_loc))
 
  271                ELSE IF ( griscal )     
THEN 
  275                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  277      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0, 
 
  278      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  280                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  282      &                           champ_loc(1:
iim,j,1:nbniv_loc))
 
  290                      CALL sgemm(
"N", 
"N", 
iim, nbniv_loc, 
iim, 1.0, 
 
  292      &                    champ_loc(1,j,1), iip1*(jje-jjb+1), 0.0, 
 
  293      &                    champ_fft(1,j,1), iip1*(jje-jjb+1))
 
  295                      champ_fft(1:
iim,j,1:nbniv_loc)=
 
  297      &                           champ_loc(1:
iim,j,1:nbniv_loc))
 
  305             IF( ifiltre.EQ.2 )  
THEN 
  318                         champ( i,j,l ) = (champ_loc(i,j,ll_nb) 
 
  319      &                       + champ_fft(i,j,ll_nb))
 
  320      &                       * sdd12(i,sdd2_type)
 
  334                         champ( i,j,l ) = (champ_loc(i,j,ll_nb) 
 
  335      &                       - champ_fft(i,j,ll_nb))
 
  336      &                       * sdd12(i,sdd2_type)
 
  348                   champ( iip1,j,l ) = champ( 1,j,l )
 
  363                      champ( i,j,l)= champ(i,j,l)*sdd12(i,sdd1_type)
 
  364                      champ_fft( i,j,l) = champ(i,j,l)
 
  370             IF (jdfil<=jffil) 
THEN 
  371                IF( ifiltre. eq. -2 )   
THEN 
  372                 CALL filtre_inv_fft(champ_fft,jjb,jje,jdfil,jffil,nbniv) 
 
  373                ELSE IF ( griscal )     
THEN 
  376                   CALL filtre_v_fft(champ_fft,jjb,jje,jdfil,jffil,nbniv)
 
  381             IF( ifiltre.EQ. 2 )  
THEN 
  386                         champ( i,j,l)=(champ(i,j,l)+champ_fft(i,j,l))
 
  387      &                       *sdd12(i,sdd2_type)
 
  398                         champ(i,j,l)=(champ(i,j,l)-champ_fft(i,j,l))
 
  399      &                       *sdd12(i,sdd2_type)
 
  411                   champ( iip1,j,l ) = champ( 1,j,l )
 
  433  1111 
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau  CHAMP a  
  434      &     filtrer, sur la grille des scalaires'/)
 
  435  2222 
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau CHAMP a fi 
  436      &     ltrer, sur la grille de V ou de Z'/)
 
!$Id!COMMON coefils sddu(iim)
 
subroutine filtre_u_fft(vect_inout, jjb, jje, jj_begin, jj_end, nbniv)
 
!$Id!COMMON coefils jfiltsu
 
!$Id!COMMON coefils unsddu(iim)
 
real, dimension(:,:,:), allocatable matriceus
 
real, dimension(:,:,:), allocatable matrinvs
 
subroutine filtreg_p(champ, ibeg, iend, nlat, nbniv, ifiltre, iaire, griscal, iter)
 
subroutine, public start_timer
 
!$Id!COMMON coefils jfiltsv
 
logical, save use_filtre_fft
 
!$Id!COMMON coefils jfiltnu
 
subroutine, public stop_timer
 
!$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
 
subroutine, public init_timer
 
c c zjulian c cym CALL iim cym klev iim
 
real, dimension(:,:,:), allocatable matriceun