@@ -17,6 +17,16 @@ module stdlib_io
17
17
! Private API that is exposed so that we can test it in tests
18
18
public :: parse_mode
19
19
20
+ ! Format strings with edit descriptors for each type and kind
21
+ character (* ), parameter :: &
22
+ FMT_INT = ' (*(i0,1x))' , &
23
+ FMT_REAL_SP = ' (*(es15.8e2,1x))' , &
24
+ FMT_REAL_DP = ' (*(es24.16e3,1x))' , &
25
+ FMT_REAL_QP = ' (*(es44.35e4,1x))' , &
26
+ FMT_COMPLEX_SP = ' (*(es15.8e2,1x,es15.8e2))' , &
27
+ FMT_COMPLEX_DP = ' (*(es24.16e3,1x,es24.16e3))' , &
28
+ FMT_COMPLEX_QP = ' (*(es44.35e4,1x,es44.35e4))'
29
+
20
30
interface loadtxt
21
31
! ! version: experimental
22
32
! !
@@ -91,11 +101,11 @@ subroutine loadtxt_rsp(filename, d)
91
101
ncol = number_of_columns(s)
92
102
93
103
! determine number or rows
94
- nrow = number_of_rows_numeric (s)
104
+ nrow = number_of_rows (s)
95
105
96
106
allocate (d(nrow, ncol))
97
107
do i = 1 , nrow
98
- read (s, * ) d(i, :)
108
+ read (s, FMT_REAL_sp ) d(i, :)
99
109
end do
100
110
close (s)
101
111
@@ -138,11 +148,11 @@ subroutine loadtxt_rdp(filename, d)
138
148
ncol = number_of_columns(s)
139
149
140
150
! determine number or rows
141
- nrow = number_of_rows_numeric (s)
151
+ nrow = number_of_rows (s)
142
152
143
153
allocate (d(nrow, ncol))
144
154
do i = 1 , nrow
145
- read (s, * ) d(i, :)
155
+ read (s, FMT_REAL_dp ) d(i, :)
146
156
end do
147
157
close (s)
148
158
@@ -185,11 +195,11 @@ subroutine loadtxt_rqp(filename, d)
185
195
ncol = number_of_columns(s)
186
196
187
197
! determine number or rows
188
- nrow = number_of_rows_numeric (s)
198
+ nrow = number_of_rows (s)
189
199
190
200
allocate (d(nrow, ncol))
191
201
do i = 1 , nrow
192
- read (s, * ) d(i, :)
202
+ read (s, FMT_REAL_qp ) d(i, :)
193
203
end do
194
204
close (s)
195
205
@@ -232,11 +242,11 @@ subroutine loadtxt_iint8(filename, d)
232
242
ncol = number_of_columns(s)
233
243
234
244
! determine number or rows
235
- nrow = number_of_rows_numeric (s)
245
+ nrow = number_of_rows (s)
236
246
237
247
allocate (d(nrow, ncol))
238
248
do i = 1 , nrow
239
- read (s, * ) d(i, :)
249
+ read (s, * ) d(i, :)
240
250
end do
241
251
close (s)
242
252
@@ -279,11 +289,11 @@ subroutine loadtxt_iint16(filename, d)
279
289
ncol = number_of_columns(s)
280
290
281
291
! determine number or rows
282
- nrow = number_of_rows_numeric (s)
292
+ nrow = number_of_rows (s)
283
293
284
294
allocate (d(nrow, ncol))
285
295
do i = 1 , nrow
286
- read (s, * ) d(i, :)
296
+ read (s, * ) d(i, :)
287
297
end do
288
298
close (s)
289
299
@@ -326,11 +336,11 @@ subroutine loadtxt_iint32(filename, d)
326
336
ncol = number_of_columns(s)
327
337
328
338
! determine number or rows
329
- nrow = number_of_rows_numeric (s)
339
+ nrow = number_of_rows (s)
330
340
331
341
allocate (d(nrow, ncol))
332
342
do i = 1 , nrow
333
- read (s, * ) d(i, :)
343
+ read (s, * ) d(i, :)
334
344
end do
335
345
close (s)
336
346
@@ -373,11 +383,11 @@ subroutine loadtxt_iint64(filename, d)
373
383
ncol = number_of_columns(s)
374
384
375
385
! determine number or rows
376
- nrow = number_of_rows_numeric (s)
386
+ nrow = number_of_rows (s)
377
387
378
388
allocate (d(nrow, ncol))
379
389
do i = 1 , nrow
380
- read (s, * ) d(i, :)
390
+ read (s, * ) d(i, :)
381
391
end do
382
392
close (s)
383
393
@@ -418,13 +428,14 @@ subroutine loadtxt_csp(filename, d)
418
428
419
429
! determine number of columns
420
430
ncol = number_of_columns(s)
431
+ ncol = ncol / 2
421
432
422
433
! determine number or rows
423
- nrow = number_of_rows_numeric (s)
434
+ nrow = number_of_rows (s)
424
435
425
436
allocate (d(nrow, ncol))
426
437
do i = 1 , nrow
427
- read (s, * ) d(i, :)
438
+ read (s, FMT_COMPLEX_sp ) d(i, :)
428
439
end do
429
440
close (s)
430
441
@@ -465,13 +476,14 @@ subroutine loadtxt_cdp(filename, d)
465
476
466
477
! determine number of columns
467
478
ncol = number_of_columns(s)
479
+ ncol = ncol / 2
468
480
469
481
! determine number or rows
470
- nrow = number_of_rows_numeric (s)
482
+ nrow = number_of_rows (s)
471
483
472
484
allocate (d(nrow, ncol))
473
485
do i = 1 , nrow
474
- read (s, * ) d(i, :)
486
+ read (s, FMT_COMPLEX_dp ) d(i, :)
475
487
end do
476
488
close (s)
477
489
@@ -512,13 +524,14 @@ subroutine loadtxt_cqp(filename, d)
512
524
513
525
! determine number of columns
514
526
ncol = number_of_columns(s)
527
+ ncol = ncol / 2
515
528
516
529
! determine number or rows
517
- nrow = number_of_rows_numeric (s)
530
+ nrow = number_of_rows (s)
518
531
519
532
allocate (d(nrow, ncol))
520
533
do i = 1 , nrow
521
- read (s, * ) d(i, :)
534
+ read (s, FMT_COMPLEX_qp ) d(i, :)
522
535
end do
523
536
close (s)
524
537
@@ -548,7 +561,7 @@ subroutine savetxt_rsp(filename, d)
548
561
integer :: s, i
549
562
s = open (filename, " w" )
550
563
do i = 1 , size (d, 1 )
551
- write (s, * ) d(i, :)
564
+ write (s, FMT_REAL_sp ) d(i, :)
552
565
end do
553
566
close (s)
554
567
end subroutine savetxt_rsp
@@ -575,7 +588,7 @@ subroutine savetxt_rdp(filename, d)
575
588
integer :: s, i
576
589
s = open (filename, " w" )
577
590
do i = 1 , size (d, 1 )
578
- write (s, * ) d(i, :)
591
+ write (s, FMT_REAL_dp ) d(i, :)
579
592
end do
580
593
close (s)
581
594
end subroutine savetxt_rdp
@@ -602,7 +615,7 @@ subroutine savetxt_rqp(filename, d)
602
615
integer :: s, i
603
616
s = open (filename, " w" )
604
617
do i = 1 , size (d, 1 )
605
- write (s, * ) d(i, :)
618
+ write (s, FMT_REAL_qp ) d(i, :)
606
619
end do
607
620
close (s)
608
621
end subroutine savetxt_rqp
@@ -629,7 +642,7 @@ subroutine savetxt_iint8(filename, d)
629
642
integer :: s, i
630
643
s = open (filename, " w" )
631
644
do i = 1 , size (d, 1 )
632
- write (s, * ) d(i, :)
645
+ write (s, FMT_INT ) d(i, :)
633
646
end do
634
647
close (s)
635
648
end subroutine savetxt_iint8
@@ -656,7 +669,7 @@ subroutine savetxt_iint16(filename, d)
656
669
integer :: s, i
657
670
s = open (filename, " w" )
658
671
do i = 1 , size (d, 1 )
659
- write (s, * ) d(i, :)
672
+ write (s, FMT_INT ) d(i, :)
660
673
end do
661
674
close (s)
662
675
end subroutine savetxt_iint16
@@ -683,7 +696,7 @@ subroutine savetxt_iint32(filename, d)
683
696
integer :: s, i
684
697
s = open (filename, " w" )
685
698
do i = 1 , size (d, 1 )
686
- write (s, * ) d(i, :)
699
+ write (s, FMT_INT ) d(i, :)
687
700
end do
688
701
close (s)
689
702
end subroutine savetxt_iint32
@@ -710,7 +723,7 @@ subroutine savetxt_iint64(filename, d)
710
723
integer :: s, i
711
724
s = open (filename, " w" )
712
725
do i = 1 , size (d, 1 )
713
- write (s, * ) d(i, :)
726
+ write (s, FMT_INT ) d(i, :)
714
727
end do
715
728
close (s)
716
729
end subroutine savetxt_iint64
@@ -737,7 +750,7 @@ subroutine savetxt_csp(filename, d)
737
750
integer :: s, i
738
751
s = open (filename, " w" )
739
752
do i = 1 , size (d, 1 )
740
- write (s, * ) d(i, :)
753
+ write (s, FMT_COMPLEX_sp ) d(i, :)
741
754
end do
742
755
close (s)
743
756
end subroutine savetxt_csp
@@ -764,7 +777,7 @@ subroutine savetxt_cdp(filename, d)
764
777
integer :: s, i
765
778
s = open (filename, " w" )
766
779
do i = 1 , size (d, 1 )
767
- write (s, * ) d(i, :)
780
+ write (s, FMT_COMPLEX_dp ) d(i, :)
768
781
end do
769
782
close (s)
770
783
end subroutine savetxt_cdp
@@ -791,7 +804,7 @@ subroutine savetxt_cqp(filename, d)
791
804
integer :: s, i
792
805
s = open (filename, " w" )
793
806
do i = 1 , size (d, 1 )
794
- write (s, * ) d(i, :)
807
+ write (s, FMT_COMPLEX_qp ) d(i, :)
795
808
end do
796
809
close (s)
797
810
end subroutine savetxt_cqp
@@ -821,36 +834,24 @@ integer function number_of_columns(s)
821
834
end function number_of_columns
822
835
823
836
824
- integer function number_of_rows_numeric (s ) result(nrows)
837
+ integer function number_of_rows (s ) result(nrows)
825
838
! ! version: experimental
826
839
! !
827
- ! ! determine number or rows
828
- integer ,intent (in ):: s
840
+ ! ! Determine the number or rows in a file
841
+ integer , intent (in ):: s
829
842
integer :: ios
830
843
831
- real :: r
832
- complex :: z
833
-
834
844
rewind(s)
835
845
nrows = 0
836
846
do
837
- read (s, * , iostat= ios) r
847
+ read (s, * , iostat= ios)
838
848
if (ios /= 0 ) exit
839
849
nrows = nrows + 1
840
850
end do
841
851
842
852
rewind(s)
843
853
844
- ! If there are no rows of real numbers, it may be that they are complex
845
- if ( nrows == 0 ) then
846
- do
847
- read (s, * , iostat= ios) z
848
- if (ios /= 0 ) exit
849
- nrows = nrows + 1
850
- end do
851
- rewind(s)
852
- end if
853
- end function number_of_rows_numeric
854
+ end function number_of_rows
854
855
855
856
856
857
integer function open (filename , mode , iostat ) result(u)
@@ -988,4 +989,4 @@ character(3) function parse_mode(mode) result(mode_)
988
989
989
990
end function parse_mode
990
991
991
- end module
992
+ end module stdlib_io
0 commit comments