Changeset 5106 for LMDZ6/branches/Amaury_dev/libf/filtrez
- Timestamp:
- Jul 23, 2024, 10:21:18 PM (7 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/filtrez
- Files:
-
- 4 deleted
- 1 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/filtrez/inifgn.f90
r5105 r5106 1 2 1 ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/inifgn.F,v 1.1.1.1 2004-05-19 12:53:09 lmdzadmin Exp $ 3 2 … … 6 5 ! ... H.Upadyaya , O.Sharma ... 7 6 ! 7 USE lmdz_coefils, ONLY: sddv, sddu, unsddu, unsddv, eignfnv, eignfnu 8 8 IMPLICIT NONE 9 9 ! … … 11 11 include "paramet.h" 12 12 include "comgeom.h" 13 14 13 ! 15 REAL :: vec(iim, iim),vec1(iim,iim)16 REAL :: dlonu(iim), dlonv(iim)17 REAL :: du(iim), dv(iim),d(iim)14 REAL :: vec(iim, iim), vec1(iim, iim) 15 REAL :: dlonu(iim), dlonv(iim) 16 REAL :: du(iim), dv(iim), d(iim) 18 17 REAL :: pi 19 INTEGER :: i,j,k,imm1,nrot 20 ! 21 include "coefils.h" 22 ! 23 EXTERNAL SSUM, acc,eigen,jacobi 18 INTEGER :: i, j, k, imm1, nrot 19 EXTERNAL SSUM, acc, eigen, jacobi 24 20 REAL :: SSUM 25 21 ! 26 22 27 imm1 = iim -128 pi = 2. * ASIN(1.)23 imm1 = iim - 1 24 pi = 2. * ASIN(1.) 29 25 ! 30 DO i =1,iim31 dlonu(i)= xprimu( i)32 dlonv(i)= xprimv( i)26 DO i = 1, iim 27 dlonu(i) = xprimu(i) 28 dlonv(i) = xprimv(i) 33 29 END DO 34 30 35 DO i =1,iim36 sddv(i)= SQRT(dlonv(i))37 sddu(i)= SQRT(dlonu(i))38 unsddu(i) = 1./sddu(i)39 unsddv(i) = 1./sddv(i)31 DO i = 1, iim 32 sddv(i) = SQRT(dlonv(i)) 33 sddu(i) = SQRT(dlonu(i)) 34 unsddu(i) = 1. / sddu(i) 35 unsddv(i) = 1. / sddv(i) 40 36 END DO 41 37 ! 42 DO j =1,iim43 DO i=1,iim44 vec(i,j)= 0.45 vec1(i,j)= 0.46 eignfnv(i,j) = 0.47 eignfnu(i,j) = 0.48 END DO38 DO j = 1, iim 39 DO i = 1, iim 40 vec(i, j) = 0. 41 vec1(i, j) = 0. 42 eignfnv(i, j) = 0. 43 eignfnu(i, j) = 0. 44 END DO 49 45 END DO 50 46 ! 51 47 ! 52 eignfnv(1, 1)= -1.53 eignfnv(iim, 1) =1.54 DO i =1,imm155 eignfnv(i+1,i+1)= -1.56 eignfnv(i,i+1) =1.48 eignfnv(1, 1) = -1. 49 eignfnv(iim, 1) = 1. 50 DO i = 1, imm1 51 eignfnv(i + 1, i + 1) = -1. 52 eignfnv(i, i + 1) = 1. 57 53 END DO 58 DO j=1,iim 59 DO i=1,iim 60 eignfnv(i,j) = eignfnv(i,j)/(sddu(i)*sddv(j)) 54 DO j = 1, iim 55 DO i = 1, iim 56 eignfnv(i, j) = eignfnv(i, j) / (sddu(i) * sddv(j)) 57 END DO 61 58 END DO 62 END DO 63 DO j=1,iim 64 DO i=1,iim 65 eignfnu(i,j) = -eignfnv(j,i) 66 END DO 59 DO j = 1, iim 60 DO i = 1, iim 61 eignfnu(i, j) = -eignfnv(j, i) 62 END DO 67 63 END DO 68 64 ! 69 65 DO j = 1, iim 70 DO i = 1, iim71 vec (i,j) = 0.072 vec1(i,j) = 0.073 DO k = 1, iim74 vec (i,j) = vec(i,j) + eignfnu(i,k) * eignfnv(k,j)75 vec1(i,j) = vec1(i,j) + eignfnv(i,k) * eignfnu(k,j)76 ENDDO77 ENDDO66 DO i = 1, iim 67 vec (i, j) = 0.0 68 vec1(i, j) = 0.0 69 DO k = 1, iim 70 vec (i, j) = vec(i, j) + eignfnu(i, k) * eignfnv(k, j) 71 vec1(i, j) = vec1(i, j) + eignfnv(i, k) * eignfnu(k, j) 72 ENDDO 73 ENDDO 78 74 ENDDO 79 75 80 76 ! 81 CALL jacobi(vec, iim,iim,dv,eignfnv,nrot)82 CALL acc(eignfnv, d,iim)83 CALL eigen_sort(dv, eignfnv,iim,iim)77 CALL jacobi(vec, iim, iim, dv, eignfnv, nrot) 78 CALL acc(eignfnv, d, iim) 79 CALL eigen_sort(dv, eignfnv, iim, iim) 84 80 ! 85 CALL jacobi(vec1, iim,iim,du,eignfnu,nrot)86 CALL acc(eignfnu, d,iim)87 CALL eigen_sort(du, eignfnu,iim,iim)81 CALL jacobi(vec1, iim, iim, du, eignfnu, nrot) 82 CALL acc(eignfnu, d, iim) 83 CALL eigen_sort(du, eignfnu, iim, iim) 88 84 89 85 !c ancienne version avec appels IMSL -
LMDZ6/branches/Amaury_dev/libf/filtrez/lmdz_coefils.f90
r5104 r5106 1 ! $Id $ 2 ! replacement for coefils.h 3 MODULE lmdz_coefils 4 IMPLICIT NONE; PRIVATE 5 INCLUDE "dimensions.h" 6 PUBLIC jfiltnu, jfiltsu, jfiltnv, jfiltsv, sddu, sddv, unsddu, unsddv, coefilu, coefilv, & 7 modfrstu, modfrstv, eignfnu, eignfnv, coefilu2, coefilv2 1 8 2 ! $Id $ 3 4 COMMON/coefils/jfiltnu,jfiltsu,jfiltnv,jfiltsv,sddu(iim),sddv(iim)& 5 & ,unsddu(iim),unsddv(iim),coefilu(iim,jjm),coefilv(iim,jjm), & 6 & modfrstu(jjm),modfrstv(jjm),eignfnu(iim,iim),eignfnv(iim,iim) & 7 & ,coefilu2(iim,jjm),coefilv2(iim,jjm) 8 !c 9 INTEGER jfiltnu ! index of the last lat line filtered in NH (U grid) 10 INTEGER jfiltsu ! index of the first lat line filtered in SH (U grid) 11 INTEGER jfiltnv ! index of the last lat line filtered in NH (V grid) 12 INTEGER jfiltsv ! index of the first lat line filtered in SH (V grid) 13 INTEGER modfrstu ! number of retained (ie: unfiltered) modes on U grid 14 INTEGER modfrstv ! number of retained (ie: unfiltered) modes on V grid 15 REAL sddu,sddv,unsddu,unsddv,coefilu,coefilv,eignfnu,eignfnv 16 REAL coefilu2,coefilv2 9 INTEGER :: jfiltnu ! index of the last lat line filtered in NH (U grid) 10 INTEGER :: jfiltsu ! index of the first lat line filtered in SH (U grid) 11 INTEGER :: jfiltnv ! index of the last lat line filtered in NH (V grid) 12 INTEGER :: jfiltsv ! index of the first lat line filtered in SH (V grid) 13 INTEGER, DIMENSION(jjm) :: modfrstu ! number of retained (ie: unfiltered) modes on U grid 14 INTEGER, DIMENSION(jjm) :: modfrstv ! number of retained (ie: unfiltered) modes on V grid 15 REAL, DIMENSION(iim) :: sddu, sddv, unsddu, unsddv 16 REAL, DIMENSION(iim, jjm) :: coefilu, coefilv, coefilu2, coefilv2 17 REAL, DIMENSION(iim, iim) :: eignfnu, eignfnv 18 END MODULE lmdz_coefils -
LMDZ6/branches/Amaury_dev/libf/filtrez/lmdz_filtreg.F90
r5105 r5106 1 2 1 ! $Id$ 3 2 4 MODULE filtreg_mod 5 6 REAL, DIMENSION(:,:,:), ALLOCATABLE :: matriceun,matriceus,matricevn 7 REAL, DIMENSION(:,:,:), ALLOCATABLE :: matricevs,matrinvn,matrinvs 3 MODULE lmdz_filtreg 4 IMPLICIT NONE; PRIVATE 5 PUBLIC matriceun, matriceus, matricevn, matricevs, matrinvn, matrinvs, & 6 inifilr, filtreg 7 8 REAL, DIMENSION(:, :, :), ALLOCATABLE :: matriceun, matriceus, matricevn 9 REAL, DIMENSION(:, :, :), ALLOCATABLE :: matricevs, matrinvn, matrinvs 8 10 9 11 CONTAINS 12 13 SUBROUTINE filtreg(champ, nlat, nbniv, ifiltre, iaire, & 14 griscal, iter) 15 USE lmdz_coefils, ONLY: jfiltnu, jfiltnv, jfiltsu, jfiltsv, sddu, sddv, unsddu, unsddv, modfrstv, modfrstu 16 17 !======================================================================= 18 ! 19 ! Auteur: P. Le Van 07/10/97 20 ! ------ 21 ! 22 ! Objet: filtre matriciel longitudinal ,avec les matrices precalculees 23 ! pour l'operateur Filtre . 24 ! ------ 25 ! 26 ! Arguments: 27 ! ---------- 28 ! 29 ! nblat nombre de latitudes a filtrer 30 ! nbniv nombre de niveaux verticaux a filtrer 31 ! champ(iip1,nblat,nbniv) en entree : champ a filtrer 32 ! en sortie : champ filtre 33 ! ifiltre +1 Transformee directe 34 ! -1 Transformee inverse 35 ! +2 Filtre directe 36 ! -2 Filtre inverse 37 ! 38 ! iaire 1 si champ intensif 39 ! 2 si champ extensif (pondere par les aires) 40 ! 41 ! iter 1 filtre simple 42 ! 43 !======================================================================= 44 ! 45 ! 46 ! Variable Intensive 47 ! ifiltre = 1 filtre directe 48 ! ifiltre =-1 filtre inverse 49 ! 50 ! Variable Extensive 51 ! ifiltre = 2 filtre directe 52 ! ifiltre =-2 filtre inverse 53 ! 54 ! 55 INCLUDE "dimensions.h" 56 INCLUDE "paramet.h" 57 58 INTEGER :: nlat, nbniv, ifiltre, iter 59 INTEGER :: i, j, l, k 60 INTEGER :: iim2, immjm 61 INTEGER :: jdfil1, jdfil2, jffil1, jffil2, jdfil, jffil 62 63 REAL :: champ(iip1, nlat, nbniv) 64 65 REAL :: eignq(iim, nlat, nbniv), sdd1(iim), sdd2(iim) 66 LOGICAL :: griscal 67 INTEGER :: hemisph, iaire 68 69 LOGICAL, SAVE :: first = .TRUE. 70 71 REAL, SAVE :: sdd12(iim, 4) 72 73 INTEGER, PARAMETER :: type_sddu = 1 74 INTEGER, PARAMETER :: type_sddv = 2 75 INTEGER, PARAMETER :: type_unsddu = 3 76 INTEGER, PARAMETER :: type_unsddv = 4 77 78 INTEGER :: sdd1_type, sdd2_type 79 80 if (iim == 1) return ! no filtre in 2D y-z 81 82 IF (first) THEN 83 sdd12(1:iim, type_sddu) = sddu(1:iim) 84 sdd12(1:iim, type_sddv) = sddv(1:iim) 85 sdd12(1:iim, type_unsddu) = unsddu(1:iim) 86 sdd12(1:iim, type_unsddv) = unsddv(1:iim) 87 88 first = .FALSE. 89 ENDIF 90 91 IF(ifiltre==1.or.ifiltre==-1) & 92 stop 'Pas de transformee simple dans cette version' 93 94 IF(iter== 2) THEN 95 PRINT *, ' Pas d iteration du filtre dans cette version !'& 96 &, ' Utiliser old_filtreg et repasser !' 97 STOP 98 ENDIF 99 100 IF(ifiltre== -2 .AND..NOT.griscal) THEN 101 PRINT *, ' Cette routine ne calcule le filtre inverse que ' & 102 , ' sur la grille des scalaires !' 103 STOP 104 ENDIF 105 106 IF(ifiltre/=2 .AND.ifiltre/= - 2) THEN 107 PRINT *, ' Probleme dans filtreg car ifiltre NE 2 et NE -2' & 108 , ' corriger et repasser !' 109 STOP 110 ENDIF 111 112 iim2 = iim * iim 113 immjm = iim * jjm 114 115 IF(griscal) THEN 116 IF(nlat /= jjp1) THEN 117 PRINT 1111 118 STOP 119 ELSE 120 121 IF(iaire==1) THEN 122 sdd1_type = type_sddv 123 sdd2_type = type_unsddv 124 ELSE 125 sdd1_type = type_unsddv 126 sdd2_type = type_sddv 127 ENDIF 128 129 ! IF( iaire.EQ.1 ) THEN 130 ! CALL SCOPY( iim, sddv, 1, sdd1, 1 ) 131 ! CALL SCOPY( iim, unsddv, 1, sdd2, 1 ) 132 ! ELSE 133 ! CALL SCOPY( iim, unsddv, 1, sdd1, 1 ) 134 ! CALL SCOPY( iim, sddv, 1, sdd2, 1 ) 135 ! END IF 136 137 jdfil1 = 2 138 jffil1 = jfiltnu 139 jdfil2 = jfiltsu 140 jffil2 = jjm 141 END IF 142 ELSE 143 IF(nlat/=jjm) THEN 144 PRINT 2222 145 STOP 146 ELSE 147 148 IF(iaire==1) THEN 149 sdd1_type = type_sddu 150 sdd2_type = type_unsddu 151 ELSE 152 sdd1_type = type_unsddu 153 sdd2_type = type_sddu 154 ENDIF 155 156 ! IF( iaire.EQ.1 ) THEN 157 ! CALL SCOPY( iim, sddu, 1, sdd1, 1 ) 158 ! CALL SCOPY( iim, unsddu, 1, sdd2, 1 ) 159 ! ELSE 160 ! CALL SCOPY( iim, unsddu, 1, sdd1, 1 ) 161 ! CALL SCOPY( iim, sddu, 1, sdd2, 1 ) 162 ! END IF 163 164 jdfil1 = 1 165 jffil1 = jfiltnv 166 jdfil2 = jfiltsv 167 jffil2 = jjm 168 END IF 169 END IF 170 171 DO hemisph = 1, 2 172 173 IF (hemisph==1) THEN 174 jdfil = jdfil1 175 jffil = jffil1 176 ELSE 177 jdfil = jdfil2 178 jffil = jffil2 179 END IF 180 181 DO l = 1, nbniv 182 DO j = jdfil, jffil 183 DO i = 1, iim 184 champ(i, j, l) = champ(i, j, l) * sdd12(i, sdd1_type) ! sdd1(i) 185 END DO 186 END DO 187 END DO 188 189 IF(hemisph == 1) THEN 190 191 IF(ifiltre == -2) THEN 192 193 DO j = jdfil, jffil 194 #ifdef BLAS 195 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 196 matrinvn(1,1,j), & 197 iim, champ(1,j,1), iip1*nlat, 0.0, & 198 eignq(1,j-jdfil+1,1), iim*nlat) 199 #else 200 eignq(:, j - jdfil + 1, :) & 201 = matmul(matrinvn(:, :, j), champ(:iim, j, :)) 202 #endif 203 END DO 204 205 ELSE IF (griscal) THEN 206 207 DO j = jdfil, jffil 208 #ifdef BLAS 209 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 210 matriceun(1,1,j), & 211 iim, champ(1,j,1), iip1*nlat, 0.0, & 212 eignq(1,j-jdfil+1,1), iim*nlat) 213 #else 214 eignq(:, j - jdfil + 1, :) & 215 = matmul(matriceun(:, :, j), champ(:iim, j, :)) 216 #endif 217 END DO 218 219 ELSE 220 221 DO j = jdfil, jffil 222 #ifdef BLAS 223 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 224 matricevn(1,1,j), & 225 iim, champ(1,j,1), iip1*nlat, 0.0, & 226 eignq(1,j-jdfil+1,1), iim*nlat) 227 #else 228 eignq(:, j - jdfil + 1, :) & 229 = matmul(matricevn(:, :, j), champ(:iim, j, :)) 230 #endif 231 END DO 232 233 ENDIF 234 235 ELSE 236 237 IF(ifiltre == -2) THEN 238 239 DO j = jdfil, jffil 240 #ifdef BLAS 241 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 242 matrinvs(1,1,j-jfiltsu+1), & 243 iim, champ(1,j,1), iip1*nlat, 0.0, & 244 eignq(1,j-jdfil+1,1), iim*nlat) 245 #else 246 eignq(:, j - jdfil + 1, :) & 247 = matmul(matrinvs(:, :, j - jfiltsu + 1), & 248 champ(:iim, j, :)) 249 #endif 250 END DO 251 252 ELSE IF (griscal) THEN 253 254 DO j = jdfil, jffil 255 #ifdef BLAS 256 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 257 matriceus(1,1,j-jfiltsu+1), & 258 iim, champ(1,j,1), iip1*nlat, 0.0, & 259 eignq(1,j-jdfil+1,1), iim*nlat) 260 #else 261 eignq(:, j - jdfil + 1, :) & 262 = matmul(matriceus(:, :, j - jfiltsu + 1), & 263 champ(:iim, j, :)) 264 #endif 265 END DO 266 267 ELSE 268 269 DO j = jdfil, jffil 270 #ifdef BLAS 271 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 272 matricevs(1,1,j-jfiltsv+1), & 273 iim, champ(1,j,1), iip1*nlat, 0.0, & 274 eignq(1,j-jdfil+1,1), iim*nlat) 275 #else 276 eignq(:, j - jdfil + 1, :) & 277 = matmul(matricevs(:, :, j - jfiltsv + 1), & 278 champ(:iim, j, :)) 279 #endif 280 END DO 281 282 ENDIF 283 284 ENDIF 285 286 IF(ifiltre== 2) THEN 287 288 DO l = 1, nbniv 289 DO j = jdfil, jffil 290 DO i = 1, iim 291 champ(i, j, l) = & 292 (champ(i, j, l) + eignq(i, j - jdfil + 1, l)) & 293 * sdd12(i, sdd2_type) ! sdd2(i) 294 END DO 295 END DO 296 END DO 297 298 ELSE 299 300 DO l = 1, nbniv 301 DO j = jdfil, jffil 302 DO i = 1, iim 303 champ(i, j, l) = & 304 (champ(i, j, l) - eignq(i, j - jdfil + 1, l)) & 305 * sdd12(i, sdd2_type) ! sdd2(i) 306 END DO 307 END DO 308 END DO 309 310 ENDIF 311 312 DO l = 1, nbniv 313 DO j = jdfil, jffil 314 champ(iip1, j, l) = champ(1, j, l) 315 END DO 316 END DO 317 318 ENDDO 319 320 1111 FORMAT(//20x, 'ERREUR dans le dimensionnement du tableau CHAMP a& 321 & filtrer, sur la grille des scalaires'/) 322 2222 FORMAT(//20x, 'ERREUR dans le dimensionnement du tableau CHAMP a fi& 323 & ltrer, sur la grille de V ou de Z'/) 324 RETURN 325 END SUBROUTINE filtreg 10 326 11 327 SUBROUTINE inifilr … … 14 330 USE mod_filtre_fft_loc, ONLY: Init_filtre_fft_loc=>Init_filtre_fft ! 15 331 #endif 16 USE serre_mod, ONLY: alphax17 USE logic_mod, ONLY: fxyhypb, ysinus18 USE comconst_mod, ONLY: maxlatfilter19 20 ! ... H. Upadhyaya, O.Sharma ...21 22 IMPLICIT NONE332 USE serre_mod, ONLY: alphax 333 USE logic_mod, ONLY: fxyhypb, ysinus 334 USE comconst_mod, ONLY: maxlatfilter 335 USE lmdz_coefils, ONLY: modfrstv, modfrstu, jfiltnu, jfiltnv, coefilu, coefilv, & 336 coefilu2, coefilv2, eignfnv, eignfnu, jfiltsu, jfiltsv 337 338 ! ... H. Upfiltreg_modadhyaya, O.Sharma ... 23 339 24 340 ! version 3 ..... … … 28 344 include "dimensions.h" 29 345 include "paramet.h" 30 ! -------------------------------------------------------------------31 346 include "comgeom.h" 32 include "coefils.h" 33 34 REAL dlonu(iim),dlatu(jjm) 35 REAL rlamda( iim ), eignvl( iim ) 36 37 REAL lamdamax,pi,cof 38 INTEGER i,j,modemax,imx,k,kf,ii 39 REAL dymin,dxmin,colat0 40 REAL eignft(iim,iim), coff 347 348 REAL dlonu(iim), dlatu(jjm) 349 REAL rlamda(iim), eignvl(iim) 350 351 REAL lamdamax, pi, cof 352 INTEGER i, j, modemax, imx, k, kf, ii 353 REAL dymin, dxmin, colat0 354 REAL eignft(iim, iim), coff 41 355 42 356 LOGICAL, SAVE :: first_call_inifilr = .TRUE. … … 44 358 INTEGER ISMIN 45 359 EXTERNAL ISMIN 46 INTEGER iymin 360 INTEGER iymin 47 361 INTEGER ixmineq 48 362 … … 65 379 !----------------------------------------------------------- 66 380 67 if ( iim == 1) return ! No filtre in 2D y-z68 69 pi = 2. * ASIN( 1.)70 71 DO i = 1, iim72 dlonu(i) = xprimu( i)381 if (iim == 1) return ! No filtre in 2D y-z 382 383 pi = 2. * ASIN(1.) 384 385 DO i = 1, iim 386 dlonu(i) = xprimu(i) 73 387 ENDDO 74 388 75 389 CALL inifgn(eignvl) 76 390 77 PRINT *, 'inifilr: EIGNVL '78 PRINT 250, eignvl79 250 FORMAT( 1x,5e14.6)391 PRINT *, 'inifilr: EIGNVL ' 392 PRINT 250, eignvl 393 250 FORMAT(1x, 5e14.6) 80 394 81 395 ! compute eigenvalues and eigenfunctions … … 96 410 ! ..... colat0 = minimum de ( 0.5, min dy/ min dx ) ... 97 411 98 99 DO j = 1,jjm 100 dlatu( j ) = rlatu( j ) - rlatu( j+1 ) 101 ENDDO 102 103 dxmin = dlonu(1) 104 DO i = 2, iim 105 dxmin = MIN( dxmin,dlonu(i) ) 106 ENDDO 107 dymin = dlatu(1) 108 DO j = 2, jjm 109 dymin = MIN( dymin,dlatu(j) ) 412 DO j = 1, jjm 413 dlatu(j) = rlatu(j) - rlatu(j + 1) 414 ENDDO 415 416 dxmin = dlonu(1) 417 DO i = 2, iim 418 dxmin = MIN(dxmin, dlonu(i)) 419 ENDDO 420 dymin = dlatu(1) 421 DO j = 2, jjm 422 dymin = MIN(dymin, dlatu(j)) 110 423 ENDDO 111 424 … … 118 431 119 432 ! if maxlatfilter >0, prescribe the colat0 value from the .def files 120 433 121 434 IF (maxlatfilter < 0.) THEN 122 435 123 colat0 = MIN( 0.5, dymin/dxmin)124 ! colat0 = 1.125 126 IF( .NOT.fxyhypb.AND.ysinus) THEN127 colat0 = 0.6128 ! ...... a revoir pour ysinus ! .......129 alphax = 0.130 ENDIF436 colat0 = MIN(0.5, dymin / dxmin) 437 ! colat0 = 1. 438 439 IF(.NOT.fxyhypb.AND.ysinus) THEN 440 colat0 = 0.6 441 ! ...... a revoir pour ysinus ! ....... 442 alphax = 0. 443 ENDIF 131 444 132 445 ELSE 133 446 134 colat0=(90.0-maxlatfilter)/180.0*pi135 136 ENDIF 137 138 PRINT 50, colat0, alphax139 50 FORMAT(/15x,' Inifilr colat0 alphax ',2e16.7)140 141 IF(alphax==1. 142 PRINT *,' Inifilr alphax doit etre < a 1. Corriger '143 144 ENDIF 145 146 lamdamax = iim / ( pi * colat0 * ( 1. - alphax ))447 colat0 = (90.0 - maxlatfilter) / 180.0 * pi 448 449 ENDIF 450 451 PRINT 50, colat0, alphax 452 50 FORMAT(/15x, ' Inifilr colat0 alphax ', 2e16.7) 453 454 IF(alphax==1.) THEN 455 PRINT *, ' Inifilr alphax doit etre < a 1. Corriger ' 456 STOP 457 ENDIF 458 459 lamdamax = iim / (pi * colat0 * (1. - alphax)) 147 460 148 461 ! ... Correction le 28/10/97 ( P.Le Van ) .. 149 462 150 DO i = 2, iim151 rlamda( i ) = lamdamax/ SQRT( ABS( eignvl(i) ))152 ENDDO 153 154 DO j = 1, jjm155 DO i = 1,iim156 coefilu( i,j )= 0.0157 coefilv( i,j )= 0.0158 coefilu2( i,j) = 0.0159 coefilv2( i,j) = 0.0160 463 DO i = 2, iim 464 rlamda(i) = lamdamax / SQRT(ABS(eignvl(i))) 465 ENDDO 466 467 DO j = 1, jjm 468 DO i = 1, iim 469 coefilu(i, j) = 0.0 470 coefilv(i, j) = 0.0 471 coefilu2(i, j) = 0.0 472 coefilv2(i, j) = 0.0 473 ENDDO 161 474 ENDDO 162 475 … … 166 479 modemax = iim 167 480 168 !!!! imx = modemax - 4 * (modemax/iim)169 170 imx 171 172 PRINT *, 'inifilr: TRUNCATION AT ',imx173 174 ! Ehouarn: set up some defaults175 jfiltnu =2 ! avoid north pole176 jfiltsu =jjm ! avoid south pole (which is at jjm+1)177 jfiltnv =1 ! NB: no poles on the V grid178 jfiltsv =jjm179 180 DO j = 2, jjm /2+1181 cof = COS( rlatu(j) )/ colat0182 IF ( cof < 1.) THEN183 IF( rlamda(imx) * COS(rlatu(j) )<1.) THEN184 jfiltnu= j185 186 187 188 cof = COS( rlatu(jjp1-j+1) )/ colat0189 IF ( cof < 1.) THEN190 IF( rlamda(imx) * COS(rlatu(jjp1-j+1) )<1.) THEN191 jfiltsu= jjp1-j+1192 193 194 ENDDO 195 196 DO j = 1, jjm /2197 cof = COS( rlatv(j) )/ colat0198 IF ( cof < 1.) THEN199 IF( rlamda(imx) * COS(rlatv(j) )<1.) THEN200 jfiltnv= j201 202 203 204 cof = COS( rlatv(jjm-j+1) )/ colat0205 IF ( cof < 1.) THEN206 IF( rlamda(imx) * COS(rlatv(jjm-j+1) )<1.) THEN207 jfiltsv= jjm-j+1208 209 210 ENDDO 211 212 IF( jfiltnu> jjm/2 +1) THEN213 PRINT *,' jfiltnu en dehors des valeurs acceptables ' ,jfiltnu214 215 ENDIF 216 217 IF( jfiltsu> jjm +1) THEN218 PRINT *,' jfiltsu en dehors des valeurs acceptables ' ,jfiltsu219 220 ENDIF 221 222 IF( jfiltnv> jjm/2) THEN223 PRINT *,' jfiltnv en dehors des valeurs acceptables ' ,jfiltnv224 225 ENDIF 226 227 IF( jfiltsv> jjm) THEN228 PRINT *,' jfiltsv en dehors des valeurs acceptables ' ,jfiltsv229 230 ENDIF 231 232 PRINT *, 'inifilr: jfiltnv jfiltsv jfiltnu jfiltsu ', &233 jfiltnv,jfiltsv,jfiltnu,jfiltsu481 !!!! imx = modemax - 4 * (modemax/iim) 482 483 imx = iim 484 485 PRINT *, 'inifilr: TRUNCATION AT ', imx 486 487 ! Ehouarn: set up some defaults 488 jfiltnu = 2 ! avoid north pole 489 jfiltsu = jjm ! avoid south pole (which is at jjm+1) 490 jfiltnv = 1 ! NB: no poles on the V grid 491 jfiltsv = jjm 492 493 DO j = 2, jjm / 2 + 1 494 cof = COS(rlatu(j)) / colat0 495 IF (cof < 1.) THEN 496 IF(rlamda(imx) * COS(rlatu(j))<1.) THEN 497 jfiltnu = j 498 ENDIF 499 ENDIF 500 501 cof = COS(rlatu(jjp1 - j + 1)) / colat0 502 IF (cof < 1.) THEN 503 IF(rlamda(imx) * COS(rlatu(jjp1 - j + 1))<1.) THEN 504 jfiltsu = jjp1 - j + 1 505 ENDIF 506 ENDIF 507 ENDDO 508 509 DO j = 1, jjm / 2 510 cof = COS(rlatv(j)) / colat0 511 IF (cof < 1.) THEN 512 IF(rlamda(imx) * COS(rlatv(j))<1.) THEN 513 jfiltnv = j 514 ENDIF 515 ENDIF 516 517 cof = COS(rlatv(jjm - j + 1)) / colat0 518 IF (cof < 1.) THEN 519 IF(rlamda(imx) * COS(rlatv(jjm - j + 1))<1.) THEN 520 jfiltsv = jjm - j + 1 521 ENDIF 522 ENDIF 523 ENDDO 524 525 IF(jfiltnu> jjm / 2 + 1) THEN 526 PRINT *, ' jfiltnu en dehors des valeurs acceptables ', jfiltnu 527 STOP 528 ENDIF 529 530 IF(jfiltsu> jjm + 1) THEN 531 PRINT *, ' jfiltsu en dehors des valeurs acceptables ', jfiltsu 532 STOP 533 ENDIF 534 535 IF(jfiltnv> jjm / 2) THEN 536 PRINT *, ' jfiltnv en dehors des valeurs acceptables ', jfiltnv 537 STOP 538 ENDIF 539 540 IF(jfiltsv> jjm) THEN 541 PRINT *, ' jfiltsv en dehors des valeurs acceptables ', jfiltsv 542 STOP 543 ENDIF 544 545 PRINT *, 'inifilr: jfiltnv jfiltsv jfiltnu jfiltsu ', & 546 jfiltnv, jfiltsv, jfiltnu, jfiltsu 234 547 235 548 IF(first_call_inifilr) THEN 236 ALLOCATE(matriceun(iim,iim,jfiltnu))237 ALLOCATE(matriceus(iim,iim,jjm-jfiltsu+1))238 ALLOCATE(matricevn(iim,iim,jfiltnv))239 ALLOCATE(matricevs(iim,iim,jjm-jfiltsv+1))240 ALLOCATE( matrinvn(iim,iim,jfiltnu))241 ALLOCATE( matrinvs(iim,iim,jjm-jfiltsu+1))242 549 ALLOCATE(matriceun(iim, iim, jfiltnu)) 550 ALLOCATE(matriceus(iim, iim, jjm - jfiltsu + 1)) 551 ALLOCATE(matricevn(iim, iim, jfiltnv)) 552 ALLOCATE(matricevs(iim, iim, jjm - jfiltsv + 1)) 553 ALLOCATE(matrinvn(iim, iim, jfiltnu)) 554 ALLOCATE(matrinvs(iim, iim, jjm - jfiltsu + 1)) 555 first_call_inifilr = .FALSE. 243 556 ENDIF 244 557 … … 246 559 !................................................................ 247 560 248 249 DO j = 1,jjm 250 !default initialization: all modes are retained (i.e. no filtering) 251 modfrstu( j ) = iim 252 modfrstv( j ) = iim 253 ENDDO 254 255 DO j = 2,jfiltnu 256 DO k = 2,modemax 257 cof = rlamda(k) * COS( rlatu(j) ) 258 IF ( cof < 1. ) GOTO 82 259 ENDDO 260 GOTO 84 261 82 modfrstu( j ) = k 262 263 kf = modfrstu( j ) 264 DO k = kf , modemax 265 cof = rlamda(k) * COS( rlatu(j) ) 266 coefilu(k,j) = cof - 1. 267 coefilu2(k,j) = cof*cof - 1. 268 ENDDO 269 84 CONTINUE 270 ENDDO 271 272 273 DO j = 1,jfiltnv 274 275 DO k = 2,modemax 276 cof = rlamda(k) * COS( rlatv(j) ) 277 IF ( cof < 1. ) GOTO 87 278 ENDDO 279 GOTO 89 280 87 modfrstv( j ) = k 281 282 kf = modfrstv( j ) 283 DO k = kf , modemax 284 cof = rlamda(k) * COS( rlatv(j) ) 285 coefilv(k,j) = cof - 1. 286 coefilv2(k,j) = cof*cof - 1. 287 ENDDO 288 89 CONTINUE 289 ENDDO 290 291 DO j = jfiltsu,jjm 292 DO k = 2,modemax 293 cof = rlamda(k) * COS( rlatu(j) ) 294 IF ( cof < 1. ) GOTO 92 295 ENDDO 296 GOTO 94 297 92 modfrstu( j ) = k 298 299 kf = modfrstu( j ) 300 DO k = kf , modemax 301 cof = rlamda(k) * COS( rlatu(j) ) 302 coefilu(k,j) = cof - 1. 303 coefilu2(k,j) = cof*cof - 1. 304 ENDDO 305 94 CONTINUE 306 ENDDO 307 308 DO j = jfiltsv,jjm 309 DO k = 2,modemax 310 cof = rlamda(k) * COS( rlatv(j) ) 311 IF ( cof < 1. ) GOTO 97 312 ENDDO 313 GOTO 99 314 97 modfrstv( j ) = k 315 316 kf = modfrstv( j ) 317 DO k = kf , modemax 318 cof = rlamda(k) * COS( rlatv(j) ) 319 coefilv(k,j) = cof - 1. 320 coefilv2(k,j) = cof*cof - 1. 321 ENDDO 322 99 CONTINUE 323 ENDDO 324 325 IF(jfiltnv>=jjm/2 .OR. jfiltnu>=jjm/2)THEN 326 ! Ehouarn: and what are these for??? Trying to handle a limit case 327 ! where filters extend to and meet at the equator? 328 IF(jfiltnv==jfiltsv)jfiltsv=1+jfiltnv 329 IF(jfiltnu==jfiltsu)jfiltsu=1+jfiltnu 330 331 PRINT *,'jfiltnv jfiltsv jfiltnu jfiltsu' , & 332 jfiltnv,jfiltsv,jfiltnu,jfiltsu 333 ENDIF 334 335 PRINT *,' Modes premiers v ' 336 PRINT 334,modfrstv 337 PRINT *,' Modes premiers u ' 338 PRINT 334,modfrstu 561 DO j = 1, jjm 562 !default initialization: all modes are retained (i.e. no filtering) 563 modfrstu(j) = iim 564 modfrstv(j) = iim 565 ENDDO 566 567 DO j = 2, jfiltnu 568 DO k = 2, modemax 569 cof = rlamda(k) * COS(rlatu(j)) 570 IF (cof < 1.) GOTO 82 571 ENDDO 572 GOTO 84 573 82 modfrstu(j) = k 574 575 kf = modfrstu(j) 576 DO k = kf, modemax 577 cof = rlamda(k) * COS(rlatu(j)) 578 coefilu(k, j) = cof - 1. 579 coefilu2(k, j) = cof * cof - 1. 580 ENDDO 581 84 CONTINUE 582 ENDDO 583 584 DO j = 1, jfiltnv 585 586 DO k = 2, modemax 587 cof = rlamda(k) * COS(rlatv(j)) 588 IF (cof < 1.) GOTO 87 589 ENDDO 590 GOTO 89 591 87 modfrstv(j) = k 592 593 kf = modfrstv(j) 594 DO k = kf, modemax 595 cof = rlamda(k) * COS(rlatv(j)) 596 coefilv(k, j) = cof - 1. 597 coefilv2(k, j) = cof * cof - 1. 598 ENDDO 599 89 CONTINUE 600 ENDDO 601 602 DO j = jfiltsu, jjm 603 DO k = 2, modemax 604 cof = rlamda(k) * COS(rlatu(j)) 605 IF (cof < 1.) GOTO 92 606 ENDDO 607 GOTO 94 608 92 modfrstu(j) = k 609 610 kf = modfrstu(j) 611 DO k = kf, modemax 612 cof = rlamda(k) * COS(rlatu(j)) 613 coefilu(k, j) = cof - 1. 614 coefilu2(k, j) = cof * cof - 1. 615 ENDDO 616 94 CONTINUE 617 ENDDO 618 619 DO j = jfiltsv, jjm 620 DO k = 2, modemax 621 cof = rlamda(k) * COS(rlatv(j)) 622 IF (cof < 1.) GOTO 97 623 ENDDO 624 GOTO 99 625 97 modfrstv(j) = k 626 627 kf = modfrstv(j) 628 DO k = kf, modemax 629 cof = rlamda(k) * COS(rlatv(j)) 630 coefilv(k, j) = cof - 1. 631 coefilv2(k, j) = cof * cof - 1. 632 ENDDO 633 99 CONTINUE 634 ENDDO 635 636 IF(jfiltnv>=jjm / 2 .OR. jfiltnu>=jjm / 2)THEN 637 ! Ehouarn: and what are these for??? Trying to handle a limit case 638 ! where filters extend to and meet at the equator? 639 IF(jfiltnv==jfiltsv)jfiltsv = 1 + jfiltnv 640 IF(jfiltnu==jfiltsu)jfiltsu = 1 + jfiltnu 641 642 PRINT *, 'jfiltnv jfiltsv jfiltnu jfiltsu', & 643 jfiltnv, jfiltsv, jfiltnu, jfiltsu 644 ENDIF 645 646 PRINT *, ' Modes premiers v ' 647 PRINT 334, modfrstv 648 PRINT *, ' Modes premiers u ' 649 PRINT 334, modfrstu 339 650 340 651 ! ................................................................... … … 346 657 DO j = 2, jfiltnu 347 658 348 DO i=1,iim349 coff = coefilu(i,j)350 IF( i<modfrstu(j)) coff = 0.351 DO k=1,iim352 eignft(i,k) = eignfnv(k,i) * coff353 354 659 DO i = 1, iim 660 coff = coefilu(i, j) 661 IF(i<modfrstu(j)) coff = 0. 662 DO k = 1, iim 663 eignft(i, k) = eignfnv(k, i) * coff 664 ENDDO 665 ENDDO ! of DO i=1,iim 355 666 356 667 #ifdef BLAS … … 358 669 eignfnv, iim, eignft, iim, 0.0, matriceun(1,1,j), iim) 359 670 #else 360 DO k = 1, iim 361 DO i = 1, iim 362 matriceun(i,k,j) = 0.0 363 DO ii = 1, iim 364 matriceun(i,k,j) = matriceun(i,k,j) & 365 + eignfnv(i,ii)*eignft(ii,k) 366 ENDDO 671 DO k = 1, iim 672 DO i = 1, iim 673 matriceun(i, k, j) = 0.0 674 DO ii = 1, iim 675 matriceun(i, k, j) = matriceun(i, k, j) & 676 + eignfnv(i, ii) * eignft(ii, k) 367 677 ENDDO 368 ENDDO ! of DO k = 1, iim 678 ENDDO 679 ENDDO ! of DO k = 1, iim 369 680 #endif 370 681 … … 373 684 DO j = jfiltsu, jjm 374 685 375 DO i=1,iim376 coff = coefilu(i,j)377 IF( i<modfrstu(j)) coff = 0.378 DO k=1,iim379 eignft(i,k) = eignfnv(k,i) * coff380 381 686 DO i = 1, iim 687 coff = coefilu(i, j) 688 IF(i<modfrstu(j)) coff = 0. 689 DO k = 1, iim 690 eignft(i, k) = eignfnv(k, i) * coff 691 ENDDO 692 ENDDO ! of DO i=1,iim 382 693 #ifdef BLAS 383 694 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, & … … 385 696 matriceus(1,1,j-jfiltsu+1), iim) 386 697 #else 387 DO k = 1, iim 388 DO i = 1, iim 389 matriceus(i,k,j-jfiltsu+1) = 0.0 390 DO ii = 1, iim 391 matriceus(i,k,j-jfiltsu+1) = matriceus(i,k,j-jfiltsu+1) & 392 + eignfnv(i,ii)*eignft(ii,k) 393 ENDDO 698 DO k = 1, iim 699 DO i = 1, iim 700 matriceus(i, k, j - jfiltsu + 1) = 0.0 701 DO ii = 1, iim 702 matriceus(i, k, j - jfiltsu + 1) = matriceus(i, k, j - jfiltsu + 1) & 703 + eignfnv(i, ii) * eignft(ii, k) 394 704 ENDDO 395 ENDDO ! of DO k = 1, iim 705 ENDDO 706 ENDDO ! of DO k = 1, iim 396 707 #endif 397 708 … … 406 717 DO j = 1, jfiltnv 407 718 408 409 coff = coefilv(i,j)410 IF( i<modfrstv(j)) coff = 0.411 412 eignft(i,k) = eignfnu(k,i) * coff413 414 719 DO i = 1, iim 720 coff = coefilv(i, j) 721 IF(i<modfrstv(j)) coff = 0. 722 DO k = 1, iim 723 eignft(i, k) = eignfnu(k, i) * coff 724 ENDDO 725 ENDDO 415 726 416 727 #ifdef BLAS … … 418 729 eignfnu, iim, eignft, iim, 0.0, matricevn(1,1,j), iim) 419 730 #else 420 DO k = 1, iim 421 DO i = 1, iim 422 matricevn(i,k,j) = 0.0 423 DO ii = 1, iim 424 matricevn(i,k,j) = matricevn(i,k,j) & 425 + eignfnu(i,ii)*eignft(ii,k) 426 ENDDO 731 DO k = 1, iim 732 DO i = 1, iim 733 matricevn(i, k, j) = 0.0 734 DO ii = 1, iim 735 matricevn(i, k, j) = matricevn(i, k, j) & 736 + eignfnu(i, ii) * eignft(ii, k) 427 737 ENDDO 428 ENDDO 738 ENDDO 739 ENDDO 429 740 #endif 430 741 … … 433 744 DO j = jfiltsv, jjm 434 745 435 436 coff = coefilv(i,j)437 IF( i<modfrstv(j)) coff = 0.438 439 eignft(i,k) = eignfnu(k,i) * coff440 441 746 DO i = 1, iim 747 coff = coefilv(i, j) 748 IF(i<modfrstv(j)) coff = 0. 749 DO k = 1, iim 750 eignft(i, k) = eignfnu(k, i) * coff 751 ENDDO 752 ENDDO 442 753 443 754 #ifdef BLAS … … 446 757 matricevs(1,1,j-jfiltsv+1), iim) 447 758 #else 448 DO k = 1, iim 449 DO i = 1, iim 450 matricevs(i,k,j-jfiltsv+1) = 0.0 451 DO ii = 1, iim 452 matricevs(i,k,j-jfiltsv+1) = matricevs(i,k,j-jfiltsv+1) & 453 + eignfnu(i,ii)*eignft(ii,k) 454 ENDDO 759 DO k = 1, iim 760 DO i = 1, iim 761 matricevs(i, k, j - jfiltsv + 1) = 0.0 762 DO ii = 1, iim 763 matricevs(i, k, j - jfiltsv + 1) = matricevs(i, k, j - jfiltsv + 1) & 764 + eignfnu(i, ii) * eignft(ii, k) 455 765 ENDDO 456 ENDDO 766 ENDDO 767 ENDDO 457 768 #endif 458 769 … … 467 778 DO j = 2, jfiltnu 468 779 469 DO i = 1,iim470 coff = coefilu(i,j)/ ( 1. + coefilu(i,j))471 IF( i<modfrstu(j)) coff = 0.472 DO k=1,iim473 eignft(i,k) = eignfnv(k,i) * coff474 475 780 DO i = 1, iim 781 coff = coefilu(i, j) / (1. + coefilu(i, j)) 782 IF(i<modfrstu(j)) coff = 0. 783 DO k = 1, iim 784 eignft(i, k) = eignfnv(k, i) * coff 785 ENDDO 786 ENDDO 476 787 477 788 #ifdef BLAS … … 479 790 eignfnv, iim, eignft, iim, 0.0, matrinvn(1,1,j), iim) 480 791 #else 481 DO k = 1, iim 482 DO i = 1, iim 483 matrinvn(i,k,j) = 0.0 484 DO ii = 1, iim 485 matrinvn(i,k,j) = matrinvn(i,k,j) & 486 + eignfnv(i,ii)*eignft(ii,k) 487 ENDDO 792 DO k = 1, iim 793 DO i = 1, iim 794 matrinvn(i, k, j) = 0.0 795 DO ii = 1, iim 796 matrinvn(i, k, j) = matrinvn(i, k, j) & 797 + eignfnv(i, ii) * eignft(ii, k) 488 798 ENDDO 489 ENDDO 799 ENDDO 800 ENDDO 490 801 #endif 491 802 … … 494 805 DO j = jfiltsu, jjm 495 806 496 DO i = 1,iim497 coff = coefilu(i,j) / ( 1. + coefilu(i,j))498 IF( i<modfrstu(j)) coff = 0.499 DO k=1,iim500 eignft(i,k) = eignfnv(k,i) * coff501 502 807 DO i = 1, iim 808 coff = coefilu(i, j) / (1. + coefilu(i, j)) 809 IF(i<modfrstu(j)) coff = 0. 810 DO k = 1, iim 811 eignft(i, k) = eignfnv(k, i) * coff 812 ENDDO 813 ENDDO 503 814 #ifdef BLAS 504 815 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, & 505 816 eignfnv, iim, eignft, iim, 0.0, matrinvs(1,1,j-jfiltsu+1), iim) 506 817 #else 507 DO k = 1, iim 508 DO i = 1, iim 509 matrinvs(i,k,j-jfiltsu+1) = 0.0 510 DO ii = 1, iim 511 matrinvs(i,k,j-jfiltsu+1) = matrinvs(i,k,j-jfiltsu+1) & 512 + eignfnv(i,ii)*eignft(ii,k) 513 ENDDO 818 DO k = 1, iim 819 DO i = 1, iim 820 matrinvs(i, k, j - jfiltsu + 1) = 0.0 821 DO ii = 1, iim 822 matrinvs(i, k, j - jfiltsu + 1) = matrinvs(i, k, j - jfiltsu + 1) & 823 + eignfnv(i, ii) * eignft(ii, k) 514 824 ENDDO 515 ENDDO 825 ENDDO 826 ENDDO 516 827 #endif 517 828 … … 528 839 ! ................................................................... 529 840 530 334 FORMAT(1x,24i3)841 334 FORMAT(1x, 24i3) 531 842 532 843 END SUBROUTINE inifilr 533 844 534 END MODULE filtreg_mod845 END MODULE lmdz_filtreg
Note: See TracChangeset
for help on using the changeset viewer.