XMM-Newton SAS Home Page
XMM-Newton Science Analysis System


ssclib (ssclib-4.36.1) [xmmsas_20230412_1735-21.0.0]


readArrayData

It is often useful to be able to read an array of any data type into a fortran array of a single data type. The following interface covers just about every combination I could think of.

  interface readArrayData
    subroutine readArrayDataName1dReal32(imageSetName, vector)
      character(*), intent(in) :: imageSetName
      real(single), pointer    :: vector(:)
    end subroutine readArrayDataName1dReal32

    subroutine readArrayDataName2dReal32(imageSetName, image)
      character(*), intent(in) :: imageSetName
      real(single), pointer    :: image(:,:)
    end subroutine readArrayDataName2dReal32

    subroutine readArrayDataName3dReal32(imageSetName, cube)
      character(*), intent(in) :: imageSetName
      real(single), pointer    :: cube(:,:,:)
    end subroutine readArrayDataName3dReal32

    subroutine readArrayDataName1dReal64(imageSetName, vector)
      character(*), intent(in) :: imageSetName
      real(double), pointer    :: vector(:)
    end subroutine readArrayDataName1dReal64

    subroutine readArrayDataName2dReal64(imageSetName, image)
      character(*), intent(in) :: imageSetName
      real(double), pointer    :: image(:,:)
    end subroutine readArrayDataName2dReal64

    subroutine readArrayDataName3dReal64(imageSetName, cube)
      character(*), intent(in) :: imageSetName
      real(double), pointer    :: cube(:,:,:)
    end subroutine readArrayDataName3dReal64

    subroutine readArrayDataName2dBool(imageSetName, image)
      character(*), intent(in) :: imageSetName
      logical(bool), pointer    :: image(:,:)
    end subroutine readArrayDataName2dBool

    subroutine readArrayDataName2dInt16(imageSetName, image)
      character(*),   intent(in) :: imageSetName
      integer(int16), pointer    :: image(:,:)
    end subroutine readArrayDataName2dInt16

    subroutine readArrayDataName2dInt32(imageSetName, image)
      character(*),   intent(in) :: imageSetName
      integer(int32), pointer    :: image(:,:)
    end subroutine readArrayDataName2dInt32

    subroutine readArrayDataArray1dReal32(inArray, vector)
      type(ArrayT), intent(in) :: inArray
      real(single), pointer    :: vector(:)
    end subroutine readArrayDataArray1dReal32

    subroutine readArrayDataArray2dReal32(inArray, image)
      type(ArrayT), intent(in) :: inArray
      real(single), pointer    :: image(:,:)
    end subroutine readArrayDataArray2dReal32

    subroutine readArrayDataArray3dReal32(inArray, cube)
      type(ArrayT), intent(in) :: inArray
      real(single), pointer    :: cube(:,:,:)
    end subroutine readArrayDataArray3dReal32

    subroutine readArrayDataArray1dReal64(inArray, vector)
      type(ArrayT), intent(in) :: inArray
      real(double), pointer    :: vector(:)
    end subroutine readArrayDataArray1dReal64

    subroutine readArrayDataArray2dReal64(inArray, image)
      type(ArrayT), intent(in) :: inArray
      real(double), dimension(:,:), pointer :: image
    end subroutine readArrayDataArray2dReal64

    subroutine readArrayDataArray3dReal64(inArray, cube)
      type(ArrayT), intent(in) :: inArray
      real(double), dimension(:,:,:), pointer :: cube
    end subroutine readArrayDataArray3dReal64

    subroutine readArrayDataArray2dBool(inArray, image)
      type(ArrayT), intent(in) :: inArray
      logical(bool), dimension(:,:), pointer :: image
    end subroutine readArrayDataArray2dBool

    subroutine readArrayDataArray2dInt16(inArray, image)
      type(ArrayT), intent(in) :: inArray
      integer(int16), dimension(:,:), pointer :: image
    end subroutine readArrayDataArray2dInt16

    subroutine readArrayDataArray2dInt32(inArray, image)
      type(ArrayT), intent(in) :: inArray
      integer(int32), dimension(:,:), pointer :: image
    end subroutine readArrayDataArray2dInt32
  end interface

Boolean values are converted to real or integer 0s and 1s; real or integer are converted to boolean TRUE if > 0, FALSE otherwise.

Where the dimensions of the dataset array don't match those of the to-be-returned pointer array, it is eventually intended to convert these as follows:

Dims: Out 1 Out2 Out 3
In 1 simple ->image(1,:) ->cube(1,1,:)
In 2 take 1st row simple -> cube(1,:,:)
In 3 take 1st row, 1st plane take 1st plane simple
In >3 not supported not supported not supported

First rows or planes are always aligned with the biggest dimension(s).

However most of the inter-dimensional functionality is not yet in place.

Note that the returned pointer is not associated with any pointer allocated by a dal call such as, for example:

arrayDataReal32 => real32Array2Data(inArray)

Where readArrayData is called with the name of image dataset, the dataset is released within the subroutine, and all such dataset pointers are at that time deallocated; if readArrayData is called instead with the pointer inArray specified, the dataset and its array remain open, all dataset pointers which were allocated within the subroutine also remain allocated, but deallocate in the normal way at the time the calling routine releases the dataset (or its array). In either case, the returned pointer argument `vector', `image', or `cube' REMAINS ALLOCATED and therefore should be expressely deallocated in the calling routine via the fortran `deallocate' statement.

XMM-Newton SOC -- 2023-04-16