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