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)
193 $ = matmul(matrinvn(:,:,
j), champ(:
iim,
j,:))
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)
207 $ = matmul(matriceun(:,:,
j), champ(:
iim,
j,:))
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)
221 $ = matmul(matricevn(:,:,
j), champ(:
iim,
j,:))
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)
239 $ = matmul(matrinvs(:,:,
j-
jfiltsu+1),
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)
255 $ = matmul(matriceus(:,:,
j-
jfiltsu+1),
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)
270 $ = matmul(matricevs(:,:,
j-
jfiltsv+1),
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 )
315 'ERREUR dans le dimensionnement du tableau CHAMP a & filtrer, sur la grille des scalaires'/)
317 'ERREUR dans le dimensionnement du tableau CHAMP a fi & ltrer, sur la grille de V ou de Z'/)