|
| 1 | +module m_nc_akbk |
| 2 | +use netcdf |
| 3 | +implicit none |
| 4 | +private |
| 5 | +public :: write_nc_akbk |
| 6 | +interface write_nc_akbk |
| 7 | + module procedure write_nc_akbk_ |
| 8 | +end interface |
| 9 | +integer :: mype_ = 0 |
| 10 | +integer :: root_ = 0 |
| 11 | +contains |
| 12 | +subroutine write_nc_akbk_ (fname,ak, bk) |
| 13 | + |
| 14 | + character(len=*), intent(in) :: fname |
| 15 | + double precision, intent(in) :: ak(:), bk(:) |
| 16 | + |
| 17 | + ! NetCDF variables |
| 18 | + integer :: ncid, dimid_edge |
| 19 | + integer :: varid_edge, varid_ak, varid_bk |
| 20 | + integer :: rc |
| 21 | + integer :: i, km |
| 22 | + double precision, allocatable :: edge(:) |
| 23 | + |
| 24 | + km = size(ak) |
| 25 | + allocate(edge(km)) |
| 26 | + do i=1,km |
| 27 | + edge(i) = dble(i) |
| 28 | + enddo |
| 29 | + |
| 30 | + ! Create the NetCDF file |
| 31 | + call check_( nf90_create(fname, NF90_CLOBBER, ncid), rc, mype_, root_ ) |
| 32 | + if(rc/=0) return |
| 33 | + |
| 34 | + ! Define dimensions |
| 35 | + call check_ ( nf90_def_dim(ncid, "edge", km, dimid_edge), rc, mype_, root_ ) |
| 36 | + if(rc/=0) return |
| 37 | + |
| 38 | + ! Define variables |
| 39 | + call check_ ( nf90_def_var(ncid, "edge", NF90_DOUBLE, (/dimid_edge/), varid_edge), rc, mype_, root_ ) |
| 40 | + call check_ ( nf90_def_var(ncid, "ak", NF90_DOUBLE, (/dimid_edge/), varid_ak), rc, mype_, root_ ) |
| 41 | + call check_ ( nf90_def_var(ncid, "bk", NF90_DOUBLE, (/dimid_edge/), varid_bk), rc, mype_, root_ ) |
| 42 | + |
| 43 | + ! Add attributes to edge |
| 44 | + call check_ ( nf90_put_att(ncid, varid_edge, "units", "level"), rc, mype_, root_ ) |
| 45 | + call check_ ( nf90_put_att(ncid, varid_edge, "long_name", "sigma at layer edges"), rc, mype_, root_ ) |
| 46 | + call check_ ( nf90_put_att(ncid, varid_edge, "standard_name", "atmosphere_hybrid_sigma_pressure_coordinate"),& |
| 47 | + rc, mype_, root_ ) |
| 48 | + call check_ ( nf90_put_att(ncid, varid_edge, "coordinate", "eta"), rc, mype_, root_ ) |
| 49 | + call check_ ( nf90_put_att(ncid, varid_edge, "positive", "down"), rc, mype_, root_ ) |
| 50 | + call check_ ( nf90_put_att(ncid, varid_edge, "formulaTerms", "ap: ak b: bk ps: ps p0: p00"),& |
| 51 | + rc, mype_, root_ ) |
| 52 | + |
| 53 | + ! Add attributes to ak |
| 54 | + call check_ ( nf90_put_att(ncid, varid_ak, "long_name", "hybrid_sigma_pressure_a"),& |
| 55 | + rc, mype_, root_ ) |
| 56 | + call check_ ( nf90_put_att(ncid, varid_ak, "units", "Pa"), rc, mype_, root_ ) |
| 57 | + |
| 58 | + ! Add attributes to bk |
| 59 | + call check_ ( nf90_put_att(ncid, varid_bk, "long_name", "hybrid_sigma_pressure_b"), & |
| 60 | + rc, mype_, root_ ) |
| 61 | + call check_ ( nf90_put_att(ncid, varid_bk, "units", "1"), rc, mype_, root_ ) |
| 62 | + |
| 63 | + ! Global attributes |
| 64 | + call check_ ( nf90_put_att(ncid, NF90_GLOBAL, "NASA/GMAO", & |
| 65 | + "Homepage = http://gmao.gfsc.nasa.gov/"), rc, mype_, root_ ) |
| 66 | + |
| 67 | + ! End define mode |
| 68 | + call check_ ( nf90_enddef(ncid), rc, mype_, root_ ) |
| 69 | + |
| 70 | + ! Write data |
| 71 | + call check_ ( nf90_put_var(ncid, varid_edge, edge), rc, mype_, root_ ) |
| 72 | + call check_ ( nf90_put_var(ncid, varid_ak, ak), rc, mype_, root_ ) |
| 73 | + call check_ ( nf90_put_var(ncid, varid_bk, bk), rc, mype_, root_ ) |
| 74 | + |
| 75 | + ! Close file |
| 76 | + call check_ ( nf90_close(ncid), rc, mype_, root_ ) |
| 77 | + |
| 78 | + deallocate(edge) |
| 79 | + |
| 80 | + print *, "NetCDF file ",trim(fname)," written successfully." |
| 81 | + |
| 82 | +end subroutine write_nc_akbk_ |
| 83 | +subroutine check_(status,rc, myid, root) |
| 84 | + integer, intent ( in) :: status |
| 85 | + integer, intent (out) :: rc |
| 86 | + integer, intent ( in) :: myid, root |
| 87 | + rc=0 |
| 88 | + if(status /= nf90_noerr) then |
| 89 | + if(myid==root) print *, trim(nf90_strerror(status)) |
| 90 | + rc=999 |
| 91 | + end if |
| 92 | +end subroutine check_ |
| 93 | +end module m_nc_akbk |
| 94 | + |
0 commit comments