5 SUBROUTINE filtreg_p ( champ,jjb,jje, ibeg, iend, nlat, nbniv,
6 & ifiltre, iaire, griscal ,iter)
55 #include "dimensions.h"
59 INTEGER jjb,jje,ibeg,iend,nlat,nbniv,ifiltre,iter
62 INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
64 REAL champ( iip1,jjb:jje,nbniv)
67 INTEGER hemisph, iaire
69 REAL :: champ_fft(iip1,jjb:jje,nbniv)
70 REAL :: champ_in(iip1,jjb:jje,nbniv)
72 LOGICAL,
SAVE :: first=.true.
75 REAL,
DIMENSION(iip1,jjb:jje,nbniv) :: champ_loc
76 INTEGER :: ll_nb, nbniv_loc
77 REAL,
SAVE :: sdd12(
iim,4)
80 INTEGER,
PARAMETER :: type_sddu=1
81 INTEGER,
PARAMETER :: type_sddv=2
82 INTEGER,
PARAMETER :: type_unsddu=3
83 INTEGER,
PARAMETER :: type_unsddv=4
85 INTEGER :: sdd1_type, sdd2_type
103 IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)
104 & stop
'Pas de transformee simple dans cette version'
106 IF( iter.EQ. 2 )
THEN
107 print *,
' Pas d iteration du filtre dans cette version !'
108 & ,
' Utiliser old_filtreg et repasser !'
112 IF( ifiltre.EQ. -2 .AND..NOT.griscal )
THEN
113 print *,
' Cette routine ne calcule le filtre inverse que '
114 & ,
' sur la grille des scalaires !'
118 IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )
THEN
119 print *,
' Probleme dans filtreg car ifiltre NE 2 et NE -2'
120 & ,
' corriger et repasser !'
130 IF( nlat. ne.
jjp1 )
THEN
135 IF( iaire.EQ.1 )
THEN
136 sdd1_type = type_sddv
137 sdd2_type = type_unsddv
139 sdd1_type = type_unsddv
140 sdd2_type = type_sddv
149 IF( nlat.NE.jjm )
THEN
154 IF( iaire.EQ.1 )
THEN
155 sdd1_type = type_sddu
156 sdd2_type = type_unsddu
158 sdd1_type = type_unsddu
159 sdd2_type = type_sddu
171 IF ( hemisph.EQ.1 )
THEN
173 jdfil = max(jdfil1,ibeg)
174 jffil = min(jffil1,iend)
177 jdfil = max(jdfil2,ibeg)
178 jffil = min(jffil2,iend)
186 IF (.NOT. use_filtre_fft)
THEN
199 champ_loc(
i,
j,ll_nb) =
200 & champ(
i,
j,
l) * sdd12(
i,sdd1_type)
208 IF( hemisph.EQ.1 )
THEN
210 IF( ifiltre.EQ.-2 )
THEN
213 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
214 & matrinvn(1,1,
j),
iim,
215 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
216 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
219 & matmul(matrinvn(:,:,
j),champ_loc(:
iim,
j,:))
223 ELSE IF ( griscal )
THEN
226 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
227 & matriceun(1,1,
j),
iim,
228 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
229 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
232 & matmul(matriceun(:,:,
j),champ_loc(:
iim,
j,:))
239 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
240 & matricevn(1,1,
j),
iim,
241 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
242 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
245 & matmul(matricevn(:,:,
j),champ_loc(:
iim,
j,:))
253 IF( ifiltre.EQ.-2 )
THEN
256 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
258 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
259 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
263 & champ_loc(:
iim,
j,:))
267 ELSE IF ( griscal )
THEN
271 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
273 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
274 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
277 & matmul(matriceus(:,:,
j-
jfiltsu+1),
278 & champ_loc(:
iim,
j,:))
286 CALL sgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
288 & champ_loc(1,
j,1), iip1*(jje-jjb+1), 0.0,
289 & champ_fft(1,
j,1), iip1*(jje-jjb+1))
292 & matmul(matricevs(:,:,
j-
jfiltsv+1),
293 & champ_loc(:
iim,
j,:))
301 IF( ifiltre.EQ.2 )
THEN
314 champ(
i,
j,
l ) = (champ_loc(
i,
j,ll_nb)
315 & + champ_fft(
i,
j,ll_nb))
316 & * sdd12(
i,sdd2_type)
330 champ(
i,
j,
l ) = (champ_loc(
i,
j,ll_nb)
331 & - champ_fft(
i,
j,ll_nb))
332 & * sdd12(
i,sdd2_type)
343 champ( iip1,
j,
l ) = champ( 1,
j,
l )
358 champ(
i,
j,
l)= champ(
i,
j,
l)*sdd12(
i,sdd1_type)
359 champ_fft(
i,
j,
l) = champ(
i,
j,
l)
365 IF (jdfil<=jffil)
THEN
366 IF( ifiltre. eq. -2 )
THEN
368 ELSE IF ( griscal )
THEN
376 IF( ifiltre.EQ. 2 )
THEN
381 champ(
i,
j,
l)=(champ(
i,
j,
l)+champ_fft(
i,
j,
l))
382 & *sdd12(
i,sdd2_type)
393 champ(
i,
j,
l)=(champ(
i,
j,
l)-champ_fft(
i,
j,
l))
394 & *sdd12(
i,sdd2_type)
405 champ( iip1,
j,
l ) = champ( 1,
j,
l )
428 'ERREUR dans le dimensionnement du tableau CHAMP a & filtrer, sur la grille des scalaires'/)
430 'ERREUR dans le dimensionnement du tableau CHAMP a fi & ltrer, sur la grille de V ou de Z'/)