Changeset 213 in lmdz_wrf for trunk/tools
- Timestamp:
- Jan 9, 2015, 3:21:22 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/iniaqua.py
r212 r213 21 21 ## g.e. # iniaqua.py -d 32,32,39 -p hybdrid -o WRF -t 19791201000000 -z param 22 22 23 # from dyn3d/fxy_new.h24 #c25 #c....stretching in x...26 #c27 def fripx(ri,dx):28 fname = 'fripx'29 30 ripx = (ri-1.0) *2.*np.pi/np.float(dx)31 32 return ripx33 34 def ffx(ri):35 fname = 'ffx'36 37 fx = fripx(ri) + transx + alphax * np.sin(fripx(ri)+transx-pxo ) - np.pi38 39 return fx40 41 def ffxprim(ri,dx):42 fname = 'ffxprim'43 44 fxprim = 2.*np.pi/REAL(dx)*( 1.+ alphax*np.cos( fripx(ri)+transx-pxo ) )45 46 return fxprim47 48 #c....stretching in y...49 #c50 def fbigy(rj,jjp1,jjm):51 fname = 'fbigy'52 53 bigy = 2.*(np.float(jjp1)-rj)*np.pi/jjm54 55 return bigy56 57 def fy(rj):58 fname = 'fy'59 60 fy = ( fbigy(rj) + transy + alphay * np.sin(fbigy(rj)+transy-pyo) )/2. - np.pi/2.61 62 return fy63 64 def ffyprim(rj,jjm):65 fname = 'ffyprim'66 67 fyprim = ( np.pi/jjm ) * ( 1. + alphay * np.cos( fbigy(rj)+transy-pyo ) )68 69 return fyprim70 71 def fxy(dx, dy):72 73 """!74 ! $Id: fxy.F 1403 2010-07-01 09:02:53Z fairhead $75 !76 77 c Auteur : P. Le Van78 c79 c Calcul des longitudes et des latitudes pour une fonction f(x,y)80 c a tangente sinusoidale et eventuellement avec zoom .81 c82 c83 """84 85 fname ='fxy'86 87 #c ...... calcul des latitudes et de y' .....88 #c89 vrlatu = np.zeros((dy+1), dtype=np.float)90 vyprimu = np.zeros((dy+1), dtype=np.float)91 92 vrlatu = ffy(np.arange(dy+1)*1. + 1.)93 vyprimu = ffy(np.arange(dy+1)*1. + 1.)94 95 vrlatv = np.zeros((dy), dtype=np.float)96 vrlatu1 = np.zeros((dy), dtype=np.float)97 vrlatu2 = np.zeros((dy), dtype=np.float)98 yprimv = np.zeros((dy), dtype=np.float)99 vyprimu1 = np.zeros((dy), dtype=np.float)100 vyprimu2 = np.zeros((dy), dtype=np.float)101 102 vrlatv = ffy(np.arange(dy)*1. + 1. + 0.5)103 vrlatu1 = ffy(np.arange(dy)*1. + 1. + 0.25)104 vrlatu2 = ffy(np.arange(dy)*1. + 1. + 0.75)105 106 vyprimv = fyprim(np.arange(dy)*1. + 1. + 0.5)107 vyprimu1 = fyprim(np.arange(dy)*1. + 1. + 0.25)108 vyprimu2 = fyprim(np.arange(dy)*1. + 1. + 0.75)109 110 #c111 #c ..... calcul des longitudes et de x' .....112 #c113 vrlonv = np.zeros((dx+1), dtype=np.float)114 vrlonu = np.zeros((dx+1), dtype=np.float)115 vrlonm025 = np.zeros((dx+1), dtype=np.float)116 vrlonp025 = np.zeros((dx+1), dtype=np.float)117 vxprimv = np.zeros((dx+1), dtype=np.float)118 vxprimu = np.zeros((dx+1), dtype=np.float)119 vxprimm025 = np.zeros((dx+1), dtype=np.float)120 vxprimo025 = np.zeros((dx+1), dtype=np.float)121 122 vrlonv = ffy(np.arange(dx+1)*1. + 1.)123 vrlonu = ffy(np.arange(dx+1)*1. + 1. + 0.5)124 vrlonm025 = ffy(np.arange(dx+1)*1. + 1. - 0.25)125 vrlonp025 = ffy(np.arange(dx+1)*1. + 1. + 0.25)126 127 vxprimv = fxprim(np.arange(dx+1)*1. + 1.)128 vxprimu = fxprim(np.arange(dx+1)*1. + 1. + 0.5)129 vxprimm025 = fxprim(np.arange(dx+1)*1. + 1. - 0.25)130 vxprimp025 = fxprim(np.arange(dx+1)*1. + 1. + 0.25)131 132 return vrlatu, vyprimu, vrlatv, vyprimv, vrlatu1, vyprimu1, vrlatu2, vyprimu2, \133 vrlonu, vxprimu, vrlonv, vxprimv, vrlonm025, vxprimm025, vrlonp025, vxprimp025134 135 def jacobi(A,N,NP):136 """!137 ! $Id: jacobi.F90 1289 2009-12-18 14:51:22Z emillour $138 !139 """140 fname = 'jacobi'141 142 D = np.zeros((NP), dtype=np.float)143 V = np.zeros((NP,NP), dtype=np.float)144 B = np.zeros((NP), dtype=np.float)145 Z = np.zeros((NP), dtype=np.float)146 147 for IP in range(N):148 V[IP,IP]=1.149 B[IP] = A[IP,IP]150 151 D = B152 NROT = 0153 for I in range(50):154 # DO I=1,50 ! 50? I suspect this should be NP155 # ! but convergence is fast enough anyway156 SM = 0.157 for IP in range(N-1):158 for IQ in range(IP+1,N):159 SM = SM + np.abs(A[IP,IQ])160 161 if SM == 0.: return A, D, V, NROT162 163 if I < 4:164 TRESH = 0.2*SM/N**2165 else:166 TRESH = 0.167 168 for IP in range(N-1):169 for IQ in range(IP+1,N):170 G = 100.*np.abs(A[IP,IQ])171 if I > 4 and np.abs(D[I]) + G == np.abs(D[IP]) and \172 np.abs(D[IQ])+G == np.abs(D[IQ]):173 A[IP,IQ] = 0.174 elif np.abs(A[IP,IQ]) > TRESH:175 H = D[IQ]-D[IP]176 if np.abs(H)+G == np.abs(H):177 T = A[IP,IQ]/H178 else:179 THETA = 0.5*H/A[IP,IQ]180 T = 1./(np.abs(THETA)+np.sqrt(1.+THETA**2))181 if THETA < 0.: T = -T182 183 C=1./SQRT(1+T**2)184 S=T*C185 TAU=S/(1.+C)186 H=T*A[IP,IQ]187 Z[IP]=Z[IP]-H188 Z[IQ]=Z[IQ]+H189 D[IP]=D[IP]-H190 D[IQ]=D[IQ]+H191 A[IP,IQ]=0.192 for J in range(IP-1):193 G=A[J,IP]194 H=A[J,IQ]195 A[J,IP]=G-S*(H+G*TAU)196 A[J,IQ]=H+S*(G-H*TAU)197 198 for J in range(IP+1,IQ-1):199 G = A[IP,J]200 H = A[J,IQ]201 A[IP,J] = G-S*(H+G*TAU)202 A[J,IQ] = H+S*(G-H*TAU)203 204 for J in range(IQ+1,N):205 G = A[IP,J]206 H = A[IQ,J]207 A[IP,J] = G-S*(H+G*TAU)208 A[IQ,J] = H+S*(G-H*TAU)209 210 for J in range(N):211 G = V[J,IP]212 H = V[J,IQ]213 V[J,IP] = G-S*(H+G*TAU)214 V[J,IQ] = H+S*(G-H*TAU)215 216 NROT=NROT+1217 218 B = B + Z219 D = B220 Z = 0.221 222 print errormsg223 print ' ' + fname + ': 50 iterations should never happen !!'224 quit(-1)225 226 return227 228 def acc(vec,im):229 """!230 ! $Header$231 !232 """233 fname ='acc'234 235 d = np.zeros((im), dtype=np.float)236 237 for j in range(im):238 for i in range(im):239 d[i] = vec[i,j]*vec[i,j]240 241 vsum = np.sqrt(np.sum(d))242 for i in range(im):243 vec[i,j] = vec[i,j] / vsum244 245 return vec, d246 247 def eigen_sort(d,n,np):248 """!249 ! $Header$250 !251 """252 fname = 'eigen_sort'253 254 v = np.zeros((np,np), dtype=np.float)255 256 for i in range(n-1):257 k=i258 p=d[i]259 for j in range(i+1,n):260 if d[j] >= p:261 k=j262 p=d[j]263 264 if k != i:265 d[k]=d[i]266 d[i]=p267 for j in range(n):268 p=v[j,i]269 v[j,i]=v[j,k]270 v[j,k]=p271 272 return d, v273 274 def inifgn(dx, dy, dv):275 """! $Header: /home/cvsroot/LMDZ4/libf/filtrez/inifgn.F,v 1.1.1.1 2004-05-19 12:53:09 lmdzadmin Exp $276 !277 c278 c ... H.Upadyaya , O.Sharma ...279 c280 """281 fname = 'inifgn'282 283 imm1 = dx - 1284 285 rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, yprimu2, rlonu, xprimu, \286 rlonv, xprimv, rlonm025, xprimm025, rlonp025, xprimp025 = fxy(dx,dy)287 288 dlonu = xprimu289 dlonv = xprimv290 291 sddv = np.sqrt(dlonv)292 sddu = np.sqrt(dlonu)293 unsddu = 1./sddu294 unsddv = 1./sddv295 296 vec = np.zeros((dx,dy), dtype=np.float)297 vec1 = np.zeros((dx,dy), dtype=np.float)298 eigenfnv = np.zeros((dx,dy), dtype=np.float)299 eigenfnu = np.zeros((dx,dy), dtype=np.float)300 c301 c302 eignfnv[0,0] = -1.303 eignfnv[dx-1,0] = 1.304 305 for i in range(imm1):306 eignfnv[i+1,i+1]= -1.307 eignfnv[i,i+1] = 1.308 309 for j in range(dx):310 for i in range(dx):311 eignfnv[i,j] = eignfnv[i,j]/(sddu[i]*sddv[j])312 313 for j in range(dx):314 for i in range(dx):315 eignfnu[i,j] = -eignfnv[j,i]316 317 for j in range(dx):318 for i in range(dx):319 vec[i,j] = 0.0320 vec1[i,j] = 0.0321 for k in range(dx):322 vec[i,j] = vec[i,j] + eignfnu[i,k]*eignfnv[k,j]323 vec1[i,j] = vec1[i,j] + eignfnv[i,k]*eignfnu[k,j]324 325 vec, dv, eignfnv, nrot = jacobi(vec,iim,iim)326 eignfnv, d = acc(eignfnv,iim)327 dv, eignfnv = eigen_sort(dv,iim,iim)328 c329 vec1, du, eignfnu, nrot = jacobi(vec1,iim,iim)330 eignfnu, d = acc(eignfnu,iim)331 du, eignfnu = eigen_sort(du,iim,iim)332 333 return sddu, unsddu, sddv, unsddv334 335 336 def inifilr(iim, xprimu):337 """ from: filtrez/filtreg_mod.F90338 ! ... H. Upadhyaya, O.Sharma ...339 !340 ! version 3 .....341 342 ! Correction le 28/10/97 P. Le Van .343 ! -------------------------------------------------------------------344 !345 ! ------------------------------------------------------------346 ! This routine computes the eigenfunctions of the laplacien347 ! on the stretched grid, and the filtering coefficients348 !349 ! We designate:350 ! eignfn eigenfunctions of the discrete laplacien351 ! eigenvl eigenvalues352 ! jfiltn indexof the last scalar line filtered in NH353 ! jfilts index of the first line filtered in SH354 ! modfrst index of the mode from WHERE modes are filtered355 ! modemax maximum number of modes ( im )356 ! coefil filtering coefficients ( lamda_max*COS(rlat)/lamda )357 ! sdd SQRT( dx )358 !359 ! the modes are filtered from modfrst to modemax360 !361 !-----------------------------------------------------------362 !363 """364 fname = 'inifilr'365 366 dlonu = xprimu367 368 !369 CALL inifgn(eignvl)370 !371 PRINT *,'inifilr: EIGNVL '372 PRINT 250,eignvl373 250 FORMAT( 1x,5e14.6)374 !375 ! compute eigenvalues and eigenfunctions376 !377 !378 !.................................................................379 !380 ! compute the filtering coefficients for scalar lines and381 ! meridional wind v-lines382 !383 ! we filter all those latitude lines WHERE coefil < 1384 ! NO FILTERING AT POLES385 !386 ! colat0 is to be used when alpha (stretching coefficient)387 ! is set equal to zero for the regular grid CASE388 !389 ! ....... Calcul de colat0 .........390 ! ..... colat0 = minimum de ( 0.5, min dy/ min dx ) ...391 !392 !393 DO j = 1,jjm394 dlatu( j ) = rlatu( j ) - rlatu( j+1 )395 ENDDO396 !397 #ifdef CRAY398 iymin = ISMIN( jjm, dlatu, 1 )399 ixmineq = ISMIN( iim, dlonu, 1 )400 dymin = dlatu( iymin )401 dxmin = dlonu( ixmineq )402 #else403 dxmin = dlonu(1)404 DO i = 2, iim405 dxmin = MIN( dxmin,dlonu(i) )406 ENDDO407 dymin = dlatu(1)408 DO j = 2, jjm409 dymin = MIN( dymin,dlatu(j) )410 ENDDO411 #endif412 !413 ! For a regular grid, we want the filter to start at latitudes414 ! corresponding to lengths dx of the same size as dy (in terms415 ! of angles: dx=2*dy) => at colat0=0.5 (i.e. colatitude=30 degrees416 ! <=> latitude=60 degrees).417 ! Same idea for the zoomed grid: start filtering polewards as soon418 ! as length dx becomes of the same size as dy419 !420 colat0 = MIN( 0.5, dymin/dxmin )421 !422 IF( .NOT.fxyhypb.AND.ysinus ) THEN423 colat0 = 0.6424 ! ...... a revoir pour ysinus ! .......425 alphax = 0.426 ENDIF427 !428 PRINT 50, colat0,alphax429 50 FORMAT(/15x,' Inifilr colat0 alphax ',2e16.7)430 !431 IF(alphax.EQ.1. ) THEN432 PRINT *,' Inifilr alphax doit etre < a 1. Corriger '433 STOP434 ENDIF435 !436 lamdamax = iim / ( pi * colat0 * ( 1. - alphax ) )437 438 ! ... Correction le 28/10/97 ( P.Le Van ) ..439 !440 DO i = 2,iim441 rlamda( i ) = lamdamax/ SQRT( ABS( eignvl(i) ) )442 ENDDO443 !444 445 DO j = 1,jjm446 DO i = 1,iim447 coefilu( i,j ) = 0.0448 coefilv( i,j ) = 0.0449 coefilu2( i,j ) = 0.0450 coefilv2( i,j ) = 0.0451 ENDDO452 ENDDO453 454 !455 ! ... Determination de jfiltnu,jfiltnv,jfiltsu,jfiltsv ....456 ! .........................................................457 !458 modemax = iim459 460 !!!! imx = modemax - 4 * (modemax/iim)461 462 imx = iim463 !464 PRINT *,'inifilr: TRUNCATION AT ',imx465 !466 ! Ehouarn: set up some defaults467 jfiltnu=2 ! avoid north pole468 jfiltsu=jjm ! avoid south pole (which is at jjm+1)469 jfiltnv=1 ! NB: no poles on the V grid470 jfiltsv=jjm471 472 DO j = 2, jjm/2+1473 cof = COS( rlatu(j) )/ colat0474 IF ( cof .LT. 1. ) THEN475 IF( rlamda(imx) * COS(rlatu(j) ).LT.1. ) THEN476 jfiltnu= j477 ENDIF478 ENDIF479 480 cof = COS( rlatu(jjp1-j+1) )/ colat0481 IF ( cof .LT. 1. ) THEN482 IF( rlamda(imx) * COS(rlatu(jjp1-j+1) ).LT.1. ) THEN483 jfiltsu= jjp1-j+1484 ENDIF485 ENDIF486 ENDDO487 !488 DO j = 1, jjm/2489 cof = COS( rlatv(j) )/ colat0490 IF ( cof .LT. 1. ) THEN491 IF( rlamda(imx) * COS(rlatv(j) ).LT.1. ) THEN492 jfiltnv= j493 ENDIF494 ENDIF495 496 cof = COS( rlatv(jjm-j+1) )/ colat0497 IF ( cof .LT. 1. ) THEN498 IF( rlamda(imx) * COS(rlatv(jjm-j+1) ).LT.1. ) THEN499 jfiltsv= jjm-j+1500 ENDIF501 ENDIF502 ENDDO503 !504 505 IF( jfiltnu.GT. jjm/2 +1 ) THEN506 PRINT *,' jfiltnu en dehors des valeurs acceptables ' ,jfiltnu507 STOP508 ENDIF509 510 IF( jfiltsu.GT. jjm +1 ) THEN511 PRINT *,' jfiltsu en dehors des valeurs acceptables ' ,jfiltsu512 STOP513 ENDIF514 515 IF( jfiltnv.GT. jjm/2 ) THEN516 PRINT *,' jfiltnv en dehors des valeurs acceptables ' ,jfiltnv517 STOP518 ENDIF519 520 IF( jfiltsv.GT. jjm ) THEN521 PRINT *,' jfiltsv en dehors des valeurs acceptables ' ,jfiltsv522 STOP523 ENDIF524 525 PRINT *,'inifilr: jfiltnv jfiltsv jfiltnu jfiltsu ' , &526 jfiltnv,jfiltsv,jfiltnu,jfiltsu527 528 IF(first_call_inifilr) THEN529 ALLOCATE(matriceun(iim,iim,jfiltnu))530 ALLOCATE(matriceus(iim,iim,jjm-jfiltsu+1))531 ALLOCATE(matricevn(iim,iim,jfiltnv))532 ALLOCATE(matricevs(iim,iim,jjm-jfiltsv+1))533 ALLOCATE( matrinvn(iim,iim,jfiltnu))534 ALLOCATE( matrinvs(iim,iim,jjm-jfiltsu+1))535 first_call_inifilr = .FALSE.536 ENDIF537 538 !539 ! ... Determination de coefilu,coefilv,n=modfrstu,modfrstv ....540 !................................................................541 !542 !543 DO j = 1,jjm544 !default initialization: all modes are retained (i.e. no filtering)545 modfrstu( j ) = iim546 modfrstv( j ) = iim547 ENDDO548 !549 DO j = 2,jfiltnu550 DO k = 2,modemax551 cof = rlamda(k) * COS( rlatu(j) )552 IF ( cof .LT. 1. ) GOTO 82553 ENDDO554 GOTO 84555 82 modfrstu( j ) = k556 !557 kf = modfrstu( j )558 DO k = kf , modemax559 cof = rlamda(k) * COS( rlatu(j) )560 coefilu(k,j) = cof - 1.561 coefilu2(k,j) = cof*cof - 1.562 ENDDO563 84 CONTINUE564 ENDDO565 !566 !567 DO j = 1,jfiltnv568 !569 DO k = 2,modemax570 cof = rlamda(k) * COS( rlatv(j) )571 IF ( cof .LT. 1. ) GOTO 87572 ENDDO573 GOTO 89574 87 modfrstv( j ) = k575 !576 kf = modfrstv( j )577 DO k = kf , modemax578 cof = rlamda(k) * COS( rlatv(j) )579 coefilv(k,j) = cof - 1.580 coefilv2(k,j) = cof*cof - 1.581 ENDDO582 89 CONTINUE583 ENDDO584 !585 DO j = jfiltsu,jjm586 DO k = 2,modemax587 cof = rlamda(k) * COS( rlatu(j) )588 IF ( cof .LT. 1. ) GOTO 92589 ENDDO590 GOTO 94591 92 modfrstu( j ) = k592 !593 kf = modfrstu( j )594 DO k = kf , modemax595 cof = rlamda(k) * COS( rlatu(j) )596 coefilu(k,j) = cof - 1.597 coefilu2(k,j) = cof*cof - 1.598 ENDDO599 94 CONTINUE600 ENDDO601 !602 DO j = jfiltsv,jjm603 DO k = 2,modemax604 cof = rlamda(k) * COS( rlatv(j) )605 IF ( cof .LT. 1. ) GOTO 97606 ENDDO607 GOTO 99608 97 modfrstv( j ) = k609 !610 kf = modfrstv( j )611 DO k = kf , modemax612 cof = rlamda(k) * COS( rlatv(j) )613 coefilv(k,j) = cof - 1.614 coefilv2(k,j) = cof*cof - 1.615 ENDDO616 99 CONTINUE617 ENDDO618 !619 620 IF(jfiltnv.GE.jjm/2 .OR. jfiltnu.GE.jjm/2)THEN621 ! Ehouarn: and what are these for??? Trying to handle a limit case622 ! where filters extend to and meet at the equator?623 IF(jfiltnv.EQ.jfiltsv)jfiltsv=1+jfiltnv624 IF(jfiltnu.EQ.jfiltsu)jfiltsu=1+jfiltnu625 626 PRINT *,'jfiltnv jfiltsv jfiltnu jfiltsu' , &627 jfiltnv,jfiltsv,jfiltnu,jfiltsu628 ENDIF629 630 PRINT *,' Modes premiers v '631 PRINT 334,modfrstv632 PRINT *,' Modes premiers u '633 PRINT 334,modfrstu634 635 !636 ! ...................................................................637 !638 ! ... Calcul de la matrice filtre 'matriceu' pour les champs situes639 ! sur la grille scalaire ........640 ! ...................................................................641 !642 DO j = 2, jfiltnu643 644 DO i=1,iim645 coff = coefilu(i,j)646 IF( i.LT.modfrstu(j) ) coff = 0.647 DO k=1,iim648 eignft(i,k) = eignfnv(k,i) * coff649 ENDDO650 ENDDO ! of DO i=1,iim651 #ifdef CRAY652 CALL MXM( eignfnv,iim,eignft,iim,matriceun(1,1,j),iim )653 #else654 #ifdef BLAS655 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &656 eignfnv, iim, eignft, iim, 0.0, matriceun(1,1,j), iim)657 #else658 DO k = 1, iim659 DO i = 1, iim660 matriceun(i,k,j) = 0.0661 DO ii = 1, iim662 matriceun(i,k,j) = matriceun(i,k,j) &663 + eignfnv(i,ii)*eignft(ii,k)664 ENDDO665 ENDDO666 ENDDO ! of DO k = 1, iim667 #endif668 #endif669 670 ENDDO ! of DO j = 2, jfiltnu671 672 DO j = jfiltsu, jjm673 674 DO i=1,iim675 coff = coefilu(i,j)676 IF( i.LT.modfrstu(j) ) coff = 0.677 DO k=1,iim678 eignft(i,k) = eignfnv(k,i) * coff679 ENDDO680 ENDDO ! of DO i=1,iim681 #ifdef CRAY682 CALL MXM(eignfnv,iim,eignft,iim,matriceus(1,1,j-jfiltsu+1),iim)683 #else684 #ifdef BLAS685 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &686 eignfnv, iim, eignft, iim, 0.0, &687 matriceus(1,1,j-jfiltsu+1), iim)688 #else689 DO k = 1, iim690 DO i = 1, iim691 matriceus(i,k,j-jfiltsu+1) = 0.0692 DO ii = 1, iim693 matriceus(i,k,j-jfiltsu+1) = matriceus(i,k,j-jfiltsu+1) &694 + eignfnv(i,ii)*eignft(ii,k)695 ENDDO696 ENDDO697 ENDDO ! of DO k = 1, iim698 #endif699 #endif700 701 ENDDO ! of DO j = jfiltsu, jjm702 703 ! ...................................................................704 !705 ! ... Calcul de la matrice filtre 'matricev' pour les champs situes706 ! sur la grille de V ou de Z ........707 ! ...................................................................708 !709 DO j = 1, jfiltnv710 711 DO i = 1, iim712 coff = coefilv(i,j)713 IF( i.LT.modfrstv(j) ) coff = 0.714 DO k = 1, iim715 eignft(i,k) = eignfnu(k,i) * coff716 ENDDO717 ENDDO718 #ifdef CRAY719 CALL MXM( eignfnu,iim,eignft,iim,matricevn(1,1,j),iim )720 #else721 #ifdef BLAS722 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &723 eignfnu, iim, eignft, iim, 0.0, matricevn(1,1,j), iim)724 #else725 DO k = 1, iim726 DO i = 1, iim727 matricevn(i,k,j) = 0.0728 DO ii = 1, iim729 matricevn(i,k,j) = matricevn(i,k,j) &730 + eignfnu(i,ii)*eignft(ii,k)731 ENDDO732 ENDDO733 ENDDO734 #endif735 #endif736 737 ENDDO ! of DO j = 1, jfiltnv738 739 DO j = jfiltsv, jjm740 741 DO i = 1, iim742 coff = coefilv(i,j)743 IF( i.LT.modfrstv(j) ) coff = 0.744 DO k = 1, iim745 eignft(i,k) = eignfnu(k,i) * coff746 ENDDO747 ENDDO748 #ifdef CRAY749 CALL MXM(eignfnu,iim,eignft,iim,matricevs(1,1,j-jfiltsv+1),iim)750 #else751 #ifdef BLAS752 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &753 eignfnu, iim, eignft, iim, 0.0, &754 matricevs(1,1,j-jfiltsv+1), iim)755 #else756 DO k = 1, iim757 DO i = 1, iim758 matricevs(i,k,j-jfiltsv+1) = 0.0759 DO ii = 1, iim760 matricevs(i,k,j-jfiltsv+1) = matricevs(i,k,j-jfiltsv+1) &761 + eignfnu(i,ii)*eignft(ii,k)762 ENDDO763 ENDDO764 ENDDO765 #endif766 #endif767 768 ENDDO ! of DO j = jfiltsv, jjm769 770 ! ...................................................................771 !772 ! ... Calcul de la matrice filtre 'matrinv' pour les champs situes773 ! sur la grille scalaire , pour le filtre inverse ........774 ! ...................................................................775 !776 DO j = 2, jfiltnu777 778 DO i = 1,iim779 coff = coefilu(i,j)/ ( 1. + coefilu(i,j) )780 IF( i.LT.modfrstu(j) ) coff = 0.781 DO k=1,iim782 eignft(i,k) = eignfnv(k,i) * coff783 ENDDO784 ENDDO785 #ifdef CRAY786 CALL MXM( eignfnv,iim,eignft,iim,matrinvn(1,1,j),iim )787 #else788 #ifdef BLAS789 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &790 eignfnv, iim, eignft, iim, 0.0, matrinvn(1,1,j), iim)791 #else792 DO k = 1, iim793 DO i = 1, iim794 matrinvn(i,k,j) = 0.0795 DO ii = 1, iim796 matrinvn(i,k,j) = matrinvn(i,k,j) &797 + eignfnv(i,ii)*eignft(ii,k)798 ENDDO799 ENDDO800 ENDDO801 #endif802 #endif803 804 ENDDO ! of DO j = 2, jfiltnu805 806 DO j = jfiltsu, jjm807 808 DO i = 1,iim809 coff = coefilu(i,j) / ( 1. + coefilu(i,j) )810 IF( i.LT.modfrstu(j) ) coff = 0.811 DO k=1,iim812 eignft(i,k) = eignfnv(k,i) * coff813 ENDDO814 ENDDO815 #ifdef CRAY816 CALL MXM(eignfnv,iim,eignft,iim,matrinvs(1,1,j-jfiltsu+1),iim)817 #else818 #ifdef BLAS819 CALL SGEMM ('N', 'N', iim, iim, iim, 1.0, &820 eignfnv, iim, eignft, iim, 0.0, matrinvs(1,1,j-jfiltsu+1), iim)821 #else822 DO k = 1, iim823 DO i = 1, iim824 matrinvs(i,k,j-jfiltsu+1) = 0.0825 DO ii = 1, iim826 matrinvs(i,k,j-jfiltsu+1) = matrinvs(i,k,j-jfiltsu+1) &827 + eignfnv(i,ii)*eignft(ii,k)828 ENDDO829 ENDDO830 ENDDO831 #endif832 #endif833 834 ENDDO ! of DO j = jfiltsu, jjm835 836 IF (use_filtre_fft) THEN837 CALL Init_filtre_fft(coefilu,modfrstu,jfiltnu,jfiltsu, &838 coefilv,modfrstv,jfiltnv,jfiltsv)839 CALL Init_filtre_fft_loc(coefilu,modfrstu,jfiltnu,jfiltsu, &840 coefilv,modfrstv,jfiltnv,jfiltsv)841 ENDIF842 843 ! ...................................................................844 845 !846 334 FORMAT(1x,24i3)847 755 FORMAT(1x,6f10.3,i3)848 849 RETURN850 END SUBROUTINE inifilr851 852 853 def filtreg(dx, dy, champorig, nlat, nbniv, ifiltre, iaire, griscal ,iterv):854 """c=======================================================================855 c856 c Auteur: P. Le Van 07/10/97857 c ------858 c859 c Objet: filtre matriciel longitudinal ,avec les matrices precalculees860 c pour l'operateur Filtre .861 c ------862 c863 c Arguments:864 c ----------865 c866 c nblat nombre de latitudes a filtrer867 c nbniv nombre de niveaux verticaux a filtrer868 c champ(iip1,nblat,nbniv) en entree : champ a filtrer869 c en sortie : champ filtre870 c ifiltre +1 Transformee directe871 c -1 Transformee inverse872 c +2 Filtre directe873 c -2 Filtre inverse874 c875 c iaire 1 si champ intensif876 c 2 si champ extensif (pondere par les aires)877 c878 c iterv 1 filtre simple879 c880 c=======================================================================881 c882 c883 c Variable Intensive884 c ifiltre = 1 filtre directe885 c ifiltre =-1 filtre inverse886 c887 c Variable Extensive888 c ifiltre = 2 filtre directe889 c ifiltre =-2 filtre inverse890 c891 """892 893 fname = 'filtreg'894 first = True895 896 sdd12 = np.zeros((dx,4), dtype = np.float)897 898 champ = fortran_mat(champorig)899 900 sddu, unsddu, sddv, unsddv = inifgn(dx, dy)901 902 if first:903 sdd12[:,type_sddu] = sddu904 sdd12[:,type_sddv] = sddv905 sdd12[:,type_unsddu] = unsddu906 sdd12[:,type_unsddv] = unsddv907 908 first=False909 910 if ifiltre == 1 or ifiltre == -1:911 print ' ' + fname + ': Pas de transformee simple dans cette version'912 quit()913 914 if iter == 2:915 print errormsg916 print ' ' + fname + ': Pas d iteration du filtre dans cette version !'917 print ' Utiliser old_filtreg et repasser !'918 quit()919 920 if ifiltre == -2 and not griscal:921 print errormsg922 print ' ' + fname + ' Cette routine ne calcule le filtre inverse que ' + \923 ' sur la grille des scalaires !'924 quit(-1)925 926 if ifiltre != 2 and ifiltre != - 2:927 print errormsg928 print ' ' + fname + ': Probleme dans filtreg car ifiltre NE 2 et NE -2' + \929 ' corriger et repasser !'930 quit(-1)931 932 iim = dx933 jjm = dy934 935 iim2 = iim*iim936 immjm = iim*jjm937 938 if griscal:939 if nlat != jjp1:940 print errormsg941 print ' ' + fname + ': 1111'942 quit(-1)943 else944 if iaire == 1:945 sdd1_type = type_sddv946 sdd2_type = type_unsddv947 else:948 sdd1_type = type_unsddv949 sdd2_type = type_sddv950 951 jdfil1 = 2952 jffil1 = jfiltnu953 jdfil2 = jfiltsu954 jffil2 = jjm955 else:956 if nlat != jjm:957 print errormsg958 print ' ' + fname + ': 2222'959 quit(-1)960 else:961 if iaire == 1:962 sdd1_type = type_sddu963 sdd2_type = type_unsddu964 else:965 sdd1_type = type_unsddu966 sdd2_type = type_sddu967 968 969 jdfil1 = 1970 jffil1 = jfiltnv971 jdfil2 = jfiltsv972 jffil2 = jjm973 974 for hemisph in range(1,3):975 if (hemisph == 1 ):976 jdfil = jdfil1977 jffil = jffil1978 else:979 jdfil = jdfil2980 jffil = jffil2981 982 for l in range(nbniv):983 for j in rangE(jdfil,jffil):984 for i in range(iim):985 champ[i,j,l] = champ[i,j,l]*sdd12[i,sdd1_type] # sdd1(i)986 987 if hemisph == 1:988 if ifiltre == -2:989 for j in range(jdfil,jffil):990 eignq[:,j-jdfil+1,:] = np.matmul(matrinvn[:,:,j], champ[:,j,:])991 #endif992 END DO993 994 ELSE IF ( griscal ) THEN995 996 DO j = jdfil,jffil997 #ifdef BLAS998 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,999 & matriceun(1,1,j),1000 & iim, champ(1,j,1), iip1*nlat, 0.0,1001 & eignq(1,j-jdfil+1,1), iim*nlat)1002 #else1003 eignq(:,j-jdfil+1,:)1004 $ = matmul(matriceun(:,:,j), champ(:iim,j,:))1005 #endif1006 END DO1007 1008 ELSE1009 1010 DO j = jdfil,jffil1011 #ifdef BLAS1012 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,1013 & matricevn(1,1,j),1014 & iim, champ(1,j,1), iip1*nlat, 0.0,1015 & eignq(1,j-jdfil+1,1), iim*nlat)1016 #else1017 eignq(:,j-jdfil+1,:)1018 $ = matmul(matricevn(:,:,j), champ(:iim,j,:))1019 #endif1020 END DO1021 1022 ENDIF1023 1024 ELSE1025 1026 IF( ifiltre. EQ. -2 ) THEN1027 1028 DO j = jdfil,jffil1029 #ifdef BLAS1030 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,1031 & matrinvs(1,1,j-jfiltsu+1),1032 & iim, champ(1,j,1), iip1*nlat, 0.0,1033 & eignq(1,j-jdfil+1,1), iim*nlat)1034 #else1035 eignq(:,j-jdfil+1,:)1036 $ = matmul(matrinvs(:,:,j-jfiltsu+1),1037 $ champ(:iim,j,:))1038 #endif1039 END DO1040 1041 1042 ELSE IF ( griscal ) THEN1043 1044 DO j = jdfil,jffil1045 #ifdef BLAS1046 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,1047 & matriceus(1,1,j-jfiltsu+1),1048 & iim, champ(1,j,1), iip1*nlat, 0.0,1049 & eignq(1,j-jdfil+1,1), iim*nlat)1050 #else1051 eignq(:,j-jdfil+1,:)1052 $ = matmul(matriceus(:,:,j-jfiltsu+1),1053 $ champ(:iim,j,:))1054 #endif1055 END DO1056 1057 ELSE1058 1059 DO j = jdfil,jffil1060 #ifdef BLAS1061 CALL SGEMM("N", "N", iim, nbniv, iim, 1.0,1062 & matricevs(1,1,j-jfiltsv+1),1063 & iim, champ(1,j,1), iip1*nlat, 0.0,1064 & eignq(1,j-jdfil+1,1), iim*nlat)1065 #else1066 eignq(:,j-jdfil+1,:)1067 $ = matmul(matricevs(:,:,j-jfiltsv+1),1068 $ champ(:iim,j,:))1069 #endif1070 END DO1071 1072 ENDIF1073 1074 ENDIF1075 1076 IF( ifiltre.EQ. 2 ) THEN1077 1078 DO l = 1, nbniv1079 DO j = jdfil,jffil1080 DO i = 1, iim1081 champ( i,j,l ) =1082 & (champ(i,j,l) + eignq(i,j-jdfil+1,l))1083 & * sdd12(i,sdd2_type) ! sdd2(i)1084 END DO1085 END DO1086 END DO1087 1088 ELSE1089 1090 DO l = 1, nbniv1091 DO j = jdfil,jffil1092 DO i = 1, iim1093 champ( i,j,l ) =1094 & (champ(i,j,l) - eignq(i,j-jdfil+1,l))1095 & * sdd12(i,sdd2_type) ! sdd2(i)1096 END DO1097 END DO1098 END DO1099 1100 ENDIF1101 1102 DO l = 1, nbniv1103 DO j = jdfil,jffil1104 champ( iip1,j,l ) = champ( 1,j,l )1105 END DO1106 END DO1107 1108 1109 ENDDO1110 1111 1111 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a1112 & filtrer, sur la grille des scalaires'/)1113 2222 FORMAT(//20x,'ERREUR dans le dimensionnement du tableau CHAMP a fi1114 & ltrer, sur la grille de V ou de Z'/)1115 RETURN1116 END1117 1118 23 def SSUM(n,sx,incx): 1119 24 """ Obsolete version of sum for non Fortan 90 code … … 1125 30 ix = 0 1126 31 1127 for i in range(n) 32 for i in range(n): 1128 33 ssumv=ssumv+sx[ix] 1129 34 ix=ix+incx … … 1145 50 return sy 1146 51 1147 def exner_hyb (dx, dy, dz, psv, pv, alphav, betav) 52 def exner_hyb (dx, dy, dz, psv, pv, alphav, betav): 1148 53 """c 1149 54 c Auteurs : P.Le Van , Fr. Hourdin . … … 1192 97 return pksv, pkv, pkfv 1193 98 1194 # !!!!General case:99 #### General case: 1195 100 1196 101 unpl2k = 1.+ 2.* kappa … … 1221 126 # 1222 127 for l in range (llm-1,1,-1): 1223 c 128 1224 129 for ij in range(ngrid): 1225 130 dellta = p[ij,l]* unpl2k + p[ij,l+1]* ( beta[ij,l+1]-unpl2k ) … … 1280 185 pkf = np.zeros((dz, dy, dx), dtype=np.float) 1281 186 1282 ppn = np.zeros((iim), dtype=np.float) )1283 ppn = np.zeros((iim), dtype=np.float) )187 ppn = np.zeros((iim), dtype=np.float) 188 ppn = np.zeros((iim), dtype=np.float) 1284 189 1285 190 firstcall = True … … 1304 209 1305 210 #### Specific behaviour for Shallow Water (1 vertical layer) case: 1306 211 if llm == 1: 1307 212 1308 213 # Compute pks(:),pk(:),pkf(:) 1309 214 1310 1311 1312 215 for ij in range(ngrid): 216 pks[ij] = (cpp/preff) * ps[ij] 217 pk[ij,1] = .5*pks[ij] 1313 218 1314 219 1315 220 pkf = SCOPY( ngrid * llm, pk, 1, pkf, 1 ) 1316 221 # We do not filter for iniaqua 1317 222 # CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 ) 1318 223 1319 224 # our work is done, exit routine 1320 return pksv, pkv, pkfv 1321 225 return pksv, pkv, pkfv 1322 226 1323 227 #### General case: … … 1330 234 pks[ij] = cpp * ( ps[ij]/preff ) ** kappa 1331 235 1332 for ij in range(iim) 236 for ij in range(iim): 1333 237 ppn[ij] = aire[ij] * pks[ij] 1334 238 pps[ij] = aire[ij+ip1jm] * pks[ij+ip1jm] … … 1337 241 xps = SSUM(iim,pps,1) /apols 1338 242 1339 for ij in range(iip1) 243 for ij in range(iip1): 1340 244 pks[ij] = xpn 1341 245 pks[ij+ip1jm] = xps … … 1373 277 return pksv, pkv, pkfv 1374 278 1375 def pression(dx, dy, dz, apv, bpv, psv) 279 def pression(dx, dy, dz, apv, bpv, psv): 1376 280 """c 1377 281 … … 1881 785 masse[ij,l] = airesurg[ij] * ( p[ij,l] - p[ij,l+1] ) 1882 786 1883 for ij in range(ip1jmp1,iip1) 787 for ij in range(ip1jmp1,iip1): 1884 788 masse[ij+iim,l] = masse[ij,l] 1885 789 1886 790 return masse 1887 791 1888 def geopot(ngrid, teta, pk, pks) 792 def geopot(ngrid, teta, pk, pks): 1889 793 """c======================================================================= 1890 794 c … … 1975 879 u = np.zeros((iip1,jjm,llm), dtype=np.float) 1976 880 1977 1978 for j in range(jjm) 1979 881 for j in range(jjm): 1980 882 if np.abs(np.sin(rlatv[j])) < 1.e-4: 1981 883 zlat = 1.e-4 … … 2051 953 IX3 = np.mod(IA3*IX3+IC3,M3) 2052 954 J = 1+(Nvals*IX3)/M3 2053 if J > Nvals or J lt1: quit()955 if J > Nvals or J < 1: quit() 2054 956 ran1=R[J] 2055 957 R[J]=(np.float(IX1)+np.float(IX2)*RM2)*RM1 … … 2067 969 parser.add_option("-d", "--dimensions", dest="dims", 2068 970 help="dimensions of the initial conditions: dimx,dimy,dimz", metavar="VALUES") 2069 parser.add_option("-p", "--pressure_exner", dest="pexner ,971 parser.add_option("-p", "--pressure_exner", dest="pexner", 2070 972 help="how as to b computed Exner pressure ('hybrid': hybrid coordinates, 'middle': middle layer)", 2071 973 metavar="VALUE")
Note: See TracChangeset
for help on using the changeset viewer.