Recipe: Fortran program as OPeNDAP client

Revision as of 13:15, 24 October 2014 by Pchakrab (talk | contribs)

Program to read downloaded nc4 file

program g5nr_reader

  use netcdf           ! for reading the NR files                                                                               

  implicit none

  !  File name                                                                                                                 
  !  ---------                                                                                                                 
  character(len=256) :: T_file

  !  Global, 4D array: (lon,lat,lev,time)                                                                                      
  !  ------------------------------------ 
  real, pointer :: T(:,:,:,:) => null()

  !  Miscellaneous                                                                                                              
  !  -------------                                                                                                              
  integer :: ierr
  integer :: im, jm, lm
  integer :: ncid, varid
  integer :: start(4), count(4)

  !  For now hard code file name and dimensions                                                                                
  !  ------------------------------------------                                                                                
  im = 720
  jm = 361
  lm = 72
  T_file = "http://opendap.nccs.nasa.gov:9090/dods/OSSE/GEOS-5.12/BETA9/0.5000_deg/inst/inst01hr_3d_T_Cv"

  !  Allocate the Global 4-D array with only 1 time level                                                                      
  !  ----------------------------------------------------                                                                      
  allocate(T(im,jm,lm,1))

  !  Hypercube for reading one 1 array for a given time                                                                         
  !  -------------------------------------------------                                                                          
  start = (/  1,  1,  1, 37 /)   ! time level 37                                                                                
  count = (/ im, jm, lm, 1  /)   ! 1 time level, 3D (lon,lat,lev) array                                                         

  !  Read the data file                                                                                                         
  !  ------------------                                                                                                         
  write(*,*)'Reading T'
  call check( nf90_open(T_file,NF90_NOWRITE,ncid), "opening T file")
  call check( nf90_inq_varid(ncid,"t",varid), "getting T varid")
  call check( nf90_get_var(ncid,varid,T,start=start,count=count), "reading T")
  call check( nf90_close(ncid), "closing T file")

  !  Orint min/max of arrays                                                                                                    
  !  -----------------------                                                                                                    
  write(*,*)'T: ', maxval(T),minval(T)

  !  All done                                                                                                                   
  !  --------                                                                                                                   

contains

  subroutine check(status, loc)

    integer, intent(in) :: status
    character(len=*), intent(in) :: loc

    if(status /= NF90_NOERR) then
       write (*,*) "Error at ", loc
       write (*,*) NF90_STRERROR(status)
    end if

  end subroutine check

end program g5nr_reader

Compile and run