3 SUBROUTINE filtreg_p ( champ, ibeg, iend, nlat, nbniv,
4 & ifiltre, iaire, griscal ,iter)
53 #include "dimensions.h"
57 INTEGER ibeg,iend,nlat,nbniv,ifiltre,iter
60 INTEGER jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil
62 REAL champ( iip1,nlat,nbniv)
65 INTEGER hemisph, iaire
67 REAL :: champ_fft(iip1,nlat,nbniv)
68 REAL :: champ_in(iip1,nlat,nbniv)
70 LOGICAL,
SAVE :: first=.true.
73 REAL,
DIMENSION(iip1,nlat,nbniv) :: champ_loc
74 INTEGER :: ll_nb, nbniv_loc
75 REAL,
SAVE :: sdd12(
iim,4)
78 INTEGER,
PARAMETER :: type_sddu=1
79 INTEGER,
PARAMETER :: type_sddv=2
80 INTEGER,
PARAMETER :: type_unsddu=3
81 INTEGER,
PARAMETER :: type_unsddv=4
83 INTEGER :: sdd1_type, sdd2_type
101 IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)
102 & stop
'Pas de transformee simple dans cette version'
104 IF( iter.EQ. 2 )
THEN
105 print *,
' Pas d iteration du filtre dans cette version !'
106 & ,
' Utiliser old_filtreg et repasser !'
110 IF( ifiltre.EQ. -2 .AND..NOT.griscal )
THEN
111 print *,
' Cette routine ne calcule le filtre inverse que '
112 & ,
' sur la grille des scalaires !'
116 IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 )
THEN
117 print *,
' Probleme dans filtreg car ifiltre NE 2 et NE -2'
118 & ,
' corriger et repasser !'
128 IF( nlat. ne.
jjp1 )
THEN
133 IF( iaire.EQ.1 )
THEN
134 sdd1_type = type_sddv
135 sdd2_type = type_unsddv
137 sdd1_type = type_unsddv
138 sdd2_type = type_sddv
147 IF( nlat.NE.jjm )
THEN
152 IF( iaire.EQ.1 )
THEN
153 sdd1_type = type_sddu
154 sdd2_type = type_unsddu
156 sdd1_type = type_unsddu
157 sdd2_type = type_sddu
169 IF ( hemisph.EQ.1 )
THEN
171 jdfil = max(jdfil1,ibeg)
172 jffil = min(jffil1,iend)
175 jdfil = max(jdfil2,ibeg)
176 jffil = min(jffil2,iend)
184 IF (.NOT. use_filtre_fft)
THEN
197 champ_loc(
i,
j,ll_nb) =
198 & champ(
i,
j,
l) * sdd12(
i,sdd1_type)
206 IF( hemisph.EQ.1 )
THEN
208 IF( ifiltre.EQ.-2 )
THEN
211 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
212 & matrinvn(1,1,
j),
iim,
213 & champ_loc(1,
j,1), iip1*nlat, 0.0,
214 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
216 champ_fft(:
iim,
j-jdfil+1,:)
217 & =matmul(matrinvn(:,:,
j),champ_loc(:
iim,
j,:))
221 ELSE IF ( griscal )
THEN
224 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
225 & matriceun(1,1,
j),
iim,
226 & champ_loc(1,
j,1), iip1*nlat, 0.0,
227 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
229 champ_fft(:
iim,
j-jdfil+1,:)
230 & =matmul(matriceun(:,:,
j),champ_loc(:
iim,
j,:))
237 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
238 & matricevn(1,1,
j),
iim,
239 & champ_loc(1,
j,1), iip1*nlat, 0.0,
240 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
242 champ_fft(:
iim,
j-jdfil+1,:)
243 & =matmul(matricevn(:,:,
j),champ_loc(:
iim,
j,:))
251 IF( ifiltre.EQ.-2 )
THEN
254 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
256 & champ_loc(1,
j,1), iip1*nlat, 0.0,
257 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
259 champ_fft(:
iim,
j-jdfil+1,:)
260 & =matmul(matrinvs(:,:,
j-
jfiltsu+1),
261 & champ_loc(:
iim,
j,:))
265 ELSE IF ( griscal )
THEN
269 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
271 & champ_loc(1,
j,1), iip1*nlat, 0.0,
272 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
274 champ_fft(:
iim,
j-jdfil+1,:)
275 & =matmul(matriceus(:,:,
j-
jfiltsu+1),
276 & champ_loc(:
iim,
j,:))
284 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
286 & champ_loc(1,
j,1), iip1*nlat, 0.0,
287 & champ_fft(1,
j-jdfil+1,1), iip1*nlat)
289 champ_fft(:
iim,
j-jdfil+1,:)
290 & =matmul(matricevs(:,:,
j-
jfiltsv+1),
291 & champ_loc(:
iim,
j,:))
299 IF( ifiltre.EQ.2 )
THEN
312 champ(
i,
j,
l ) = (champ_loc(
i,
j,ll_nb)
313 & + champ_fft(
i,
j-jdfil+1,ll_nb))
314 & * sdd12(
i,sdd2_type)
328 champ(
i,
j,
l ) = (champ_loc(
i,
j,ll_nb)
329 & - champ_fft(
i,
j-jdfil+1,ll_nb))
330 & * sdd12(
i,sdd2_type)
341 champ( iip1,
j,
l ) = champ( 1,
j,
l )
356 champ(
i,
j,
l)= champ(
i,
j,
l)*sdd12(
i,sdd1_type)
357 champ_fft(
i,
j,
l) = champ(
i,
j,
l)
363 IF (jdfil<=jffil)
THEN
364 IF( ifiltre. eq. -2 )
THEN
366 ELSE IF ( griscal )
THEN
374 IF( ifiltre.EQ. 2 )
THEN
379 champ(
i,
j,
l)=(champ(
i,
j,
l)+champ_fft(
i,
j,
l))
380 & *sdd12(
i,sdd2_type)
391 champ(
i,
j,
l)=(champ(
i,
j,
l)-champ_fft(
i,
j,
l))
392 & *sdd12(
i,sdd2_type)
403 champ( iip1,
j,
l ) = champ( 1,
j,
l )
426 'ERREUR dans le dimensionnement du tableau CHAMP a & filtrer, sur la grille des scalaires'/)
428 'ERREUR dans le dimensionnement du tableau CHAMP a fi & ltrer, sur la grille de V ou de Z'/)