GDFV2 header

#
GDFV2 header

    type :: gildas_header_v2
      sequence
        ! Trailer:
        integer(kind=4) :: ijtyp(3) = 0       !  1  Image Type
        integer(kind=4) :: form    = fmt_r4   !  4  Data format (FMT_xx)
        integer(kind=8) :: ndb     = 0        !  5  Number of blocks
        integer(kind=4) :: nhb     = 2        !  7  Number of header blocks
        integer(kind=4) :: ntb     = 0        !  8  Number of trailing blocks
        integer(kind=4) :: version_gdf = code_version_gdf_current !  9  Data format Version number
        integer(kind=4) :: type_gdf =  code_gdf_image  !  10 code_gdf_image or code_null
        integer(kind=4) :: dim_start = gdf_startdim    !  11  Start offset for DIMENSION, should be odd, >12
        integer(kind=4) :: pad_trail
        ! The maximum value would be 17 to hold up to 8 dimensions.
        !
        ! DIMENSION Section. Caution about alignment...
        integer(kind=4) :: dim_words   = 2*gdf_maxdims+2  ! at s_dim=17  Dimension section length
        integer(kind=4) :: blan_start !! = dim_start + dim_lenth + 2   ! 18  Pointer to next section
        integer(kind=4) :: mdim    = 4        !or > ! 19  Maximum number of dimensions in this data format
        integer(kind=4) :: ndim    = 0        ! 20  Number of dimensions
        integer(kind=index_length) :: dim(gdf_maxdims) = 0     ! 21  Dimensions
        !
        ! BLANKING
        integer(kind=4) :: blan_words = 2     ! Blanking section length
        integer(kind=4) :: extr_start         ! Pointer to next section
        real(kind=4) :: bval = +1.23456e+38   ! Blanking value
        real(kind=4) :: eval = -1.0           ! Tolerance
        !
        ! EXTREMA
        integer(kind=4) :: extr_words = 6    ! Extrema section length
        integer(kind=4) :: coor_start !! = extr_start + extr_words +2     !
        real(kind=4) :: rmin    = 0.0         ! Minimum
        real(kind=4) :: rmax    = 0.0         ! Maximum
        integer(kind=index_length) :: minloc(gdf_maxdims) = 0 ! Pixel of minimum
        integer(kind=index_length) :: maxloc(gdf_maxdims) = 0 ! Pixel of maximum
        !
        ! In data file, minloc and maxloc are not written. Instead, two Integer(8)
        ! mini and maxi indicate the position of the extrema in a rank-1 model of the data.
        !
        ! COORDINATE Section
        integer(kind=4) :: coor_words  = 6*gdf_maxdims   ! at s_coor  Section length
        integer(kind=4) :: desc_start  !! = coord_start + coord_words +2     !
        real(kind=8)    :: convert(3,gdf_maxdims)   !  Ref, Val, Inc for each dimension
        !
        ! DESCRIPTION Section
        integer(kind=4) :: desc_words  = 3*(gdf_maxdims+1) ! at s_desc, Description section length
        integer(kind=4) :: null_start  !! = desc_start + desc_words +2     !
        integer(kind=4) :: ijuni(3)   = 0        ! Data Unit
        integer(kind=4) :: ijcod(3,gdf_maxdims) = 0    ! Axis names
        integer(kind=4) :: pad_desc              ! For Odd gdf_maxdims only
        !
        !
        ! The first block length is thus
        !   s_dim-1 + (2*mdim+4) + (4) + (8) +  (6*mdim+2) + (3*mdim+5)
        ! = s_dim-1 + mdim*(2+6+3) + (4+4+2+5+8)
        ! = s_dim-1 + 11*mdim + 23
        ! With mdim = 7, s_dim=11, this is 110 spaces
        ! With mdim = 8, s_dim=11, this is 121 spaces
        ! MDIM > 8 would NOT fit in one block...
        !
        ! Block 2: Ancillary information
        !
        ! The same logic of Length + Pointer is used there too, although the
        ! length are fixed. Note rounding to even number for the pointer offsets
        ! in order to preserve alignement...
        !
        integer(kind=4) :: posi_start  = 1
        !
        ! POSITION
        integer(kind=4) :: posi_words = 15    ! Position section length: 15 used + 1 padding
        integer(kind=4) :: proj_start         !! = s_posi + 16     ! Pointer to next section
        integer(kind=4) :: ijsou(3) = 0       ! 75  Source name
        integer(kind=4) :: ijsys(3) = 0       ! 71  Coordinate System (moved from Description section)
        real(kind=8) :: ra         = 0.d0     ! 78  Right Ascension
        real(kind=8) :: dec        = 0.d0     ! 80  Declination
        real(kind=8) :: lii        = 0.d0     ! 82  Galactic longitude
        real(kind=8) :: bii        = 0.d0     ! 84           latitude
        real(kind=4) :: epoc       = 0.0      ! 86  Epoch of coordinates
        real(kind=4) :: pad_posi
        !
        ! PROJECTION
        integer(kind=4) :: proj_words = 9     ! Projection length: 9 used + 1 padding
        integer(kind=4) :: spec_start !! = proj_start + 12
        real(kind=8) :: a0      = 0.d0        ! 89  X of projection center
        real(kind=8) :: d0      = 0.d0        ! 91  Y of projection center
        real(kind=8) :: pang    = 0.d0        ! 93  Projection angle
        integer(kind=4) :: ptyp = p_none      ! 88  Projection type (see p_... codes)
        integer(kind=4) :: xaxi = 0           ! 95  X axis
        integer(kind=4) :: yaxi = 0           ! 96  Y axis
        integer(kind=4) :: pad_proj
        !
        ! SPECTROSCOPY
        integer(kind=4) :: spec_words  = 14   ! Spectroscopy length: 14 used
        integer(kind=4) :: reso_start  !! = spec_words + 16
        real(kind=8) :: fres       = 0.d0     !101  Frequency resolution
        real(kind=8) :: fima       = 0.d0     !103  Image frequency
        real(kind=8) :: freq       = 0.d0     !105  Rest Frequency
        real(kind=4) :: vres       = 0.0      !107  Velocity resolution
        real(kind=4) :: voff       = 0.0      !108  Velocity offset
        real(kind=4) :: dopp       = 0.0      !     Doppler factor
        integer(kind=4) :: faxi    = 0        !109  Frequency axis
        integer(kind=4) :: ijlin(3) = 0       ! 98  Line name
        integer(kind=4) :: vtyp    = vel_unk  ! Velocity type (see vel_... codes)
        !
        ! RESOLUTION
        integer(kind=4) :: reso_words = 3     ! Resolution length: 3 used + 1 padding
        integer(kind=4) :: nois_start !! = reso_words + 6
        real(kind=4) :: majo    = 0.0         !111  Major axis
        real(kind=4) :: mino    = 0.0         !112  Minor axis
        real(kind=4) :: posa    = 0.0         !113  Position angle
        real(kind=4) :: pad_reso
        !
        ! NOISE
        integer(kind=4) :: nois_words = 2     ! Noise section length: 2 used
        integer(kind=4) :: astr_start !! = s_nois + 4
        real(kind=4) :: noise   = 0.0         ! 115 Theoretical noise
        real(kind=4) :: rms     = 0.0         ! 116 Actual noise
        !
        ! ASTROMETRY
        integer(kind=4) :: astr_words = 3    ! Proper motion section length: 3 used + 1 padding
        integer(kind=4) :: uvda_start !! = s_astr + 4
        real(kind=4) :: mura     = 0.0        ! 118 along RA, in mas/yr
        real(kind=4) :: mudec    = 0.0        ! 119 along Dec, in mas/yr
        real(kind=4) :: parallax = 0.0        ! 120 in mas
        real(kind=4) :: pad_astr
        ! real(kind=4) :: pepoch   = 2000.0     ! 121 in yrs ?
        !
        ! TELESCOPE information section, normally after the UV Data section
        integer(kind=4) :: tele_words  = 2    ! Length of section: 8 used
        integer(kind=4) :: void_start  !! = s_tele + l_tele + 2
        integer(kind=4) :: nteles = 0        ! Number of telescopes
        integer(kind=4) :: magic  = 1000     ! Magic offset to code telescope pairs
        !
        ! UV_DATA information
        integer(kind=4) :: uvda_words  = 18+2*code_uvt_last ! Length of section: 18 used + codes
        integer(kind=4) :: void_start        !! = s_uvda + l_uvda + 2
        integer(kind=4) :: version_uv = code_version_uvt_current  ! 1 version number.
        integer(kind=4) :: nchan = 0         ! 2 Number of channels
        integer(kind=8) :: nvisi = 0         ! 3-4 Independent of the transposition status
        integer(kind=4) :: nstokes = 0       ! 5 Number of polarizations
        integer(kind=4) :: natom = 0         ! 6. 3 for real, imaginary, weight. 1 for real.
        real(kind=4)    :: basemin = 0.      ! 7 Minimum Baseline
        real(kind=4)    :: basemax = 0.      ! 8 Maximum Baseline
        integer(kind=4) :: fcol              ! 9 Column of first visibility information
        integer(kind=4) :: lcol              ! 10 Column of last visibility information
        ! The number of information per channel can be obtained by
        !       (lcol-fcol+1)/(nchan*natom)
        ! so this could allow to derive the number of Stokes parameters
        ! Leading data at start of each visibility contains specific information
        integer(kind=4) :: nlead = 7         ! 11 Number of leading informations
        ! Trailing data at end of each visibility may hold additional information
        integer(kind=4) :: ntrail = 0        ! 12 Number of trailing informations
        !
        ! Leading / Trailing information codes have been specified before
        integer(kind=4) :: column_pointer(code_uvt_last) = code_null ! Pointers to columns...
        integer(kind=4) :: column_size(code_uvt_last) = 0  ! Number of columns for each
        ! In the data, we instead have the codes for each column
        ! integer(kind=4) :: column_codes(nlead+ntrail)         ! Column code for each ...
        ! integer(kind=4) :: column_types(nlead+ntrail) /0,1,2/ ! Number of columns for each: 1 real*4, 2 real*8
        ! Leading / Trailing information codes
        !
        integer(kind=4) :: order = 0         ! 13  Stoke/Channel ordering
        integer(kind=4) :: nfreq = 0         ! 14  ! 0 or = nchan*nstokes
        integer(kind=4) :: atoms(4) = 0      ! 18  Atoms description
        !
        real(kind=8), pointer :: freqs(:) => null()     ! (nchan*nstokes) = 0d0
        integer(kind=4), pointer :: stokes(:) => null() ! (nchan*nstokes) or (nstokes) = code_stoke
      end type gildas_header_v2

      type :: telesco
        sequence
         ! Then for each telescope
         real(kind=8) :: lon=0     ! Longitude (radians)
         real(kind=8) :: lat=0     ! Latitude  (radians)
         real(kind=4) :: alt=0     ! Altitude (m)
         real(kind=4) :: diam=0    ! Diameter
         character(len=12) :: ctele=' '  ! Telescope name
         integer(kind=4) :: pad    ! Padding for alignment
      end type telesco