Re: [netcdfgroup] Enveloping fields of data in user defined types while storing in netCDF format

Dear all,

This time around I have come up with a problem concerning compound types. I scripted a FORTRAN subroutine to write data in compound form into a .nc file and it compiles perfectly, however, it gives exactly the error "Unknown error" when I run the model calling the ncwrite function after model run once is completed. My FORTRAN subroutine file is attached. It gives the error when it reaches the line with "nf90_def_compound" function. My netCDF version is 4.1.3 and fortran compiler is gfortran 4.4.5. I had compiled netCDF with --disable-netcdf-4 option. Could this be the cause of the problem?

Regards,

Ekin

On 02/23/2012 10:58 AM, Ekin Akoglu wrote:
Dear all,

I have come up with an answer to my question, that is, user-defined "compound types" in netCDF. The compound types are not very well documented under FORTRAN API, however, section for C API gives also an example where one can develop on for FORTRAN. If you are also interested please see: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90/Compound-Types.html#Compound-Types

Thank you...

Ekin





On 02/22/2012 10:03 PM, Ekin Akoglu wrote:
Dear all,

I am quite inexperienced in using netCDF FORTRAN API and netCDF format in storing data. Currently I am struggling on a problem. I have user derived data types in FORTRAN with multiple components, i.e. fields, such as:

ep_data%biomass
ep_data%pob
....

ms_data%biomass
ms_data%age
...

Is there a way to envelope the fields (after % sign) under e.g. "ms_data" and "ep_data" defined types when writing in a single netcdf file so that the "biomass" field of "ms_data" does not interfere with the "biomass" field of "ep_data" while reading it from the .nc file? I would be glad to hear if you have suggestions on the matter.

Regards,

--
*Ekin Akoglu*

Research Assistant

Institute of Marine Sciences
Middle East Technical University
P.O. Box 28, 33731
Erdemli, Mersin
Turkey

Web: www.ims.metu.edu.tr
Email: ekin@xxxxxxxxxxxxxxx <mailto:ekin@xxxxxxxxxxxxxxx>
Phone: +90 324 521 34 34
GSM: +90 506 554 03 90
Fax: +90 324 521 23 27


_______________________________________________
netcdfgroup mailing list
netcdfgroup@xxxxxxxxxxxxxxxx
For list information or to unsubscribe, visit:http://www.unidata.ucar.edu/mailing_lists/


--
*Ekin Akoglu*

Research Assistant

Institute of Marine Sciences
Middle East Technical University
P.O. Box 28, 33731
Erdemli, Mersin
Turkey

Web: www.ims.metu.edu.tr
Email: ekin@xxxxxxxxxxxxxxx <mailto:ekin@xxxxxxxxxxxxxxx>
Phone: +90 324 521 34 34
GSM: +90 506 554 03 90
Fax: +90 324 521 23 27


_______________________________________________
netcdfgroup mailing list
netcdfgroup@xxxxxxxxxxxxxxxx
For list information or to unsubscribe,  visit: 
http://www.unidata.ucar.edu/mailing_lists/


--
*Ekin Akoglu*

Research Assistant

Institute of Marine Sciences
Middle East Technical University
P.O. Box 28, 33731
Erdemli, Mersin
Turkey

Web: www.ims.metu.edu.tr
Email: ekin@xxxxxxxxxxxxxxx <mailto:ekin@xxxxxxxxxxxxxxx>
Phone: +90 324 521 34 34
GSM: +90 506 554 03 90
Fax: +90 324 521 23 27
subroutine ncwrite(nvars, nstanzas, drows, dcols, ep_data, ms_data, ep_diet)

use statevartypesEcopath_mod
use netcdf

implicit none

! This is the name of the data file we will read. 
character (len = *), parameter :: FILE_NAME = "ecopath_results.nc"

! variables inherited from Ecopath model
integer, intent(in)            :: nvars, nstanzas, drows, dcols
type(ecopath_data), intent(in) :: ep_data
type(multi_stanza), intent(in) :: ms_data(nstanzas)
real(4), intent(in)            :: ep_diet(drows, dcols)

! in-subroutine variable declarations
integer :: ncid, typeid, field_typeid

  ! Create the netCDF file. The nf90_clobber parameter tells netCDF to
  ! overwrite this file, if it already exists.
  call check( nf90_create(FILE_NAME, NF90_CLOBBER, ncid) )

  call check( nf90_def_compound(ncid, sizeof(ep_data), "ecopath_data", typeid) )
  call check( nf90_insert_compound(ncid, typeid, "biomass", 1, field_typeid) )

  call check( nf90_enddef(ncid) )

  call check( nf90_put_vara(ncid, typeid, field_typeid, nvars, ep_data%biomass) 
)

  ! Close the file. This frees up any internal netCDF resources
  ! associated with the file, and flushes any buffers.
  call check( nf90_close(ncid) )

  print *, "*** SUCCESS writing Ecopath output file ecopath_results.nc! "

contains
  subroutine check(status)
    integer, intent ( in) :: status
    
    if(status /= nf90_noerr) then 
      print *, trim(nf90_strerror(status))
      stop "Stopped"
    end if
  end subroutine check

function nf90_def_compound(ncid, size, name, typeid)
         integer, intent(in) :: ncid
         integer(8), intent(in) :: size
         character (len = *), intent(in) :: name
         integer, intent(out) :: typeid
         integer :: nf90_def_compound
end function nf90_def_compound

function nf90_insert_compound(ncid, xtype, name, offset, field_typeid)
         integer, intent(in) :: ncid
         integer, intent(in) :: xtype
         character (len = *), intent(in) :: name
         integer, intent(in) :: offset
         integer, intent(in) :: field_typeid
         integer :: nf90_insert_compound
end function nf90_insert_compound

function nf90_put_vara(ncid, typeid, field_typeid, array_size, data)
         integer, intent(in) :: ncid
         integer, intent(in) :: typeid
         integer, intent(in) :: field_typeid
         integer, intent(in) :: array_size
         real(4), intent(in) :: data(array_size)
         integer :: nf90_put_vara
end function nf90_put_vara

end subroutine ncwrite
  • 2012 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: