Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.

Re: [netcdfgroup] reading variable dimension using fortran 90

Thank you Dave & Pierce,
                                   Sorry about that confusion, Yes it
is possible for allocating an array with 2 dimenstion as parameters
and last dimesion as variable. What I as facing was  some error  with
the library. I have a question regarding your modules "getnc_dims.f90
netcdf_check.f90".  After seeing that they are very useful modules I
have added them to my include path ie under directory along with
netcdf.mod  as below

sjo@sjo-desktop:~/hdd4/NRL_file_gen$ ll  /usr/local/include/*.mod
-rw-r--r-- 1 sjo  sjo    4272 2010-06-14 10:40
/usr/local/include/getnc__dims.mod
-rw-r--r-- 1 sjo  sjo     562 2010-06-14 10:40
/usr/local/include/netcdf__check.mod
-rw-r--r-- 1 root root 277339 2010-06-03 18:57 /usr/local/include/netcdf.mod
-rw-r--r-- 1 root root   1510 2010-06-03 18:57 /usr/local/include/typesizes.mod

but when I complie by
ifort -extend-source -O3   -o ncep2ascii.x  -I/usr/local/include
ncep2ascii.f90 getnc_dims.f90 -L/usr/local/lib/ -lnetcdf
it gives error as below

sjo@sjo-desktop:~/hdd4/NRL_file_gen$ ifort -extend-source -O3
-I/usr/local/include ncep2ascii.f90 getnc_dims.f90 -L/usr/local/lib/
-lnetcdf/tmp/ifortEEeYgg.o: In function `MAIN__':
ncep2ascii.f90:(.text+0x30c): undefined reference to `netcdf__check_mp_check_'
ncep2ascii.f90:(.text+0x55e): undefined reference to `netcdf__check_mp_check_'
ncep2ascii.f90:(.text+0x595): undefined reference to `netcdf__check_mp_check_'
ncep2ascii.f90:(.text+0x5cc): undefined reference to `netcdf__check_mp_check_'
ncep2ascii.f90:(.text+0x667): undefined reference to `netcdf__check_mp_check_'
/tmp/ifortEEeYgg.o:ncep2ascii.f90:(.text+0x6f8): more undefined
references to `netcdf__check_mp_check_' follow

but if i compile by

ifort -extend-source -O3  -o ncep2ascii.x   -I/usr/local/include
ncep2ascii.f90 getnc_dims.f90 netcdf_check.f90 -L/usr/local/lib/
-lnetcdf

it works with out problem
So are these modules not supposed to be used similar way as netcdf.mod
? which can be used in any code by including its path during
compilation? or what change I need to make them to use them like
netcdf.mod?

I have attached here the code where I am trying to use these modules.
please advice.
with best regards,
Sudheer

On Fri, Jun 11, 2010 at 10:06 AM, Sudheer Joseph <sjo@xxxxxxxxxxxxx> wrote:
> Thank you Dave,
>                                  The subroutine you mentioned is very
> useful. But my question was slightly different. suppose if you get the
> dimension size before reading the 3 dimensional variable. we cannot
> use that information to read the netcdf 3rd dimension at a stretch.
> I mean
> if I use the
>
> NTIM= nf_get_dim(time) ( just for illustration sake )
> and use this for allocating the dimension for 3D variable it will not
> accept as it is not defined as a parameter.
>
> allocate(pres_in(NLONS, NLATS, NTIM))
> count = (/ NLONS, NLATS,NTIM/)
> start = (/ 1, 1, 1/)
>
> One possibility came to my mind yesterday night was  to read the data
> as xy slabs and use a do loop to read the time dimension. It appears
> there is no way to read the 3D variable at one call if we are not
> defining the dimension as parameter.
> with best regards,
> Sudheer
>
> On Fri, Jun 11, 2010 at 3:42 AM, Dave Allured <dave.allured@xxxxxxxx> wrote:
>> Sudheer,
>>
>> If the names of the dimensions are always the same, then use
>> nf90_inq_dimid followed by nf90_inquire_dimension to get the length
>> of each dimension.  See the example on this page:
>>
>> http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90/NF90_005fINQUIRE_005fDIMENSION.html
>>
>> If all the dimensions have coordinate variables, then the following
>> subroutine will get several dimension lengths in one call:
>>
>> http://www.esrl.noaa.gov/psd/people/dave.allured/data/f90/lib/getnc_dims.f90
>>
>> If the dimension names change between Netcdf files, then the problem
>> is more complicated.  We can address that if neither of the above
>> works for you.
>>
>> --Dave A.
>> NOAA/PSD/CIRES
>>
>> On 6/10/2010 7:55 AM, Sudheer Joseph wrote:
>>> Dear Users,
>>>                       I have been coding a program to read multiple
>>> netcdf files having different time dimensions. I want to know if there
>>> is a way to read netcdf varibale with out defining the dimension as
>>> parameter. with in fortran 90 program.
>>> normally we need to define like below
>>>   ! timesteps of data.
>>>         integer, parameter :: NDIMS = 3, NRECS =1
>>>         integer, parameter :: NTIM=1464, NLATS = 94, NLONS = 192
>>>   allocate(pres_in(NLONS, NLATS, NTIM))count = (/ NLONS, NLATS,NTIM/)
>>>         start = (/ 1, 1, 1/)
>>>
>>>         ! Read the surface pressure and temperature data from the file, one
>>>         ! record at a time.
>>>         call check( nf90_get_var(ncid, pres_varid, pres_in, start =
>>> start,count = count) )
>>>
>>> In my case ntim may be different for different files. I wanted to use
>>> the reading part as a subroutine where ntim is provided as a variable
>>> and passed to subroutine
>>> but if I declare ntim as varible then netcdf gives an error.
>>> If any one have a solution please help. I am not looking for solutions
>>> like replacing the parameter statement using shell script and re
>>> compiling it etc.
>>>
>>
         program ncep2ascii
         implicit none
         INTEGER   ntim, nlat, nlon,tlen,sln
         CHARACTER*80 outfile,vname,infile
         infile='air.2m.gauss.2004.nc'
         vname="air"
       call ncep_var_read(infile,vname)
       contains
       subroutine ncep_var_read(infile,vname) 
       use netcdf
       use getnc__dims 
       use  netcdf__check 
       implicit none
       ! This is the name of the data file we will read.
        character (len = 80) :: FILE_NAME
        character (len = 80) :: outfile,vname,infile 
       integer :: ncid,l,n,m,ss,tlen,nx,ny,nt,nl,ntim
       ! timesteps of data.
       integer, parameter :: NDIMS=3 
       integer, parameter ::  nlat = 94, nlon = 192
       character (len = *), parameter :: LAT_NAME = "lat"
       character (len = *), parameter :: LON_NAME = "lon"
       character (len = *), parameter ::TIME_NAME = "time"
! The start and count arrays will tell the netCDF library where to
       ! read our data.
       integer :: start(NDIMS), count(NDIMS),start_1(1),count_1(1)     
       ! In addition to the latitude and longitude dimensions, we will also
       ! create latitude and longitude variables which will hold the actual
       ! latitudes and longitudes. Since they hold data about the
       ! coordinate system, the netCDF term for these is: "coordinate
       ! variables."
       real :: lat(nlat), lon(nlon)
       integer :: lon_varid, lat_varid,time_varid
       real :: field,add_offset,scale_factor     
       ! We will read surface temperature and sure fields. In netCDF
       ! terminology these are called "variables."
       character (len = 80) :: var_NAME
       integer :: var_varid 
       ! Program variables to hold the data we will read in. We will only
       ! need enough space to hold one timestep of data; one record.
       ! Allocate memory for data.
       real, dimension(:,:,:), allocatable :: var_in,uflx
       real, dimension(:), allocatable :: time 
       ! Use these to calculate the values we expect to find.
       ! Loop indices
       ! Allocate memory
       FILE_NAME=infile 
       var_NAME='air'
       call get_ofl(file_name,outfile)
       call check( nf90_open(FILE_NAME, nf90_nowrite, ncid) )
       call getnc_dims(ncid, nx, ny, nt, nl)
        ntim=nt
       allocate(var_in(NLON,NLAT,ntim))
       allocate(time(ntim))
       ! Open the file.
       ! Get the varids of the latitude and longitude coordinate variables.
       call check( nf90_inq_varid(ncid, LAT_NAME, lat_varid) )
       call check( nf90_inq_varid(ncid, LON_NAME, lon_varid) )
       call check( nf90_inq_varid(ncid, TIME_NAME, time_varid) )
       ! Read the latitude and longitude data.
       call check( nf90_get_var(ncid, lat_varid, lat) )
       call check( nf90_get_var(ncid, lon_varid, lon) )
       call check( nf90_get_var(ncid, time_varid, time) )
       ! Check to make sure we got what we expected.
     
       ! Get the varids of the sure and temperature netCDF variables.
       call check( nf90_inq_varid(ncid, var_NAME,var_varid) )
       ! Read 1 record of NLONS*NLATS*NLVLS values, starting at the beginning
       ! of the record (the (1, 1, 1, rec) element in the netCDF file).
       count = (/ nlon, nlat,ntim/)
       start = (/1, 1,1/)
      call check( nf90_get_var(ncid, var_varid, var_in, start = start,count = 
count) ) 
       ! Read the surface sure and temperature data from the file, one
       ! timestep at a time.
       open(unit=21,file=outfile,status = 'new')
      call check(NF90_GET_ATT(ncid,var_varid,'scale_factor',scale_factor))
      call check(NF90_GET_ATT(ncid,var_varid,'add_offset',add_offset))
                 do l=1,ntim
                        do m=1,nlat
                                do n=nlon,1,-1
                                field=var_in(n,m,l)*scale_factor+add_offset
                                write(21,115) field,lat(m),lon(n),time(l)
                                enddo
                        enddo
!       write(*,*) "south_west",var_in(1,1,l)*scale_factor+add_offset
!       write(*,*) "south_east",var_in(nlon,1,l)*scale_factor+add_offset
!       write(*,*) "north_east",var_in(nlon,nlat,l)*scale_factor+add_offset
!       write(*,*) "north_west",var_in(1,nlat,l)*scale_factor+add_offset
                 write(*,*)"Writing...", l,"^th record"
                 enddo
115  format (E13.6,2F12.3,F14.2)
       call check( nf90_close(ncid) )
       ! If we got this far, everything worked as expected. Yipee!
       write(*,*) "scale_factor    add_offset"    
       write(*,*) scale_factor,add_offset    
       print *,"*** SUCCESS fully writen ",outfile, "!"
       end subroutine ncep_var_read 
         subroutine get_ofl(infile,outfile)
         integer sln,tlen
         character*150 cmd
         character*80 infile,outfile
         logical back
         sln=index(infile,'.nc', back)
         outfile=infile(1:sln)//"xya"
         return
         end subroutine get_ofl
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 end program ncep2ascii
  • 2010 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: