Changeset 215 in lmdz_wrf
- Timestamp:
- Jan 13, 2015, 1:11:32 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/iniaqua.py
r214 r215 19 19 filekinds = ['CF', 'WRF'] 20 20 21 ## g.e. # iniaqua.py -d 32,32,39 -p hybdrid -o WRF -t 19791201000000 -z tropo 21 ## g.e. # iniaqua.py -d 32,32,39 -p hybdrid -o WRF -t 19791201000000 -z tropo -q 2 22 22 def fxy(dx, dy): 23 23 """! … … 1395 1395 print rlatuu[0:dy+2] 1396 1396 1397 return aire 1397 return aire, apoln, apols, airesurg, rlatu, rlatv, cu, cv 1398 1398 1399 1399 def SSUM(n,sx,incx): … … 1415 1415 return ssumv 1416 1416 1417 def SCOPY( n,sx,incx,sy,incy):1417 def SCOPY(ddx,ddy,ddz,sx,incx,sy,incy): 1418 1418 """ Obsolete function to copy matrix values 1419 1419 from dyn3d/cray.F 1420 1420 """ 1421 iy = 1 1422 ix = 1 1423 1424 for i in range(n): 1425 sy[iy] = sx[ix] 1426 ix = ix+incx 1427 iy = iy+incy 1421 fname = 'SCOPY' 1422 1423 if len(sx.shape) == 2: 1424 for j in range(ddy-1): 1425 for i in range(ddx-1): 1426 sy[iy,ix] = sx[iy,ix] 1427 ix = ix+incx 1428 iy = iy+incy 1429 elif len(sx.shape) == 3: 1430 iy = 0 1431 for j in range(ddy): 1432 ix = 0 1433 for i in range(ddx): 1434 for l in range(ddz): 1435 sy[l,iy,ix] = sx[l,iy,ix] 1436 ix = ix+incx 1437 iy = iy+incy 1428 1438 1429 1439 return sy 1430 1440 1431 def exner_hyb (dx, dy, dz, psv, pv, aire ):1441 def exner_hyb (dx, dy, dz, psv, pv, aire, apoln, apols): 1432 1442 """c 1433 1443 c Auteurs : P.Le Van , Fr. Hourdin . … … 1459 1469 fname = 'exner_hyb' 1460 1470 1461 pks = np.zeros((dy, dx), dtype=np.float) 1462 pk = np.zeros((dz, dy, dx), dtype=np.float) 1463 pkf = np.zeros((dz, dy, dx), dtype=np.float) 1464 1465 ppn = np.zeros((dy, dx), dtype=np.float) 1466 pps = np.zeros((dy, dx), dtype=np.float) 1467 1468 ip1jm = (dx+1)*dy 1469 1470 if dz == 1: 1471 pksv = np.zeros((dy+1, dx+1), dtype=np.float) 1472 pkv = np.zeros((dz, dy+1, dx+1), dtype=np.float) 1473 pkfv = np.zeros((dz, dy+1, dx+1), dtype=np.float) 1474 1475 ppn = np.zeros((dy+1, dx+1), dtype=np.float) 1476 pps = np.zeros((dy+1, dx+1), dtype=np.float) 1477 1478 alphav = np.zeros((dz+1, dy+1, dx+1), dtype=np.float) 1479 betav = np.zeros((dz+1, dy+1, dx+1), dtype=np.float) 1480 1481 if dz == 1: 1471 1482 # Compute pks(:),pk(:),pkf(:) 1472 1483 pks = (cpp/preff)*ps … … 1485 1496 unpl2k = 1.+ 2.* kappa 1486 1497 1498 for j in range(dy+1): 1499 for i in range(dx+1): 1500 pksv[j,i] = cpp * ( psv[j,i]/preff ) ** kappa 1501 1502 for j in range(dy+1): 1503 for i in range(dx+1): 1504 ppn[j,i] = aire[j,i] * pksv[j,i] 1505 pps[j,i] = aire[dy,i] * pksv[dy,i] 1506 1507 xpn = SSUM(dx,ppn,1) /apoln 1508 xps = SSUM(dx,pps,1) /apols 1509 1487 1510 for j in range(dy): 1488 1511 for i in range(dx): 1489 pks[j,i] = cpp * ( ps[j,i]/preff ) ** kappa 1490 1491 for j in range(dy): 1492 for i in range(dx): 1493 ppn[j,i] = aire[j,i] * pks[j,i] 1494 pps[j,i] = aire[j,i+ip1jm] * pks[ij+ip1jm] 1495 1496 xpn = SSUM(iim,ppn,1) /apoln 1497 xps = SSUM(iim,pps,1) /apols 1498 1499 for ij in range(iip1): 1500 pks[ij] = xpn 1501 pks[ij+ip1jm] = xps 1512 pksv[j,i] = xpn[i] 1513 pksv[dy-1,i] = xps[i] 1502 1514 # 1503 1515 # 1504 1516 # .... Calcul des coeff. alpha et beta pour la couche l = llm .. 1505 1517 # 1506 for ij in range(ngrid): 1507 alpha[ij,llm] = 0. 1508 beta [ij,llm] = 1./ unpl2k 1518 for j in range(dy+1): 1519 for i in range(dx+1): 1520 alphav[dz-1,j,i] = 0. 1521 betav[dz-1,j,i] = 1./ unpl2k 1509 1522 1510 1523 # 1511 1524 # ... Calcul des coeff. alpha et beta pour l = llm-1 a l = 2 ... 1512 1525 # 1513 for l in range ( llm-1,1,-1):1514 1515 for ij in range(ngrid):1516 dellta = p[ij,l]* unpl2k + p[ij,l+1]* ( beta[ij,l+1]-unpl2k )1517 alpha[ij,l] = -p[ij,l+1] / dellta * alpha[ij,l+1]1518 beta[ij,l] = p[ij,l] / dellta1526 for l in range (dz-1,1,-1): 1527 for j in range(dy+1): 1528 for i in range(dx+1): 1529 dellta = pv[l,j,i]* unpl2k + pv[l+1,j,i]* ( betav[l+1,j,i]-unpl2k ) 1530 alphav[l,j,i] = -pv[l+1,j,i] / dellta * alphav[l+1,j,i] 1531 betav[l,j,i] = pv[l,j,i] / dellta 1519 1532 1520 1533 # *********************************************************************** 1521 1534 # ..... Calcul de pk pour la couche 1 , pres du sol .... 1522 1535 # 1523 for ij in range(ngrid): 1524 pk[ij,0] = ( p[ij,0]*pks[ij] - 0.5*alpha[ij,1]*p[ij,1] ) \ 1525 *( p[ij,0]* (1.+kappa) + 0.5*( beta[ij,1]-unpl2k )* p[ij,1] ) 1536 for j in range(dy+1): 1537 for i in range(dx+1): 1538 pkv[0,j,i] = ( pv[0,j,i]*pksv[j,i] - 0.5*alphav[1,j,i]*pv[1,j,i] ) \ 1539 *( pv[0,j,i]* (1.+kappa) + 0.5*( betav[1,j,i]-unpl2k )* pv[1,j,i] ) 1526 1540 1527 1541 # 1528 1542 # ..... Calcul de pk(ij,l) , pour l = 2 a l = llm ........ 1529 1543 # 1530 for l in range(1,llm): 1531 for ij in range(ngrid): 1532 pk[ij,l] = alpha[ij,l] + beta[ij,l] * pk[ij,l-1] 1533 # 1534 # 1535 pkfv = SCOPY ( ngrid * llm, pk, 1, pkfv, 1 ) 1544 for l in range(dz): 1545 for j in range(dy+1): 1546 for i in range(dx+1): 1547 pkv[l,j,i] = alphav[l,j,i] + betav[l,j,i] * pkv[l-1,j,i] 1548 # 1549 # 1550 pkfv = SCOPY ( dx+1, dy+1, dz, pkv, 1, pkfv, 1 ) 1536 1551 1537 1552 # We do not filter for iniaqua 1538 1553 # CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 ) 1539 1554 1540 return pksv, pkv, pkfv, a plhav, betav1555 return pksv, pkv, pkfv, alphav, betav 1541 1556 1542 1557 def exner_milieu ( ngrid, ps, p,beta, pks, pk, pkf ): … … 1599 1614 # Compute pks(:),pk(:),pkf(:) 1600 1615 1601 for ijin range(ngrid):1602 pks[ ij] = (cpp/preff) * ps[ij]1603 pk[ ij,1] = .5*pks[ij]1616 for j,i in range(ngrid): 1617 pks[j,i] = (cpp/preff) * ps[j,i] 1618 pk[j,i,1] = .5*pks[j,i] 1604 1619 1605 pkf = SCOPY( ngrid * llm, pk, 1, pkf, 1 )1620 pkf = SCOPY(dx,dy,dz, pk, 1, pkf, 1 ) 1606 1621 # We do not filter for iniaqua 1607 1622 # CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 ) … … 1616 1631 # ------------- 1617 1632 1618 for ijin range(ngrid):1619 pks[ ij] = cpp * ( ps[ij]/preff ) ** kappa1620 1621 for ijin range(iim):1622 ppn[ ij] = aire[ij] * pks[ij]1623 pps[ ij] = aire[ij+ip1jm] * pks[ij+ip1jm]1633 for j,i in range(ngrid): 1634 pks[j,i] = cpp * ( ps[j,i]/preff ) ** kappa 1635 1636 for j,i in range(iim): 1637 ppn[j,i] = aire[j,i] * pks[j,i] 1638 pps[j,i] = aire[j,i+ip1jm] * pks[j,i+ip1jm] 1624 1639 1625 1640 xpn = SSUM(iim,ppn,1) /apoln 1626 1641 xps = SSUM(iim,pps,1) /apols 1627 1642 1628 for ijin range(iip1):1629 pks[ ij] = xpn1630 pks[ ij+ip1jm] = xps1643 for j,i in range(iip1): 1644 pks[j,i] = xpn 1645 pks[j,i+ip1jm] = xps 1631 1646 1632 1647 # … … 1637 1652 dum1 = cpp * (2*preff)**(-kappa) 1638 1653 for l in range(llm-1): 1639 for ijin range(ngrid):1640 pk[ ij,l] = dum1 * (p[ij,l] + p[ij,l+1])**kappa1654 for j,i in range(ngrid): 1655 pk[j,i,l] = dum1 * (p[j,i,l] + p[j,i,l+1])**kappa 1641 1656 1642 1657 # .... Calcul de pk pour la couche l = llm .. … … 1644 1659 # et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2) 1645 1660 1646 for ijin range(ngrid):1647 pk[ ij,llm] = pk[ij,llm-1]**2 / pk[ij,llm-2]1661 for j,i in range(ngrid): 1662 pk[j,i,llm] = pk[j,i,llm-1]**2 / pk[j,i,llm-2] 1648 1663 1649 1664 # calcul de pkf 1650 1665 # ------------- 1651 pkf = SCOPY( ngrid * llm, pk, 1, pkf, 1 )1666 pkf = SCOPY( dx,dy,dz, pk, 1, pkf, 1 ) 1652 1667 1653 1668 # We do not filter iniaqua … … 1657 1672 # -------------------------------- 1658 1673 for l in range(1, llm): 1659 for ijin range(ngrid):1660 beta[ ij,l] = pk[ij,l] / pk[ij,l-1]1674 for j,i in range(ngrid): 1675 beta[j,i,l] = pk[j,i,l] / pk[j,i,l-1] 1661 1676 1662 1677 return pksv, pkv, pkfv … … 1676 1691 fname = 'pression' 1677 1692 1678 press = np.zeros((dz+1, dy, dx), dtype=np.float) 1679 1680 print 'shape psv:',psv.shape,'press:',press.shape,'ap:',apv.shape,'bp:',bpv.shape 1693 press = np.zeros((dz+1, dy+1, dx+1), dtype=np.float) 1694 1681 1695 for l in range(dz+1): 1682 1696 press[l,:,:] = apv[l] + bpv[l]*psv … … 2099 2113 return longitude, latitude 2100 2114 2101 def massdair( p):2115 def massdair(dx,dy,dz,p,airesurg): 2102 2116 """c 2103 2117 c ********************************************************************* … … 2116 2130 fname = 'massdair' 2117 2131 2118 masse = np.zeros(( ip1jmp1,llm), dtype=np.float)2132 masse = np.zeros((dz+1,dy+1,dx+1), dtype=np.float) 2119 2133 # 2120 2134 # … … 2167 2181 #======================================================================= 2168 2182 2169 for l in range (llm): 2170 for ij in range(ip1jmp1): 2171 masse[ij,l] = airesurg[ij] * ( p[ij,l] - p[ij,l+1] ) 2172 2173 for ij in range(ip1jmp1,iip1): 2174 masse[ij+iim,l] = masse[ij,l] 2183 for l in range (dz-1): 2184 for j in range(dy+1): 2185 for i in range(dx+1): 2186 masse[l,j,i] = airesurg[j,i] * ( p[l,j,i] - p[l+2,j,i] ) 2187 2188 for j in range(1,dy): 2189 masse[l,j,dx] = masse[l,j-1,dx] 2175 2190 2176 2191 return masse 2177 2192 2178 def geopot( ngrid, teta, pk, pks):2193 def geopot(dx, dy, dz, teta, pk, pks): 2179 2194 """c======================================================================= 2180 2195 c … … 2198 2213 fname = 'geopot' 2199 2214 2200 phis = np.zeros((ngrid), dtype=np.float) 2201 phi = np.zeros((ngrid,llm), dtype=np.float) 2215 phis = np.zeros((dy+1,dx+1), dtype=np.float) 2216 phi = np.zeros((dz+1,dy+1,dx+1), dtype=np.float) 2217 2218 print ' Lluis in ' + fname + ' shapes phis:',phis.shape,'phi:',phi.shape, \ 2219 'teta:',teta.shape,'pks:',pks.shape,'pk:',pk.shape 2202 2220 2203 2221 #----------------------------------------------------------------------- 2204 2222 # calcul de phi au niveau 1 pres du sol ..... 2205 2223 2206 for ij in range(ngrid): 2207 phi[ij,1] = phis[ij] + teta[ij,0] * ( pks[ij] - pk[ij,0] ) 2224 for j in range(dy): 2225 for i in range(dx): 2226 phi[0,j,i] = phis[j,i] + teta[0,j,i] * ( pks[j,i] - pk[0,j,i] ) 2208 2227 2209 2228 # calcul de phi aux niveaux superieurs ....... 2210 2229 2211 for l in range(1,llm): 2212 for ij in range(ngrid): 2213 phi[ij,l] = phi[ij,l-1] + 0.5 * ( teta[ij,l]+teta[ij,l-1] ) * \ 2214 ( pk[ij,l-1]-pk[ij,l] ) 2230 for l in range(1,dz): 2231 for j in range(dy): 2232 for i in range(dx): 2233 phi[l,j,i] = phi[l-1,j,i] + 0.5 * ( teta[l,j,i]+teta[l-1,j,i] ) * \ 2234 ( pk[l-1,j,i]-pk[l,j,i] ) 2215 2235 2216 2236 return phis, phi … … 2252 2272 return z 2253 2273 2254 def ugeostr( phi):2274 def ugeostr(dx,dy,dz,phis,phi,rlatu,rlatv,cu): 2255 2275 """! Calcul du vent covariant geostrophique a partir du champ de 2256 2276 ! geopotentiel. … … 2261 2281 """ 2262 2282 fname = 'ugeostr' 2263 ucov = np.zeros((iip1,jjp1,llm), dtype=np.float) 2264 um = np.zeros((jjm,llm), dtype=np.float) 2265 u = np.zeros((iip1,jjm,llm), dtype=np.float) 2266 2267 for j in range(jjm): 2283 ucov = np.zeros((dz,dy+1,dx+1), dtype=np.float) 2284 um = np.zeros((dz,dy), dtype=np.float) 2285 u = np.zeros((dz,dy,dx+1), dtype=np.float) 2286 2287 print ' Lluis in ' + fname + ': shapes phis:',phis.shape,'phi:',phi.shape,'u:',u.shape 2288 2289 for j in range(dy): 2268 2290 if np.abs(np.sin(rlatv[j])) < 1.e-4: 2269 2291 zlat = 1.e-4 2270 2292 else: 2271 zlat=rlatv (j)2293 zlat=rlatv[j] 2272 2294 2273 2295 fact = np.cos(zlat) … … 2275 2297 fact = fact*fact 2276 2298 fact = fact*fact 2277 fact = (1.-fact)/ (2.*omeg* sin(zlat)*(rlatu[j+1]-rlatu[j]))2299 fact = (1.-fact)/ (2.*omeg*np.sin(zlat)*(rlatu[j+1]-rlatu[j])) 2278 2300 fact = -fact/rad 2279 for l in range( llm):2280 for i in range( iim):2281 u[ i,j,l] = fact*(phi[i,j+1,l]-phi[i,j,l])2282 um[ j,l]=um[j,l]+u[i,j,l]/np.float(iim)2283 2284 um = dump2d( jjm,llm,'Vent-u geostrophique')2301 for l in range(dz): 2302 for i in range(dx): 2303 u[l,j,i] = fact*(phi[l,j+1,i]-phi[l,j,i]) 2304 um[l,j]=um[l,j]+u[l,j,i]/np.float(dx) 2305 2306 um = dump2d(dz,dy,'Vent-u geostrophique') 2285 2307 2286 2308 # calcul des champ de vent: 2287 2309 2288 for l in range( llm):2289 for i in range( iip1):2290 ucov[ i,1,l]=0.2291 ucov[ i,jjp1,l]=0.2292 for j in range(1, jjm):2293 for i in range( iim):2294 ucov[ i,j,l] = 0.5*(u[i,j,l]+u[i,j-1,l])*cu[i,j]2295 2296 ucov[ iip1,j,l]=ucov[0,j,l]2310 for l in range(dz): 2311 for i in range(dx+1): 2312 ucov[l,0,i]=0. 2313 ucov[l,dy,i]=0. 2314 for j in range(1,dy): 2315 for i in range(dx): 2316 ucov[l,j,i] = 0.5*(u[l,j,i]+u[l,j-1,i])*cu[j,i] 2317 2318 ucov[l,j,dx]=ucov[l,j,0] 2297 2319 2298 2320 return ucov … … 2305 2327 """ 2306 2328 fname = 'RAN1' 2307 Nvals = 972308 2329 2309 2330 R = np.zeros((Nvals), dtype=np.float) … … 2320 2341 IA3 = 4561 2321 2342 IC3 = 51349 2343 IFF = 0 2322 2344 2323 2345 if IDUM < 0 or IFF == 0: … … 2358 2380 help="how as to b computed Exner pressure ('hybrid': hybrid coordinates, 'middle': middle layer)", 2359 2381 metavar="VALUE") 2382 parser.add_option("-q", "--NWaterSpecies", dest="nqtot", 2383 help="Number of water species", metavar="VALUE") 2360 2384 parser.add_option("-t", "--time", dest="time", 2361 2385 help="time of the initial conditions ([YYYY][MM][DD][HH][MI][SS] format)", metavar="VALUE") … … 2396 2420 dimy = int(opts.dims.split(',')[1]) 2397 2421 dimz = int(opts.dims.split(',')[2]) 2422 nqtot = int(opts.nqtot) 2398 2423 2399 2424 ofile = 'iniaqua.nc' … … 2473 2498 # Vertical profile 2474 2499 tetajl = np.zeros((dimz, dimy+1, dimx), dtype=np.float) 2475 t eta = np.zeros((dimy+1, dimx+1), dtype=np.float)2476 t etarappel = np.zeros((dimz, dimy+1, dimx+1), dtype=np.float)2500 theta = np.zeros((dimy+1, dimx+1), dtype=np.float) 2501 thetarappel = np.zeros((dimz, dimy+1, dimx+1), dtype=np.float) 2477 2502 2478 2503 for l in range (dimz): … … 2501 2526 # 2502 2527 # tetarappel[iz,iy,0:dimx] = tetajl[iz,iy,dimx-1] 2503 t etarappel = tetajl2528 thetarappel = tetajl.copy() 2504 2529 2505 2530 # 3. Initialize fields (if necessary) … … 2510 2535 # "Specify the initial dry mass to be equivalent to 2511 2536 # a global mean surface pressure (101325 minus 245) Pa." 2512 p s = np.ones((dimy, dimx), dtype=np.float)*101080.2537 press = np.ones((dimy+1, dimx+1), dtype=np.float)*101080. 2513 2538 else: 2514 2539 # use reference surface pressure 2515 p s = np.ones((dimy, dimx), dtype=np.float)*preff2540 press = np.ones((dimy+1, dimx+1), dtype=np.float)*preff 2516 2541 2517 2542 # ground geopotential 2518 phiss = np.zeros((dimy, dimx), dtype=np.float) 2519 2520 p = pression(dimx, dimy, dimz, ap, bp, ps) 2521 2522 aire = inigeom(dimx, dimy) 2543 phiss = np.zeros((dimy+1, dimx+1), dtype=np.float) 2544 2545 pres = pression(dimx, dimy, dimz, ap, bp, press) 2546 2547 aire, apolnorth, apolsouth, airesurge, rlatitudeu, rlatitudev, cuwind, cvwind = \ 2548 inigeom(dimx, dimy) 2523 2549 2524 2550 if opts.pexner == 'hybdrid': 2525 pks, pk, pkf, alpha, beta = exner_hyb(dimx, dimy, dimz, ps, p, aire) 2551 pks, pk, pkf, alpha, beta = exner_hyb(dimx, dimy, dimz, press, pres, aire, \ 2552 apolnorth, apolsouth) 2526 2553 else: 2527 pks, pk, pkf = exner_milieu(ip1jmp1, dimx, dimy, dimz, p s, p, beta)2528 2529 masse = massdair( p)2554 pks, pk, pkf = exner_milieu(ip1jmp1, dimx, dimy, dimz, press, pres, beta) 2555 2556 masse = massdair(dimx,dimy,dimz,pres,airesurge) 2530 2557 2531 2558 # bulk initialization of temperature 2532 t eta = tetarappel.copy()2559 theta = thetarappel.copy() 2533 2560 2534 2561 # geopotential 2535 phis = np.zeros((dimy, dimx), dtype=np.float)2536 phi = np.zeros((dimz, dimy, dimx), dtype=np.float)2537 2538 phis , phi = geopot(ip1jmp1,teta,pk,pks)2562 phisfc = np.zeros((dimy+1, dimx+1), dtype=np.float) 2563 phiall = np.zeros((dimz+1, dimy+1, dimx+1), dtype=np.float) 2564 2565 phisfc, phiall = geopot(dimx,dimy,dimz,theta,pk,pks) 2539 2566 2540 2567 # winds … … 2542 2569 vcov = np.zeros((dimz, dimy, dimx), dtype=np.float) 2543 2570 2544 2545 2571 if ok_geost: 2546 ucov = ugeostr( phi)2572 ucov = ugeostr(dimx,dimy,dimz,phisfc,phiall,rlatitudeu,rlatitudev,cuwind) 2547 2573 2548 2574 # bulk initialization of tracers 2575 print 'Lluis nqtot:',nqtot 2549 2576 q = np.zeros((dimz, dimy, dimx, nqtot), dtype=np.float) 2550 2577 … … 2558 2585 # add random perturbation to temperature 2559 2586 idum = -1 2560 zz = RAN1(idum )2587 zz = RAN1(idum,97) 2561 2588 idum = 0 2562 for l in range(llm): 2563 for ij in range(iip2,ip1jm): 2564 teta[ij,l] = teta[ij,l]*(1.+0.005*RAN1(idum)) 2589 for l in range(dimz): 2590 for j in range(dimy): 2591 for i in range(dimx): 2592 theta[l,j,i] = theta[l,j,i]*(1.+0.005*RAN1(idum,97)) 2565 2593 2566 2594 # maintain periodicity in longitude 2567 for l in range( llm):2568 for ij in range(0,ip1jmp1,iip1):2569 t eta[ij+iim,l]=teta[ij,l]2595 for l in range(dimz): 2596 for j in range(1,dimy): 2597 theta[l,j,dimx-1]=theta[l,j-1,dimx-1] 2570 2598 2571 2599 ncf = NetCDFFile(ofile, 'w')
Note: See TracChangeset
for help on using the changeset viewer.