MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
utilit.f90
1 ! ---------------------------------------------------------------------
2 ! Utility subroutines used by any program from Numath library
3 ! ---------------------------------------------------------------------
4 ! Reference: From Numath Library By Tuan Dang Trong in Fortran 77
5 ! [BIBLI 18].
6 !
7 ! F90 Release 1.0 By J-P Moreau, Paris
8 ! (www.jpmoreau.fr)
9 ! ---------------------------------------------------------------------
10 MODULE utilit
11 
12 CONTAINS
13 
14 !REAL*8 FUNCTION D1MACH(I)
15 !!***BEGIN PROLOGUE D1MACH
16 !!***DATE WRITTEN 750101 (YYMMDD)
17 !!***REVISION DATE 860501 (YYMMDD)
18 !!***CATEGORY NO. R1
19 !!***KEYWORDS MACHINE CONSTANTS
20 !!***AUTHOR FOX, P. A., (BELL LABS)
21 !! HALL, A. D., (BELL LABS)
22 !! SCHRYER, N. L., (BELL LABS)
23 !!***PURPOSE RETURN DOUBLE PRECISION MACHINE DEPENDENT CONSTANTS.
24 !!***DESCRIPTION
25 !
26 !! D1MACH CAN BE USED TO OBTAIN MACHINE-DEPENDENT PARAMETERS
27 !! FOR THE LOCAL MACHINE ENVIRONMENT. IT IS A FUNCTION
28 !! SUBPROGRAM WITH ONE (INPUT) ARGUMENT, AND CAN BE CALLED
29 !! AS FOLLOWS, FOR EXAMPLE
30 !
31 !! D = D1MACH(I)
32 !
33 !! WHERE I=1,...,5. THE (OUTPUT) VALUE OF D ABOVE IS
34 !! DETERMINED BY THE (INPUT) VALUE OF I. THE RESULTS FOR
35 !! VARIOUS VALUES OF I ARE DISCUSSED BELOW.
36 !
37 !! DOUBLE-PRECISION MACHINE CONSTANTS
38 !! D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
39 !! D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
40 !! D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
41 !! D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
42 !! D1MACH( 5) = LOG10(B)
43 !!***REFERENCES FOX P.A., HALL A.D., SCHRYER N.L.,*FRAMEWORK FOR A
44 !! PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHEMATICAL
45 !! SOFTWARE, VOL. 4, NO. 2, JUNE 1978, PP. 177-188.
46 !!***ROUTINES CALLED XERROR
47 !!***END PROLOGUE D1MACH
48 !
49 ! INTEGER SMALL(4)
50 ! INTEGER LARGE(4)
51 ! INTEGER RIGHT(4)
52 ! INTEGER DIVER(4)
53 ! INTEGER LOG10(4)
54 !
55 ! DOUBLE PRECISION DMACH(5)
56 !
57 ! EQUIVALENCE (DMACH(1),SMALL(1))
58 ! EQUIVALENCE (DMACH(2),LARGE(1))
59 ! EQUIVALENCE (DMACH(3),RIGHT(1))
60 ! EQUIVALENCE (DMACH(4),DIVER(1))
61 ! EQUIVALENCE (DMACH(5),LOG10(1))
62 !
63 !! MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
64 !! THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86, AND
65 !! THE PERKIN ELMER (INTERDATA) 7/32.
66 !
67 ! DATA SMALL(1), SMALL(2) / Z00100000, Z00000000 /
68 ! DATA LARGE(1), LARGE(2) / Z7FFFFFFF, ZFFFFFFFF /
69 ! DATA RIGHT(1), RIGHT(2) / Z33100000, Z00000000 /
70 ! DATA DIVER(1), DIVER(2) / Z34100000, Z00000000 /
71 ! DATA LOG10(1), LOG10(2) / Z41134413, Z509F79FF /
72 
73 ! MACHINE CONSTANTS FOR THE APOLLO DNXXXX SERIES,
74 
75 ! DATA DMACH(1) / 2.22559D-308/
76 ! DATA DMACH(2) / 1.79728D308/
77 ! DATA DMACH(3) / 1.11048D-16 /
78 ! DATA DMACH(4) / 2.22096D-16 /
79 ! DATA DMACH(5) / .301029995663981198D0 /
80 
81 ! MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM.
82 
83 ! DATA SMALL(1) / ZC00800000 /
84 ! DATA SMALL(2) / Z000000000 /
85 
86 ! DATA LARGE(1) / ZDFFFFFFFF /
87 ! DATA LARGE(2) / ZFFFFFFFFF /
88 
89 ! DATA RIGHT(1) / ZCC5800000 /
90 ! DATA RIGHT(2) / Z000000000 /
91 
92 ! DATA DIVER(1) / ZCC6800000 /
93 ! DATA DIVER(2) / Z000000000 /
94 
95 ! DATA LOG10(1) / ZD00E730E7 /
96 ! DATA LOG10(2) / ZC77800DC0 /
97 
98 ! MACHINE CONSTANTS FOR THE BURROUGHS 5700 SYSTEM.
99 
100 ! DATA SMALL(1) / O1771000000000000 /
101 ! DATA SMALL(2) / O0000000000000000 /
102 
103 ! DATA LARGE(1) / O0777777777777777 /
104 ! DATA LARGE(2) / O0007777777777777 /
105 
106 ! DATA RIGHT(1) / O1461000000000000 /
107 ! DATA RIGHT(2) / O0000000000000000 /
108 
109 ! DATA DIVER(1) / O1451000000000000 /
110 ! DATA DIVER(2) / O0000000000000000 /
111 
112 ! DATA LOG10(1) / O1157163034761674 /
113 ! DATA LOG10(2) / O0006677466732724 /
114 
115 ! MACHINE CONSTANTS FOR THE BURROUGHS 6700/7700 SYSTEMS.
116 
117 ! DATA SMALL(1) / O1771000000000000 /
118 ! DATA SMALL(2) / O7770000000000000 /
119 
120 ! DATA LARGE(1) / O0777777777777777 /
121 ! DATA LARGE(2) / O7777777777777777 /
122 
123 ! DATA RIGHT(1) / O1461000000000000 /
124 ! DATA RIGHT(2) / O0000000000000000 /
125 
126 ! DATA DIVER(1) / O1451000000000000 /
127 ! DATA DIVER(2) / O0000000000000000 /
128 
129 ! DATA LOG10(1) / O1157163034761674 /
130 ! DATA LOG10(2) / O0006677466732724 /
131 
132 ! MACHINE CONSTANTS FOR THE CD! 6000/7000 SERIES.
133 ! FOR FTN4
134 
135 ! DATA SMALL(1) / 00564000000000000000B /
136 ! DATA SMALL(2) / 00000000000000000000B /
137 
138 ! DATA LARGE(1) / 37757777777777777777B /
139 ! DATA LARGE(2) / 37157777777777777777B /
140 
141 ! DATA RIGHT(1) / 15624000000000000000B /
142 ! DATA RIGHT(2) / 00000000000000000000B /
143 
144 ! DATA DIVER(1) / 15634000000000000000B /
145 ! DATA DIVER(2) / 00000000000000000000B /
146 
147 ! DATA LOG10(1) / 17164642023241175717B /
148 ! DATA LOG10(2) / 16367571421742254654B /
149 
150 ! MACHINE CONSTANTS FOR THE CD! 6000/7000 SERIES.
151 ! FOR FTN5
152 
153 ! DATA SMALL(1) / O"00564000000000000000" /
154 ! DATA SMALL(2) / O"00000000000000000000" /
155 
156 ! DATA LARGE(1) / O"37757777777777777777" /
157 ! DATA LARGE(2) / O"37157777777777777777" /
158 
159 ! DATA RIGHT(1) / O"15624000000000000000" /
160 ! DATA RIGHT(2) / O"00000000000000000000" /
161 
162 ! DATA DIVER(1) / O"15634000000000000000" /
163 ! DATA DIVER(2) / O"00000000000000000000" /
164 
165 ! DATA LOG10(1) / O"17164642023241175717" /
166 ! DATA LOG10(2) / O"16367571421742254654" /
167 
168 ! MACHINE CONSTANTS FOR THE CRAY 1
169 
170 ! DATA SMALL(1) / 201354000000000000000B /
171 ! DATA SMALL(2) / 000000000000000000000B /
172 
173 ! DATA LARGE(1) / 577767777777777777777B /
174 ! DATA LARGE(2) / 000007777777777777774B /
175 
176 ! DATA RIGHT(1) / 376434000000000000000B /
177 ! DATA RIGHT(2) / 000000000000000000000B /
178 
179 ! DATA DIVER(1) / 376444000000000000000B /
180 ! DATA DIVER(2) / 000000000000000000000B /
181 
182 ! DATA LOG10(1) / 377774642023241175717B /
183 ! DATA LOG10(2) / 000007571421742254654B /
184 
185 ! MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
186 
187 ! NOTE - IT MAY BE APPROPRIATE TO INCLUDE THE FOLLOWING CARD -
188 ! STATI! DMACH(5)
189 
190 ! DATA SMALL/20K,3*0/,LARGE/77777K,3*177777K/
191 ! DATA RIGHT/31420K,3*0/,DIVER/32020K,3*0/
192 ! DATA LOG10/40423K,42023K,50237K,74776K/
193 
194 ! MACHINE CONSTANTS FOR THE HARRIS 220
195 
196 ! DATA SMALL(1), SMALL(2) / '20000000, '00000201 /
197 ! DATA LARGE(1), LARGE(2) / '37777777, '37777577 /
198 ! DATA RIGHT(1), RIGHT(2) / '20000000, '00000333 /
199 ! DATA DIVER(1), DIVER(2) / '20000000, '00000334 /
200 ! DATA LOG10(1), LOG10(2) / '23210115, '10237777 /
201 
202 ! MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES.
203 
204 ! DATA SMALL(1), SMALL(2) / O402400000000, O000000000000 /
205 ! DATA LARGE(1), LARGE(2) / O376777777777, O777777777777 /
206 ! DATA RIGHT(1), RIGHT(2) / O604400000000, O000000000000 /
207 ! DATA DIVER(1), DIVER(2) / O606400000000, O000000000000 /
208 ! DATA LOG10(1), LOG10(2) / O776464202324, O117571775714 /
209 
210 ! MACHINE CONSTANTS FOR THE HP 2100
211 ! THREE WORD DOUBLE PRECISION OPTION WITH FTN4
212 
213 ! DATA SMALL(1), SMALL(2), SMALL(3) / 40000B, 0, 1 /
214 ! DATA LARGE(1), LARGE(2), LARGE(3) / 77777B, 177777B, 177776B /
215 ! DATA RIGHT(1), RIGHT(2), RIGHT(3) / 40000B, 0, 265B /
216 ! DATA DIVER(1), DIVER(2), DIVER(3) / 40000B, 0, 276B /
217 ! DATA LOG10(1), LOG10(2), LOG10(3) / 46420B, 46502B, 77777B /
218 
219 ! MACHINE CONSTANTS FOR THE HP 2100
220 ! FOUR WORD DOUBLE PRECISION OPTION WITH FTN4
221 
222 ! DATA SMALL(1), SMALL(2) / 40000B, 0 /
223 ! DATA SMALL(3), SMALL(4) / 0, 1 /
224 ! DATA LARGE(1), LARGE(2) / 77777B, 177777B /
225 ! DATA LARGE(3), LARGE(4) / 177777B, 177776B /
226 ! DATA RIGHT(1), RIGHT(2) / 40000B, 0 /
227 ! DATA RIGHT(3), RIGHT(4) / 0, 225B /
228 ! DATA DIVER(1), DIVER(2) / 40000B, 0 /
229 ! DATA DIVER(3), DIVER(4) / 0, 227B /
230 ! DATA LOG10(1), LOG10(2) / 46420B, 46502B /
231 ! DATA LOG10(3), LOG10(4) / 76747B, 176377B /
232 
233 ! MACHINE CONSTANTS FOR THE HP 9000
234 
235 ! D1MACH(1) = 2.8480954D-306
236 ! D1MACH(2) = 1.40444776D+306
237 ! D1MACH(3) = 2.22044605D-16
238 ! D1MACH(4) = 4.44089210D-16
239 ! D1MACH(5) = 3.01029996D-1
240 
241 ! DATA SMALL(1), SMALL(2) / 00040000000B, 00000000000B /
242 ! DATA LARGE(1), LARGE(2) / 17737777777B, 37777777777B /
243 ! DATA RIGHT(1), RIGHT(2) / 07454000000B, 00000000000B /
244 ! DATA DIVER(1), DIVER(2) / 07460000000B, 00000000000B /
245 ! DATA LOG10(1), LOG10(2) / 07764642023B, 12047674777B /
246 
247 ! MACHINE CONSTANTS FOR THE PDP-10 (KA PROCESSOR).
248 
249 ! DATA SMALL(1), SMALL(2) / "033400000000, "000000000000 /
250 ! DATA LARGE(1), LARGE(2) / "377777777777, "344777777777 /
251 ! DATA RIGHT(1), RIGHT(2) / "113400000000, "000000000000 /
252 ! DATA DIVER(1), DIVER(2) / "114400000000, "000000000000 /
253 ! DATA LOG10(1), LOG10(2) / "177464202324, "144117571776 /
254 
255 ! MACHINE CONSTANTS FOR THE PDP-10 (KI PROCESSOR).
256 
257 ! DATA SMALL(1), SMALL(2) / "000400000000, "000000000000 /
258 ! DATA LARGE(1), LARGE(2) / "377777777777, "377777777777 /
259 ! DATA RIGHT(1), RIGHT(2) / "103400000000, "000000000000 /
260 ! DATA DIVER(1), DIVER(2) / "104400000000, "000000000000 /
261 ! DATA LOG10(1), LOG10(2) / "177464202324, "476747767461 /
262 
263 ! MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
264 ! 32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
265 
266 ! DATA SMALL(1), SMALL(2) / 8388608, 0 /
267 ! DATA LARGE(1), LARGE(2) / 2147483647, -1 /
268 ! DATA RIGHT(1), RIGHT(2) / 612368384, 0 /
269 ! DATA DIVER(1), DIVER(2) / 620756992, 0 /
270 ! DATA LOG10(1), LOG10(2) / 1067065498, -2063872008 /
271 
272 ! DATA SMALL(1), SMALL(2) / O00040000000, O00000000000 /
273 ! DATA LARGE(1), LARGE(2) / O17777777777, O37777777777 /
274 ! DATA RIGHT(1), RIGHT(2) / O04440000000, O00000000000 /
275 ! DATA DIVER(1), DIVER(2) / O04500000000, O00000000000 /
276 ! DATA LOG10(1), LOG10(2) / O07746420232, O20476747770 /
277 
278 ! MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
279 ! 16-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
280 
281 ! DATA SMALL(1), SMALL(2) / 128, 0 /
282 ! DATA SMALL(3), SMALL(4) / 0, 0 /
283 
284 ! DATA LARGE(1), LARGE(2) / 32767, -1 /
285 ! DATA LARGE(3), LARGE(4) / -1, -1 /
286 
287 ! DATA RIGHT(1), RIGHT(2) / 9344, 0 /
288 ! DATA RIGHT(3), RIGHT(4) / 0, 0 /
289 
290 ! DATA DIVER(1), DIVER(2) / 9472, 0 /
291 ! DATA DIVER(3), DIVER(4) / 0, 0 /
292 
293 ! DATA LOG10(1), LOG10(2) / 16282, 8346 /
294 ! DATA LOG10(3), LOG10(4) / -31493, -12296 /
295 
296 ! DATA SMALL(1), SMALL(2) / O000200, O000000 /
297 ! DATA SMALL(3), SMALL(4) / O000000, O000000 /
298 
299 ! DATA LARGE(1), LARGE(2) / O077777, O177777 /
300 ! DATA LARGE(3), LARGE(4) / O177777, O177777 /
301 
302 ! DATA RIGHT(1), RIGHT(2) / O022200, O000000 /
303 ! DATA RIGHT(3), RIGHT(4) / O000000, O000000 /
304 
305 ! DATA DIVER(1), DIVER(2) / O022400, O000000 /
306 ! DATA DIVER(3), DIVER(4) / O000000, O000000 /
307 
308 ! DATA LOG10(1), LOG10(2) / O037632, O020232 /
309 ! DATA LOG10(3), LOG10(4) / O102373, O147770 /
310 
311 ! MACHINE CONSTANTS FOR THE UNIVA! 1100 SERIES. FTN COMPILER
312 
313 ! DATA SMALL(1), SMALL(2) / O000040000000, O000000000000 /
314 ! DATA LARGE(1), LARGE(2) / O377777777777, O777777777777 /
315 ! DATA RIGHT(1), RIGHT(2) / O170540000000, O000000000000 /
316 ! DATA DIVER(1), DIVER(2) / O170640000000, O000000000000 /
317 ! DATA LOG10(1), LOG10(2) / O177746420232, O411757177572 /
318 
319 ! MACHINE CONSTANTS FOR VAX 11/780
320 ! (EXPRESSED IN INTEGER AND HEXADECIMAL)
321 ! ***THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSYEMS***
322 ! *** THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS***
323 
324 ! DATA SMALL(1), SMALL(2) / 128, 0 /
325 ! DATA LARGE(1), LARGE(2) / -32769, -1 /
326 ! DATA RIGHT(1), RIGHT(2) / 9344, 0 /
327 ! DATA DIVER(1), DIVER(2) / 9472, 0 /
328 ! DATA LOG10(1), LOG10(2) / 546979738, -805796613 /
329 
330 ! DATA SMALL(1), SMALL(2) / Z00000080, Z00000000 /
331 ! DATA LARGE(1), LARGE(2) / ZFFFF7FFF, ZFFFFFFFF /
332 ! DATA RIGHT(1), RIGHT(2) / Z00002480, Z00000000 /
333 ! DATA DIVER(1), DIVER(2) / Z00002500, Z00000000 /
334 ! DATA LOG10(1), LOG10(2) / Z209A3F9A, ZCFF884FB /
335 
336 ! MACHINE CONSTANTS FOR VAX 11/780 (G-FLOATING)
337 ! (EXPRESSED IN INTEGER AND HEXADECIMAL)
338 ! ***THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSYEMS***
339 ! *** THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS***
340 
341 ! DATA SMALL(1), SMALL(2) / 16, 0 /
342 ! DATA LARGE(1), LARGE(2) / -32769, -1 /
343 ! DATA RIGHT(1), RIGHT(2) / 15552, 0 /
344 ! DATA DIVER(1), DIVER(2) / 15568, 0 /
345 ! DATA LOG10(1), LOG10(2) / 1142112243, 2046775455 /
346 
347 ! DATA SMALL(1), SMALL(2) / Z00000010, Z00000000 /
348 ! DATA LARGE(1), LARGE(2) / ZFFFF7FFF, ZFFFFFFFF /
349 ! DATA RIGHT(1), RIGHT(2) / Z00003CC0, Z00000000 /
350 ! DATA DIVER(1), DIVER(2) / Z00003CD0, Z00000000 /
351 ! DATA LOG10(1), LOG10(2) / Z44133FF3, Z79FF509F /
352 
353 ! MACHINE CONSTANTS FOR THE ELXSI 6400
354 ! (ASSUMING REAL*8 IS THE DEFAULT DOUBLE PRECISION)
355 
356 ! DATA SMALL(1), SMALL(2) / '00100000'X,'00000000'X /
357 ! DATA LARGE(1), LARGE(2) / '7FEFFFFF'X,'FFFFFFFF'X /
358 ! DATA RIGHT(1), RIGHT(2) / '3CB00000'X,'00000000'X /
359 ! DATA DIVER(1), DIVER(2) / '3CC00000'X,'00000000'X /
360 ! DATA LOG10(1), DIVER(2) / '3FD34413'X,'509F79FF'X /
361 
362 ! MACHINE CONSTANTS FOR THE IBM PC - MICROSOFT FORTRAN
363 
364 ! DATA SMALL(1), SMALL(2) / �00000000, �00100000 /
365 ! DATA LARGE(1), LARGE(2) / �FFFFFFFF, �7FEFFFFF /
366 ! DATA RIGHT(1), RIGHT(2) / �00000000, �3CA00000 /
367 ! DATA DIVER(1), DIVER(2) / �00000000, �3CB00000 /
368 ! DATA LOG10(1), LOG10(2) / �509F79FF, �3FD34413 /
369 
370 ! MACHINE CONSTANTS FOR THE IBM PC - PROFESSIONAL FORTRAN
371 ! AND LAHEY FORTRAN
372 
373 ! DATA SMALL(1), SMALL(2) / Z'00000000', Z'00100000' /
374 ! DATA LARGE(1), LARGE(2) / Z'FFFFFFFF', Z'7FEFFFFF' /
375 ! DATA RIGHT(1), RIGHT(2) / Z'00000000', Z'3CA00000' /
376 ! DATA DIVER(1), DIVER(2) / Z'00000000', Z'3CB00000' /
377 ! DATA LOG10(1), LOG10(2) / Z'509F79FF', Z'3FD34413' /
378 !
379 !!***FIRST EXECUTABLE STATEMENT D1MACH
380 ! IF (I .LT. 1 .OR. I .GT. 5) &
381 ! CALL XERROR( 'D1MACH -- I OUT OF BOUNDS',25,1,2)
382 !
383 ! D1MACH = DMACH(I)
384 ! RETURN
385 !
386 !END FUNCTION D1MACH
387 !DECK D1MACH
388  DOUBLE PRECISION FUNCTION d1mach (I)
389  IMPLICIT NONE
390  INTEGER :: i
391  DOUBLE PRECISION :: b, x
392 !***BEGIN PROLOGUE D1MACH
393 !***PURPOSE Return floating point machine dependent constants.
394 !***LIBRARY SLATEC
395 !***CATEGORY R1
396 !***TYPE SINGLE PRECISION (D1MACH-S, D1MACH-D)
397 !***KEYWORDS MACHINE CONSTANTS
398 !***AUTHOR Fox, P. A., (Bell Labs)
399 ! Hall, A. D., (Bell Labs)
400 ! Schryer, N. L., (Bell Labs)
401 !***DESCRIPTION
402 !
403 ! D1MACH can be used to obtain machine-dependent parameters for the
404 ! local machine environment. It is a function subprogram with one
405 ! (input) argument, and can be referenced as follows:
406 !
407 ! A = D1MACH(I)
408 !
409 ! where I=1,...,5. The (output) value of A above is determined by
410 ! the (input) value of I. The results for various values of I are
411 ! discussed below.
412 !
413 ! D1MACH(1) = B**(EMIN-1), the smallest positive magnitude.
414 ! D1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude.
415 ! D1MACH(3) = B**(-T), the smallest relative spacing.
416 ! D1MACH(4) = B**(1-T), the largest relative spacing.
417 ! D1MACH(5) = LOG10(B)
418 !
419 ! Assume single precision numbers are represented in the T-digit,
420 ! base-B form
421 !
422 ! sign (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
423 !
424 ! where 0 .LE. X(I) .LT. B for I=1,...,T, 0 .LT. X(1), and
425 ! EMIN .LE. E .LE. EMAX.
426 !
427 ! The values of B, T, EMIN and EMAX are provided in I1MACH as
428 ! follows:
429 ! I1MACH(10) = B, the base.
430 ! I1MACH(11) = T, the number of base-B digits.
431 ! I1MACH(12) = EMIN, the smallest exponent E.
432 ! I1MACH(13) = EMAX, the largest exponent E.
433 !
434 !
435 !***REFERENCES P. A. Fox, A. D. Hall and N. L. Schryer, Framework for
436 ! a portable library, ACM Transactions on Mathematical
437 ! Software 4, 2 (June 1978), pp. 177-188.
438 !***ROUTINES CALLED XERMSG
439 !***REVISION HISTORY (YYMMDD)
440 ! 790101 DATE WRITTEN
441 ! 960329 Modified for Fortran 90 (BE after suggestions by EHG)
442 !***END PROLOGUE D1MACH
443 !
444  x = 1.0d0
445  b = radix(x)
446  SELECT CASE (i)
447  CASE (1)
448  d1mach = b**(minexponent(x)-1) ! the smallest positive magnitude.
449  CASE (2)
450  d1mach = huge(x) ! the largest magnitude.
451  CASE (3)
452  d1mach = b**(-digits(x)) ! the smallest relative spacing.
453  CASE (4)
454  d1mach = b**(1-digits(x)) ! the largest relative spacing.
455  CASE (5)
456  d1mach = log10(b)
457  CASE DEFAULT
458  WRITE (*, fmt = 9000)
459  9000 FORMAT ('1ERROR 1 IN D1MACH - I OUT OF BOUNDS')
460  stop
461  END SELECT
462  RETURN
463  END
464 ! ---------------------------------------------------------------------
465 INTEGER FUNCTION i1mach(I)
466 !***BEGIN PROLOGUE I1MACH
467 !***DATE WRITTEN 750101 (YYMMDD)
468 !***REVISION DATE 890313 (YYMMDD)
469 !***CATEGORY NO. R1
470 !***KEYWORDS LIBRARY=SLATEC,TYPE=INTEGER(I1MACH-I),MACHINE CONSTANTS
471 !***AUTHOR FOX, P. A., (BELL LABS)
472 ! HALL, A. D., (BELL LABS)
473 ! SCHRYER, N. L., (BELL LABS)
474 !***PURPOSE Return integer machine dependent constants.
475 !***DESCRIPTION
476 
477 ! I1MACH can be used to obtain machine-dependent parameters
478 ! for the local machine environment. It is a function
479 ! subroutine with one (input) argument, and can be called
480 ! as follows, for example
481 
482 ! K = I1MACH(I)
483 
484 ! where I=1,...,16. The (output) value of K above is
485 ! determined by the (input) value of I. The results for
486 ! various values of I are discussed below.
487 
488 ! I/O unit numbers.
489 ! I1MACH( 1) = the standard input unit.
490 ! I1MACH( 2) = the standard output unit.
491 ! I1MACH( 3) = the standard punch unit.
492 ! I1MACH( 4) = the standard error message unit.
493 
494 ! Words.
495 ! I1MACH( 5) = the number of bits per integer storage unit.
496 ! I1MACH( 6) = the number of characters per integer storage unit.
497 
498 ! Integers.
499 ! assume integers are represented in the S-digit, base-A form
500 
501 ! sign ( X(S-1)*A**(S-1) + ... + X(1)*A + X(0) )
502 
503 ! where 0 .LE. X(I) .LT. A for I=0,...,S-1.
504 ! I1MACH( 7) = A, the base.
505 ! I1MACH( 8) = S, the number of base-A digits.
506 ! I1MACH( 9) = A**S - 1, the largest magnitude.
507 
508 ! Floating-Point Numbers.
509 ! Assume floating-point numbers are represented in the T-digit,
510 ! base-B form
511 ! sign (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
512 
513 ! where 0 .LE. X(I) .LT. B for I=1,...,T,
514 ! 0 .LT. X(1), and EMIN .LE. E .LE. EMAX.
515 ! I1MACH(10) = B, the base.
516 
517 ! Single-Precision
518 ! I1MACH(11) = T, the number of base-B digits.
519 ! I1MACH(12) = EMIN, the smallest exponent E.
520 ! I1MACH(13) = EMAX, the largest exponent E.
521 
522 ! Double-Precision
523 ! I1MACH(14) = T, the number of base-B digits.
524 ! I1MACH(15) = EMIN, the smallest exponent E.
525 ! I1MACH(16) = EMAX, the largest exponent E.
526 
527 ! To alter this function for a particular environment,
528 ! the desired set of DATA statements should be activated by
529 ! removing the ! from column 1. Also, the values of
530 ! I1MACH(1) - I1MACH(4) should be checked for consistency
531 ! with the local operating system.
532 
533 !***REFERENCES FOX P.A., HALL A.D., SCHRYER N.L.,*FRAMEWORK FOR A
534 ! PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHEMATICAL
535 ! SOFTWARE, VOL. 4, NO. 2, JUNE 1978, PP. 177-188.
536 !***ROUTINES CALLED (NONE)
537 !***END PROLOGUE I1MACH
538 
539  INTEGER imach(16),output
540  SAVE imach
541  equivalence(imach(4),output)
542 
543 ! MACHINE CONSTANTS FOR THE AMIGA
544 ! ABSOFT COMPILER
545 
546 ! DATA IMACH(1) / 5 /
547 ! DATA IMACH(2) / 6 /
548 ! DATA IMACH(3) / 5 /
549 ! DATA IMACH(4) / 6 /
550 ! DATA IMACH(5) / 32 /
551 ! DATA IMACH(6) / 4 /
552 ! DATA IMACH(7) / 2 /
553 ! DATA IMACH(8) / 31 /
554 ! DATA IMACH(9) / 2147483647 /
555 ! DATA IMACH(10)/ 2 /
556 ! DATA IMACH(11)/ 24 /
557 ! DATA IMACH(12)/ -126 /
558 ! DATA IMACH(13)/ 127 /
559 ! DATA IMACH(14)/ 53 /
560 ! DATA IMACH(15)/ -1022 /
561 ! DATA IMACH(16)/ 1023 /
562 
563 ! MACHINE CONSTANTS FOR THE APOLLO
564 
565 ! DATA IMACH(1) / 5 /
566 ! DATA IMACH(2) / 6 /
567 ! DATA IMACH(3) / 6 /
568 ! DATA IMACH(4) / 6 /
569 ! DATA IMACH(5) / 32 /
570 ! DATA IMACH(6) / 4 /
571 ! DATA IMACH(7) / 2 /
572 ! DATA IMACH(8) / 31 /
573 ! DATA IMACH(9) / 2147483647 /
574 ! DATA IMACH(10)/ 2 /
575 ! DATA IMACH(11)/ 24 /
576 ! DATA IMACH(12)/ -125 /
577 ! DATA IMACH(13)/ 129 /
578 ! DATA IMACH(14)/ 53 /
579 ! DATA IMACH(15)/ -1021 /
580 ! DATA IMACH(16)/ 1025 /
581 
582 ! MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM
583 
584 ! DATA IMACH( 1) / 7 /
585 ! DATA IMACH( 2) / 2 /
586 ! DATA IMACH( 3) / 2 /
587 ! DATA IMACH( 4) / 2 /
588 ! DATA IMACH( 5) / 36 /
589 ! DATA IMACH( 6) / 4 /
590 ! DATA IMACH( 7) / 2 /
591 ! DATA IMACH( 8) / 33 /
592 ! DATA IMACH( 9) / Z1FFFFFFFF /
593 ! DATA IMACH(10) / 2 /
594 ! DATA IMACH(11) / 24 /
595 ! DATA IMACH(12) / -256 /
596 ! DATA IMACH(13) / 255 /
597 ! DATA IMACH(14) / 60 /
598 ! DATA IMACH(15) / -256 /
599 ! DATA IMACH(16) / 255 /
600 
601 ! MACHINE CONSTANTS FOR THE BURROUGHS 5700 SYSTEM
602 
603 ! DATA IMACH( 1) / 5 /
604 ! DATA IMACH( 2) / 6 /
605 ! DATA IMACH( 3) / 7 /
606 ! DATA IMACH( 4) / 6 /
607 ! DATA IMACH( 5) / 48 /
608 ! DATA IMACH( 6) / 6 /
609 ! DATA IMACH( 7) / 2 /
610 ! DATA IMACH( 8) / 39 /
611 ! DATA IMACH( 9) / O0007777777777777 /
612 ! DATA IMACH(10) / 8 /
613 ! DATA IMACH(11) / 13 /
614 ! DATA IMACH(12) / -50 /
615 ! DATA IMACH(13) / 76 /
616 ! DATA IMACH(14) / 26 /
617 ! DATA IMACH(15) / -50 /
618 ! DATA IMACH(16) / 76 /
619 
620 ! MACHINE CONSTANTS FOR THE BURROUGHS 6700/7700 SYSTEMS
621 
622 ! DATA IMACH( 1) / 5 /
623 ! DATA IMACH( 2) / 6 /
624 ! DATA IMACH( 3) / 7 /
625 ! DATA IMACH( 4) / 6 /
626 ! DATA IMACH( 5) / 48 /
627 ! DATA IMACH( 6) / 6 /
628 ! DATA IMACH( 7) / 2 /
629 ! DATA IMACH( 8) / 39 /
630 ! DATA IMACH( 9) / O0007777777777777 /
631 ! DATA IMACH(10) / 8 /
632 ! DATA IMACH(11) / 13 /
633 ! DATA IMACH(12) / -50 /
634 ! DATA IMACH(13) / 76 /
635 ! DATA IMACH(14) / 26 /
636 ! DATA IMACH(15) / -32754 /
637 ! DATA IMACH(16) / 32780 /
638 
639 ! MACHINE CONSTANTS FOR THE CD! 170/180 SERIES USING NOS/VE
640 
641 ! DATA IMACH( 1) / 5 /
642 ! DATA IMACH( 2) / 6 /
643 ! DATA IMACH( 3) / 7 /
644 ! DATA IMACH( 4) / 6 /
645 ! DATA IMACH( 5) / 64 /
646 ! DATA IMACH( 6) / 8 /
647 ! DATA IMACH( 7) / 2 /
648 ! DATA IMACH( 8) / 63 /
649 ! DATA IMACH( 9) / 9223372036854775807 /
650 ! DATA IMACH(10) / 2 /
651 ! DATA IMACH(11) / 47 /
652 ! DATA IMACH(12) / -4095 /
653 ! DATA IMACH(13) / 4094 /
654 ! DATA IMACH(14) / 94 /
655 ! DATA IMACH(15) / -4095 /
656 ! DATA IMACH(16) / 4094 /
657 
658 ! MACHINE CONSTANTS FOR THE CD! 6000/7000 SERIES
659 
660 ! DATA IMACH( 1) / 5 /
661 ! DATA IMACH( 2) / 6 /
662 ! DATA IMACH( 3) / 7 /
663 ! DATA IMACH( 4) /6LOUTPUT/
664 ! DATA IMACH( 5) / 60 /
665 ! DATA IMACH( 6) / 10 /
666 ! DATA IMACH( 7) / 2 /
667 ! DATA IMACH( 8) / 48 /
668 ! DATA IMACH( 9) / 00007777777777777777B /
669 ! DATA IMACH(10) / 2 /
670 ! DATA IMACH(11) / 47 /
671 ! DATA IMACH(12) / -929 /
672 ! DATA IMACH(13) / 1070 /
673 ! DATA IMACH(14) / 94 /
674 ! DATA IMACH(15) / -929 /
675 ! DATA IMACH(16) / 1069 /
676 
677 ! MACHINE CONSTANTS FOR THE CELERITY C1260
678 
679 ! DATA IMACH(1) / 5 /
680 ! DATA IMACH(2) / 6 /
681 ! DATA IMACH(3) / 6 /
682 ! DATA IMACH(4) / 0 /
683 ! DATA IMACH(5) / 32 /
684 ! DATA IMACH(6) / 4 /
685 ! DATA IMACH(7) / 2 /
686 ! DATA IMACH(8) / 31 /
687 ! DATA IMACH(9) / Z'7FFFFFFF' /
688 ! DATA IMACH(10)/ 2 /
689 ! DATA IMACH(11)/ 24 /
690 ! DATA IMACH(12)/ -126 /
691 ! DATA IMACH(13)/ 127 /
692 ! DATA IMACH(14)/ 53 /
693 ! DATA IMACH(15)/ -1022 /
694 ! DATA IMACH(16)/ 1023 /
695 
696 ! MACHINE CONSTANTS FOR THE CONVEX C-1
697 
698 ! DATA IMACH( 1) / 5/
699 ! DATA IMACH( 2) / 6/
700 ! DATA IMACH( 3) / 7/
701 ! DATA IMACH( 4) / 6/
702 ! DATA IMACH( 5) / 32/
703 ! DATA IMACH( 6) / 4/
704 ! DATA IMACH( 7) / 2/
705 ! DATA IMACH( 8) / 31/
706 ! DATA IMACH( 9) /2147483647/
707 ! DATA IMACH(10) / 2/
708 ! DATA IMACH(11) / 24/
709 ! DATA IMACH(12) / -128/
710 ! DATA IMACH(13) / 127/
711 ! DATA IMACH(14) / 53/
712 ! DATA IMACH(15) / -1024/
713 ! DATA IMACH(16) / 1023/
714 
715 ! MACHINE CONSTANTS FOR THE CRAY-1
716 ! USING THE 46 BIT INTEGER COMPILER OPTION
717 
718 ! DATA IMACH( 1) / 100 /
719 ! DATA IMACH( 2) / 101 /
720 ! DATA IMACH( 3) / 102 /
721 ! DATA IMACH( 4) / 101 /
722 ! DATA IMACH( 5) / 64 /
723 ! DATA IMACH( 6) / 8 /
724 ! DATA IMACH( 7) / 2 /
725 ! DATA IMACH( 8) / 46 /
726 ! DATA IMACH( 9) / 1777777777777777B /
727 ! DATA IMACH(10) / 2 /
728 ! DATA IMACH(11) / 47 /
729 ! DATA IMACH(12) / -8189 /
730 ! DATA IMACH(13) / 8190 /
731 ! DATA IMACH(14) / 94 /
732 ! DATA IMACH(15) / -8099 /
733 ! DATA IMACH(16) / 8190 /
734 
735 ! MACHINE CONSTANTS FOR THE CRAY-1
736 ! USING THE 64 BIT INTEGER COMPILER OPTION
737 
738 ! DATA IMACH( 1) / 100 /
739 ! DATA IMACH( 2) / 101 /
740 ! DATA IMACH( 3) / 102 /
741 ! DATA IMACH( 4) / 101 /
742 ! DATA IMACH( 5) / 64 /
743 ! DATA IMACH( 6) / 8 /
744 ! DATA IMACH( 7) / 2 /
745 ! DATA IMACH( 8) / 63 /
746 ! DATA IMACH( 9) / 777777777777777777777B /
747 ! DATA IMACH(10) / 2 /
748 ! DATA IMACH(11) / 47 /
749 ! DATA IMACH(12) / -8189 /
750 ! DATA IMACH(13) / 8190 /
751 ! DATA IMACH(14) / 94 /
752 ! DATA IMACH(15) / -8099 /
753 ! DATA IMACH(16) / 8190 /
754 
755 ! MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
756 
757 ! DATA IMACH( 1) / 11 /
758 ! DATA IMACH( 2) / 12 /
759 ! DATA IMACH( 3) / 8 /
760 ! DATA IMACH( 4) / 10 /
761 ! DATA IMACH( 5) / 16 /
762 ! DATA IMACH( 6) / 2 /
763 ! DATA IMACH( 7) / 2 /
764 ! DATA IMACH( 8) / 15 /
765 ! DATA IMACH( 9) /32767 /
766 ! DATA IMACH(10) / 16 /
767 ! DATA IMACH(11) / 6 /
768 ! DATA IMACH(12) / -64 /
769 ! DATA IMACH(13) / 63 /
770 ! DATA IMACH(14) / 14 /
771 ! DATA IMACH(15) / -64 /
772 ! DATA IMACH(16) / 63 /
773 
774 ! MACHINE CONSTANTS FOR THE ELXSI 6400
775 
776 ! DATA IMACH( 1) / 5/
777 ! DATA IMACH( 2) / 6/
778 ! DATA IMACH( 3) / 6/
779 ! DATA IMACH( 4) / 6/
780 ! DATA IMACH( 5) / 32/
781 ! DATA IMACH( 6) / 4/
782 ! DATA IMACH( 7) / 2/
783 ! DATA IMACH( 8) / 32/
784 ! DATA IMACH( 9) /2147483647/
785 ! DATA IMACH(10) / 2/
786 ! DATA IMACH(11) / 24/
787 ! DATA IMACH(12) / -126/
788 ! DATA IMACH(13) / 127/
789 ! DATA IMACH(14) / 53/
790 ! DATA IMACH(15) / -1022/
791 ! DATA IMACH(16) / 1023/
792 
793 ! MACHINE CONSTANTS FOR THE HARRIS 220
794 
795 ! DATA IMACH( 1) / 5 /
796 ! DATA IMACH( 2) / 6 /
797 ! DATA IMACH( 3) / 0 /
798 ! DATA IMACH( 4) / 6 /
799 ! DATA IMACH( 5) / 24 /
800 ! DATA IMACH( 6) / 3 /
801 ! DATA IMACH( 7) / 2 /
802 ! DATA IMACH( 8) / 23 /
803 ! DATA IMACH( 9) / 8388607 /
804 ! DATA IMACH(10) / 2 /
805 ! DATA IMACH(11) / 23 /
806 ! DATA IMACH(12) / -127 /
807 ! DATA IMACH(13) / 127 /
808 ! DATA IMACH(14) / 38 /
809 ! DATA IMACH(15) / -127 /
810 ! DATA IMACH(16) / 127 /
811 
812 ! MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES
813 
814 ! DATA IMACH( 1) / 5 /
815 ! DATA IMACH( 2) / 6 /
816 ! DATA IMACH( 3) / 43 /
817 ! DATA IMACH( 4) / 6 /
818 ! DATA IMACH( 5) / 36 /
819 ! DATA IMACH( 6) / 6 /
820 ! DATA IMACH( 7) / 2 /
821 ! DATA IMACH( 8) / 35 /
822 ! DATA IMACH( 9) / O377777777777 /
823 ! DATA IMACH(10) / 2 /
824 ! DATA IMACH(11) / 27 /
825 ! DATA IMACH(12) / -127 /
826 ! DATA IMACH(13) / 127 /
827 ! DATA IMACH(14) / 63 /
828 ! DATA IMACH(15) / -127 /
829 ! DATA IMACH(16) / 127 /
830 
831 ! MACHINE CONSTANTS FOR THE HP 2100
832 ! 3 WORD DOUBLE PRECISION OPTION WITH FTN4
833 
834 ! DATA IMACH(1) / 5/
835 ! DATA IMACH(2) / 6 /
836 ! DATA IMACH(3) / 4 /
837 ! DATA IMACH(4) / 1 /
838 ! DATA IMACH(5) / 16 /
839 ! DATA IMACH(6) / 2 /
840 ! DATA IMACH(7) / 2 /
841 ! DATA IMACH(8) / 15 /
842 ! DATA IMACH(9) / 32767 /
843 ! DATA IMACH(10)/ 2 /
844 ! DATA IMACH(11)/ 23 /
845 ! DATA IMACH(12)/ -128 /
846 ! DATA IMACH(13)/ 127 /
847 ! DATA IMACH(14)/ 39 /
848 ! DATA IMACH(15)/ -128 /
849 ! DATA IMACH(16)/ 127 /
850 
851 ! MACHINE CONSTANTS FOR THE HP 2100
852 ! 4 WORD DOUBLE PRECISION OPTION WITH FTN4
853 
854 ! DATA IMACH(1) / 5 /
855 ! DATA IMACH(2) / 6 /
856 ! DATA IMACH(3) / 4 /
857 ! DATA IMACH(4) / 1 /
858 ! DATA IMACH(5) / 16 /
859 ! DATA IMACH(6) / 2 /
860 ! DATA IMACH(7) / 2 /
861 ! DATA IMACH(8) / 15 /
862 ! DATA IMACH(9) / 32767 /
863 ! DATA IMACH(10)/ 2 /
864 ! DATA IMACH(11)/ 23 /
865 ! DATA IMACH(12)/ -128 /
866 ! DATA IMACH(13)/ 127 /
867 ! DATA IMACH(14)/ 55 /
868 ! DATA IMACH(15)/ -128 /
869 ! DATA IMACH(16)/ 127 /
870 
871 ! MACHINE CONSTANTS FOR THE HP 9000
872 
873 ! DATA IMACH(1) / 5 /
874 ! DATA IMACH(2) / 6 /
875 ! DATA IMACH(3) / 6 /
876 ! DATA IMACH(3) / 7 /
877 ! DATA IMACH(5) / 32 /
878 ! DATA IMACH(6) / 4 /
879 ! DATA IMACH(7) / 2 /
880 ! DATA IMACH(8) / 32 /
881 ! DATA IMACH(9) /2147483647 /
882 ! DATA IMACH(10) / 2 /
883 ! DATA IMACH(11) / 24 /
884 ! DATA IMACH(12) / -126 /
885 ! DATA IMACH(13) / 127 /
886 ! DATA IMACH(14) / 53 /
887 ! DATA IMACH(15) /-1015 /
888 ! DATA IMACH(16) / 1017 /
889 
890 ! MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
891 ! THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86, AND
892 ! THE PERKIN ELMER (INTERDATA) 7/32.
893 
894 ! DATA IMACH( 1) / 5 /
895 ! DATA IMACH( 2) / 6 /
896 ! DATA IMACH( 3) / 7 /
897 ! DATA IMACH( 4) / 6 /
898 ! DATA IMACH( 5) / 32 /
899 ! DATA IMACH( 6) / 4 /
900 ! DATA IMACH( 7) / 16 /
901 ! DATA IMACH( 8) / 31 /
902 ! DATA IMACH( 9) / Z7FFFFFFF /
903 ! DATA IMACH(10) / 16 /
904 ! DATA IMACH(11) / 6 /
905 ! DATA IMACH(12) / -64 /
906 ! DATA IMACH(13) / 63 /
907 ! DATA IMACH(14) / 14 /
908 ! DATA IMACH(15) / -64 /
909 ! DATA IMACH(16) / 63 /
910 
911 ! MACHINE CONSTANTS FOR THE IBM PC
912 
913  DATA imach( 1) / 5 /
914  DATA imach( 2) / 6 /
915  DATA imach( 3) / 0 /
916  DATA imach( 4) / 0 /
917  DATA imach( 5) / 32 /
918  DATA imach( 6) / 4 /
919  DATA imach( 7) / 2 /
920  DATA imach( 8) / 31 /
921  DATA imach( 9) / 2147483647 /
922  DATA imach(10) / 2 /
923  DATA imach(11) / 24 /
924  DATA imach(12) / -125 /
925  DATA imach(13) / 127 /
926  DATA imach(14) / 53 /
927  DATA imach(15) / -1021 /
928  DATA imach(16) / 1023 /
929 
930 ! MACHINE CONSTANTS FOR THE PDP-10 (KA PROCESSOR)
931 
932 ! DATA IMACH( 1) / 5 /
933 ! DATA IMACH( 2) / 6 /
934 ! DATA IMACH( 3) / 5 /
935 ! DATA IMACH( 4) / 6 /
936 ! DATA IMACH( 5) / 36 /
937 ! DATA IMACH( 6) / 5 /
938 ! DATA IMACH( 7) / 2 /
939 ! DATA IMACH( 8) / 35 /
940 ! DATA IMACH( 9) / "377777777777 /
941 ! DATA IMACH(10) / 2 /
942 ! DATA IMACH(11) / 27 /
943 ! DATA IMACH(12) / -128 /
944 ! DATA IMACH(13) / 127 /
945 ! DATA IMACH(14) / 54 /
946 ! DATA IMACH(15) / -101 /
947 ! DATA IMACH(16) / 127 /
948 
949 ! MACHINE CONSTANTS FOR THE PDP-10 (KI PROCESSOR)
950 
951 ! DATA IMACH( 1) / 5 /
952 ! DATA IMACH( 2) / 6 /
953 ! DATA IMACH( 3) / 5 /
954 ! DATA IMACH( 4) / 6 /
955 ! DATA IMACH( 5) / 36 /
956 ! DATA IMACH( 6) / 5 /
957 ! DATA IMACH( 7) / 2 /
958 ! DATA IMACH( 8) / 35 /
959 ! DATA IMACH( 9) / "377777777777 /
960 ! DATA IMACH(10) / 2 /
961 ! DATA IMACH(11) / 27 /
962 ! DATA IMACH(12) / -128 /
963 ! DATA IMACH(13) / 127 /
964 ! DATA IMACH(14) / 62 /
965 ! DATA IMACH(15) / -128 /
966 ! DATA IMACH(16) / 127 /
967 
968 ! MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
969 ! 32-BIT INTEGER ARITHMETIC.
970 
971 ! DATA IMACH( 1) / 5 /
972 ! DATA IMACH( 2) / 6 /
973 ! DATA IMACH( 3) / 5 /
974 ! DATA IMACH( 4) / 6 /
975 ! DATA IMACH( 5) / 32 /
976 ! DATA IMACH( 6) / 4 /
977 ! DATA IMACH( 7) / 2 /
978 ! DATA IMACH( 8) / 31 /
979 ! DATA IMACH( 9) / 2147483647 /
980 ! DATA IMACH(10) / 2 /
981 ! DATA IMACH(11) / 24 /
982 ! DATA IMACH(12) / -127 /
983 ! DATA IMACH(13) / 127 /
984 ! DATA IMACH(14) / 56 /
985 ! DATA IMACH(15) / -127 /
986 ! DATA IMACH(16) / 127 /
987 
988 ! MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
989 ! 16-BIT INTEGER ARITHMETIC.
990 
991 ! DATA IMACH( 1) / 5 /
992 ! DATA IMACH( 2) / 6 /
993 ! DATA IMACH( 3) / 5 /
994 ! DATA IMACH( 4) / 6 /
995 ! DATA IMACH( 5) / 16 /
996 ! DATA IMACH( 6) / 2 /
997 ! DATA IMACH( 7) / 2 /
998 ! DATA IMACH( 8) / 15 /
999 ! DATA IMACH( 9) / 32767 /
1000 ! DATA IMACH(10) / 2 /
1001 ! DATA IMACH(11) / 24 /
1002 ! DATA IMACH(12) / -127 /
1003 ! DATA IMACH(13) / 127 /
1004 ! DATA IMACH(14) / 56 /
1005 ! DATA IMACH(15) / -127 /
1006 ! DATA IMACH(16) / 127 /
1007 
1008 ! MACHINE CONSTANTS FOR THE SUN
1009 
1010 ! DATA IMACH(1) / 5 /
1011 ! DATA IMACH(2) / 6 /
1012 ! DATA IMACH(3) / 6 /
1013 ! DATA IMACH(4) / 6 /
1014 ! DATA IMACH(5) / 32 /
1015 ! DATA IMACH(6) / 4 /
1016 ! DATA IMACH(7) / 2 /
1017 ! DATA IMACH(8) / 31 /
1018 ! DATA IMACH(9) /2147483647 /
1019 ! DATA IMACH(10)/ 2 /
1020 ! DATA IMACH(11)/ 24 /
1021 ! DATA IMACH(12)/ -125 /
1022 ! DATA IMACH(13)/ 128 /
1023 ! DATA IMACH(14)/ 53 /
1024 ! DATA IMACH(15)/ -1021 /
1025 ! DATA IMACH(16)/ 1024 /
1026 
1027 ! MACHINE CONSTANTS FOR THE UNIVA! 1100 SERIES FTN COMPILER
1028 
1029 ! DATA IMACH( 1) / 5 /
1030 ! DATA IMACH( 2) / 6 /
1031 ! DATA IMACH( 3) / 1 /
1032 ! DATA IMACH( 4) / 6 /
1033 ! DATA IMACH( 5) / 36 /
1034 ! DATA IMACH( 6) / 4 /
1035 ! DATA IMACH( 7) / 2 /
1036 ! DATA IMACH( 8) / 35 /
1037 ! DATA IMACH( 9) / O377777777777 /
1038 ! DATA IMACH(10) / 2 /
1039 ! DATA IMACH(11) / 27 /
1040 ! DATA IMACH(12) / -128 /
1041 ! DATA IMACH(13) / 127 /
1042 ! DATA IMACH(14) / 60 /
1043 ! DATA IMACH(15) /-1024 /
1044 ! DATA IMACH(16) / 1023 /
1045 
1046 ! MACHINE CONSTANTS FOR THE VAX 11/780
1047 
1048 ! DATA IMACH(1) / 5 /
1049 ! DATA IMACH(2) / 6 /
1050 ! DATA IMACH(3) / 5 /
1051 ! DATA IMACH(4) / 6 /
1052 ! DATA IMACH(5) / 32 /
1053 ! DATA IMACH(6) / 4 /
1054 ! DATA IMACH(7) / 2 /
1055 ! DATA IMACH(8) / 31 /
1056 ! DATA IMACH(9) /2147483647 /
1057 ! DATA IMACH(10)/ 2 /
1058 ! DATA IMACH(11)/ 24 /
1059 ! DATA IMACH(12)/ -127 /
1060 ! DATA IMACH(13)/ 127 /
1061 ! DATA IMACH(14)/ 56 /
1062 ! DATA IMACH(15)/ -127 /
1063 ! DATA IMACH(16)/ 127 /
1064 
1065 ! MACHINE CONSTANTS FOR THE Z80 MICROPROCESSOR
1066 
1067 ! DATA IMACH( 1) / 1/
1068 ! DATA IMACH( 2) / 1/
1069 ! DATA IMACH( 3) / 0/
1070 ! DATA IMACH( 4) / 1/
1071 ! DATA IMACH( 5) / 16/
1072 ! DATA IMACH( 6) / 2/
1073 ! DATA IMACH( 7) / 2/
1074 ! DATA IMACH( 8) / 15/
1075 ! DATA IMACH( 9) / 32767/
1076 ! DATA IMACH(10) / 2/
1077 ! DATA IMACH(11) / 24/
1078 ! DATA IMACH(12) / -127/
1079 ! DATA IMACH(13) / 127/
1080 ! DATA IMACH(14) / 56/
1081 ! DATA IMACH(15) / -127/
1082 ! DATA IMACH(16) / 127/
1083 
1084 !***FIRST EXECUTABLE STATEMENT I1MACH
1085  IF (i .LT. 1 .OR. i .GT. 16) GO TO 10
1086 
1087  i1mach = imach(i)
1088  RETURN
1089 
1090  10 CONTINUE
1091  WRITE (unit = output, fmt = 9000)
1092  9000 FORMAT ('1ERROR 1 IN I1MACH - I OUT OF BOUNDS')
1093 
1094 ! CALL FDUMP
1095 
1096  stop
1097 END FUNCTION i1mach
1098 ! ---------------------------------------------------------------------
1099 SUBROUTINE xerror(MESSG,NMESSG,NERR,LEVEL)
1100 !***BEGIN PROLOGUE XERROR
1101 !***DATE WRITTEN 790801 (YYMMDD)
1102 !***REVISION DATE 861211 (YYMMDD)
1103 !***CATEGORY NO. R3C
1104 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERROR-A),ERROR
1105 !***AUTHOR JONES, R. E., (SNLA)
1106 !***PURPOSE Process an error (diagnostic) message.
1107 !***DESCRIPTION
1108 
1109 ! Abstract
1110 ! XERROR processes a diagnostic message, in a manner
1111 ! determined by the value of LEVEL and the current value
1112 ! of the library error control flag, KONTRL.
1113 ! (See subroutine XSETF for details.)
1114 
1115 ! Description of Parameters
1116 ! --Input--
1117 ! MESSG - the Hollerith message to be processed, containing
1118 ! no more than 72 characters.
1119 ! NMESSG- the actual number of characters in MESSG.
1120 ! NERR - the error number associated with this message.
1121 ! NERR must not be zero.
1122 ! LEVEL - error category.
1123 ! =2 means this is an unconditionally fatal error.
1124 ! =1 means this is a recoverable error. (I.e., it is
1125 ! non-fatal if XSETF has been appropriately called.)
1126 ! =0 means this is a warning message only.
1127 ! =-1 means this is a warning message which is to be
1128 ! printed at most once, regardless of how many
1129 ! times this call is executed.
1130 
1131 ! Examples
1132 ! CALL XERROR('SMOOTH -- NUM WAS ZERO.',23,1,2)
1133 ! CALL XERROR('INTEG -- LESS THAN FULL ACCURACY ACHIEVED.',
1134 ! 1 43,2,1)
1135 ! CALL XERROR('ROOTER -- ACTUAL ZERO OF F FOUND BEFORE INTERVAL F
1136 ! 1ULLY COLLAPSED.',65,3,0)
1137 ! CALL XERROR('EXP -- UNDERFLOWS BEING SET TO ZERO.',39,1,-1)
1138 
1139 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1140 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1141 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1142 ! 1982.
1143 !***ROUTINES CALLED XERRWV
1144 !***END PROLOGUE XERROR
1145  CHARACTER*(*) messg
1146 !***FIRST EXECUTABLE STATEMENT XERROR
1147  CALL xerrwv(messg,nmessg,nerr,level,0,0,0,0,0.,0.)
1148  RETURN
1149 END SUBROUTINE xerror
1150 ! ---------------------------------------------------------------------
1151  SUBROUTINE xerrwv(MESSG,NMESSG,NERR,LEVEL,NI,I1,I2,NR,R1,R2)
1152 !***BEGIN PROLOGUE XERRWV
1153 !***DATE WRITTEN 800319 (YYMMDD)
1154 !***REVISION DATE 890531 (YYMMDD)
1155 !***CATEGORY NO. R3C
1156 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERRWV-A),ERROR
1157 !***AUTHOR JONES, R. E., (SNLA)
1158 !***PURPOSE Process an error message allowing 2 integer and 2 real
1159 ! values to be included in the message.
1160 !***DESCRIPTION
1161 
1162 ! Abstract
1163 ! XERRWV processes a diagnostic message, in a manner
1164 ! determined by the value of LEVEL and the current value
1165 ! of the library error control flag, KONTRL.
1166 ! (See subroutine XSETF for details.)
1167 ! In addition, up to two integer values and two real
1168 ! values may be printed along with the message.
1169 
1170 ! Description of Parameters
1171 ! --Input--
1172 ! MESSG - the Hollerith message to be processed.
1173 ! NMESSG- the actual number of characters in MESSG.
1174 ! NERR - the error number associated with this message.
1175 ! NERR must not be zero.
1176 ! LEVEL - error category.
1177 ! =2 means this is an unconditionally fatal error.
1178 ! =1 means this is a recoverable error. (I.e., it is
1179 ! non-fatal if XSETF has been appropriately called.)
1180 ! =0 means this is a warning message only.
1181 ! =-1 means this is a warning message which is to be
1182 ! printed at most once, regardless of how many
1183 ! times this call is executed.
1184 ! NI - number of integer values to be printed. (0 to 2)
1185 ! I1 - first integer value.
1186 ! I2 - second integer value.
1187 ! NR - number of real values to be printed. (0 to 2)
1188 ! R1 - first real value.
1189 ! R2 - second real value.
1190 
1191 ! Examples
1192 ! CALL XERRWV('SMOOTH -- NUM (=I1) WAS ZERO.',29,1,2,
1193 ! 1 1,NUM,0,0,0.,0.)
1194 ! CALL XERRWV('QUADXY -- REQUESTED ERROR (R1) LESS THAN MINIMUM (
1195 ! 1R2).,54,77,1,0,0,0,2,ERRREQ,ERRMIN)
1196 
1197 ! Latest revision --- 1 August 1985
1198 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1199 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1200 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1201 ! 1982.
1202 !***ROUTINES CALLED FDUMP,I1MACH,J4SAVE,XERABT,XERCTL,XERPRT,XERSAV,
1203 ! XGETUA
1204 !***END PROLOGUE XERRWV
1205 
1206 ! ----------------------------------------------------------------------
1207 
1208 ! Change record:
1209 ! 89-05-31 Changed all specific intrinsics to generic. (WRB)
1210 
1211 ! ----------------------------------------------------------------------
1212 
1213  CHARACTER*(*) messg
1214  CHARACTER*20 lfirst
1215  CHARACTER*37 form
1216  dimension lun(5)
1217 ! GET FLAGS
1218 !***FIRST EXECUTABLE STATEMENT XERRWV
1219  lkntrl = j4save(2,0,.false.)
1220  maxmes = j4save(4,0,.false.)
1221 ! CHECK FOR VALID INPUT
1222  IF ((nmessg.GT.0).AND.(nerr.NE.0).AND. &
1223  (level.GE.(-1)).AND.(level.LE.2)) GO TO 10
1224  IF (lkntrl.GT.0) CALL xerprt('FATAL ERROR IN...',17)
1225  CALL xerprt('XERROR -- INVALID INPUT',23)
1226  IF (lkntrl.GT.0) CALL fdump
1227  IF (lkntrl.GT.0) CALL xerprt('JOB ABORT DUE TO FATAL ERROR.', &
1228  29)
1229  IF (lkntrl.GT.0) CALL xersav(' ',0,0,0,kdummy)
1230  CALL xerabt('XERROR -- INVALID INPUT',23)
1231  RETURN
1232  10 CONTINUE
1233 ! RECORD MESSAGE
1234  junk = j4save(1,nerr,.true.)
1235  CALL xersav(messg,nmessg,nerr,level,kount)
1236 ! LET USER OVERRIDE
1237  lfirst = messg
1238  lmessg = nmessg
1239  lerr = nerr
1240  llevel = level
1241  CALL xerctl(lfirst,lmessg,lerr,llevel,lkntrl)
1242 ! RESET TO ORIGINAL VALUES
1243  lmessg = nmessg
1244  lerr = nerr
1245  llevel = level
1246  lkntrl = max(-2,min(2,lkntrl))
1247  mkntrl = abs(lkntrl)
1248 ! DECIDE WHETHER TO PRINT MESSAGE
1249  IF ((llevel.LT.2).AND.(lkntrl.EQ.0)) GO TO 100
1250  IF (((llevel.EQ.(-1)).AND.(kount.GT.min(1,maxmes))) &
1251  .OR.((llevel.EQ.0) .AND.(kount.GT.maxmes)) &
1252  .OR.((llevel.EQ.1) .AND.(kount.GT.maxmes).AND.(mkntrl.EQ.1)) &
1253  .OR.((llevel.EQ.2) .AND.(kount.GT.max(1,maxmes)))) GO TO 100
1254  IF (lkntrl.LE.0) GO TO 20
1255  CALL xerprt(' ',1)
1256 ! INTRODUCTION
1257  IF (llevel.EQ.(-1)) CALL xerprt &
1258  ('WARNING MESSAGE...THIS MESSAGE WILL ONLY BE PRINTED ONCE.',57)
1259  IF (llevel.EQ.0) CALL xerprt('WARNING IN...',13)
1260  IF (llevel.EQ.1) CALL xerprt &
1261  ('RECOVERABLE ERROR IN...',23)
1262  IF (llevel.EQ.2) CALL xerprt('FATAL ERROR IN...',17)
1263  20 CONTINUE
1264 ! MESSAGE
1265  CALL xerprt(messg,lmessg)
1266  CALL xgetua(lun,nunit)
1267  isizei = log10(REAL(i1mach(9))) + 1.0
1268  isizef = log10(REAL(i1mach(10))**i1mach(11)) + 1.0
1269  DO 50 kunit=1,nunit
1270  iunit = lun(kunit)
1271  IF (iunit.EQ.0) iunit = i1mach(4)
1272  DO 22 i=1,min(ni,2)
1273  WRITE (form,21) i,isizei
1274  21 FORMAT ('(11X,21HIN ABOVE MESSAGE, I',i1,'=,I',i2,') ')
1275  IF (i.EQ.1) WRITE (iunit,form) i1
1276  IF (i.EQ.2) WRITE (iunit,form) i2
1277  22 CONTINUE
1278  DO 24 i=1,min(nr,2)
1279  WRITE (form,23) i,isizef+10,isizef
1280  23 FORMAT ('(11X,21HIN ABOVE MESSAGE, R',i1,'=,E', &
1281  i2,'.',i2,')')
1282  IF (i.EQ.1) WRITE (iunit,form) r1
1283  IF (i.EQ.2) WRITE (iunit,form) r2
1284  24 CONTINUE
1285  IF (lkntrl.LE.0) GO TO 40
1286 ! ERROR NUMBER
1287  WRITE (iunit,30) lerr
1288  30 FORMAT (15h error number =,i10)
1289  40 CONTINUE
1290  50 CONTINUE
1291 ! TRACE-BACK
1292  IF (lkntrl.GT.0) CALL fdump
1293  100 CONTINUE
1294  ifatal = 0
1295  IF ((llevel.EQ.2).OR.((llevel.EQ.1).AND.(mkntrl.EQ.2))) &
1296  ifatal = 1
1297 ! QUIT HERE IF MESSAGE IS NOT FATAL
1298  IF (ifatal.LE.0) RETURN
1299  IF ((lkntrl.LE.0).OR.(kount.GT.max(1,maxmes))) GO TO 120
1300 ! PRINT REASON FOR ABORT
1301  IF (llevel.EQ.1) CALL xerprt &
1302  ('JOB ABORT DUE TO UNRECOVERED ERROR.',35)
1303  IF (llevel.EQ.2) CALL xerprt &
1304  ('JOB ABORT DUE TO FATAL ERROR.',29)
1305 ! PRINT ERROR SUMMARY
1306  CALL xersav(' ',-1,0,0,kdummy)
1307  120 CONTINUE
1308 ! ABORT
1309  IF ((llevel.EQ.2).AND.(kount.GT.max(1,maxmes))) lmessg = 0
1310  CALL xerabt(messg,lmessg)
1311  RETURN
1312 END SUBROUTINE xerrwv
1313 ! ---------------------------------------------------------------------
1314 FUNCTION j4save(IWHICH,IVALUE,ISET)
1315 !***BEGIN PROLOGUE J4SAVE
1316 !***REFER TO XERROR
1317 !***ROUTINES CALLED (NONE)
1318 !***DESCRIPTION
1319 
1320 ! Abstract
1321 ! J4SAVE saves and recalls several global variables needed
1322 ! by the library error handling routines.
1323 
1324 ! Description of Parameters
1325 ! --Input--
1326 ! IWHICH - Index of item desired.
1327 ! = 1 Refers to current error number.
1328 ! = 2 Refers to current error control flag.
1329 ! = 3 Refers to current unit number to which error
1330 ! messages are to be sent. (0 means use standard.)
1331 ! = 4 Refers to the maximum number of times any
1332 ! message is to be printed (as set by XERMAX).
1333 ! = 5 Refers to the total number of units to which
1334 ! each error message is to be written.
1335 ! = 6 Refers to the 2nd unit for error messages
1336 ! = 7 Refers to the 3rd unit for error messages
1337 ! = 8 Refers to the 4th unit for error messages
1338 ! = 9 Refers to the 5th unit for error messages
1339 ! IVALUE - The value to be set for the IWHICH-th parameter,
1340 ! if ISET is .TRUE. .
1341 ! ISET - If ISET=.TRUE., the IWHICH-th parameter will BE
1342 ! given the value, IVALUE. If ISET=.FALSE., the
1343 ! IWHICH-th parameter will be unchanged, and IVALUE
1344 ! is a dummy parameter.
1345 ! --Output--
1346 ! The (old) value of the IWHICH-th parameter will be returned
1347 ! in the function value, J4SAVE.
1348 
1349 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1350 ! Adapted from Bell Laboratories PORT Library Error Handler
1351 ! Latest revision --- 1 August 1985
1352 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1353 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1354 ! 1982.
1355 !***END PROLOGUE J4SAVE
1356  LOGICAL iset
1357  INTEGER iparam(9)
1358  SAVE iparam
1359  DATA iparam(1),iparam(2),iparam(3),iparam(4)/0,2,0,10/
1360  DATA iparam(5)/1/
1361  DATA iparam(6),iparam(7),iparam(8),iparam(9)/0,0,0,0/
1362 !***FIRST EXECUTABLE STATEMENT J4SAVE
1363  j4save = iparam(iwhich)
1364  IF (iset) iparam(iwhich) = ivalue
1365  RETURN
1366  END FUNCTION j4save
1367 ! ---------------------------------------------------------------------
1368  SUBROUTINE xersav(MESSG,NMESSG,NERR,LEVEL,ICOUNT)
1369 !***BEGIN PROLOGUE XERSAV
1370 !***DATE WRITTEN 800319 (YYMMDD)
1371 !***REVISION DATE 861211 (YYMMDD)
1372 !***CATEGORY NO. R3
1373 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERSAV-A),ERROR
1374 !***AUTHOR JONES, R. E., (SNLA)
1375 !***PURPOSE Record that an error has occurred.
1376 !***DESCRIPTION
1377 
1378 ! Abstract
1379 ! Record that this error occurred.
1380 
1381 ! Description of Parameters
1382 ! --Input--
1383 ! MESSG, NMESSG, NERR, LEVEL are as in XERROR,
1384 ! except that when NMESSG=0 the tables will be
1385 ! dumped and cleared, and when NMESSG is less than zero the
1386 ! tables will be dumped and not cleared.
1387 ! --Output--
1388 ! ICOUNT will be the number of times this message has
1389 ! been seen, or zero if the table has overflowed and
1390 ! does not contain this message specifically.
1391 ! When NMESSG=0, ICOUNT will not be altered.
1392 
1393 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1394 ! Latest revision --- 1 August 1985
1395 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1396 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1397 ! 1982.
1398 !***ROUTINES CALLED I1MACH,XGETUA
1399 !***END PROLOGUE XERSAV
1400  INTEGER lun(5)
1401  CHARACTER*(*) messg
1402  CHARACTER*20 mestab(10),mes
1403  dimension nertab(10),levtab(10),kount(10)
1404  SAVE mestab,nertab,levtab,kount,kountx
1405 ! NEXT TWO DATA STATEMENTS ARE NECESSARY TO PROVIDE A BLANK
1406 ! ERROR TABLE INITIALLY
1407  DATA kount(1),kount(2),kount(3),kount(4),kount(5), &
1408  kount(6),kount(7),kount(8),kount(9),kount(10) &
1409  /0,0,0,0,0,0,0,0,0,0/
1410  DATA kountx/0/
1411 !***FIRST EXECUTABLE STATEMENT XERSAV
1412  IF (nmessg.GT.0) GO TO 80
1413 ! DUMP THE TABLE
1414  IF (kount(1).EQ.0) RETURN
1415 ! PRINT TO EACH UNIT
1416  CALL xgetua(lun,nunit)
1417  DO 60 kunit=1,nunit
1418  iunit = lun(kunit)
1419  IF (iunit.EQ.0) iunit = i1mach(4)
1420 ! PRINT TABLE HEADER
1421  WRITE (iunit,10)
1422  10 FORMAT (32h0 error message summary/ &
1423  51h message start nerr level count)
1424 ! PRINT BODY OF TABLE
1425  DO 20 i=1,10
1426  IF (kount(i).EQ.0) GO TO 30
1427  WRITE (iunit,15) mestab(i),nertab(i),levtab(i),kount(i)
1428  15 FORMAT (1x,a20,3i10)
1429  20 CONTINUE
1430  30 CONTINUE
1431 ! PRINT NUMBER OF OTHER ERRORS
1432  IF (kountx.NE.0) WRITE (iunit,40) kountx
1433  40 FORMAT (41h0other errors not individually tabulated=,i10)
1434  WRITE (iunit,50)
1435  50 FORMAT (1x)
1436  60 CONTINUE
1437  IF (nmessg.LT.0) RETURN
1438 ! CLEAR THE ERROR TABLES
1439  DO 70 i=1,10
1440  70 kount(i) = 0
1441  kountx = 0
1442  RETURN
1443  80 CONTINUE
1444 ! PROCESS A MESSAGE...
1445 ! SEARCH FOR THIS MESSG, OR ELSE AN EMPTY SLOT FOR THIS MESSG,
1446 ! OR ELSE DETERMINE THAT THE ERROR TABLE IS FULL.
1447  mes = messg
1448  DO 90 i=1,10
1449  ii = i
1450  IF (kount(i).EQ.0) GO TO 110
1451  IF (mes.NE.mestab(i)) GO TO 90
1452  IF (nerr.NE.nertab(i)) GO TO 90
1453  IF (level.NE.levtab(i)) GO TO 90
1454  GO TO 100
1455  90 CONTINUE
1456 ! THREE POSSIBLE CASES...
1457 ! TABLE IS FULL
1458  kountx = kountx+1
1459  icount = 1
1460  RETURN
1461 ! MESSAGE FOUND IN TABLE
1462  100 kount(ii) = kount(ii) + 1
1463  icount = kount(ii)
1464  RETURN
1465 ! EMPTY SLOT FOUND FOR NEW MESSAGE
1466  110 mestab(ii) = mes
1467  nertab(ii) = nerr
1468  levtab(ii) = level
1469  kount(ii) = 1
1470  icount = 1
1471  RETURN
1472 END SUBROUTINE xersav
1473 ! ---------------------------------------------------------------------
1474 SUBROUTINE xgetua(IUNITA,N)
1475 !***BEGIN PROLOGUE XGETUA
1476 !***DATE WRITTEN 790801 (YYMMDD)
1477 !***REVISION DATE 861211 (YYMMDD)
1478 !***CATEGORY NO. R3C
1479 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XGETUA-A),ERROR
1480 !***AUTHOR JONES, R. E., (SNLA)
1481 !***PURPOSE Return unit number(s) to which error messages are being
1482 ! sent.
1483 !***DESCRIPTION
1484 
1485 ! Abstract
1486 ! XGETUA may be called to determine the unit number or numbers
1487 ! to which error messages are being sent.
1488 ! These unit numbers may have been set by a call to XSETUN,
1489 ! or a call to XSETUA, or may be a default value.
1490 
1491 ! Description of Parameters
1492 ! --Output--
1493 ! IUNIT - an array of one to five unit numbers, depending
1494 ! on the value of N. A value of zero refers to the
1495 ! default unit, as defined by the I1MACH machine
1496 ! constant routine. Only IUNIT(1),...,IUNIT(N) are
1497 ! defined by XGETUA. The values of IUNIT(N+1),...,
1498 ! IUNIT(5) are not defined (for N .LT. 5) or altered
1499 ! in any way by XGETUA.
1500 ! N - the number of units to which copies of the
1501 ! error messages are being sent. N will be in the
1502 ! range from 1 to 5.
1503 
1504 ! Latest revision --- 19 MAR 1980
1505 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1506 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1507 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1508 ! 1982.
1509 !***ROUTINES CALLED J4SAVE
1510 !***END PROLOGUE XGETUA
1511  dimension iunita(5)
1512 !***FIRST EXECUTABLE STATEMENT XGETUA
1513  n = j4save(5,0,.false.)
1514  DO 30 i=1,n
1515  index = i+4
1516  IF (i.EQ.1) index = 3
1517  iunita(i) = j4save(index,0,.false.)
1518  30 CONTINUE
1519  RETURN
1520 END SUBROUTINE xgetua
1521 ! ---------------------------------------------------------------------
1522 SUBROUTINE xerctl(MESSG1,NMESSG,NERR,LEVEL,KONTRL)
1523 !***BEGIN PROLOGUE XERCTL
1524 !***DATE WRITTEN 790801 (YYMMDD)
1525 !***REVISION DATE 861211 (YYMMDD)
1526 !***CATEGORY NO. R3C
1527 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERCTL-A),ERROR
1528 !***AUTHOR JONES, R. E., (SNLA)
1529 !***PURPOSE Allow user control over handling of errors.
1530 !***DESCRIPTION
1531 
1532 ! Abstract
1533 ! Allows user control over handling of individual errors.
1534 ! Just after each message is recorded, but before it is
1535 ! processed any further (i.e., before it is printed or
1536 ! a decision to abort is made), a call is made to XERCTL.
1537 ! If the user has provided his own version of XERCTL, he
1538 ! can then override the value of KONTROL used in processing
1539 ! this message by redefining its value.
1540 ! KONTRL may be set to any value from -2 to 2.
1541 ! The meanings for KONTRL are the same as in XSETF, except
1542 ! that the value of KONTRL changes only for this message.
1543 ! If KONTRL is set to a value outside the range from -2 to 2,
1544 ! it will be moved back into that range.
1545 
1546 ! Description of Parameters
1547 
1548 ! --Input--
1549 ! MESSG1 - the first word (only) of the error message.
1550 ! NMESSG - same as in the call to XERROR or XERRWV.
1551 ! NERR - same as in the call to XERROR or XERRWV.
1552 ! LEVEL - same as in the call to XERROR or XERRWV.
1553 ! KONTRL - the current value of the control flag as set
1554 ! by a call to XSETF.
1555 
1556 ! --Output--
1557 ! KONTRL - the new value of KONTRL. If KONTRL is not
1558 ! defined, it will remain at its original value.
1559 ! This changed value of control affects only
1560 ! the current occurrence of the current message.
1561 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1562 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1563 ! 1982.
1564 !***ROUTINES CALLED (NONE)
1565 !***END PROLOGUE XERCTL
1566  CHARACTER*20 messg1
1567 !***FIRST EXECUTABLE STATEMENT XERCTL
1568  RETURN
1569  END SUBROUTINE xerctl
1570 ! ---------------------------------------------------------------------
1571  SUBROUTINE xerprt(MESSG,NMESSG)
1572 !***BEGIN PROLOGUE XERPRT
1573 !***DATE WRITTEN 790801 (YYMMDD)
1574 !***REVISION DATE 890531 (YYMMDD)
1575 !***CATEGORY NO. R3
1576 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERPRT-A),ERROR
1577 !***AUTHOR JONES, R. E., (SNLA)
1578 !***PURPOSE Print error messages.
1579 !***DESCRIPTION
1580 
1581 ! Abstract
1582 ! Print the Hollerith message in MESSG, of length NMESSG,
1583 ! on each file indicated by XGETUA.
1584 ! Latest revision --- 1 August 1985
1585 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1586 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1587 ! 1982.
1588 !***ROUTINES CALLED I1MACH,XGETUA
1589 !***END PROLOGUE XERPRT
1590 
1591 ! ----------------------------------------------------------------------
1592 
1593 ! Change record:
1594 ! 89-05-31 Changed all specific intrinsics to generic. (WRB)
1595 
1596 ! ----------------------------------------------------------------------
1597 
1598  INTEGER lun(5)
1599  CHARACTER*(*) messg
1600 ! OBTAIN UNIT NUMBERS AND WRITE LINE TO EACH UNIT
1601 !***FIRST EXECUTABLE STATEMENT XERPRT
1602  CALL xgetua(lun,nunit)
1603  lenmes = len(messg)
1604  DO 20 kunit=1,nunit
1605  iunit = lun(kunit)
1606  IF (iunit.EQ.0) iunit = i1mach(4)
1607  DO 10 ichar=1,lenmes,72
1608  last = min(ichar+71 , lenmes)
1609  WRITE (iunit,'(1X,A)') messg(ichar:last)
1610  10 CONTINUE
1611  20 CONTINUE
1612  RETURN
1613 END SUBROUTINE xerprt
1614 ! ---------------------------------------------------------------------
1615 SUBROUTINE fdump
1616 !***BEGIN PROLOGUE FDUMP
1617 !***DATE WRITTEN 790801 (YYMMDD)
1618 !***REVISION DATE 861211 (YYMMDD)
1619 !***CATEGORY NO. R3
1620 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(FDUMP-A),ERROR
1621 !***AUTHOR JONES, R. E., (SNLA)
1622 !***PURPOSE Symbolic dump (should be locally written).
1623 !***DESCRIPTION
1624 
1625 ! ***Note*** Machine Dependent Routine
1626 ! FDUMP is intended to be replaced by a locally written
1627 ! version which produces a symbolic dump. Failing this,
1628 ! it should be replaced by a version which prints the
1629 ! subprogram nesting list. Note that this dump must be
1630 ! printed on each of up to five files, as indicated by the
1631 ! XGETUA routine. See XSETUA and XGETUA for details.
1632 
1633 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1634 !***REFERENCES (NONE)
1635 !***ROUTINES CALLED (NONE)
1636 !***END PROLOGUE FDUMP
1637 !***FIRST EXECUTABLE STATEMENT FDUMP
1638  RETURN
1639  END SUBROUTINE fdump
1640 ! ---------------------------------------------------------------------
1641  SUBROUTINE xerabt(MESSG,NMESSG)
1642 !***BEGIN PROLOGUE XERABT
1643 !***DATE WRITTEN 790801 (YYMMDD)
1644 !***REVISION DATE 861211 (YYMMDD)
1645 !***CATEGORY NO. R3C
1646 !***KEYWORDS LIBRARY=SLATEC(XERROR),TYPE=ALL(XERABT-A),ERROR
1647 !***AUTHOR JONES, R. E., (SNLA)
1648 !***PURPOSE Abort program execution and print error message.
1649 !***DESCRIPTION
1650 
1651 ! Abstract
1652 ! ***Note*** machine dependent routine
1653 ! XERABT aborts the execution of the program.
1654 ! The error message causing the abort is given in the calling
1655 ! sequence, in case one needs it for printing on a dayfile,
1656 ! for example.
1657 
1658 ! Description of Parameters
1659 ! MESSG and NMESSG are as in XERROR, except that NMESSG may
1660 ! be zero, in which case no message is being supplied.
1661 
1662 ! Written by Ron Jones, with SLATEC Common Math Library Subcommittee
1663 ! Latest revision --- 1 August 1982
1664 !***REFERENCES JONES R.E., KAHANER D.K., 'XERROR, THE SLATEC ERROR-
1665 ! HANDLING PACKAGE', SAND82-0800, SANDIA LABORATORIES,
1666 ! 1982.
1667 !***ROUTINES CALLED (NONE)
1668 !***END PROLOGUE XERABT
1669  CHARACTER*(*) messg
1670 !***FIRST EXECUTABLE STATEMENT XERABT
1671  stop
1672 END SUBROUTINE xerabt
1673 ! ---------------------------------------------------------------------
1674 END MODULE utilit
1675 ! end of file Utilit.f90