! Name: $Id$
!
! Purpose: jpss meta root fortran I/O module
!
! Method:
!
! Current Code Owner: NWP SAF
!
! COPYRIGHT
!    This software was developed within the context of the EUMETSAT Satellite
!    Application Facility on Numerical Weather Prediction (NWP SAF), under the
!    Cooperation Agreement dated 1 December 2006, between EUMETSAT and the
!    Met Office, UK, by one or more partners within the NWP SAF. The partners
!    in the NWP SAF are the Met Office, ECMWF, KNMI and MeteoFrance.
!
!    Copyright 2010, EUMETSAT, All Rights Reserved.
!
! History:
! Version    Date     Comment
!
!   1.0   3/12/2012  Initial version (Pascal Brunel) 
!   1.1   11/01/2018 Update for JPSS-1 (Pascale Roquet)
!   1.2   25/03/2024 Use attribute Platform_Short_Name instead of Mission_Name (Sonia Pere)
!
module jpss_meta_root_io

#ifdef HAS_LIBHDF5

#include "aapp_throw.h"
!use rttov_print_mod
use aapp_hdf_mod
use jpss_meta_root_def
use jpss_meta_root_mem
use hdf5
use h5lt
implicit none
private
public :: jpss_meta_root_rh
public :: jpss_meta_root_wh
public :: jpss_meta_root_writea


contains


subroutine jpss_meta_root_writea(x,lun,err)
type(jpss_meta_root),intent(in)::x
integer,intent(in)::lun
integer,intent(out)::err
integer::lb(7),ub(7)
character(len=nlen)::sname

TRY
sname='Distributor'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'Distributor'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A5))',a0=x%Distributor)
!write(lun,err=999)x%Distributor

sname='Mission_Name'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'Mission Name'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A6))',a0=x%Mission_Name)
!write(lun,err=999)x%Mission_Name

sname='N_Dataset_Source'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'N_Dataset_Source'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A9))',a0=x%N_Dataset_Source)
!write(lun,err=999)x%N_Dataset_Source

sname='N_HDF_Creation_Date'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'N_HDF_Creation_Date'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A9))',a0=x%N_HDF_Creation_Date)
!write(lun,err=999)x%N_HDF_Creation_Date

sname='N_HDF_Creation_Time'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'N_HDF_Creation_Time'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A15))',a0=x%N_HDF_Creation_Time)
!write(lun,err=999)x%N_HDF_Creation_Time

sname='N_GEO_Ref'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'N_GEO_Ref'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A79))',a0=x%N_GEO_Ref)
!write(lun,err=999)x%N_GEO_Ref

sname='Platform_Short_Name'
write(lun,'("SECTION = ",A)',err=999)trim(sname)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
write(lun,'("COMMENT = ",A)',err=999) &
 & 'Platform_Short_Name'
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
call print_array_character(lun,'(10000(A4))',a0=x%Platform_Short_Name)
!write(lun,err=999)x%Platform_Short_Name

write(lun,'("SECTION = EOF")',err=999)
THROWM(err.ne.0,"CANNOT WRITE "//trim(sname))
err=0
CATCH
end subroutine

subroutine jpss_meta_root_rh(x,lun,dname,err)
type(jpss_meta_root),intent(out)::x
integer(hid_t),intent(in)::lun
character(len=*)::dname
integer,intent(out)::err
character(len=nlen)::sname
logical :: lext
integer::ival(1)
real::sval(1)
integer(HSIZE_T),dimension(7):: dims 
integer :: type_class
integer(SIZE_T):: type_size

TRY

call jpss_meta_root_init(x)

sname='Distributor'
call h5ltget_attribute_string_f(lun,dname,sname,x%Distributor,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

sname='Platform_Short_Name'
call h5ltget_attribute_string_f(lun,dname,sname,x%Mission_Name,err)

THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

sname='N_Dataset_Source'
call h5ltget_attribute_string_f(lun,dname,sname,x%N_Dataset_Source,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

sname='N_HDF_Creation_Date'
call h5ltget_attribute_string_f(lun,dname,sname,x%N_HDF_Creation_Date,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

sname='N_HDF_Creation_Time'
call h5ltget_attribute_string_f(lun,dname,sname,x%N_HDF_Creation_Time,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

sname='N_GEO_Ref'
call h5aexists_by_name_f(lun, dname, sname, lext, err)
if( lext ) then
call h5ltget_attribute_string_f(lun,dname,sname,x%N_GEO_Ref,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))
endif

sname='Platform_Short_Name'
call h5ltget_attribute_string_f(lun,dname,sname,x%Platform_Short_Name,err)
THROWM(err.ne.0,"CANNOT READ ATTRIBUTE "//trim(sname))

err=0
CATCH
end subroutine

subroutine jpss_meta_root_wh(x,lun,dname,err)
type(jpss_meta_root),intent(in)::x
integer(hid_t),intent(in)::lun
character(len=*)::dname
integer,intent(out)::err
character(len=nlen)::sname
integer::ival(1)
real::sval(1)
INTEGER(SIZE_T) :: idims(1)

TRY
idims(1)=1
sname='Distributor'
call h5ltset_attribute_string_f(lun,dname,sname,x%Distributor,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='Platform_Short_Name'
call h5ltset_attribute_string_f(lun,dname,sname,x%Mission_Name,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='N_Dataset_Source'
call h5ltset_attribute_string_f(lun,dname,sname,x%N_Dataset_Source,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='N_HDF_Creation_Date'
call h5ltset_attribute_string_f(lun,dname,sname,x%N_HDF_Creation_Date,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='N_HDF_Creation_Time'
call h5ltset_attribute_string_f(lun,dname,sname,x%N_HDF_Creation_Time,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='N_GEO_Ref'
call h5ltset_attribute_string_f(lun,dname,sname,x%N_GEO_Ref,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

sname='Platform_Short_Name'
call h5ltset_attribute_string_f(lun,dname,sname,x%Platform_Short_Name,err)
THROWM(err.ne.0,"CANNOT WRITE ATTRIBUTE "//trim(sname))

err=0
CATCH
end subroutine

#endif

end module
