1271
1272
1274
1277
1278
1279
1280 logical, intent(out), optional :: Lregrid
1281
1282 integer, intent(in) :: ng, model, tindex
1283 integer, intent(in) :: LBi, UBi, LBj, UBj
1284 integer, intent(in) :: Vsize(4)
1285
1286 integer(i8b), intent(out), optional :: checksum
1287
1288 real(dp), intent(in) :: Ascl
1289 real(r8), intent(out) :: Amin
1290 real(r8), intent(out) :: Amax
1291
1292 character (len=*), intent(in) :: ncname
1293 character (len=*), intent(in) :: ncvname
1294
1295# ifdef ASSUMED_SHAPE
1296# ifdef MASKING
1297 real(r8), intent(in) :: Amask(LBi:,LBj:)
1298# endif
1299 real(r8), intent(out) :: Adat(LBi:,LBj:)
1300# else
1301# ifdef MASKING
1302 real(r8), intent(in) :: Amask(LBi:UBi,LBj:UBj)
1303# endif
1304 real(r8), intent(out) :: Adat(LBi:UBi,LBj:UBj)
1305# endif
1306
1307 TYPE (File_desc_t), intent(inout) :: pioFile
1308 TYPE (IO_Desc_t), intent(inout) :: pioDesc
1309 TYPE (My_VarDesc), intent(inout) :: pioVar
1310
1311
1312
1313 logical :: Lchecksum, interpolate
1314
1315 logical, dimension(3) :: foundit
1316
1317 integer :: i, j, Npts, status
1318 integer :: Is, Ie, Js, Je
1319 integer :: Imin, Imax, Jmin, Jmax
1320 integer :: Ilen, Jlen, IJlen
1321 integer :: Cgrid, ghost, dkind, gtype
1322
1323 integer, dimension(3) :: start, total
1324
1325 real(r8) :: Afactor, Aoffset, Aspval, Avalue
1326 real(r8) :: my_Amin, my_Amax
1327
1328 real(r8), dimension(3) :: AttValue
1329 real(r8), dimension(2) :: rbuffer
1330
1331 real(r4), pointer :: Awrk4(:,:)
1332 real(r8), pointer :: Awrk8(:,:)
1333 real(r8), allocatable :: Cwrk(:)
1334 real(r8), allocatable :: wrk(:,:)
1335
1336 character (len=12), dimension(3) :: AttName
1337 character (len= 3), dimension(2) :: op_handle
1338
1339 character (len=*), parameter :: MyFile = &
1340 & __FILE__//", pio_fread2d"
1341
1342
1343
1344
1345
1346 status=pio_noerr
1347 amin=spval
1348 amax=-spval
1349 my_amin=spval
1350 my_amax=-spval
1351
1352
1353
1354
1355
1356 dkind=piovar%dkind
1357 gtype=piovar%gtype
1358
1359 SELECT CASE (abs(gtype))
1360 CASE (p2dvar, p3dvar)
1361 cgrid=1
1362 is=iobounds(ng)%ILB_psi
1363 ie=iobounds(ng)%IUB_psi
1364 js=iobounds(ng)%JLB_psi
1365 je=iobounds(ng)%JUB_psi
1366 CASE (r2dvar, r3dvar)
1367 cgrid=2
1368 is=iobounds(ng)%ILB_rho
1369 ie=iobounds(ng)%IUB_rho
1370 js=iobounds(ng)%JLB_rho
1371 je=iobounds(ng)%JUB_rho
1372 CASE (u2dvar, u3dvar)
1373 cgrid=3
1374 is=iobounds(ng)%ILB_u
1375 ie=iobounds(ng)%IUB_u
1376 js=iobounds(ng)%JLB_u
1377 je=iobounds(ng)%JUB_u
1378 CASE (v2dvar, v3dvar)
1379 cgrid=4
1380 is=iobounds(ng)%ILB_v
1381 ie=iobounds(ng)%IUB_v
1382 js=iobounds(ng)%JLB_v
1383 je=iobounds(ng)%JUB_v
1384 CASE DEFAULT
1385 cgrid=2
1386 is=iobounds(ng)%ILB_rho
1387 ie=iobounds(ng)%IUB_rho
1388 js=iobounds(ng)%JLB_rho
1389 je=iobounds(ng)%JUB_rho
1390 END SELECT
1391
1392
1393
1394
1395 ilen=ie-is+1
1396 jlen=je-js+1
1397
1398
1399
1400 ghost=0
1401 imin=bounds(ng)%Imin(cgrid,ghost,myrank)
1402 imax=bounds(ng)%Imax(cgrid,ghost,myrank)
1403 jmin=bounds(ng)%Jmin(cgrid,ghost,myrank)
1404 jmax=bounds(ng)%Jmax(cgrid,ghost,myrank)
1405
1406
1407
1408
1409
1410
1411
1412 interpolate=.false.
1413 IF (((vsize(1).gt.0).and.(vsize(1).ne.ilen)).or. &
1414 & ((vsize(2).gt.0).and.(vsize(2).ne.jlen))) THEN
1415 interpolate=.true.
1416 ilen=vsize(1)
1417 jlen=vsize(2)
1418 END IF
1419 IF (PRESENT(lregrid)) THEN
1420 lregrid=interpolate
1421 END IF
1422 ijlen=ilen*jlen
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437 attname(1)='scale_factor'
1438 attname(2)='add_offset '
1439 attname(3)='_FillValue '
1440
1442 & attvalue, foundit, &
1443 & piofile = piofile)
1444 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
1445 status=ioerror
1446 RETURN
1447 END IF
1448
1449 IF (.not.foundit(1)) THEN
1450 afactor=1.0_r8
1451 ELSE
1452 afactor=attvalue(1)
1453 END IF
1454
1455 IF (.not.foundit(2)) THEN
1456 aoffset=0.0_r8
1457 ELSE
1458 aoffset=attvalue(2)
1459 END IF
1460
1461 IF (.not.foundit(3)) THEN
1462 aspval=spval_check
1463 ELSE
1464 aspval=attvalue(3)
1465 END IF
1466
1467
1468
1469
1470
1471 IF (interpolate) THEN
1472 IF (.not.allocated(wrk)) THEN
1473 allocate ( wrk(ilen,jlen) )
1474 END IF
1475 wrk=0.0_r8
1476
1477 start(1)=1
1478 total(1)=ilen
1479 start(2)=1
1480 total(2)=jlen
1481 start(3)=tindex
1482 total(3)=1
1483
1484
1485
1486
1487
1489 & ncvname, wrk, &
1490 & piofile = piofile, &
1491 & start = start, &
1492 & total = total, &
1493 & broadcast = .false., &
1494 & min_val = amin, &
1495 & max_val = amax)
1496
1497
1498
1499 DO j=1,jlen
1500 DO i=1,ilen
1501 wrk(i,j)=ascl*wrk(i,j)
1502 END DO
1503 END DO
1504 END IF
1505
1506
1507
1508 IF (PRESENT(checksum)) THEN
1509 lchecksum=.true.
1510 checksum=0_i8b
1511 ELSE
1512 lchecksum=.false.
1513 END IF
1514
1515
1516
1517
1518
1519 IF (.not.interpolate) THEN
1520
1521
1522
1523
1524
1525 IF (dkind.eq.pio_double) THEN
1526 IF (.not.associated(awrk8)) THEN
1527 allocate ( awrk8(imin:imax, jmin:jmax) )
1528 END IF
1529 awrk8=0.0_r8
1530 ELSE
1531 IF (.not.associated(awrk4)) THEN
1532 allocate ( awrk4(imin:imax, jmin:jmax) )
1533 END IF
1534 awrk4=0.0_r4
1535 END IF
1536
1537
1538
1539 IF (tindex.gt.0) THEN
1540 CALL pio_setframe (piofile, &
1541 & piovar%vd, &
1542 & int(tindex, kind=pio_offset_kind))
1543 END IF
1544
1545
1546
1547 IF (dkind.eq.pio_double) THEN
1548 CALL pio_read_darray (piofile, &
1549 & piovar%vd, &
1550 & piodesc, &
1551 & awrk8(imin:,jmin:), &
1552 & status)
1553
1554 DO j=jmin,jmax
1555 DO i=imin,imax
1556 IF (abs(awrk8(i,j)).ge.abs(aspval)) THEN
1557 adat(i,j)=0.0_r8
1558 ELSE
1559 avalue=ascl*(afactor*awrk8(i,j)+aoffset)
1560 adat(i,j)=avalue
1561 my_amin=min(my_amin,avalue)
1562 my_amax=max(my_amax,avalue)
1563 END IF
1564 END DO
1565 END DO
1566 IF (associated(awrk8)) deallocate (awrk8)
1567
1568
1569
1570 ELSE
1571 CALL pio_read_darray (piofile, &
1572 & piovar%vd, &
1573 & piodesc, &
1574 & awrk4(imin:,jmin:), &
1575 & status)
1576
1577 DO j=jmin,jmax
1578 DO i=imin,imax
1579 IF (abs(awrk4(i,j)).ge.abs(real(aspval,r4))) THEN
1580 adat(i,j)=0.0_r8
1581 ELSE
1582 avalue=real(ascl*(afactor*awrk4(i,j)+aoffset),r8)
1583 adat(i,j)=avalue
1584 my_amin=real(min(my_amin,avalue),r8)
1585 my_amax=real(max(my_amax,avalue),r8)
1586 END IF
1587 END DO
1588 END DO
1589 IF (associated(awrk4)) deallocate (awrk4)
1590 END IF
1591
1592
1593
1594 rbuffer(1)=my_amin
1595 rbuffer(2)=my_amax
1596 op_handle(1)='MIN'
1597 op_handle(2)='MAX'
1598 CALL mp_reduce (ng, model, 2, rbuffer, op_handle)
1599 amin=rbuffer(1)
1600 amax=rbuffer(2)
1601
1602 IF ((abs(amin).ge.abs(spval)).and. &
1603 & (abs(amax).ge.abs(spval))) THEN
1604 amin=0.0_r8
1605 amax=0.0_r8
1606 END IF
1607 END IF
1608
1609
1610
1611
1612
1613
1614 IF (interpolate) THEN
1615 SELECT CASE (gtype)
1616 CASE (p2dvar, p3dvar)
1617 IF (spherical) THEN
1618 CALL regrid_pio (ng, model, ncname, piofile, &
1619 & ncvname, piovar, gtype, interpflag, &
1620 & ilen, jlen, wrk, amin, amax, &
1621 & lbi, ubi, lbj, ubj, &
1622 & imin, imax, jmin, jmax, &
1623# ifdef MASKING
1624 & amask, &
1625# endif
1626 & grid(ng) % MyLon, &
1627 & grid(ng) % lonp, &
1628 & grid(ng) % latp, &
1629 & adat)
1630 ELSE
1631 CALL regrid_pio (ng, model, ncname, piofile, &
1632 & ncvname, piovar, gtype, interpflag, &
1633 & ilen, jlen, wrk, amin, amax, &
1634 & lbi, ubi, lbj, ubj, &
1635 & imin, imax, jmin, jmax, &
1636# ifdef MASKING
1637 & amask, &
1638# endif
1639 & grid(ng) % MyLon, &
1640 & grid(ng) % xp, &
1641 & grid(ng) % yp, &
1642 & adat)
1643 END IF
1644 CASE (r2dvar, r3dvar)
1645 IF (spherical) THEN
1646 CALL regrid_pio (ng, model, ncname, piofile, &
1647 & ncvname, piovar, gtype, interpflag, &
1648 & ilen, jlen, wrk, amin, amax, &
1649 & lbi, ubi, lbj, ubj, &
1650 & imin, imax, jmin, jmax, &
1651# ifdef MASKING
1652 & grid(ng) % rmask, &
1653# endif
1654 & grid(ng) % MyLon, &
1655 & grid(ng) % lonr, &
1656 & grid(ng) % latr, &
1657 & adat)
1658 ELSE
1659 CALL regrid_pio (ng, model, ncname, piofile, &
1660 & ncvname, piovar, gtype, interpflag, &
1661 & ilen, jlen, wrk, amin, amax, &
1662 & lbi, ubi, lbj, ubj, &
1663 & imin, imax, jmin, jmax, &
1664# ifdef MASKING
1665 & grid(ng) % rmask, &
1666# endif
1667 & grid(ng) % MyLon, &
1668 & grid(ng) % xr, &
1669 & grid(ng) % yr, &
1670 & adat)
1671 END IF
1672 CASE (u2dvar, u3dvar)
1673 IF (spherical) THEN
1674 CALL regrid_pio (ng, model, ncname, piofile, &
1675 & ncvname, piovar, gtype, interpflag, &
1676 & ilen, jlen, wrk, amin, amax, &
1677 & lbi, ubi, lbj, ubj, &
1678 & imin, imax, jmin, jmax, &
1679# ifdef MASKING
1680 & grid(ng) % umask, &
1681# endif
1682 & grid(ng) % MyLon, &
1683 & grid(ng) % lonu, &
1684 & grid(ng) % latu, &
1685 & adat)
1686 ELSE
1687 CALL regrid_pio (ng, model, ncname, piofile, &
1688 & ncvname, piovar, gtype, interpflag, &
1689 & ilen, jlen, wrk, amin, amax, &
1690 & lbi, ubi, lbj, ubj, &
1691 & imin, imax, jmin, jmax, &
1692# ifdef MASKING
1693 & grid(ng) % umask, &
1694# endif
1695 & grid(ng) % MyLon, &
1696 & grid(ng) % xu, &
1697 & grid(ng) % yu, &
1698 & adat)
1699 END IF
1700 CASE (v2dvar, v3dvar)
1701 IF (spherical) THEN
1702 CALL regrid_pio (ng, model, ncname, piofile, &
1703 & ncvname, piovar, gtype, interpflag, &
1704 & ilen, jlen, wrk, amin, amax, &
1705 & lbi, ubi, lbj, ubj, &
1706 & imin, imax, jmin, jmax, &
1707# ifdef MASKING
1708 & grid(ng) % vmask, &
1709# endif
1710 & grid(ng) % MyLon, &
1711 & grid(ng) % lonv, &
1712 & grid(ng) % latv, &
1713 & adat)
1714 ELSE
1715 CALL regrid_pio (ng, model, ncname, piofile, &
1716 & ncvname, piovar, gtype, interpflag, &
1717 & ilen, jlen, wrk, amin, amax, &
1718 & lbi, ubi, lbj, ubj, &
1719 & imin, imax, jmin, jmax, &
1720# ifdef MASKING
1721 & grid(ng) % vmask, &
1722# endif
1723 & grid(ng) % MyLon, &
1724 & grid(ng) % xv, &
1725 & grid(ng) % yv, &
1726 & adat)
1727 END IF
1728 CASE DEFAULT
1729 IF (spherical) THEN
1730 CALL regrid_pio (ng, model, ncname, piofile, &
1731 & ncvname, piovar, gtype, interpflag, &
1732 & ilen, jlen, wrk, amin, amax, &
1733 & lbi, ubi, lbj, ubj, &
1734 & imin, imax, jmin, jmax, &
1735# ifdef MASKING
1736 & grid(ng) % rmask, &
1737# endif
1738 & grid(ng) % MyLon, &
1739 & grid(ng) % lonr, &
1740 & grid(ng) % latr, &
1741 & adat)
1742 ELSE
1743 CALL regrid_pio (ng, model, ncname, piofile, &
1744 & ncvname, piovar, gtype, interpflag, &
1745 & ilen, jlen, wrk, amin, amax, &
1746 & lbi, ubi, lbj, ubj, &
1747 & imin, imax, jmin, jmax, &
1748# ifdef MASKING
1749 & grid(ng) % rmask, &
1750# endif
1751 & grid(ng) % MyLon, &
1752 & grid(ng) % xr, &
1753 & grid(ng) % yr, &
1754 & adat)
1755 END IF
1756 END SELECT
1757
1758
1759
1760 IF (allocated(wrk)) THEN
1761 deallocate (wrk)
1762 END IF
1763 END IF
1764
1765
1766
1767 IF (lchecksum) THEN
1768 npts=(imax-imin+1)*(jmax-jmin+1)
1769 IF (.not.allocated(cwrk)) allocate ( cwrk(npts) )
1770 cwrk=pack(adat(imin:imax, jmin:jmax), .true.)
1771 CALL get_hash (cwrk, npts, checksum, .true.)
1772 IF (allocated(cwrk)) deallocate (cwrk)
1773 END IF
1774
1775 RETURN
subroutine, public regrid_pio(ng, model, ncname, piofile, ncvname, piovar, gtype, iflag, nx, ny, finp, amin, amax, lbi, ubi, lbj, ubj, imin, imax, jmin, jmax, mymask, myxout, xout, yout, fout)