Changeset 5246 for LMDZ6/trunk/libf/filtrez
- Timestamp:
- Oct 21, 2024, 2:58:45 PM (14 months ago)
- Location:
- LMDZ6/trunk/libf/filtrez
- Files:
-
- 5 moved
-
acc.f90 (moved) (moved from LMDZ6/trunk/libf/filtrez/acc.F) (1 diff)
-
eigen.f90 (moved) (moved from LMDZ6/trunk/libf/filtrez/eigen.F) (1 diff)
-
eigen_sort.f90 (moved) (moved from LMDZ6/trunk/libf/filtrez/eigen_sort.F) (1 diff)
-
filtreg.F90 (moved) (moved from LMDZ6/trunk/libf/filtrez/filtreg.F) (1 diff)
-
inifgn.F90 (moved) (moved from LMDZ6/trunk/libf/filtrez/inifgn.F) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/filtrez/acc.f90
r5245 r5246 2 2 ! $Header$ 3 3 ! 4 subroutine acc(vec,d,im)5 implicit none6 integer :: im7 real :: vec(im,im),d(im)8 integer :: i,j9 real ::sum10 real,external :: ssum11 do j=1,im12 do i=1,im13 d(i)=vec(i,j)*vec(i,j)14 enddo15 sum=ssum(im,d,1)16 sum=sqrt(sum)17 do i=1,im18 vec(i,j)=vec(i,j)/sum19 enddo20 enddo21 return22 end 4 subroutine acc(vec,d,im) 5 implicit none 6 integer :: im 7 real :: vec(im,im),d(im) 8 integer :: i,j 9 real ::sum 10 real,external :: ssum 11 do j=1,im 12 do i=1,im 13 d(i)=vec(i,j)*vec(i,j) 14 enddo 15 sum=ssum(im,d,1) 16 sum=sqrt(sum) 17 do i=1,im 18 vec(i,j)=vec(i,j)/sum 19 enddo 20 enddo 21 return 22 end subroutine acc -
LMDZ6/trunk/libf/filtrez/eigen.f90
r5245 r5246 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE eigen( e,d)5 IMPLICIT NONE6 INCLUDE "dimensions.h"7 real :: e( iim,iim ), d( iim )8 real :: asm( iim )9 integer :: im,i,j10 im=iim11 c 12 DO 48i = 1,im13 asm( i ) = d( im-i+1 )14 48 CONTINUE15 DO 49i = 1,iim16 d( i ) = asm( i )17 49 CONTINUE18 c 19 cPRINT 70,d4 SUBROUTINE eigen( e,d) 5 IMPLICIT NONE 6 INCLUDE "dimensions.h" 7 real :: e( iim,iim ), d( iim ) 8 real :: asm( iim ) 9 integer :: im,i,j 10 im=iim 11 ! 12 DO i = 1,im 13 asm( i ) = d( im-i+1 ) 14 END DO 15 DO i = 1,iim 16 d( i ) = asm( i ) 17 END DO 18 ! 19 ! PRINT 70,d 20 20 70 FORMAT(5x,'Valeurs propres',/,8(1x,8f10.4,/),/) 21 print *22 c 23 DO 51i = 1,im24 DO 52j = 1,im25 asm( j ) = e( i , im-j+1 )26 52 CONTINUE27 DO 50j = 1,im28 e( i,j ) = asm( j )29 50 CONTINUE30 51 CONTINUE21 print * 22 ! 23 DO i = 1,im 24 DO j = 1,im 25 asm( j ) = e( i , im-j+1 ) 26 END DO 27 DO j = 1,im 28 e( i,j ) = asm( j ) 29 END DO 30 END DO 31 31 32 RETURN33 END 32 RETURN 33 END SUBROUTINE eigen -
LMDZ6/trunk/libf/filtrez/eigen_sort.f90
r5245 r5246 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE eigen_sort(d,v,n,np)5 INTEGERn,np6 REALd(np),v(np,np)7 INTEGERi,j,k8 REALp4 SUBROUTINE eigen_sort(d,v,n,np) 5 INTEGER :: n,np 6 REAL :: d(np),v(np,np) 7 INTEGER :: i,j,k 8 REAL :: p 9 9 10 DO i=1,n-1 11 k=i 12 p=d(i) 13 DO j=i+1,n 14 IF(d(j).ge.p) THEN 15 k=j 16 p=d(j) 17 ENDIF 18 ENDDO 19 20 IF(k.ne.i) THEN 21 d(k)=d(i) 22 d(i)=p 23 DO j=1,n 24 p=v(j,i) 25 v(j,i)=v(j,k) 26 v(j,k)=p 27 ENDDO 28 ENDIF 29 ENDDO 10 DO i=1,n-1 11 k=i 12 p=d(i) 13 DO j=i+1,n 14 IF(d(j).ge.p) THEN 15 k=j 16 p=d(j) 17 ENDIF 18 ENDDO 30 19 31 RETURN 32 END 20 IF(k.ne.i) THEN 21 d(k)=d(i) 22 d(i)=p 23 DO j=1,n 24 p=v(j,i) 25 v(j,i)=v(j,k) 26 v(j,k)=p 27 ENDDO 28 ENDIF 29 ENDDO 30 31 RETURN 32 END SUBROUTINE eigen_sort -
LMDZ6/trunk/libf/filtrez/filtreg.F90
r5245 r5246 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire, 5 &griscal ,iter)6 7 USE filtreg_mod8 9 IMPLICIT NONE10 c=======================================================================11 c 12 cAuteur: P. Le Van 07/10/9713 c------14 c 15 cObjet: filtre matriciel longitudinal ,avec les matrices precalculees16 cpour l'operateur Filtre .17 c------18 c 19 cArguments:20 c----------21 c 22 cnblat nombre de latitudes a filtrer23 cnbniv nombre de niveaux verticaux a filtrer24 cchamp(iip1,nblat,nbniv) en entree : champ a filtrer25 cen sortie : champ filtre26 cifiltre +1 Transformee directe27 c-1 Transformee inverse28 c+2 Filtre directe29 c-2 Filtre inverse30 c 31 ciaire 1 si champ intensif32 c2 si champ extensif (pondere par les aires)33 c 34 citer 1 filtre simple35 c 36 c=======================================================================37 c 38 c 39 cVariable Intensive40 cifiltre = 1 filtre directe41 cifiltre =-1 filtre inverse42 c 43 cVariable Extensive44 cifiltre = 2 filtre directe45 cifiltre =-2 filtre inverse46 c 47 c 48 INCLUDE "dimensions.h"49 INCLUDE "paramet.h"50 INCLUDE "coefils.h"51 52 INTEGERnlat,nbniv,ifiltre,iter53 INTEGERi,j,l,k54 INTEGERiim2,immjm55 INTEGERjdfil1,jdfil2,jffil1,jffil2,jdfil,jffil56 57 REALchamp( iip1,nlat,nbniv)58 59 REALeignq(iim,nlat,nbniv), sdd1(iim),sdd2(iim)60 LOGICALgriscal61 INTEGERhemisph, iaire62 63 LOGICAL,SAVE :: first=.TRUE.64 65 REAL, SAVE :: sdd12(iim,4)66 67 INTEGER, PARAMETER :: type_sddu=168 INTEGER, PARAMETER :: type_sddv=269 INTEGER, PARAMETER :: type_unsddu=370 INTEGER, PARAMETER :: type_unsddv=471 72 INTEGER :: sdd1_type, sdd2_type73 74 if ( iim == 1 ) return ! no filtre in 2D y-z75 76 IF (first) THEN77 sdd12(1:iim,type_sddu) = sddu(1:iim)78 sdd12(1:iim,type_sddv) = sddv(1:iim)79 sdd12(1:iim,type_unsddu) = unsddu(1:iim)80 sdd12(1:iim,type_unsddv) = unsddv(1:iim)81 82 first=.FALSE.83 ENDIF84 85 IF(ifiltre.EQ.1.or.ifiltre.EQ.-1)86 & STOP'Pas de transformee simple dans cette version'87 88 IF( iter.EQ. 2 ) THEN89 PRINT *,' Pas d iteration du filtre dans cette version !'90 & , ' Utiliser old_filtreg et repasser !'91 STOP92 ENDIF93 94 IF( ifiltre.EQ. -2 .AND..NOT.griscal ) THEN95 PRINT *,' Cette routine ne calcule le filtre inverse que '96 &, ' sur la grille des scalaires !'97 STOP98 ENDIF99 100 IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 ) THEN101 PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2'102 &, ' corriger et repasser !'103 STOP104 ENDIF105 106 iim2 = iim * iim107 immjm = iim * jjm108 109 IF( griscal ) THEN110 IF( nlat.NE. jjp1 ) THEN111 PRINT 1111112 STOP113 ELSE114 115 IF( iaire.EQ.1 ) THEN116 sdd1_type = type_sddv117 sdd2_type = type_unsddv118 ELSE119 sdd1_type = type_unsddv120 sdd2_type = type_sddv121 ENDIF122 123 cIF( iaire.EQ.1 ) THEN124 c CALL SCOPY( iim, sddv, 1, sdd1, 1 ) 125 cCALL SCOPY( iim, unsddv, 1, sdd2, 1 )126 cELSE127 cCALL SCOPY( iim, unsddv, 1, sdd1, 1 )128 cCALL SCOPY( iim, sddv, 1, sdd2, 1 )129 cEND IF130 131 jdfil1 = 2132 jffil1 = jfiltnu133 jdfil2 = jfiltsu134 jffil2 = jjm135 END IF136 ELSE137 IF( nlat.NE.jjm ) THEN138 PRINT 2222139 STOP140 ELSE141 142 IF( iaire.EQ.1 ) THEN143 sdd1_type = type_sddu144 sdd2_type = type_unsddu145 ELSE146 sdd1_type = type_unsddu147 sdd2_type = type_sddu148 ENDIF149 150 cIF( iaire.EQ.1 ) THEN151 c CALL SCOPY( iim, sddu, 1, sdd1, 1 ) 152 cCALL SCOPY( iim, unsddu, 1, sdd2, 1 )153 cELSE154 cCALL SCOPY( iim, unsddu, 1, sdd1, 1 )155 cCALL SCOPY( iim, sddu, 1, sdd2, 1 )156 cEND IF157 158 jdfil1 = 1159 jffil1 = jfiltnv160 jdfil2 = jfiltsv161 jffil2 = jjm162 END IF163 END IF164 165 DO hemisph = 1, 2166 167 IF ( hemisph.EQ.1 ) THEN168 jdfil = jdfil1169 jffil = jffil1170 ELSE171 jdfil = jdfil2172 jffil = jffil2173 END IF174 175 DO l = 1, nbniv176 DO j = jdfil,jffil177 DO i = 1, iim178 champ(i,j,l) = champ(i,j,l) * sdd12(i,sdd1_type) ! sdd1(i)179 END DO180 END DO181 END DO182 183 IF( hemisph.EQ. 1 ) THEN184 185 IF( ifiltre.EQ. -2 ) THEN186 187 DO j = jdfil,jffil188 #ifdef BLAS 189 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,190 & matrinvn(1,1,j),191 & iim, champ(1,j,1), iip1*nlat, 0.0,192 &eignq(1,j-jdfil+1,1), iim*nlat)193 #else 194 eignq(:,j-jdfil+1,:)195 $= matmul(matrinvn(:,:,j), champ(:iim,j,:))196 #endif 197 END DO198 199 ELSE IF ( griscal ) THEN200 201 DO j = jdfil,jffil202 #ifdef BLAS 203 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,204 & matriceun(1,1,j),205 & iim, champ(1,j,1), iip1*nlat, 0.0,206 &eignq(1,j-jdfil+1,1), iim*nlat)207 #else 208 eignq(:,j-jdfil+1,:)209 $= matmul(matriceun(:,:,j), champ(:iim,j,:))210 #endif 211 END DO212 213 ELSE214 215 DO j = jdfil,jffil216 #ifdef BLAS 217 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,218 & matricevn(1,1,j),219 & iim, champ(1,j,1), iip1*nlat, 0.0,220 &eignq(1,j-jdfil+1,1), iim*nlat)221 #else 222 eignq(:,j-jdfil+1,:)223 $= matmul(matricevn(:,:,j), champ(:iim,j,:))224 #endif 225 END DO226 227 ENDIF228 229 ELSE230 231 IF( ifiltre.EQ. -2 ) THEN232 233 DO j = jdfil,jffil234 #ifdef BLAS 235 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,236 & matrinvs(1,1,j-jfiltsu+1),237 & iim, champ(1,j,1), iip1*nlat, 0.0,238 &eignq(1,j-jdfil+1,1), iim*nlat)239 #else 240 eignq(:,j-jdfil+1,:)241 $ = matmul(matrinvs(:,:,j-jfiltsu+1),242 $champ(:iim,j,:))243 #endif 244 END DO245 246 247 ELSE IF ( griscal ) THEN248 249 DO j = jdfil,jffil250 #ifdef BLAS 251 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,252 & matriceus(1,1,j-jfiltsu+1),253 & iim, champ(1,j,1), iip1*nlat, 0.0,254 &eignq(1,j-jdfil+1,1), iim*nlat)255 #else 256 eignq(:,j-jdfil+1,:)257 $ = matmul(matriceus(:,:,j-jfiltsu+1),258 $champ(:iim,j,:))259 #endif 260 END DO261 262 ELSE263 264 DO j = jdfil,jffil265 #ifdef BLAS 266 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,267 & matricevs(1,1,j-jfiltsv+1),268 & iim, champ(1,j,1), iip1*nlat, 0.0,269 &eignq(1,j-jdfil+1,1), iim*nlat)270 #else 271 eignq(:,j-jdfil+1,:)272 $ = matmul(matricevs(:,:,j-jfiltsv+1),273 $champ(:iim,j,:))274 #endif 275 END DO276 277 ENDIF278 279 ENDIF280 281 IF( ifiltre.EQ. 2 ) THEN282 283 DO l = 1, nbniv284 DO j = jdfil,jffil285 DO i = 1, iim286 champ( i,j,l ) =287 & (champ(i,j,l) + eignq(i,j-jdfil+1,l))288 &* sdd12(i,sdd2_type) ! sdd2(i)289 END DO290 END DO291 END DO292 293 ELSE294 295 DO l = 1, nbniv296 DO j = jdfil,jffil297 DO i = 1, iim298 champ( i,j,l ) =299 & (champ(i,j,l) - eignq(i,j-jdfil+1,l))300 &* sdd12(i,sdd2_type) ! sdd2(i)301 END DO302 END DO303 END DO304 305 ENDIF306 307 DO l = 1, nbniv308 DO j = jdfil,jffil309 champ( iip1,j,l ) = champ( 1,j,l )310 END DO311 END DO312 313 314 ENDDO315 316 1111 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a317 & filtrer, sur la grille des scalaires'/)318 2222 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi319 & ltrer, sur la grille de V ou de Z'/)320 RETURN321 END 4 SUBROUTINE filtreg ( champ, nlat, nbniv, ifiltre,iaire, & 5 griscal ,iter) 6 7 USE filtreg_mod 8 9 IMPLICIT NONE 10 !======================================================================= 11 ! 12 ! Auteur: P. Le Van 07/10/97 13 ! ------ 14 ! 15 ! Objet: filtre matriciel longitudinal ,avec les matrices precalculees 16 ! pour l'operateur Filtre . 17 ! ------ 18 ! 19 ! Arguments: 20 ! ---------- 21 ! 22 ! nblat nombre de latitudes a filtrer 23 ! nbniv nombre de niveaux verticaux a filtrer 24 ! champ(iip1,nblat,nbniv) en entree : champ a filtrer 25 ! en sortie : champ filtre 26 ! ifiltre +1 Transformee directe 27 ! -1 Transformee inverse 28 ! +2 Filtre directe 29 ! -2 Filtre inverse 30 ! 31 ! iaire 1 si champ intensif 32 ! 2 si champ extensif (pondere par les aires) 33 ! 34 ! iter 1 filtre simple 35 ! 36 !======================================================================= 37 ! 38 ! 39 ! Variable Intensive 40 ! ifiltre = 1 filtre directe 41 ! ifiltre =-1 filtre inverse 42 ! 43 ! Variable Extensive 44 ! ifiltre = 2 filtre directe 45 ! ifiltre =-2 filtre inverse 46 ! 47 ! 48 INCLUDE "dimensions.h" 49 INCLUDE "paramet.h" 50 INCLUDE "coefils.h" 51 52 INTEGER :: nlat,nbniv,ifiltre,iter 53 INTEGER :: i,j,l,k 54 INTEGER :: iim2,immjm 55 INTEGER :: jdfil1,jdfil2,jffil1,jffil2,jdfil,jffil 56 57 REAL :: champ( iip1,nlat,nbniv) 58 59 REAL :: eignq(iim,nlat,nbniv), sdd1(iim),sdd2(iim) 60 LOGICAL :: griscal 61 INTEGER :: hemisph, iaire 62 63 LOGICAL,SAVE :: first=.TRUE. 64 65 REAL, SAVE :: sdd12(iim,4) 66 67 INTEGER, PARAMETER :: type_sddu=1 68 INTEGER, PARAMETER :: type_sddv=2 69 INTEGER, PARAMETER :: type_unsddu=3 70 INTEGER, PARAMETER :: type_unsddv=4 71 72 INTEGER :: sdd1_type, sdd2_type 73 74 if ( iim == 1 ) return ! no filtre in 2D y-z 75 76 IF (first) THEN 77 sdd12(1:iim,type_sddu) = sddu(1:iim) 78 sdd12(1:iim,type_sddv) = sddv(1:iim) 79 sdd12(1:iim,type_unsddu) = unsddu(1:iim) 80 sdd12(1:iim,type_unsddv) = unsddv(1:iim) 81 82 first=.FALSE. 83 ENDIF 84 85 IF(ifiltre.EQ.1.or.ifiltre.EQ.-1) & 86 STOP 'Pas de transformee simple dans cette version' 87 88 IF( iter.EQ. 2 ) THEN 89 PRINT *,' Pas d iteration du filtre dans cette version !'& 90 & , ' Utiliser old_filtreg et repasser !' 91 STOP 92 ENDIF 93 94 IF( ifiltre.EQ. -2 .AND..NOT.griscal ) THEN 95 PRINT *,' Cette routine ne calcule le filtre inverse que ' & 96 , ' sur la grille des scalaires !' 97 STOP 98 ENDIF 99 100 IF( ifiltre.NE.2 .AND.ifiltre.NE. - 2 ) THEN 101 PRINT *,' Probleme dans filtreg car ifiltre NE 2 et NE -2' & 102 , ' corriger et repasser !' 103 STOP 104 ENDIF 105 106 iim2 = iim * iim 107 immjm = iim * jjm 108 109 IF( griscal ) THEN 110 IF( nlat.NE. jjp1 ) THEN 111 PRINT 1111 112 STOP 113 ELSE 114 115 IF( iaire.EQ.1 ) THEN 116 sdd1_type = type_sddv 117 sdd2_type = type_unsddv 118 ELSE 119 sdd1_type = type_unsddv 120 sdd2_type = type_sddv 121 ENDIF 122 123 ! IF( iaire.EQ.1 ) THEN 124 ! CALL SCOPY( iim, sddv, 1, sdd1, 1 ) 125 ! CALL SCOPY( iim, unsddv, 1, sdd2, 1 ) 126 ! ELSE 127 ! CALL SCOPY( iim, unsddv, 1, sdd1, 1 ) 128 ! CALL SCOPY( iim, sddv, 1, sdd2, 1 ) 129 ! END IF 130 131 jdfil1 = 2 132 jffil1 = jfiltnu 133 jdfil2 = jfiltsu 134 jffil2 = jjm 135 END IF 136 ELSE 137 IF( nlat.NE.jjm ) THEN 138 PRINT 2222 139 STOP 140 ELSE 141 142 IF( iaire.EQ.1 ) THEN 143 sdd1_type = type_sddu 144 sdd2_type = type_unsddu 145 ELSE 146 sdd1_type = type_unsddu 147 sdd2_type = type_sddu 148 ENDIF 149 150 ! IF( iaire.EQ.1 ) THEN 151 ! CALL SCOPY( iim, sddu, 1, sdd1, 1 ) 152 ! CALL SCOPY( iim, unsddu, 1, sdd2, 1 ) 153 ! ELSE 154 ! CALL SCOPY( iim, unsddu, 1, sdd1, 1 ) 155 ! CALL SCOPY( iim, sddu, 1, sdd2, 1 ) 156 ! END IF 157 158 jdfil1 = 1 159 jffil1 = jfiltnv 160 jdfil2 = jfiltsv 161 jffil2 = jjm 162 END IF 163 END IF 164 165 DO hemisph = 1, 2 166 167 IF ( hemisph.EQ.1 ) THEN 168 jdfil = jdfil1 169 jffil = jffil1 170 ELSE 171 jdfil = jdfil2 172 jffil = jffil2 173 END IF 174 175 DO l = 1, nbniv 176 DO j = jdfil,jffil 177 DO i = 1, iim 178 champ(i,j,l) = champ(i,j,l) * sdd12(i,sdd1_type) ! sdd1(i) 179 END DO 180 END DO 181 END DO 182 183 IF( hemisph.EQ. 1 ) THEN 184 185 IF( ifiltre.EQ. -2 ) THEN 186 187 DO j = jdfil,jffil 188 #ifdef BLAS 189 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 190 matrinvn(1,1,j), & 191 iim, champ(1,j,1), iip1*nlat, 0.0, & 192 eignq(1,j-jdfil+1,1), iim*nlat) 193 #else 194 eignq(:,j-jdfil+1,:) & 195 = matmul(matrinvn(:,:,j), champ(:iim,j,:)) 196 #endif 197 END DO 198 199 ELSE IF ( griscal ) THEN 200 201 DO j = jdfil,jffil 202 #ifdef BLAS 203 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 204 matriceun(1,1,j), & 205 iim, champ(1,j,1), iip1*nlat, 0.0, & 206 eignq(1,j-jdfil+1,1), iim*nlat) 207 #else 208 eignq(:,j-jdfil+1,:) & 209 = matmul(matriceun(:,:,j), champ(:iim,j,:)) 210 #endif 211 END DO 212 213 ELSE 214 215 DO j = jdfil,jffil 216 #ifdef BLAS 217 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 218 matricevn(1,1,j), & 219 iim, champ(1,j,1), iip1*nlat, 0.0, & 220 eignq(1,j-jdfil+1,1), iim*nlat) 221 #else 222 eignq(:,j-jdfil+1,:) & 223 = matmul(matricevn(:,:,j), champ(:iim,j,:)) 224 #endif 225 END DO 226 227 ENDIF 228 229 ELSE 230 231 IF( ifiltre.EQ. -2 ) THEN 232 233 DO j = jdfil,jffil 234 #ifdef BLAS 235 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 236 matrinvs(1,1,j-jfiltsu+1), & 237 iim, champ(1,j,1), iip1*nlat, 0.0, & 238 eignq(1,j-jdfil+1,1), iim*nlat) 239 #else 240 eignq(:,j-jdfil+1,:) & 241 = matmul(matrinvs(:,:,j-jfiltsu+1), & 242 champ(:iim,j,:)) 243 #endif 244 END DO 245 246 247 ELSE IF ( griscal ) THEN 248 249 DO j = jdfil,jffil 250 #ifdef BLAS 251 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 252 matriceus(1,1,j-jfiltsu+1), & 253 iim, champ(1,j,1), iip1*nlat, 0.0, & 254 eignq(1,j-jdfil+1,1), iim*nlat) 255 #else 256 eignq(:,j-jdfil+1,:) & 257 = matmul(matriceus(:,:,j-jfiltsu+1), & 258 champ(:iim,j,:)) 259 #endif 260 END DO 261 262 ELSE 263 264 DO j = jdfil,jffil 265 #ifdef BLAS 266 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0, & 267 matricevs(1,1,j-jfiltsv+1), & 268 iim, champ(1,j,1), iip1*nlat, 0.0, & 269 eignq(1,j-jdfil+1,1), iim*nlat) 270 #else 271 eignq(:,j-jdfil+1,:) & 272 = matmul(matricevs(:,:,j-jfiltsv+1), & 273 champ(:iim,j,:)) 274 #endif 275 END DO 276 277 ENDIF 278 279 ENDIF 280 281 IF( ifiltre.EQ. 2 ) THEN 282 283 DO l = 1, nbniv 284 DO j = jdfil,jffil 285 DO i = 1, iim 286 champ( i,j,l ) = & 287 (champ(i,j,l) + eignq(i,j-jdfil+1,l)) & 288 * sdd12(i,sdd2_type) ! sdd2(i) 289 END DO 290 END DO 291 END DO 292 293 ELSE 294 295 DO l = 1, nbniv 296 DO j = jdfil,jffil 297 DO i = 1, iim 298 champ( i,j,l ) = & 299 (champ(i,j,l) - eignq(i,j-jdfil+1,l)) & 300 * sdd12(i,sdd2_type) ! sdd2(i) 301 END DO 302 END DO 303 END DO 304 305 ENDIF 306 307 DO l = 1, nbniv 308 DO j = jdfil,jffil 309 champ( iip1,j,l ) = champ( 1,j,l ) 310 END DO 311 END DO 312 313 314 ENDDO 315 316 1111 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a& 317 & filtrer, sur la grille des scalaires'/) 318 2222 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi& 319 & ltrer, sur la grille de V ou de Z'/) 320 RETURN 321 END SUBROUTINE filtreg -
LMDZ6/trunk/libf/filtrez/inifgn.F90
r5245 r5246 2 2 ! $Header: /home/cvsroot/LMDZ4/libf/filtrez/inifgn.F,v 1.1.1.1 2004-05-19 12:53:09 lmdzadmin Exp $ 3 3 ! 4 SUBROUTINE inifgn(dv)5 c 6 c ... H.Upadyaya , O.Sharma ... 7 c 8 IMPLICIT NONE9 c 10 include "dimensions.h"11 include "paramet.h"12 include "comgeom.h"4 SUBROUTINE inifgn(dv) 5 ! 6 ! ... H.Upadyaya , O.Sharma ... 7 ! 8 IMPLICIT NONE 9 ! 10 include "dimensions.h" 11 include "paramet.h" 12 include "comgeom.h" 13 13 14 c 15 REALvec(iim,iim),vec1(iim,iim)16 REALdlonu(iim),dlonv(iim)17 REALdu(iim),dv(iim),d(iim)18 REALpi19 INTEGERi,j,k,imm1,nrot20 C 21 include "coefils.h"22 c 23 EXTERNAL SSUM, acc,eigen,jacobi24 REALSSUM25 c 14 ! 15 REAL :: vec(iim,iim),vec1(iim,iim) 16 REAL :: dlonu(iim),dlonv(iim) 17 REAL :: du(iim),dv(iim),d(iim) 18 REAL :: pi 19 INTEGER :: i,j,k,imm1,nrot 20 ! 21 include "coefils.h" 22 ! 23 EXTERNAL SSUM, acc,eigen,jacobi 24 REAL :: SSUM 25 ! 26 26 27 imm1 = iim -128 pi = 2.* ASIN(1.)29 C 30 DO 5i=1,iim31 dlonu(i)= xprimu( i )32 dlonv(i)= xprimv( i )33 5 CONTINUE27 imm1 = iim -1 28 pi = 2.* ASIN(1.) 29 ! 30 DO i=1,iim 31 dlonu(i)= xprimu( i ) 32 dlonv(i)= xprimv( i ) 33 END DO 34 34 35 DO 12 i=1,iim 36 sddv(i) = SQRT(dlonv(i)) 37 sddu(i) = SQRT(dlonu(i)) 38 unsddu(i) = 1./sddu(i) 39 unsddv(i) = 1./sddv(i) 40 12 CONTINUE 41 C 42 DO 17 j=1,iim 43 DO 17 i=1,iim 44 vec(i,j) = 0. 45 vec1(i,j) = 0. 46 eignfnv(i,j) = 0. 47 eignfnu(i,j) = 0. 48 17 CONTINUE 49 c 50 c 51 eignfnv(1,1) = -1. 52 eignfnv(iim,1) = 1. 53 DO 20 i=1,imm1 54 eignfnv(i+1,i+1)= -1. 55 eignfnv(i,i+1) = 1. 56 20 CONTINUE 57 DO 25 j=1,iim 58 DO 25 i=1,iim 59 eignfnv(i,j) = eignfnv(i,j)/(sddu(i)*sddv(j)) 60 25 CONTINUE 61 DO 30 j=1,iim 62 DO 30 i=1,iim 63 eignfnu(i,j) = -eignfnv(j,i) 64 30 CONTINUE 65 c 35 DO i=1,iim 36 sddv(i) = SQRT(dlonv(i)) 37 sddu(i) = SQRT(dlonu(i)) 38 unsddu(i) = 1./sddu(i) 39 unsddv(i) = 1./sddv(i) 40 END DO 41 ! 42 DO j=1,iim 43 DO i=1,iim 44 vec(i,j) = 0. 45 vec1(i,j) = 0. 46 eignfnv(i,j) = 0. 47 eignfnu(i,j) = 0. 48 END DO 49 END DO 50 ! 51 ! 52 eignfnv(1,1) = -1. 53 eignfnv(iim,1) = 1. 54 DO i=1,imm1 55 eignfnv(i+1,i+1)= -1. 56 eignfnv(i,i+1) = 1. 57 END DO 58 DO j=1,iim 59 DO i=1,iim 60 eignfnv(i,j) = eignfnv(i,j)/(sddu(i)*sddv(j)) 61 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 67 END DO 68 ! 66 69 #ifdef CRAY 67 CALL MXM(eignfnu,iim,eignfnv,iim,vec ,iim)68 CALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim)70 CALL MXM(eignfnu,iim,eignfnv,iim,vec ,iim) 71 CALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim) 69 72 #else 70 DO j = 1, iim71 DO i = 1, iim72 vec (i,j) = 0.073 vec1(i,j) = 0.074 DO k = 1, iim75 vec (i,j) = vec(i,j) + eignfnu(i,k) * eignfnv(k,j)76 vec1(i,j) = vec1(i,j) + eignfnv(i,k) * eignfnu(k,j)77 ENDDO78 ENDDO79 ENDDO73 DO j = 1, iim 74 DO i = 1, iim 75 vec (i,j) = 0.0 76 vec1(i,j) = 0.0 77 DO k = 1, iim 78 vec (i,j) = vec(i,j) + eignfnu(i,k) * eignfnv(k,j) 79 vec1(i,j) = vec1(i,j) + eignfnv(i,k) * eignfnu(k,j) 80 ENDDO 81 ENDDO 82 ENDDO 80 83 #endif 81 84 82 c 83 CALL jacobi(vec,iim,iim,dv,eignfnv,nrot)84 CALL acc(eignfnv,d,iim)85 CALL eigen_sort(dv,eignfnv,iim,iim)86 c 87 CALL jacobi(vec1,iim,iim,du,eignfnu,nrot)88 CALL acc(eignfnu,d,iim)89 CALL eigen_sort(du,eignfnu,iim,iim)85 ! 86 CALL jacobi(vec,iim,iim,dv,eignfnv,nrot) 87 CALL acc(eignfnv,d,iim) 88 CALL eigen_sort(dv,eignfnv,iim,iim) 89 ! 90 CALL jacobi(vec1,iim,iim,du,eignfnu,nrot) 91 CALL acc(eignfnu,d,iim) 92 CALL eigen_sort(du,eignfnu,iim,iim) 90 93 91 cc ancienne version avec appels IMSL92 c 93 cCALL MXM(eignfnu,iim,eignfnv,iim,vec,iim)94 cCALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim)95 cCALL EVCSF(iim,vec,iim,dv,eignfnv,iim)96 cCALL acc(eignfnv,d,iim)97 cCALL eigen(eignfnv,dv)98 c 99 cCALL EVCSF(iim,vec1,iim,du,eignfnu,iim)100 cCALL acc(eignfnu,d,iim)101 cCALL eigen(eignfnu,du)94 !c ancienne version avec appels IMSL 95 ! 96 ! CALL MXM(eignfnu,iim,eignfnv,iim,vec,iim) 97 ! CALL MXM(eignfnv,iim,eignfnu,iim,vec1,iim) 98 ! CALL EVCSF(iim,vec,iim,dv,eignfnv,iim) 99 ! CALL acc(eignfnv,d,iim) 100 ! CALL eigen(eignfnv,dv) 101 ! 102 ! CALL EVCSF(iim,vec1,iim,du,eignfnu,iim) 103 ! CALL acc(eignfnu,d,iim) 104 ! CALL eigen(eignfnu,du) 102 105 103 RETURN104 END 106 RETURN 107 END SUBROUTINE inifgn 105 108
Note: See TracChangeset
for help on using the changeset viewer.
