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)
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,
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,:)
221 ELSE IF ( griscal )
THEN
224 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
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,:)
237 CALL dgemm(
"N",
"N",
iim, nbniv_loc,
iim, 1.0,
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,:)
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,:)
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,:)
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,:)
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 )
425 1111
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau CHAMP a
426 & filtrer, sur la grille des scalaires'/)
427 2222
FORMAT(//20
x,
'ERREUR dans le dimensionnement du tableau CHAMP a fi
428 & ltrer, sur la grille de V ou de Z'/)
!$Id!COMMON coefils sddu(iim)
!$Id!COMMON coefils jfiltsu
!$Id!COMMON coefils unsddu(iim)
subroutine filtre_u_fft(vect_inout, nlat, jj_begin, jj_end, nbniv)
real, dimension(:,:,:), allocatable matriceus
logical, save use_filtre_fft
real, dimension(:,:,:), allocatable matrinvs
subroutine filtreg_p(champ, ibeg, iend, nlat, nbniv, ifiltre, iaire, griscal, iter)
subroutine, public start_timer
subroutine filtre_v_fft(vect_inout, nlat, jj_begin, jj_end, nbniv)
!$Id!COMMON coefils jfiltsv
!$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
real, dimension(:,:,:), allocatable matricevn
real, dimension(:,:,:), allocatable matricevs
subroutine filtre_inv_fft(vect_inout, nlat, jj_begin, jj_end, nbniv)