33 CHARACTER(len=*),
PARAMETER,
PUBLIC :: NeXus_version =
"2.0.1"
35 INTEGER,
PARAMETER,
PUBLIC :: NXACC_READ = 1
36 INTEGER,
PARAMETER,
PUBLIC :: NXACC_RDWR = 2
37 INTEGER,
PARAMETER,
PUBLIC :: NXACC_CREATE = 3
38 INTEGER,
PARAMETER,
PUBLIC :: NXACC_CREATE4 = 4
39 INTEGER,
PARAMETER,
PUBLIC :: NXACC_CREATE5 = 5
41 INTEGER,
PARAMETER,
PUBLIC :: NX_OK = 1
42 INTEGER,
PARAMETER,
PUBLIC :: NX_ERROR = 0
43 INTEGER,
PARAMETER,
PUBLIC :: NX_EOD = -1
45 INTEGER,
PARAMETER,
PUBLIC :: NX_CHAR = 4
46 INTEGER,
PARAMETER,
PUBLIC :: NX_FLOAT32 = 5
47 INTEGER,
PARAMETER,
PUBLIC :: NX_FLOAT64 = 6
48 INTEGER,
PARAMETER,
PUBLIC :: NX_INT8 = 20
49 INTEGER,
PARAMETER,
PUBLIC :: NX_UINT8 = 21
50 INTEGER,
PARAMETER,
PUBLIC :: NX_INT16 = 22
51 INTEGER,
PARAMETER,
PUBLIC :: NX_UINT16 = 23
52 INTEGER,
PARAMETER,
PUBLIC :: NX_INT32 = 24
53 INTEGER,
PARAMETER,
PUBLIC :: NX_UINT32 = 25
55 INTEGER,
PARAMETER,
PUBLIC :: NX_COMP_NONE = 100
56 INTEGER,
PARAMETER,
PUBLIC :: NX_COMP_LZW = 200
57 INTEGER,
PARAMETER,
PUBLIC :: NX_COMP_RLE = 300
58 INTEGER,
PARAMETER,
PUBLIC :: NX_COMP_HUF = 400
60 INTEGER,
PARAMETER,
PUBLIC :: NX_UNLIMITED = -1
62 INTEGER,
PARAMETER,
PUBLIC :: NX_MAXRANK = 32
63 INTEGER,
PARAMETER,
PUBLIC :: NX_MAXNAMELEN = 64
64 INTEGER,
PARAMETER,
PUBLIC :: NX_MAXSTACK = 20
66 INTEGER,
PARAMETER,
PUBLIC :: NXi1 = selected_int_kind(2)
67 INTEGER,
PARAMETER,
PUBLIC :: NXi2 = selected_int_kind(4)
68 INTEGER,
PARAMETER,
PUBLIC :: NXi4 = selected_int_kind(8)
69 INTEGER,
PARAMETER,
PUBLIC :: NXr4 = kind(1.0)
70 INTEGER,
PARAMETER,
PUBLIC :: NXr8 = kind(1.0D0)
73 INTEGER(kind=NXi4) :: dummy(1040)
76 INTEGER(kind=NXi4) :: dummy(5120)
79 INTEGER(KIND=NXi1),
ALLOCATABLE,
PRIVATE :: buffer_i1(:)
80 INTEGER(KIND=NXi2),
ALLOCATABLE,
PRIVATE :: buffer_i2(:)
81 INTEGER(KIND=NXi4),
ALLOCATABLE,
PRIVATE :: buffer_i4(:)
82 REAL(KIND=NXr4),
ALLOCATABLE,
PRIVATE :: buffer_r4(:)
83 REAL(KIND=NXr8),
ALLOCATABLE,
PRIVATE :: buffer_r8(:)
84 INTEGER,
PRIVATE :: NXrank, NXdims(NX_MAXRANK), NXtype, NXsize
122 FUNCTION nxopen (file_name, access_method, file_id) RESULT (status)
124 CHARACTER(len=*),
INTENT(in) :: file_name
125 INTEGER,
INTENT(in) :: access_method
126 TYPE(nxhandle),
INTENT(out) :: file_id
128 INTEGER :: status, nxifopen
131 status = nxifopen(
nxcstring(file_name), access_method, new_id)
139 TYPE(nxhandle),
INTENT(in) :: file_id
140 INTEGER :: status, nxifclose
143 status = nxifclose(file_id)
150 TYPE(nxhandle),
INTENT(inout) :: file_id
151 INTEGER :: status, nxifflush
154 status = nxifflush(file_id)
159 FUNCTION nxmakegroup (file_id, group_name, group_class) RESULT (status)
161 TYPE(nxhandle),
INTENT(in) :: file_id
162 CHARACTER(len=*),
INTENT(in) :: group_name, group_class
163 INTEGER :: status, nximakegroup
164 EXTERNAL nximakegroup
166 status = nximakegroup(file_id,
nxcstring(group_name), &
172 FUNCTION nxopengroup (file_id, group_name, group_class) RESULT (status)
174 TYPE(nxhandle),
INTENT(in) :: file_id
175 CHARACTER(len=*),
INTENT(in) :: group_name, group_class
176 INTEGER :: status, nxiopengroup
177 EXTERNAL nxiopengroup
179 status = nxiopengroup(file_id,
nxcstring(group_name), &
187 TYPE(nxhandle),
INTENT(in) :: file_id
188 INTEGER :: status, nxiclosegroup
189 EXTERNAL nxiclosegroup
191 status = nxiclosegroup(file_id)
196 FUNCTION nxmakedata (file_id, data_name, data_type, data_rank, &
197 data_dimensions, compress_type, chunk_size) &
200 TYPE(nxhandle),
INTENT(in) :: file_id
201 CHARACTER(len=*),
INTENT(in) :: data_name
202 INTEGER,
INTENT(in) :: data_type,data_rank,data_dimensions(:)
203 INTEGER,
OPTIONAL,
INTENT(in) :: compress_type, chunk_size(:)
204 INTEGER,
ALLOCATABLE :: nxchunk_size(:)
205 INTEGER :: status, i, nxifmakedata, nxifcompmakedata
206 EXTERNAL nxifmakedata, nxifcompmakedata
208 IF (present(compress_type))
THEN
209 IF (present(chunk_size))
THEN
210 ALLOCATE (nxchunk_size(data_rank))
211 nxchunk_size = chunk_size
213 ALLOCATE (nxchunk_size(data_rank))
214 nxchunk_size = (/(data_dimensions(i),i=1,data_rank)/)
216 status = nxifcompmakedata(file_id,
nxcstring(data_name), data_type, &
217 data_rank, data_dimensions, compress_type, nxchunk_size)
218 DEALLOCATE (nxchunk_size)
220 status = nxifmakedata(file_id,
nxcstring(data_name), data_type, &
221 data_rank, data_dimensions)
229 TYPE(nxhandle),
INTENT(in) :: file_id
230 CHARACTER(len=*),
INTENT(in) :: data_name
231 INTEGER :: status, nxiopendata
234 status = nxiopendata(file_id,
nxcstring(data_name))
241 TYPE(nxhandle),
INTENT(in) :: file_id
242 INTEGER,
INTENT(in) :: compress_type
243 INTEGER :: status, nxifcompress
244 EXTERNAL nxifcompress
246 status = nxifcompress(file_id, compress_type)
253 TYPE(nxhandle),
INTENT(in) :: file_id
254 INTEGER :: status, nxiclosedata
255 EXTERNAL nxiclosedata
257 status = nxiclosedata(file_id)
266 FUNCTION nxgeti1 (file_id, data) RESULT (status)
268 TYPE(nxhandle),
INTENT(in) :: file_id
269 INTEGER(KIND=NXi1),
INTENT(out) :: data(:)
270 INTEGER :: status, nxigetdata
273 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
274 IF (status /= nx_ok) return
275 nxsize = product(nxdims(1:nxrank))
276 IF (nxsize >
size(data))
THEN
277 CALL
nxerror(
"The supplied array is not large enough for the data")
279 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
280 ALLOCATE (buffer_i1(nxsize))
281 status = nxigetdata(file_id, buffer_i1)
283 DEALLOCATE (buffer_i1)
284 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
285 ALLOCATE (buffer_i2(nxsize))
286 status = nxigetdata(file_id, buffer_i2)
287 IF (abs(maxval(buffer_i2)) <= huge(data))
THEN
290 CALL
nxerror(
"Input values too large for data type")
293 DEALLOCATE (buffer_i2)
294 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
295 ALLOCATE (buffer_i4(nxsize))
296 status = nxigetdata(file_id, buffer_i4)
297 IF (abs(maxval(buffer_i4)) <= huge(data))
THEN
300 CALL
nxerror(
"Input values too large for data type")
303 DEALLOCATE (buffer_i4)
306 (
"The datatype is incompatible with the supplied variable")
313 FUNCTION nxgeti2 (file_id, data) RESULT (status)
315 TYPE(nxhandle),
INTENT(in) :: file_id
316 INTEGER(KIND=NXi2),
INTENT(out) :: data(:)
317 INTEGER :: status, nxigetdata
320 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
321 IF (status /= nx_ok) return
322 nxsize = product(nxdims(1:nxrank))
323 IF (nxsize >
size(data))
THEN
324 CALL
nxerror(
"The supplied array is not large enough for the data")
326 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
327 ALLOCATE (buffer_i1(nxsize))
328 status = nxigetdata(file_id, buffer_i1)
330 DEALLOCATE (buffer_i1)
331 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
332 ALLOCATE (buffer_i2(nxsize))
333 status = nxigetdata(file_id, buffer_i2)
335 DEALLOCATE (buffer_i2)
336 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
337 ALLOCATE (buffer_i4(nxsize))
338 status = nxigetdata(file_id, buffer_i4)
339 IF (abs(maxval(buffer_i4)) <= huge(data))
THEN
342 CALL
nxerror(
"Input values too large for data type")
345 DEALLOCATE (buffer_i4)
348 (
"The datatype is incompatible with the supplied variable")
355 FUNCTION nxgeti4 (file_id, data) RESULT (status)
357 TYPE(nxhandle),
INTENT(in) :: file_id
358 INTEGER(KIND=NXi4),
INTENT(out) :: data(:)
359 INTEGER :: status, nxigetdata
362 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
363 IF (status /= nx_ok) return
364 nxsize = product(nxdims(1:nxrank))
365 IF (nxsize >
size(data))
THEN
366 CALL
nxerror(
"The supplied array is not large enough for the data")
368 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
369 ALLOCATE (buffer_i1(nxsize))
370 status = nxigetdata(file_id, buffer_i1)
372 DEALLOCATE (buffer_i1)
373 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
374 ALLOCATE (buffer_i2(nxsize))
375 status = nxigetdata(file_id, buffer_i2)
377 DEALLOCATE (buffer_i2)
378 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
379 ALLOCATE (buffer_i4(nxsize))
380 status = nxigetdata(file_id, buffer_i4)
382 DEALLOCATE (buffer_i4)
385 (
"The datatype is incompatible with the supplied variable")
392 FUNCTION nxgetr4 (file_id, data) RESULT (status)
394 TYPE(nxhandle),
INTENT(in) :: file_id
395 REAL(KIND=NXr4),
INTENT(out) :: data(:)
396 INTEGER :: status, nxigetdata
399 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
400 IF (status /= nx_ok) return
401 nxsize = product(nxdims(1:nxrank))
402 IF (nxsize >
size(data))
THEN
403 CALL
nxerror(
"The supplied array is not large enough for the data")
405 ELSE IF (nxtype == nx_float32)
THEN
406 ALLOCATE (buffer_r4(nxsize))
407 status = nxigetdata(file_id, buffer_r4)
409 DEALLOCATE (buffer_r4)
410 ELSE IF (nxtype == nx_float64)
THEN
411 ALLOCATE (buffer_r8(nxsize))
412 status = nxigetdata(file_id, buffer_r8)
414 DEALLOCATE (buffer_r8)
417 (
"The datatype is incompatible with the supplied variable")
424 FUNCTION nxgetr8 (file_id, data) RESULT (status)
426 TYPE(nxhandle),
INTENT(in) :: file_id
427 REAL(KIND=NXr8),
INTENT(out) :: data(:)
428 INTEGER :: status, nxigetdata
431 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
432 IF (status /= nx_ok) return
433 nxsize = product(nxdims(1:nxrank))
434 IF (nxsize >
size(data))
THEN
435 CALL
nxerror(
"The supplied array is not large enough for the data")
437 ELSE IF (nxtype == nx_float32)
THEN
438 ALLOCATE (buffer_r4(nxsize))
439 status = nxigetdata(file_id, buffer_r4)
441 DEALLOCATE (buffer_r4)
442 ELSE IF (nxtype == nx_float64)
THEN
443 ALLOCATE (buffer_r8(nxsize))
444 status = nxigetdata(file_id, buffer_r8)
445 IF (abs(maxval(buffer_r8)) <= huge(data))
THEN
448 CALL
nxerror(
"Input values too large for data type")
451 DEALLOCATE (buffer_r8)
454 (
"The datatype is incompatible with the supplied variable")
463 TYPE(nxhandle),
INTENT(in) :: file_id
464 CHARACTER(len=*),
INTENT(out) :: data
465 INTEGER :: status, nxigetdata
466 INTEGER(kind=NXi1) :: cstring(255)
469 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
470 IF (status /= nx_ok) return
471 nxsize = product(nxdims(1:nxrank))
472 IF (nxsize > len(data))
THEN
473 CALL
nxerror(
"The supplied string is not large enough for the data")
475 ELSE IF (nxtype == nx_char)
THEN
477 status = nxigetdata(file_id, cstring)
478 IF (status == nx_ok)
data = trim(
nxfstring(cstring))
481 (
"The datatype is incompatible with the supplied variable")
492 FUNCTION nxgeti1slab (file_id, data, data_start, data_size) RESULT (status)
494 TYPE(nxhandle),
INTENT(in) :: file_id
495 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
496 INTEGER(KIND=NXi1),
INTENT(out) :: data(:)
497 INTEGER :: status, nxigetslab
500 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
501 IF (status /= nx_ok) return
502 nxsize = product(data_size(1:nxrank))
503 IF (nxsize >
size(data))
THEN
504 CALL
nxerror(
"The supplied array is not large enough for the data")
506 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
507 ALLOCATE (buffer_i1(nxsize))
508 status = nxigetslab(file_id, buffer_i1, &
511 DEALLOCATE (buffer_i1)
512 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
513 ALLOCATE (buffer_i2(nxsize))
514 status = nxigetslab(file_id, buffer_i2, &
516 IF (abs(maxval(buffer_i2)) <= huge(data))
THEN
519 CALL
nxerror(
"Input values too large for data type")
522 DEALLOCATE (buffer_i2)
523 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
524 ALLOCATE (buffer_i4(nxsize))
525 status = nxigetslab(file_id, buffer_i4, &
527 IF (abs(maxval(buffer_i4)) <= huge(data))
THEN
530 CALL
nxerror(
"Input values too large for data type")
533 DEALLOCATE (buffer_i4)
536 (
"The datatype is incompatible with the supplied variable")
543 FUNCTION nxgeti2slab (file_id, data, data_start, data_size) RESULT (status)
545 TYPE(nxhandle),
INTENT(in) :: file_id
546 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
547 INTEGER(KIND=NXi2),
INTENT(out) :: data(:)
548 INTEGER :: status, nxigetslab
551 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
552 IF (status /= nx_ok) return
553 nxsize = product(data_size(1:nxrank))
554 IF (nxsize >
size(data))
THEN
555 CALL
nxerror(
"The supplied array is not large enough for the data")
557 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
558 ALLOCATE (buffer_i1(nxsize))
559 status = nxigetslab(file_id, buffer_i1, &
562 DEALLOCATE (buffer_i1)
563 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
564 ALLOCATE (buffer_i2(nxsize))
565 status = nxigetslab(file_id, buffer_i2, &
568 DEALLOCATE (buffer_i2)
569 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
570 ALLOCATE (buffer_i4(nxsize))
571 status = nxigetslab(file_id, buffer_i4, &
573 IF (abs(maxval(buffer_i4)) <= huge(data))
THEN
576 CALL
nxerror(
"Input values too large for data type")
579 DEALLOCATE (buffer_i4)
582 (
"The datatype is incompatible with the supplied variable")
589 FUNCTION nxgeti4slab (file_id, data, data_start, data_size) RESULT (status)
591 TYPE(nxhandle),
INTENT(in) :: file_id
592 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
593 INTEGER(KIND=NXi4),
INTENT(out) :: data(:)
594 INTEGER :: status, nxigetslab
597 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
598 IF (status /= nx_ok) return
599 nxsize = product(data_size(1:nxrank))
600 IF (nxsize >
size(data))
THEN
601 CALL
nxerror(
"The supplied array is not large enough for the data")
603 ELSE IF (nxtype == nx_int8 .OR. nxtype == nx_uint8)
THEN
604 ALLOCATE (buffer_i1(nxsize))
605 status = nxigetslab(file_id, buffer_i1, &
608 DEALLOCATE (buffer_i1)
609 ELSE IF (nxtype == nx_int16 .OR. nxtype == nx_uint16)
THEN
610 ALLOCATE (buffer_i2(nxsize))
611 status = nxigetslab(file_id, buffer_i2, &
614 DEALLOCATE (buffer_i2)
615 ELSE IF (nxtype == nx_int32 .OR. nxtype == nx_uint32)
THEN
616 ALLOCATE (buffer_i4(nxsize))
617 status = nxigetslab(file_id, buffer_i4, &
620 DEALLOCATE (buffer_i4)
623 (
"The datatype is incompatible with the supplied variable")
630 FUNCTION nxgetr4slab (file_id, data, data_start, data_size) RESULT (status)
632 TYPE(nxhandle),
INTENT(in) :: file_id
633 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
634 REAL(KIND=NXr4),
INTENT(out) :: data(:)
635 INTEGER :: status, nxigetslab
638 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
639 IF (status /= nx_ok) return
640 nxsize = product(data_size(1:nxrank))
641 IF (nxsize >
size(data))
THEN
642 CALL
nxerror(
"The supplied array is not large enough for the data")
644 ELSE IF (nxtype == nx_float32)
THEN
645 ALLOCATE (buffer_r4(nxsize))
646 status = nxigetslab(file_id, buffer_r4, &
649 DEALLOCATE (buffer_r4)
650 ELSE IF (nxtype == nx_float64)
THEN
651 ALLOCATE (buffer_r8(nxsize))
652 status = nxigetslab(file_id, buffer_r8, &
654 IF (abs(maxval(buffer_r8)) <= huge(data))
THEN
657 CALL
nxerror(
"Input values too large for data type")
660 DEALLOCATE (buffer_r8)
663 (
"The datatype is incompatible with the supplied variable")
670 FUNCTION nxgetr8slab (file_id, data, data_start, data_size) RESULT (status)
672 TYPE(nxhandle),
INTENT(in) :: file_id
673 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
674 REAL(KIND=NXr8),
INTENT(out) :: data(:)
675 INTEGER :: status, nxigetslab
678 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
679 IF (status /= nx_ok) return
680 nxsize = product(data_size(1:nxrank))
681 IF (nxsize >
size(data))
THEN
682 CALL
nxerror(
"The supplied array is not large enough for the data")
684 ELSE IF (nxtype == nx_float32)
THEN
685 ALLOCATE (buffer_r4(nxsize))
686 status = nxigetslab(file_id, buffer_r4, &
689 DEALLOCATE (buffer_r4)
690 ELSE IF (nxtype == nx_float64)
THEN
691 ALLOCATE (buffer_r8(nxsize))
692 status = nxigetslab(file_id, buffer_r8, &
695 DEALLOCATE (buffer_r8)
698 (
"The datatype is incompatible with the supplied variable")
709 FUNCTION nxgeti1attr (file_id, attr_name, value, attr_length, attr_type) &
712 TYPE(nxhandle),
INTENT(in) :: file_id
713 CHARACTER(len=*),
INTENT(in) :: attr_name
714 INTEGER(KIND=NXi1),
INTENT(out) :: value
715 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
716 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
717 INTEGER :: status, nxigetattr, value_length, value_type
720 value_length = 1; value_type = nx_int8
721 status = nxigetattr(file_id,
nxcstring(attr_name), value, value_length, &
727 FUNCTION nxgeti2attr (file_id, attr_name, value, attr_length, attr_type) &
730 TYPE(nxhandle),
INTENT(in) :: file_id
731 CHARACTER(len=*),
INTENT(in) :: attr_name
732 INTEGER(KIND=NXi2),
INTENT(out) :: value
733 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
734 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
735 INTEGER :: status, nxigetattr, value_length, value_type
738 value_length = 1; value_type = nx_int16
739 status = nxigetattr(file_id,
nxcstring(attr_name), value, value_length, &
745 FUNCTION nxgeti4attr (file_id, attr_name, value, attr_length, attr_type) &
748 TYPE(nxhandle),
INTENT(in) :: file_id
749 CHARACTER(len=*),
INTENT(in) :: attr_name
750 INTEGER(KIND=NXi4),
INTENT(out) :: value
751 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
752 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
753 INTEGER :: status, nxigetattr, value_length, value_type
756 value_length = 1; value_type = nx_int32
757 status = nxigetattr(file_id,
nxcstring(attr_name), value, value_length, &
763 FUNCTION nxgetr4attr (file_id, attr_name, value, attr_length, attr_type) &
766 TYPE(nxhandle),
INTENT(in) :: file_id
767 CHARACTER(len=*),
INTENT(in) :: attr_name
768 REAL(KIND=NXr4),
INTENT(out) :: value
769 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
770 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
771 INTEGER :: status, nxigetattr, value_length, value_type
774 value_length = 1; value_type = nx_float32
775 status = nxigetattr(file_id,
nxcstring(attr_name), value, value_length, &
781 FUNCTION nxgetr8attr (file_id, attr_name, value, attr_length, attr_type) &
784 TYPE(nxhandle),
INTENT(in) :: file_id
785 CHARACTER(len=*),
INTENT(in) :: attr_name
786 REAL(KIND=NXr8),
INTENT(out) :: value
787 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
788 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
789 INTEGER :: status, nxigetattr, value_length, value_type
792 value_length = 1; value_type = nx_float64
793 status = nxigetattr(file_id,
nxcstring(attr_name), value, value_length, &
799 FUNCTION nxgetcharattr (file_id, attr_name, value, attr_length, attr_type) &
802 TYPE(nxhandle),
INTENT(in) :: file_id
803 CHARACTER(len=*),
INTENT(in) :: attr_name
804 CHARACTER(len=*),
INTENT(out) :: value
805 INTEGER,
OPTIONAL,
INTENT(inout) :: attr_length
806 INTEGER,
OPTIONAL,
INTENT(in) :: attr_type
807 INTEGER :: status, nxigetattr, value_length, value_type
808 INTEGER(kind=NXi1) :: cstring(255)
811 value_length = len(value); value_type = nx_char
813 status = nxigetattr(file_id,
nxcstring(attr_name), cstring, &
814 value_length, value_type)
824 FUNCTION nxputi1 (file_id, data) RESULT (status)
826 TYPE(nxhandle),
INTENT(in) :: file_id
827 INTEGER(KIND=NXi1),
INTENT(in) :: data(:)
828 INTEGER :: status, nxiputdata
831 status = nxiputdata(file_id, data)
836 FUNCTION nxputi2 (file_id, data) RESULT (status)
838 TYPE(nxhandle),
INTENT(in) :: file_id
839 INTEGER(KIND=NXi2),
INTENT(in) :: data(:)
840 INTEGER :: status, nxiputdata
843 status = nxiputdata(file_id, data)
848 FUNCTION nxputi4 (file_id, data) RESULT (status)
850 TYPE(nxhandle),
INTENT(in) :: file_id
851 INTEGER(KIND=NXi4),
INTENT(in) :: data(:)
852 INTEGER :: status, nxiputdata
855 status = nxiputdata(file_id, data)
860 FUNCTION nxputr4 (file_id, data) RESULT (status)
862 TYPE(nxhandle),
INTENT(in) :: file_id
863 REAL(KIND=NXr4),
INTENT(in) :: data(:)
864 INTEGER :: status, nxiputdata
867 status = nxiputdata(file_id, data)
872 FUNCTION nxputr8 (file_id, data) RESULT (status)
874 TYPE(nxhandle),
INTENT(in) :: file_id
875 REAL(KIND=NXr8),
INTENT(in) :: data(:)
876 INTEGER :: status, nxiputdata
879 status = nxiputdata(file_id, data)
886 TYPE(nxhandle),
INTENT(in) :: file_id
887 CHARACTER(len=*),
INTENT(in) :: data
888 INTEGER :: status, nxiputdata
891 status = nxiputdata(file_id,
nxcstring(data))
900 FUNCTION nxputi1slab (file_id, data, data_start, data_size) RESULT (status)
902 TYPE(nxhandle),
INTENT(in) :: file_id
903 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
904 INTEGER(KIND=NXi1),
INTENT(in) :: data(:)
905 INTEGER :: status, nxiputslab
908 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
909 status = nxiputslab(file_id,
data, &
915 FUNCTION nxputi2slab (file_id, data, data_start, data_size) RESULT (status)
917 TYPE(nxhandle),
INTENT(in) :: file_id
918 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
919 INTEGER(KIND=NXi2),
INTENT(in) :: data(:)
920 INTEGER :: status, nxiputslab
923 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
924 status = nxiputslab(file_id,
data, &
930 FUNCTION nxputi4slab (file_id, data, data_start, data_size) RESULT (status)
932 TYPE(nxhandle),
INTENT(in) :: file_id
933 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
934 INTEGER(KIND=NXi4),
INTENT(in) :: data(:)
935 INTEGER :: status, nxiputslab
938 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
939 status = nxiputslab(file_id,
data, &
945 FUNCTION nxputr4slab (file_id, data, data_start, data_size) RESULT (status)
947 TYPE(nxhandle),
INTENT(in) :: file_id
948 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
949 REAL(KIND=NXr4),
INTENT(in) :: data(:)
950 INTEGER :: status, nxiputslab
953 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
954 status = nxiputslab(file_id,
data, &
960 FUNCTION nxputr8slab (file_id, data, data_start, data_size) RESULT (status)
962 TYPE(nxhandle),
INTENT(in) :: file_id
963 INTEGER,
INTENT(in) :: data_start(:), data_size(:)
964 REAL(KIND=NXr8),
INTENT(in) :: data(:)
965 INTEGER :: status, nxiputslab
968 status =
nxgetinfo(file_id, nxrank, nxdims, nxtype)
969 status = nxiputslab(file_id,
data, &
979 FUNCTION nxputi1attr (file_id, name, value, value_length, value_type) &
982 TYPE(nxhandle),
INTENT(in) :: file_id
983 CHARACTER(len=*),
INTENT(in) :: name
984 INTEGER(KIND=NXi1),
INTENT(in) :: value
985 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
986 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
987 INTEGER :: status, nxifputattr
990 status = nxifputattr(file_id,
nxcstring(name), value, 1, nx_int8)
995 FUNCTION nxputi2attr (file_id, name, value, value_length, value_type) &
998 TYPE(nxhandle),
INTENT(in) :: file_id
999 CHARACTER(len=*),
INTENT(in) :: name
1000 INTEGER(KIND=NXi2),
INTENT(in) :: value
1001 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
1002 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
1003 INTEGER :: status, nxifputattr
1004 EXTERNAL nxifputattr
1006 status = nxifputattr(file_id,
nxcstring(name), value, 1, nx_int16)
1011 FUNCTION nxputi4attr (file_id, name, value, value_length, value_type) &
1014 TYPE(nxhandle),
INTENT(in) :: file_id
1015 CHARACTER(len=*),
INTENT(in) :: name
1016 INTEGER(KIND=NXi4),
INTENT(in) :: value
1017 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
1018 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
1019 INTEGER :: status, nxifputattr
1020 EXTERNAL nxifputattr
1022 status = nxifputattr(file_id,
nxcstring(name), value, 1, nx_int32)
1027 FUNCTION nxputr4attr (file_id, name, value, value_length, value_type) &
1030 TYPE(nxhandle),
INTENT(in) :: file_id
1031 CHARACTER(len=*),
INTENT(in) :: name
1032 REAL(KIND=NXr4),
INTENT(in) :: value
1033 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
1034 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
1035 INTEGER :: status, nxifputattr
1036 EXTERNAL nxifputattr
1038 status = nxifputattr(file_id,
nxcstring(name), value, 1, nx_float32)
1043 FUNCTION nxputr8attr (file_id, name, value, value_length, value_type) &
1046 TYPE(nxhandle),
INTENT(in) :: file_id
1047 CHARACTER(len=*),
INTENT(in) :: name
1048 REAL(KIND=NXr8),
INTENT(in) :: value
1049 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
1050 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
1051 INTEGER :: status, nxifputattr
1052 EXTERNAL nxifputattr
1054 status = nxifputattr(file_id,
nxcstring(name), value, 1, nx_float64)
1062 TYPE(nxhandle),
INTENT(in) :: file_id
1063 CHARACTER(len=*),
INTENT(in) :: name
1064 CHARACTER(len=*),
INTENT(in) :: value
1065 INTEGER,
OPTIONAL,
INTENT(in) :: value_length
1066 INTEGER,
OPTIONAL,
INTENT(in) :: value_type
1067 INTEGER :: status, nxifputattr
1068 EXTERNAL nxifputattr
1071 len_trim(value), nx_char)
1077 FUNCTION nxgetinfo (file_id, data_rank, data_dimensions, data_type) &
1080 TYPE(nxhandle),
INTENT(in) :: file_id
1081 INTEGER,
INTENT(out) :: data_rank, data_dimensions(:), data_type
1082 INTEGER :: status, nxigetinfo, i, j, dimensions(size(data_dimensions))
1085 status = nxigetinfo(file_id, data_rank, dimensions, data_type)
1086 IF (status == nx_ok)
THEN
1087 data_dimensions =
nxreverse(data_rank, dimensions)
1095 TYPE(nxhandle),
INTENT(in) :: file_id
1096 CHARACTER(len=*),
INTENT(out) :: name, class
1097 INTEGER,
INTENT(out) :: data_type
1098 INTEGER :: status, nxigetnextentry, i, j
1099 INTEGER(kind=NXi1) :: cname(nx_maxnamelen), cclass(nx_maxnamelen)
1100 EXTERNAL nxigetnextentry
1102 status = nxigetnextentry(file_id, cname, cclass, data_type)
1112 TYPE(nxhandle),
INTENT(in) :: file_id
1113 CHARACTER(len=*),
INTENT(out) :: attr_name
1114 INTEGER,
INTENT(out) :: attr_length, attr_type
1115 INTEGER :: status, nxigetnextattr
1116 INTEGER(kind=NXi1) :: cstring(nx_maxnamelen)
1117 EXTERNAL nxigetnextattr
1119 status = nxigetnextattr(file_id, cstring, attr_length, attr_type)
1127 TYPE(nxhandle),
INTENT(in) :: file_id
1128 TYPE(nxlink),
INTENT(out) :: group_id
1129 TYPE(nxlink) :: current_id
1130 INTEGER :: status, nxigetgroupid
1131 EXTERNAL nxigetgroupid
1133 status = nxigetgroupid(file_id, current_id)
1134 group_id = current_id
1141 TYPE(nxhandle),
INTENT(in) :: file_id
1142 TYPE(nxlink),
INTENT(out) :: data_id
1143 TYPE(nxlink) :: current_id
1144 INTEGER :: status, nxigetdataid
1145 EXTERNAL nxigetdataid
1147 status = nxigetdataid(file_id, current_id)
1148 data_id = current_id
1153 FUNCTION nxsameid (file_id, first_id, second_id) RESULT (same)
1155 TYPE(nxhandle),
INTENT(in) :: file_id
1156 TYPE(nxlink),
INTENT(in) :: first_id, second_id
1158 INTEGER :: status, nxisameid
1161 status = nxisameid(file_id, first_id, second_id)
1162 IF (status == nx_ok)
THEN
1173 TYPE(nxhandle),
INTENT(in) :: file_id
1174 TYPE(nxlink),
INTENT(in) :: link
1175 INTEGER :: status, nximakelink
1176 EXTERNAL nximakelink
1178 status = nximakelink(file_id, link)
1186 TYPE(nxhandle),
INTENT(in) :: file_id
1187 INTEGER,
INTENT(out) :: item_number
1188 CHARACTER(len=*),
INTENT(out),
OPTIONAL :: group_name, group_class
1189 TYPE(nxlink) :: group_id, new_id
1190 INTEGER :: status, nxigetgroupinfo
1191 INTEGER(kind=NXi1) :: cname(nx_maxnamelen), cclass(nx_maxnamelen)
1192 EXTERNAL nxigetgroupinfo
1194 status = nxigetgroupinfo(file_id, item_number, cname, cclass)
1195 IF (present(group_name)) group_name = trim(
nxfstring(cname))
1196 IF (present(group_class)) group_class = trim(
nxfstring(cclass))
1203 TYPE(nxhandle),
INTENT(inout) :: file_id
1204 INTEGER :: status, nxiinitgroupdir
1205 EXTERNAL nxiinitgroupdir
1207 status = nxiinitgroupdir(file_id)
1212 FUNCTION nxgroupdir (file_id, item_number, item_name, item_class) &
1215 TYPE(nxhandle),
INTENT(inout) :: file_id
1216 INTEGER,
INTENT(out) :: item_number
1217 CHARACTER(len=*) :: item_name(:), item_class(:)
1218 CHARACTER(len=len(item_name)) :: name
1219 CHARACTER(len=len(item_class)) :: class
1226 IF (status == nx_ok .AND. &
1227 (class(1:2) ==
"NX" .OR. class(1:3) ==
"SDS"))
THEN
1228 item_number = item_number + 1
1229 IF (item_number >
size(item_name) .OR. &
1230 item_number >
size(item_class))
THEN
1231 CALL
nxerror(
"Number of items greater than array size")
1235 item_name(item_number) = trim(name)
1236 item_class(item_number) = trim(class)
1237 ELSE IF (status == nx_eod)
THEN
1239 ELSE IF (status == nx_error)
THEN
1250 TYPE(nxhandle),
INTENT(inout) :: file_id
1251 INTEGER,
INTENT(out) :: attr_number
1252 INTEGER :: status, nxigetattrinfo
1253 EXTERNAL nxigetattrinfo
1255 status = nxigetattrinfo(file_id, attr_number)
1262 TYPE(nxhandle),
INTENT(inout) :: file_id
1263 INTEGER :: status, nxiinitattrdir
1264 EXTERNAL nxiinitattrdir
1266 status = nxiinitattrdir(file_id)
1271 FUNCTION nxattrdir (file_id, attr_number, attr_name) RESULT (status)
1273 TYPE(nxhandle),
INTENT(inout) :: file_id
1274 INTEGER,
INTENT(out) :: attr_number
1275 CHARACTER(len=*) :: attr_name(:)
1276 CHARACTER(len=len(attr_name)) :: name
1283 IF (status == nx_ok)
THEN
1284 attr_number = attr_number + 1
1285 IF (attr_number >
size(attr_name))
THEN
1286 CALL
nxerror(
"Number of attributes greater than array size")
1290 attr_name(attr_number) = trim(name)
1292 ELSE IF (status == nx_eod)
THEN
1294 ELSE IF (status == nx_error)
THEN
1303 FUNCTION nxreverse (rank, dimensions) RESULT (reversed_dimensions)
1305 INTEGER,
INTENT(in) :: rank
1306 INTEGER,
INTENT(in) :: dimensions(:)
1307 INTEGER :: reversed_dimensions(size(dimensions))
1311 reversed_dimensions(i) = dimensions(rank-i+1)
1319 CHARACTER(len=*),
INTENT(in) :: string
1320 INTEGER(kind=NXi1) :: array(255)
1323 DO i = 1,min(len_trim(string),(
size(array)-1))
1324 array(i) = ichar(string(i:i))
1326 array(len_trim(string)+1) = 0
1333 INTEGER(kind=NXi1),
INTENT(in) :: array(:)
1334 CHARACTER(len=255) :: string
1338 DO i = 1,
size(array)
1339 IF (array(i) == 0) exit
1340 string(i:i) = char(array(i))
1348 INTEGER,
INTENT(in) :: int_type
1349 CHARACTER(len=10) :: char_type
1351 SELECT CASE (int_type)
1352 CASE(nx_char); char_type =
"NX_CHAR"
1353 CASE(nx_float32); char_type =
"NX_FLOAT32"
1354 CASE(nx_float64); char_type =
"NX_FLOAT64"
1355 CASE(nx_int8); char_type =
"NX_INT8"
1356 CASE(nx_int16); char_type =
"NX_INT16"
1357 CASE(nx_int32); char_type =
"NX_INT32"
1358 CASE(nx_uint32); char_type =
"NX_UINT32"
1359 CASE default; char_type =
"UNKNOWN"
1367 CHARACTER(len=*),
INTENT(in) :: message
1369 print *,
"NXerror : "//message