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