SELF_Metadata.f90 Source File


Contents

Source Code


Source Code

! //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// !
!
! Maintainers : support@fluidnumerics.com
! Official Repository : https://github.com/FluidNumerics/self/
!
! Copyright © 2024 Fluid Numerics LLC
!
! Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
!
! 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
!
! 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in
!    the documentation and/or other materials provided with the distribution.
!
! 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from
!    this software without specific prior written permission.
!
! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
! HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
! LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!
! //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// !

module SELF_Metadata

  use SELF_HDF5
  use HDF5

  integer,parameter,public :: SELF_MTD_NameLength = 250
  integer,parameter,public :: SELF_MTD_DescriptionLength = 1000
  integer,parameter,public :: SELF_MTD_UnitsLength = 20

  ! A class for storing metadata information, intended for file IO
  type Metadata
    character(SELF_MTD_NameLength) :: name
    character(SELF_MTD_DescriptionLength) :: description
    character(SELF_MTD_UnitsLength) :: units

  contains

    procedure,public :: SetName => SetName_Metadata
    procedure,public :: SetDescription => SetDescription_Metadata
    procedure,public :: SetUnits => SetUnits_Metadata
    procedure,public :: WriteHDF5 => WriteHDF5_Metadata

  endtype Metadata

contains

  subroutine SetName_Metadata(mtd,name)
    implicit none
    class(Metadata),intent(inout) :: mtd
    character(*),intent(in) :: name

    mtd%name = name

  endsubroutine SetName_Metadata

  subroutine SetDescription_Metadata(mtd,description)
    implicit none
    class(Metadata),intent(inout) :: mtd
    character(*),intent(in) :: description

    mtd%description = description

  endsubroutine SetDescription_Metadata

  subroutine SetUnits_Metadata(mtd,units)
    implicit none
    class(Metadata),intent(inout) :: mtd
    character(*),intent(in) :: units

    mtd%units = units

  endsubroutine SetUnits_Metadata

  subroutine WriteHDF5_Metadata(mtd,group,varid,fileId)
  !! Writes the metadata to a HDF5 file using the
  !! fields :
  !!  * `/metadata/{group}/name/{varid}`
  !!  * `/metadata/{group}/description/{varid}`
  !!  * `/metadata/{group}/units/{varid}`
  !!
  !! This method assumes that an HDF5 file is already
  !! open for writing and is associated with the `fileId`
  !! input.
    class(Metadata),intent(in) :: mtd
    character(*),intent(in) :: group
    integer,intent(in) :: varid
    integer(HID_T),intent(in) :: fileId
    ! Local
    character(4) :: varNumber

    ! Add variable names to the file
    call CreateGroup_HDF5(fileId,trim(group)//"/metadata")
    call CreateGroup_HDF5(fileId,trim(group)//"/metadata/name")
    call CreateGroup_HDF5(fileId,trim(group)//"/metadata/description")
    call CreateGroup_HDF5(fileId,trim(group)//"/metadata/units")

    write(varNumber,"(I0)") varid
    call WriteCharacter_HDF5(fileId,trim(group)//"/metadata/name/"//trim(varnumber), &
                             trim(mtd%name))
    call WriteCharacter_HDF5(fileId,trim(group)//"/metadata/description/"//trim(varnumber), &
                             trim(mtd%description))
    call WriteCharacter_HDF5(fileId,trim(group)//"/metadata/units/"//trim(varnumber), &
                             trim(mtd%units))
  endsubroutine WriteHDF5_Metadata

endmodule SELF_Metadata