1 MODULE write_array_generic
6 REAL(rprec),
PARAMETER :: zero = 0
7 INTEGER :: start_count, end_count, length, line
8 CHARACTER(LEN=*),
PARAMETER :: adyes =
"yes", adno =
"no"
9 CHARACTER(LEN=3) :: adv
12 MODULE PROCEDURE write_array_section_real,
13 1 write_array_section_logical,
14 2 write_array_section_integer
21 SUBROUTINE write_array_section_real(iunit, name, array, n1,
27 INTEGER,
INTENT(in) :: iunit, n1
28 INTEGER,
INTENT(in),
OPTIONAL :: ndim2, low_index
29 CHARACTER(len=*),
INTENT(in) :: name
30 REAL(rprec),
DIMENSION(n1),
INTENT(in) :: array
32 CHARACTER(len=LEN_TRIM(name)+20) :: parse
33 CHARACTER(len=40+LEN_TRIM(name)) :: line1,line2
43 CALL parse_name (parse, n1, ndim2, low_index)
47 ELSE IF (n1 == 1)
THEN
48 WRITE (line2, 990) array(1)
49 line1 = trim(parse) // adjustl(line2)
50 WRITE (iunit,980) trim(line1)
52 ELSE IF (all(array(1) == array(2:n1)))
THEN
54 WRITE (line2, 990) array(1)
55 line1 = trim(parse) // trim(adjustl(line1))
56 1 //
'*' // adjustl(line2)
57 WRITE (iunit,980) trim(line1)
63 WRITE(iunit, 980, advance=
"no") trim(parse)
64 DO WHILE (start_count .le. n1)
65 temp = array(start_count)
66 end_count = start_count
67 DO WHILE (end_count .lt. n1)
68 IF (array(end_count+1) .ne. temp)
EXIT
69 end_count = end_count+1
73 IF (line==3 .or. end_count.eq.n1)
THEN
80 length = end_count - start_count + 1
82 WRITE (line1, *) length
83 WRITE (line2, 990) temp
84 line1 = trim(adjustl(line1)) //
'*' // adjustl(line2)
85 WRITE (iunit,980, advance=trim(adv)) trim(line1)
87 WRITE (line1, 990) temp
88 WRITE (iunit, 980, advance=trim(adv))trim(adjustl(line1))
90 start_count = end_count+1
98 END SUBROUTINE write_array_section_real
101 SUBROUTINE write_array_section_logical(iunit, name, larray, n1,
107 INTEGER,
INTENT(in) :: iunit, n1
108 INTEGER,
INTENT(in),
OPTIONAL :: ndim2, low_index
109 CHARACTER(LEN=*),
INTENT(in) :: name
110 LOGICAL,
DIMENSION(n1),
INTENT(in) :: larray
112 CHARACTER(len=LEN_TRIM(name)+20) :: parse
122 CALL parse_name (parse, n1, ndim2, low_index)
126 ELSE IF (n1 == 1)
THEN
127 WRITE(iunit,990) trim(parse), larray(1)
129 ELSE IF (all(larray(1) .eqv. larray(2:n1)))
THEN
130 WRITE(iunit,993) trim(parse), n1, larray(1)
136 WRITE(iunit, 980, advance=
"no") trim(parse)
137 DO WHILE (start_count .le. n1)
138 ltemp = larray(start_count)
139 end_count = start_count
140 DO WHILE (end_count .lt. n1)
141 IF (larray(end_count+1) .neqv. ltemp)
EXIT
142 end_count = end_count+1
146 IF (line==20 .or. end_count.eq.n1)
THEN
153 length = end_count - start_count + 1
155 WRITE (iunit, 982, advance=trim(adv)) length, ltemp
157 WRITE (iunit, 984, advance=trim(adv)) ltemp
159 start_count = end_count+1
163 982
FORMAT(2x,i4,
'*',l1)
166 993
FORMAT(2x,a,i4,
'*',l1)
170 END SUBROUTINE write_array_section_logical
172 SUBROUTINE write_array_section_integer(iunit, name, iarray, n1,
178 INTEGER,
INTENT(in) :: iunit, n1
179 INTEGER,
INTENT(in),
OPTIONAL :: ndim2, low_index
180 CHARACTER(len=*),
INTENT(in) :: name
181 INTEGER,
DIMENSION(n1),
INTENT(in) :: iarray
184 CHARACTER(len=LEN_TRIM(name)+20) :: parse
185 CHARACTER(len=40+LEN_TRIM(name)) :: line1,line2
195 CALL parse_name (parse, n1, ndim2, low_index)
199 ELSE IF (n1 == 1)
THEN
200 WRITE (line1, *) iarray(1)
201 line2 = trim(parse) // adjustl(line1)
202 WRITE (iunit, 980) trim(line2)
204 ELSE IF (all(iarray(1) == iarray(2:n1)))
THEN
206 WRITE (line2, *) iarray(1)
207 line1 = trim(parse) // trim(adjustl(line1))
208 1 //
'*' // adjustl(line2)
209 WRITE (iunit,980) trim(line1)
215 WRITE(iunit, 980, advance=
"no") trim(parse)
216 DO WHILE (start_count .le. n1)
217 temp = iarray(start_count)
218 end_count = start_count
219 DO WHILE (end_count .lt. n1)
220 IF (iarray(end_count+1) .ne. temp)
EXIT
221 end_count = end_count+1
225 IF (line==8 .or. end_count.eq.n1)
THEN
232 length = end_count - start_count + 1
234 WRITE (line1, *) length
235 WRITE (line2, *) temp
236 line1 = trim(adjustl(line1)) //
'*' // adjustl(line2)
237 WRITE (iunit,980, advance=trim(adv)) trim(line1)
239 WRITE (line1, *) temp
240 WRITE (iunit, 980, advance=trim(adv))
241 1 trim(adjustl(line1))
243 start_count = end_count+1
250 END SUBROUTINE write_array_section_integer
253 SUBROUTINE parse_name (name, n1, ndim2, low_index)
254 CHARACTER(LEN=*),
INTENT(inout) :: name
255 INTEGER,
INTENT(in) :: n1
256 INTEGER,
INTENT(in),
OPTIONAL :: ndim2, low_index
257 CHARACTER(LEN=*),
PARAMETER :: fmt(5) = (/
'(a,i1)',
258 1
'(a,i2)',
'(a,i3)',
'(a,i4)',
'(a,i5)' /)
259 CHARACTER(len=LEN(name)+100) :: parse
260 CHARACTER(len=100) :: fmt_string
261 INTEGER :: i1, istart, iend
264 IF (
PRESENT(low_index)) istart = low_index
265 i1 = indexformat(istart)
266 WRITE (parse, fmt(i1)) trim(name) //
"(", istart
268 iend = istart + n1 - 1
269 i1 = indexformat(iend)
270 WRITE (parse, fmt(i1)) trim(parse) //
":", iend
272 IF (
PRESENT(ndim2))
THEN
273 i1 = indexformat(ndim2)
274 WRITE (parse, fmt(i1)) trim(parse) //
",", ndim2
277 name = trim(parse) //
")="
279 END SUBROUTINE parse_name
281 INTEGER FUNCTION indexformat(number)
282 INTEGER,
INTENT(in) :: number
285 SELECT CASE (abs(number))
296 IF (number < 0) i1 = i1 + 1
299 END FUNCTION indexformat
301 END MODULE write_array_generic