| 1 | !------------------------------------------------------------------------------ |
|---|
| 2 | ! NeXus - Neutron & X-ray Common Data Format |
|---|
| 3 | ! |
|---|
| 4 | ! Test program for the Fortran 90 API |
|---|
| 5 | ! |
|---|
| 6 | ! Copyright (C) 1999-2002, Ray Osborn |
|---|
| 7 | ! |
|---|
| 8 | ! This library is free software; you can redistribute it and/or |
|---|
| 9 | ! modify it under the terms of the GNU Lesser General Public |
|---|
| 10 | ! License as published by the Free Software Foundation; either |
|---|
| 11 | ! version 2 of the License, or (at your option) any later version. |
|---|
| 12 | ! |
|---|
| 13 | ! This library is distributed in the hope that it will be useful, |
|---|
| 14 | ! but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 15 | ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|---|
| 16 | ! Lesser General Public License for more details. |
|---|
| 17 | ! |
|---|
| 18 | ! You should have received a copy of the GNU Lesser General Public |
|---|
| 19 | ! License along with this library; if not, write to the Free Software |
|---|
| 20 | ! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 21 | ! |
|---|
| 22 | ! For further information, see <http://www.nexusformat.org> |
|---|
| 23 | ! |
|---|
| 24 | ! $Id$ |
|---|
| 25 | !------------------------------------------------------------------------------ |
|---|
| 26 | |
|---|
| 27 | program NXtest |
|---|
| 28 | |
|---|
| 29 | use NXmodule |
|---|
| 30 | |
|---|
| 31 | integer :: NXrank, NXdims(NX_maxrank), NXtype, NXlen, entry_status, attr_status |
|---|
| 32 | integer(kind=NXi1), dimension(4) :: i1_array = (/1, 2, 3, 4/) |
|---|
| 33 | integer(kind=NXi2), dimension(4) :: i2_array = (/1000, 2000, 3000, 4000/) |
|---|
| 34 | integer(kind=NXi4), dimension(4) :: i4_array = (/1000000, 2000000, 3000000, 4000000/) |
|---|
| 35 | real(kind=NXr4), dimension(4,5) :: r4_array |
|---|
| 36 | real(kind=NXr8), dimension(4,5) :: r8_array |
|---|
| 37 | integer(kind=NXi4), dimension(4) :: i4_buffer |
|---|
| 38 | real(kind=NXr4), dimension(4) :: r4_buffer |
|---|
| 39 | real(kind=NXr8), dimension(16) :: r8_buffer |
|---|
| 40 | integer(kind=NXi4), dimension(2000) :: comp_array |
|---|
| 41 | integer(kind=NXi4) :: i, j |
|---|
| 42 | real(kind=NXr4) :: r |
|---|
| 43 | character(len=20) :: char_buffer |
|---|
| 44 | character(len=NX_maxnamelen) :: name, class |
|---|
| 45 | type(NXhandle) :: fileid |
|---|
| 46 | type(NXlink) :: glink, dlink, blink |
|---|
| 47 | |
|---|
| 48 | r4_array = reshape ((/(i*1.0_NXr4,i=1,20)/),(/4,5/)) |
|---|
| 49 | r8_array = reshape ((/(i*1.0_NXr8,i=1,20)/),(/4,5/)) |
|---|
| 50 | ! *** create file |
|---|
| 51 | if (NXopen("NXtest.nxs", NXACC_CREATE5, fileid) /= NX_OK) stop |
|---|
| 52 | if (NXmakegroup(fileid, "entry", "NXentry") /= NX_OK) stop |
|---|
| 53 | if (NXopengroup(fileid, "entry", "NXentry") /= NX_OK) stop |
|---|
| 54 | if (NXmakedata(fileid, "ch_data", NX_CHAR, 1, (/10/)) /= NX_OK) stop |
|---|
| 55 | if (NXopendata(fileid, "ch_data") /= NX_OK) stop |
|---|
| 56 | if (NXputdata(fileid, "NeXus data") /= NX_OK) stop |
|---|
| 57 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 58 | if (NXmakedata(fileid, "i1_data", NX_INT8, 1, (/4/)) /= NX_OK) stop |
|---|
| 59 | if (NXopendata(fileid, "i1_data") /= NX_OK) stop |
|---|
| 60 | if (NXputdata(fileid, i1_array) /= NX_OK) stop |
|---|
| 61 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 62 | if (NXmakedata(fileid, "i2_data", NX_INT16, 1, (/4/)) /= NX_OK) stop |
|---|
| 63 | if (NXopendata(fileid, "i2_data") /= NX_OK) stop |
|---|
| 64 | if (NXputdata(fileid, i2_array) /= NX_OK) stop |
|---|
| 65 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 66 | if (NXmakedata(fileid, "i4_data", NX_INT32, 1, (/4/)) /= NX_OK) stop |
|---|
| 67 | if (NXopendata(fileid, "i4_data") /= NX_OK) stop |
|---|
| 68 | if (NXputdata(fileid, i4_array) /= NX_OK) stop |
|---|
| 69 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 70 | if (NXmakedata(fileid, "r4_data", NX_FLOAT32, 2, (/4,5/), NX_COMP_LZW, (/4,5/)) /= NX_OK) stop |
|---|
| 71 | if (NXopendata(fileid, "r4_data") /= NX_OK) stop |
|---|
| 72 | if (NXputdata(fileid, reshape(r4_array,(/size(r4_array)/))) /= NX_OK) stop |
|---|
| 73 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 74 | if (NXmakedata(fileid, "r8_data", NX_FLOAT64, 2, (/4,5/)) /= NX_OK) stop |
|---|
| 75 | if (NXopendata(fileid, "r8_data") /= NX_OK) stop |
|---|
| 76 | r8_buffer(1:4) = reshape(r8_array(1:4,5:5),(/4/)) |
|---|
| 77 | if (NXputslab(fileid, r8_buffer, (/1,5/), (/4,1/)) /= NX_OK) stop |
|---|
| 78 | r8_buffer = reshape(r8_array(1:4,1:4),(/16/)) |
|---|
| 79 | if (NXputslab(fileid, r8_buffer, (/1,1/), (/4,4/)) /= NX_OK) stop |
|---|
| 80 | if (NXputattr(fileid, "ch_attribute", "NeXus") /= NX_OK) stop |
|---|
| 81 | if (NXputattr(fileid, "i4_attribute", 42) /= NX_OK) stop |
|---|
| 82 | if (NXputattr(fileid, "r4_attribute", 3.141593_NXr4) /= NX_OK) stop |
|---|
| 83 | if (NXgetdataID(fileid, dlink) /= NX_OK) stop |
|---|
| 84 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 85 | if (NXmakegroup(fileid, "data", "NXdata") /= NX_OK) stop |
|---|
| 86 | if (NXopengroup(fileid, "data", "NXdata") /= NX_OK) stop |
|---|
| 87 | if (NXmakelink(fileid, dlink) /= NX_OK) stop |
|---|
| 88 | if (NXmakedata(fileid, "comp_data", NX_INT32, 2, (/20,100/)) /= NX_OK) stop |
|---|
| 89 | if (NXopendata(fileid, "comp_data") /= NX_OK) stop |
|---|
| 90 | comp_array = (/((j-1,i=1,20),j=1,100)/) |
|---|
| 91 | if (NXputdata(fileid, comp_array) /= NX_OK) stop |
|---|
| 92 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 93 | if (NXflush(fileid) /= NX_OK) stop |
|---|
| 94 | if (NXmakedata(fileid, "flush_data", NX_INT32, 1, (/NX_UNLIMITED/)) /= NX_OK) stop |
|---|
| 95 | do i = 1,7 |
|---|
| 96 | if (NXopendata(fileid, "flush_data") /= NX_OK) stop |
|---|
| 97 | if (NXputslab(fileid, (/i/), (/i/), (/1/)) /= NX_OK) stop |
|---|
| 98 | if (NXflush(fileid) /= NX_OK) stop |
|---|
| 99 | end do |
|---|
| 100 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 101 | if (NXmakegroup(fileid, "sample", "NXsample") /= NX_OK) stop |
|---|
| 102 | if (NXopengroup(fileid, "sample", "NXsample") /= NX_OK) stop |
|---|
| 103 | print 300, "Writing character data" |
|---|
| 104 | if (NXmakedata(fileid, "ch_data", NX_CHAR, 1, (/12/)) /= NX_OK) stop |
|---|
| 105 | if (NXopendata(fileid, "ch_data") /= NX_OK) stop |
|---|
| 106 | if (NXputdata(fileid, "NeXus sample") /= NX_OK) stop |
|---|
| 107 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 108 | if (NXgetgroupID(fileid, glink) /= NX_OK) stop |
|---|
| 109 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 110 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 111 | if (NXmakegroup(fileid, "link", "NXentry") /= NX_OK) stop |
|---|
| 112 | if (NXopengroup(fileid, "link", "NXentry") /= NX_OK) stop |
|---|
| 113 | if (NXmakelink(fileid, glink) /= NX_OK) stop |
|---|
| 114 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 115 | if (NXclose(fileid) /= NX_OK) stop |
|---|
| 116 | ! *** read data |
|---|
| 117 | if (NXopen("NXtest.nxs", NXACC_READ, fileid) /= NX_OK) stop |
|---|
| 118 | if (NXgetattrinfo(fileid, i) /= NX_OK) stop |
|---|
| 119 | if (i > 0) print 200, "Number of global attributes: ", i |
|---|
| 120 | attr_status = NX_OK |
|---|
| 121 | do while (attr_status == NX_OK) |
|---|
| 122 | attr_status = NXgetnextattr(fileid, name, NXlen, NXtype) |
|---|
| 123 | if (attr_status == NX_ERROR) stop |
|---|
| 124 | if (attr_status == NX_OK) then |
|---|
| 125 | if ((name /= "HDF_version") .and. (name /= "HDF5_Version") .and. & |
|---|
| 126 | (name /= "file_time")) then |
|---|
| 127 | select case (NXtype) |
|---|
| 128 | case (NX_CHAR) |
|---|
| 129 | NXlen = len(char_buffer) |
|---|
| 130 | if (NXgetattr(fileid, name, char_buffer, NXlen, NXtype) /= NX_OK) stop |
|---|
| 131 | print 300, " "//trim(name)//" = "//trim(char_buffer) |
|---|
| 132 | end select |
|---|
| 133 | end if |
|---|
| 134 | end if |
|---|
| 135 | end do |
|---|
| 136 | if (NXopengroup(fileid, "entry", "NXentry") /= NX_OK) stop |
|---|
| 137 | if (NXgetgroupinfo(fileid, i, name, class) /= NX_OK) stop |
|---|
| 138 | print '(A,i8,A)', "Group: "//trim(name)//"("//trim(class)//") contains ", i, " items" |
|---|
| 139 | do |
|---|
| 140 | entry_status = NXgetnextentry(fileid, name, class, NXtype) |
|---|
| 141 | if (entry_status == NX_ERROR) then |
|---|
| 142 | stop |
|---|
| 143 | else if (entry_status == NX_EOD) then |
|---|
| 144 | exit |
|---|
| 145 | else if (trim(class) /= "SDS") then |
|---|
| 146 | print 300, " Subgroup: "//trim(name)//"("//trim(class)//")" |
|---|
| 147 | else if (entry_status == NX_OK) then |
|---|
| 148 | if (NXopendata(fileid, name) /= NX_OK) stop |
|---|
| 149 | if (NXgetinfo(fileid, NXrank, NXdims, NXtype) /= NX_OK) stop |
|---|
| 150 | print 300, " "//trim(name)//" : ", trim(NXdatatype(NXtype)) |
|---|
| 151 | if (NXtype == NX_CHAR) then |
|---|
| 152 | if (NXgetdata(fileid, char_buffer) /= NX_OK) stop |
|---|
| 153 | print 300, " Values : ", trim(char_buffer) |
|---|
| 154 | else if (NXtype == NX_INT8 .or. NXtype == NX_INT16 .or. NXtype == NX_INT32) then |
|---|
| 155 | if (NXgetdata(fileid, i4_buffer) /= NX_OK) stop |
|---|
| 156 | print 200, " Values : ", i4_buffer |
|---|
| 157 | else if (NXtype == NX_FLOAT32 .or. NXtype == NX_FLOAT64) then |
|---|
| 158 | if (NXgetslab(fileid, r4_buffer, (/1,1/), (/4,1/)) /= NX_OK) stop |
|---|
| 159 | print 100, " Values : ", r4_buffer |
|---|
| 160 | if (NXgetslab(fileid, r4_buffer, (/1,2/), (/4,1/)) /= NX_OK) stop |
|---|
| 161 | print 100, " : ", r4_buffer |
|---|
| 162 | if (NXgetslab(fileid, r4_buffer, (/1,3/), (/4,1/)) /= NX_OK) stop |
|---|
| 163 | print 100, " : ", r4_buffer |
|---|
| 164 | if (NXgetslab(fileid, r4_buffer, (/1,4/), (/4,1/)) /= NX_OK) stop |
|---|
| 165 | print 100, " : ", r4_buffer |
|---|
| 166 | if (NXgetslab(fileid, r4_buffer, (/1,5/), (/4,1/)) /= NX_OK) stop |
|---|
| 167 | print 100, " : ", r4_buffer |
|---|
| 168 | end if |
|---|
| 169 | do |
|---|
| 170 | attr_status = NXgetnextattr(fileid, name, NXdims(1), NXtype) |
|---|
| 171 | if (attr_status == NX_ERROR) then |
|---|
| 172 | stop |
|---|
| 173 | else if (attr_status == NX_EOD) then |
|---|
| 174 | exit |
|---|
| 175 | else if (attr_status == NX_OK) then |
|---|
| 176 | if (NXtype == NX_CHAR) then |
|---|
| 177 | if (NXgetattr(fileid, name, char_buffer) /= NX_OK) stop |
|---|
| 178 | print 300, " "//trim(name)//" : ", trim(char_buffer) |
|---|
| 179 | else if (NXtype == NX_INT32) then |
|---|
| 180 | if (NXgetattr(fileid, name, i) /= NX_OK) stop |
|---|
| 181 | print 200, " "//trim(name)//" : ", i |
|---|
| 182 | else if (NXtype == NX_FLOAT32) then |
|---|
| 183 | if (NXgetattr(fileid, name, r) /= NX_OK) stop |
|---|
| 184 | print 100, " "//trim(name)//" : ", r |
|---|
| 185 | end if |
|---|
| 186 | end if |
|---|
| 187 | end do |
|---|
| 188 | if (NXclosedata(fileid) /= NX_OK) stop |
|---|
| 189 | end if |
|---|
| 190 | end do |
|---|
| 191 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 192 | if (NXopengroup(fileid, "link", "NXentry") /= NX_OK) stop |
|---|
| 193 | if (NXgetgroupID(fileid, glink) /= NX_OK) stop |
|---|
| 194 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 195 | if (NXopengroup(fileid, "link", "NXentry") /= NX_OK) stop |
|---|
| 196 | if (NXgetgroupID(fileid, blink) /= NX_OK) stop |
|---|
| 197 | if (NXsameID(fileid, glink, blink)) then |
|---|
| 198 | print 300, "Link Check OK" |
|---|
| 199 | else |
|---|
| 200 | print 300, "Link Check Failed" |
|---|
| 201 | end if |
|---|
| 202 | if (NXclosegroup(fileid) /= NX_OK) stop |
|---|
| 203 | if (NXclose(fileid) /= NX_OK) stop |
|---|
| 204 | |
|---|
| 205 | 100 format(A,4f12.7) |
|---|
| 206 | 200 format(A,4i8) |
|---|
| 207 | 300 format(4A) |
|---|
| 208 | |
|---|
| 209 | end program NXtest |
|---|