blob: 1e31795f7d6a89c4ca0ab9cc799cf18e2cbba6bf [file] [log] [blame] [view]
peter klausler3cecff62018-09-25 20:26:351<!--
2Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
3-->
4
peter klauslere7c5a4702018-09-25 22:23:015# A categorization of standard (2018) and extended Fortran intrinsic procedures
6
7This note attempts to group the intrinsic procedures of Fortran into categories
8of functions or subroutines with similar interfaces as an aid to
9comprehension beyond that which might be gained from the standard's
10alphabetical list.
11
12Few procedures are actually described here apart from their interfaces; see the
13Fortran 2018 standard (section 16) for the complete story.
14
15Intrinsic modules are not covered here.
peter klausler3cecff62018-09-25 20:26:3516
17## General rules
18
peter klauslere7c5a4702018-09-25 22:23:01191. The value of any intrinsic function's `KIND` actual argument, if present,
20 must be a scalar constant integer expression, of any kind, whose value
peter klausler3cecff62018-09-25 20:26:3521 resolves to some supported kind of the function's result type.
22 If optional and absent, the kind of the function's result is
23 either the default kind of that category or to the kind of an argument
24 (e.g., as in `AINT`).
251. Procedures are summarized with a non-Fortran syntax for brevity.
26 Wherever a function has a short definition, it appears after an
peter klauslere7c5a4702018-09-25 22:23:0127 equal sign as if it were a statement function. Any functions referenced
28 in these short summaries are intrinsic.
peter klausler3cecff62018-09-25 20:26:35291. Unless stated otherwise, an actual argument may have any supported kind
30 of a particular intrinsic type. Sometimes a pattern variable
31 can appear in a description (e.g., `REAL(k)`) when the kind of an
32 actual argument's type must match the kind of another argument, or
33 determines the kind type parameter of the function result.
341. When an intrinsic type name appears without a kind (e.g., `REAL`),
35 it refers to the default kind of that type. Sometimes the word
36 `default` will appear for clarity.
peter klauslere7c5a4702018-09-25 22:23:01371. The names of the dummy arguments actually matter because they can
38 be used as keywords for actual arguments.
391. All standard intrinsic functions are pure, even when not elemental.
peter klausler9849cf52018-09-25 21:47:55401. Assumed-rank arguments may not appear as actual arguments unless
41 expressly permitted.
peter klauslerbab1f672018-09-26 17:42:55421. When an argument is described with a default value, e.g. `KIND=KIND(0)`,
43 it is an optional argument. Optional arguments without defaults,
44 e.g. `DIM` on many transformationals, are wrapped in `[]` brackets
45 as in the Fortran standard. When an intrinsic has optional arguments
46 with and without default values, the arguments with default values
47 may appear within the brackets to preserve the order of arguments
48 (e.g., `COUNT`).
peter klausler3cecff62018-09-25 20:26:3549
50# Elemental intrinsic functions
51
peter klauslere7c5a4702018-09-25 22:23:0152Pure elemental semantics apply to these functions, to wit: when one or more of
peter klausler3cecff62018-09-25 20:26:3553the actual arguments are arrays, the arguments must be conformable, and
54the result is also an array.
55Scalar arguments are expanded when the arguments are not all scalars.
56
peter klausler9849cf52018-09-25 21:47:5557## Elemental intrinsic functions that may have unrestricted specific procedures
peter klausler370c44a2018-09-25 23:59:4158
peter klauslere7c5a4702018-09-25 22:23:0159When an elemental intrinsic function is documented here as having an
peter klausler9849cf52018-09-25 21:47:5560_unrestricted specific name_, that name may be passed as an actual
peter klauslere7c5a4702018-09-25 22:23:0161argument, used as the target of a procedure pointer, appear in
62a generic interface, and be otherwise used as if it were an external
63procedure.
peter klauslere7c5a4702018-09-25 22:23:0164An `INTRINSIC` statement or attribute may have to be applied to an
peter klausler370c44a2018-09-25 23:59:4165unrestricted specific name to enable such usage.
peter klauslere7c5a4702018-09-25 22:23:0166
peter klausler42d17f22018-09-26 19:58:4367When a name is being used as a specific procedure for any purpose other
68than that of a called function, the specific instance of the function
69that accepts and returns values of the default kinds of the intrinsic
70types is used.
peter klauslere7c5a4702018-09-25 22:23:0171A Fortran `INTERFACE` could be written to define each of
72these unrestricted specific intrinsic function names.
73
peter klausler3cecff62018-09-25 20:26:3574Calls to dummy arguments and procedure pointers that correspond to these
75specific names must pass only scalar actual argument values.
76
77No other intrinsic function name can be passed as an actual argument,
peter klausler42d17f22018-09-26 19:58:4378used as a pointer target, appear in a generic interface, or be otherwise
79used except as the name of a called function.
80Some of these _restricted specific intrinsic functions_, e.g. `FLOAT`,
81provide a means for invoking a corresponding generic (`REAL` in the case of `FLOAT`)
82with forced argument and result kinds.
83Others, viz. `CHAR`, `ICHAR`, `INT`, `REAL`, and the lexical comparisons like `LGE`,
84have the same name as their generic functions, and it is not clear what purpose
85is accomplished by the standard by defining them as specific functions.
peter klausler9849cf52018-09-25 21:47:5586
87### Trigonometric elemental intrinsic functions, generic and (mostly) specific
88All of these functions can be used as unrestricted specific names.
89
90```
91ACOS(REAL(k) X) -> REAL(k)
92ASIN(REAL(k) X) -> REAL(k)
93ATAN(REAL(k) X) -> REAL(k)
94ATAN(REAL(k) Y, REAL(k) X) -> REAL(k) = ATAN2(Y, X)
95ATAN2(REAL(k) Y, REAL(k) X) -> REAL(k)
96COS(REAL(k) X) -> REAL(k)
97COSH(REAL(k) X) -> REAL(k)
98SIN(REAL(k) X) -> REAL(k)
99SINH(REAL(k) X) -> REAL(k)
100TAN(REAL(k) X) -> REAL(k)
101TANH(REAL(k) X) -> REAL(k)
102```
103
104These `COMPLEX` versions of some of those functions, and the
105inverse hyperbolic functions, cannot be used as specific names.
106```
107ACOS(COMPLEX(k) X) -> COMPLEX(k)
108ASIN(COMPLEX(k) X) -> COMPLEX(k)
109ATAN(COMPLEX(k) X) -> COMPLEX(k)
110ACOSH(REAL(k) X) -> REAL(k)
111ACOSH(COMPLEX(k) X) -> COMPLEX(k)
112ASINH(REAL(k) X) -> REAL(k)
113ASINH(COMPLEX(k) X) -> COMPLEX(k)
114ATANH(REAL(k) X) -> REAL(k)
115ATANH(COMPLEX(k) X) -> COMPLEX(k)
116COS(COMPLEX(k) X) -> COMPLEX(k)
117COSH(COMPLEX(k) X) -> COMPLEX(k)
118SIN(COMPLEX(k) X) -> COMPLEX(k)
119SINH(COMPLEX(k) X) -> COMPLEX(k)
120TAN(COMPLEX(k) X) -> COMPLEX(k)
121TANH(COMPLEX(k) X) -> COMPLEX(k)
122```
123
124### Non-trigonometric elemental intrinsic functions, generic and specific
peter klauslere7c5a4702018-09-25 22:23:01125These functions *can* be used as unrestricted specific names.
peter klausler9849cf52018-09-25 21:47:55126```
peter klauslere7c5a4702018-09-25 22:23:01127ABS(REAL(k) A) -> REAL(k) = SIGN(A, 0.0)
128AIMAG(COMPLEX(k) Z) -> REAL(k) = Z%IM
peter klauslerbab1f672018-09-26 17:42:55129AINT(REAL(k) A, KIND=k) -> REAL(KIND)
130ANINT(REAL(k) A, KIND=k) -> REAL(KIND)
peter klauslere7c5a4702018-09-25 22:23:01131CONJG(COMPLEX(k) Z) -> COMPLEX(k) = CMPLX(Z%RE, -Z%IM)
peter klausler370c44a2018-09-25 23:59:41132DIM(REAL(k) X, REAL(k) Y) -> REAL(k) = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55133DPROD(default REAL X, default REAL Y) -> DOUBLE PRECISION = DBLE(X)*DBLE(Y)
134EXP(REAL(k) X) -> REAL(k)
peter klauslerbab1f672018-09-26 17:42:55135INDEX(CHARACTER(k) STRING, CHARACTER(k) SUBSTRING, LOGICAL(any) BACK=.FALSE., KIND=KIND(0)) -> INTEGER(KIND)
136LEN(CHARACTER(k,n) STRING, KIND=KIND(0)) -> INTEGER(KIND) = n
peter klausler9849cf52018-09-25 21:47:55137LOG(REAL(k) X) -> REAL(k)
138LOG10(REAL(k) X) -> REAL(k)
139MOD(INTEGER(k) A, INTEGER(k) P) -> INTEGER(k) = A-P*INT(A/P)
peter klauslerbab1f672018-09-26 17:42:55140NINT(REAL(k) A, KIND=KIND(0)) -> INTEGER(KIND)
peter klausler9849cf52018-09-25 21:47:55141SIGN(REAL(k) A, REAL(k) B) -> REAL(k)
peter klauslere7c5a4702018-09-25 22:23:01142SQRT(REAL(k) X) -> REAL(k) = X ** 0.5
peter klausler9849cf52018-09-25 21:47:55143```
144
peter klausler970e746c2018-09-25 22:36:00145These variants, however *cannot* be used as specific names without recourse to an alias
146from the following section:
peter klausler9849cf52018-09-25 21:47:55147```
peter klauslere7c5a4702018-09-25 22:23:01148ABS(INTEGER(k) A) -> INTEGER(k) = SIGN(A, 0)
149ABS(COMPLEX(k) A) -> REAL(k) = HYPOT(A%RE, A%IM)
peter klausler370c44a2018-09-25 23:59:41150DIM(INTEGER(k) X, INTEGER(k) Y) -> INTEGER(k) = X-MIN(X,Y)
peter klausler9849cf52018-09-25 21:47:55151EXP(COMPLEX(k) X) -> COMPLEX(k)
152LOG(COMPLEX(k) X) -> COMPLEX(k)
peter klauslere7c5a4702018-09-25 22:23:01153MOD(REAL(k) A, REAL(k) P) -> REAL(k) = A-P*INT(A/P)
peter klausler9849cf52018-09-25 21:47:55154SIGN(INTEGER(k) A, INTEGER(k) B) -> INTEGER(k)
peter klausler370c44a2018-09-25 23:59:41155SQRT(COMPLEX(k) X) -> COMPLEX(k)
peter klausler9849cf52018-09-25 21:47:55156```
peter klausler3cecff62018-09-25 20:26:35157
158### Unrestricted specific aliases for some elemental intrinsic functions with distinct names
159
160```
peter klausler9849cf52018-09-25 21:47:55161ALOG(REAL X) -> REAL = LOG(X)
162ALOG10(REAL X) -> REAL = LOG10(X)
163AMOD(REAL A, REAL P) -> REAL = MOD(A, P)
164CABS(COMPLEX A) = ABS(A)
165CCOS(COMPLEX X) = COS(X)
166CEXP(COMPLEX A) -> COMPLEX = EXP(A)
167CLOG(COMPLEX X) -> COMPLEX = LOG(X)
peter klausler42b33da2018-09-29 00:02:11168CSIN(COMPLEX X) -> COMPLEX = SIN(X)
peter klausler9849cf52018-09-25 21:47:55169CSQRT(COMPLEX X) -> COMPLEX = SQRT(X)
peter klausler42b33da2018-09-29 00:02:11170CTAN(COMPLEX X) -> COMPLEX = TAN(X)
171DABS(DOUBLE PRECISION A) -> DOUBLE PRECISION = ABS(A)
172DACOS(DOUBLE PRECISION X) -> DOUBLE PRECISION = ACOS(X)
173DASIN(DOUBLE PRECISION X) -> DOUBLE PRECISION = ASIN(X)
174DATAN(DOUBLE PRECISION X) -> DOUBLE PRECISION = ATAN(X)
175DATAN2(DOUBLE PRECISION Y, DOUBLE PRECISION X) -> DOUBLE PRECISION = ATAN2(Y, X)
176DCOS(DOUBLE PRECISION X) -> DOUBLE PRECISION = COS(X)
177DCOSH(DOUBLE PRECISION X) -> DOUBLE PRECISION = COSH(X)
peter klausler370c44a2018-09-25 23:59:41178DDIM(DOUBLE PRECISION X, DOUBLE PRECISION Y) -> DOUBLE PRECISION = X-MIN(X,Y)
peter klausler42b33da2018-09-29 00:02:11179DEXP(DOUBLE PRECISION X) -> DOUBLE PRECISION = EXP(X)
peter klausler9849cf52018-09-25 21:47:55180DINT(DOUBLE PRECISION A) -> DOUBLE PRECISION = AINT(A)
181DLOG(DOUBLE PRECISION X) -> DOUBLE PRECISION = LOG(X)
182DLOG10(DOUBLE PRECISION X) -> DOUBLE PRECISION = LOG10(X)
183DMOD(DOUBLE PRECISION A, DOUBLE PRECISION P) -> DOUBLE PRECISION = MOD(A, P)
peter klausler42b33da2018-09-29 00:02:11184DNINT(DOUBLE PRECISION A) -> DOUBLE PRECISION = ANINT(A)
peter klausler9849cf52018-09-25 21:47:55185DSIGN(DOUBLE PRECISION A, DOUBLE PRECISION B) -> DOUBLE PRECISION = SIGN(A, B)
peter klausler42b33da2018-09-29 00:02:11186DSIN(DOUBLE PRECISION X) -> DOUBLE PRECISION = SIN(X)
187DSINH(DOUBLE PRECISION X) -> DOUBLE PRECISION = SINH(X)
peter klausler9849cf52018-09-25 21:47:55188DSQRT(DOUBLE PRECISION X) -> DOUBLE PRECISION = SQRT(X)
peter klausler42b33da2018-09-29 00:02:11189DTAN(DOUBLE PRECISION X) -> DOUBLE PRECISION = TAN(X)
190DTANH(DOUBLE PRECISION X) -> DOUBLE PRECISION = TANH(X)
191IABS(INTEGER A) -> INTEGER = ABS(A)
peter klausler370c44a2018-09-25 23:59:41192IDIM(INTEGER X, INTEGER Y) -> INTEGER = X-MIN(X,Y)
peter klausler42b33da2018-09-29 00:02:11193IDNINT(DOUBLE PRECISION A) -> INTEGER = NINT(A)
peter klausler9849cf52018-09-25 21:47:55194ISIGN(INTEGER A, INTEGER B) -> INTEGER = SIGN(A, B)
peter klausler3cecff62018-09-25 20:26:35195```
196
197## Generic elemental intrinsic functions without specific names
198
peter klausler9849cf52018-09-25 21:47:55199(No procedures after this point can be passed as actual arguments, used as
200pointer targets, or appear as specific procedures in generic interfaces.)
201
peter klausler3cecff62018-09-25 20:26:35202### Elemental conversions
203
204```
peter klauslerbab1f672018-09-26 17:42:55205ACHAR(INTEGER(k) I, KIND=KIND('')) -> CHARACTER(KIND,LEN=1)
206CEILING(REAL() A, KIND=KIND(0)) -> INTEGER(KIND)
207CHAR(INTEGER(any) I, KIND=KIND('')) -> CHARACTER(KIND,LEN=1)
208CMPLX(COMPLEX(k) X, KIND=KIND(0.0D0)) -> COMPLEX(KIND)
209CMPLX(INTEGER or REAL or BOZ X, INTEGER or REAL or BOZ Y=0, KIND=KIND((0,0))) -> COMPLEX(KIND)
peter klausler9849cf52018-09-25 21:47:55210EXPONENT(REAL(any) X) -> default INTEGER
peter klauslerbab1f672018-09-26 17:42:55211FLOOR(REAL(any) A, KIND=KIND(0)) -> INTEGER(KIND)
212IACHAR(CHARACTER(KIND=k,LEN=1) C, KIND=KIND(0)) -> INTEGER(KIND)
213ICHAR(CHARACTER(KIND=k,LEN=1) C, KIND=KIND(0)) -> INTEGER(KIND)
214INT(INTEGER or REAL or COMPLEX or BOZ A, KIND=KIND(0)) -> INTEGER(KIND)
215LOGICAL(LOGICAL(any) L, KIND=KIND(.TRUE.)) -> LOGICAL(KIND)
216REAL(INTEGER or REAL or COMPLEX or BOZ A, KIND=KIND(0.0)) -> REAL(KIND)
peter klausler3cecff62018-09-25 20:26:35217```
218
219### Other generic elemental intrinsic functions without specific names
220N.B. `BESSEL_JN(N1, N2, X)` and `BESSEL_YN(N1, N2, X)` are categorized
peter klausler9849cf52018-09-25 21:47:55221below with the _transformational_ intrinsic functions.
peter klausler3cecff62018-09-25 20:26:35222
223```
peter klausler9849cf52018-09-25 21:47:55224BESSEL_J0(REAL(k) X) -> REAL(k)
225BESSEL_J1(REAL(k) X) -> REAL(k)
226BESSEL_JN(INTEGER(n) N, REAL(k) X) -> REAL(k)
227BESSEL_Y0(REAL(k) X) -> REAL(k)
228BESSEL_Y1(REAL(k) X) -> REAL(k)
229BESSEL_YN(INTEGER(n) N, REAL(k) X) -> REAL(k)
230ERF(REAL(k) X) -> REAL(k)
231ERFC(REAL(k) X) -> REAL(k)
232ERFC_SCALED(REAL(k) X) -> REAL(k)
233FRACTION(REAL(k) X) -> REAL(k)
234GAMMA(REAL(k) X) -> REAL(k)
peter klausler970e746c2018-09-25 22:36:00235HYPOT(REAL(k) X, REAL(k) Y) -> REAL(k) = SQRT(X*X+Y*Y) without spurious overflow
peter klausler42b33da2018-09-29 00:02:11236IMAGE_STATUS(INTEGER(any) IMAGE [, scalar TEAM_TYPE TEAM ]) -> default INTEGER
peter klausler9849cf52018-09-25 21:47:55237IS_IOSTAT_END(INTEGER(any) I) -> default LOGICAL
238IS_IOSTAT_EOR(INTEGER(any) I) -> default LOGICAL
239LOG_GAMMA(REAL(k) X) -> REAL(k)
240MAX(INTEGER(k) ...) -> INTEGER(k)
241MAX(REAL(k) ...) -> REAL(k)
242MAX(CHARACTER(KIND=k) ...) -> CHARACTER(KIND=k,LEN=MAX(LEN(...)))
243MERGE(any type TSOURCE, same type FSOURCE, LOGICAL(any) MASK) -> type of FSOURCE
244MIN(INTEGER(k) ...) -> INTEGER(k)
245MIN(REAL(k) ...) -> REAL(k)
246MIN(CHARACTER(KIND=k) ...) -> CHARACTER(KIND=k,LEN=MAX(LEN(...)))
247MODULO(INTEGER(k) A, INTEGER(k) P) -> INTEGER(k); P*result >= 0
248MODULO(REAL(k) A, REAL(k) P) -> REAL(k) = A - P*FLOOR(A/P)
249NEAREST(REAL(k) X, REAL(any) S) -> REAL(k)
peter klauslerbab1f672018-09-26 17:42:55250OUT_OF_RANGE(INTEGER(any) X, scalar INTEGER or REAL(k) MOLD) -> default LOGICAL
251OUT_OF_RANGE(REAL(any) X, scalar REAL(k) MOLD) -> default LOGICAL
252OUT_OF_RANGE(REAL(any) X, scalar INTEGER(any) MOLD, scalar LOGICAL(any) ROUND=.FALSE.) -> default LOGICAL
peter klausler9849cf52018-09-25 21:47:55253RRSPACING(REAL(k) X) -> REAL(k)
254SCALE(REAL(k) X, INTEGER(any) I) -> REAL(k)
255SET_EXPONENT(REAL(k) X, INTEGER(any) I) -> REAL(k)
256SPACING(REAL(k) X) -> REAL(k)
peter klausler3cecff62018-09-25 20:26:35257```
258
peter klausler9849cf52018-09-25 21:47:55259### Restricted specific aliases for elemental conversions &/or extrema with default intrinsic types
peter klausler3cecff62018-09-25 20:26:35260
261```
peter klausler9849cf52018-09-25 21:47:55262AMAX0(INTEGER ...) = REAL(MAX(...))
263AMAX1(REAL ...) = MAX(...)
264AMIN0(INTEGER...) = REAL(MIN(...))
265AMIN1(REAL ...) = MIN(...)
266DBLE(REAL A) = REAL(A, KIND=KIND(0.0D0))
267DMAX1(DOUBLE PRECISION ...) = MAX(...)
268DMIN1(DOUBLE PRECISION ...) = MIN(...)
269FLOAT(INTEGER I) = REAL(I)
270IDINT(DOUBLE PRECISION A) = INT(A)
271IFIX(REAL A) = INT(A)
272MAX0(INTEGER ...) = MAX(...)
273MAX1(REAL ...) = INT(MAX(...))
274MIN0(INTEGER ...) = MIN(...)
275MIN1(REAL ...) = INT(MIN(...))
276SNGL(DOUBLE PRECISION A) = REAL(A)
peter klausler3cecff62018-09-25 20:26:35277```
278
279### Generic elemental bit manipulation intrinsic functions
peter klauslerbab1f672018-09-26 17:42:55280Many of these accept a typeless "BOZ" literal as an actual argument.
281It is interpreted as having the kind of intrinsic `INTEGER` type
282as another argument, as if the typeless were implicitly wrapped
283in a call to `INT()`.
284When multiple arguments can be either `INTEGER` values or typeless
285constants, it is forbidden for *all* of them to be typeless
286constants if the result of the function is `INTEGER`
287(i.e., only `BGE`, `BGT`, `BLE`, and `BLT` can have multiple
288typeless arguments).
289
peter klausler3cecff62018-09-25 20:26:35290```
peter klauslere7c5a4702018-09-25 22:23:01291BGE(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
292BGT(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
293BLE(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
294BLT(INTEGER(n1) or BOZ I, INTEGER(n2) or BOZ J) -> default LOGICAL
peter klausler9849cf52018-09-25 21:47:55295BTEST(INTEGER(n1) I, INTEGER(n2) POS) -> default LOGICAL
peter klausler42b33da2018-09-29 00:02:11296DSHIFTL(INTEGER(k) I, INTEGER(k) or BOZ J, INTEGER(any) SHIFT) -> INTEGER(k)
peter klausler9849cf52018-09-25 21:47:55297DSHIFTL(BOZ I, INTEGER(k), INTEGER(any) SHIFT) -> INTEGER(k)
peter klausler42b33da2018-09-29 00:02:11298DSHIFTR(INTEGER(k) I, INTEGER(k) or BOZ J, INTEGER(any) SHIFT) -> INTEGER(k)
peter klausler9849cf52018-09-25 21:47:55299DSHIFTR(BOZ I, INTEGER(k), INTEGER(any) SHIFT) -> INTEGER(k)
300IAND(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
301IAND(BOZ I, INTEGER(k) J) -> INTEGER(k)
302IBCLR(INTEGER(k) I, INTEGER(any) POS) -> INTEGER(k)
peter klausler9849cf52018-09-25 21:47:55303IBITS(INTEGER(k) I, INTEGER(n1) POS, INTEGER(n2) LEN) -> INTEGER(k)
peter klausler42b33da2018-09-29 00:02:11304IBSET(INTEGER(k) I, INTEGER(any) POS) -> INTEGER(k)
peter klausler9849cf52018-09-25 21:47:55305IEOR(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
306IEOR(BOZ I, INTEGER(k) J) -> INTEGER(k)
307IOR(INTEGER(k) I, INTEGER(k) or BOZ J) -> INTEGER(k)
308IOR(BOZ I, INTEGER(k) J) -> INTEGER(k)
309ISHFT(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
peter klauslerbab1f672018-09-26 17:42:55310ISHFTC(INTEGER(k) I, INTEGER(n1) SHIFT, INTEGER(n2) SIZE=BIT_SIZE(I)) -> INTEGER(k)
peter klausler9849cf52018-09-25 21:47:55311LEADZ(INTEGER(any) I) -> default INTEGER
peter klauslerbab1f672018-09-26 17:42:55312MASKL(INTEGER(any) I, KIND=KIND(0)) -> INTEGER(KIND)
313MASKR(INTEGER(any) I, KIND=KIND(0)) -> INTEGER(KIND)
peter klausler9849cf52018-09-25 21:47:55314MERGE_BITS(INTEGER(k) I, INTEGER(k) or BOZ J, INTEGER(k) or BOZ MASK) = IOR(IAND(I,MASK),IAND(J,NOT(MASK)))
315MERGE_BITS(BOZ I, INTEGER(k) J, INTEGER(k) or BOZ MASK) = IOR(IAND(I,MASK),IAND(J,NOT(MASK)))
316NOT(INTEGER(k) I) -> INTEGER(k)
317POPCNT(INTEGER(any) I) -> default INTEGER
peter klauslere7c5a4702018-09-25 22:23:01318POPPAR(INTEGER(any) I) -> default INTEGER = IAND(POPCNT(I), Z'1')
peter klausler9849cf52018-09-25 21:47:55319SHIFTA(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
320SHIFTL(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
321SHIFTR(INTEGER(k) I, INTEGER(any) SHIFT) -> INTEGER(k)
322TRAILZ(INTEGER(any) I) -> default INTEGER
peter klausler3cecff62018-09-25 20:26:35323```
324
325### Character elemental intrinsic functions
326See also `INDEX` and `LEN` above among the elemental intrinsic functions with
327unrestricted specific names.
peter klausler9849cf52018-09-25 21:47:55328```
329ADJUSTL(CHARACTER(k,LEN=n) STRING) -> CHARACTER(k,LEN=n)
330ADJUSTR(CHARACTER(k,LEN=n) STRING) -> CHARACTER(k,LEN=n)
peter klauslerbab1f672018-09-26 17:42:55331LEN_TRIM(CHARACTER(k,n) STRING, KIND=KIND(0)) -> INTEGER(KIND) = n
peter klausler9849cf52018-09-25 21:47:55332LGE(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
333LGT(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
334LLE(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
335LLT(CHARACTER(k,n1) STRING_A, CHARACTER(k,n2) STRING_B) -> default LOGICAL
peter klauslerbab1f672018-09-26 17:42:55336SCAN(CHARACTER(k,n) STRING, CHARACTER(k,m) SET, LOGICAL(any) BACK=.FALSE., KIND=KIND(0)) -> INTEGER(KIND)
337VERIFY(CHARACTER(k,n) STRING, CHARACTER(k,m) SET, LOGICAL(any) BACK=.FALSE., KIND=KIND(0)) -> INTEGER(KIND)
peter klausler9849cf52018-09-25 21:47:55338```
peter klausler3cecff62018-09-25 20:26:35339
peter klausler9849cf52018-09-25 21:47:55340`SCAN` returns the index of the first (or last, if `BACK=.TRUE.`) character in `STRING`
341that is present in `SET`, or zero if none is.
342
peter klauslerbab1f672018-09-26 17:42:55343`VERIFY` is essentially the opposite: it returns the index of the first (or last) character
peter klausler9849cf52018-09-25 21:47:55344in `STRING` that is *not* present in `SET`, or zero if all are.
peter klausler3cecff62018-09-25 20:26:35345
peter klauslere7c5a4702018-09-25 22:23:01346# Transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35347
peter klausler9849cf52018-09-25 21:47:55348This category comprises a large collection of intrinsic functions that
349are collected together because they somehow transform their arguments
350in a way that prevents them from being elemental.
peter klauslere7c5a4702018-09-25 22:23:01351All of them are pure, however.
peter klausler9849cf52018-09-25 21:47:55352
353Some general rules apply to the transformational intrinsic functions:
354
peter klausler3cecff62018-09-25 20:26:353551. `DIM` arguments are optional; if present, the actual argument must be
356 a scalar integer of any kind.
3571. When an optional `DIM` argument is absent, or an `ARRAY` or `MASK`
358 argument is a vector, the result of the function is scalar; otherwise,
359 the result is an array of the same shape as the `ARRAY` or `MASK`
360 argument with the dimension `DIM` removed from the shape.
3611. When a function takes an optional `MASK` argument, it must be conformable
362 with its `ARRAY` argument if it is present, and the mask can be any kind
363 of `LOGICAL`. It can be scalar.
3641. The type `numeric` here can be any kind of `INTEGER`, `REAL`, or `COMPLEX`.
3651. The type `relational` here can be any kind of `INTEGER`, `REAL`, or `CHARACTER`.
3661. The type `any` here denotes any intrinsic or derived type.
peter klausler9849cf52018-09-25 21:47:553671. The notation `(..)` denotes an array of any rank (but not an assumed-rank array).
peter klausler3cecff62018-09-25 20:26:35368
peter klauslere7c5a4702018-09-25 22:23:01369## Logical reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35370```
peter klausler9849cf52018-09-25 21:47:55371ALL(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
372ANY(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
373COUNT(LOGICAL(any) MASK(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
374PARITY(LOGICAL(k) MASK(..) [, DIM ]) -> LOGICAL(k)
peter klausler3cecff62018-09-25 20:26:35375```
376
peter klauslere7c5a4702018-09-25 22:23:01377## Numeric reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35378```
peter klausler9849cf52018-09-25 21:47:55379IALL(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
380IANY(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
381IPARITY(INTEGER(k) ARRAY(..) [, DIM, MASK ]) -> INTEGER(k)
382NORM2(REAL(k) X(..) [, DIM ]) -> REAL(k)
383PRODUCT(numeric ARRAY(..) [, DIM, MASK ]) -> numeric
384SUM(numeric ARRAY(..) [, DIM, MASK ]) -> numeric
peter klausler3cecff62018-09-25 20:26:35385```
386
peter klausler970e746c2018-09-25 22:36:00387`NORM2` generalizes `HYPOT` by computing `SQRT(SUM(X*X))` while avoiding spurious overflows.
388
peter klauslere7c5a4702018-09-25 22:23:01389## Extrema reduction transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35390```
peter klausler9849cf52018-09-25 21:47:55391MAXVAL(relational(k) ARRAY(..) [, DIM, MASK ]) -> relational(k)
392MINVAL(relational(k) ARRAY(..) [, DIM, MASK ]) -> relational(k)
peter klausler3cecff62018-09-25 20:26:35393```
394
395### Locational transformational intrinsic functions
396When the optional `DIM` argument is absent, the result is an `INTEGER(KIND)`
397vector whose length is the rank of `ARRAY`.
398When the optional `DIM` argument is present, the result is an `INTEGER(KIND)`
399array of rank `RANK(ARRAY)-1` and shape equal to that of `ARRAY` with
400the dimension `DIM` removed.
401
peter klausler9849cf52018-09-25 21:47:55402The optional `BACK` argument is a scalar LOGICAL value of any kind.
403When present and `.TRUE.`, it causes the function to return the index
404of the *last* occurence of the target or extreme value.
405
peter klausler3cecff62018-09-25 20:26:35406For `FINDLOC`, `ARRAY` may have any of the five intrinsic types, and `VALUE`
407must a scalar value of a type for which `ARRAY==VALUE` or `ARRAY .EQV. VALUE`
408is an acceptable expression.
409
410```
peter klauslerbab1f672018-09-26 17:42:55411FINDLOC(intrinsic ARRAY(..), scalar VALUE [, DIM, MASK, KIND=KIND(0), BACK=.FALSE. ])
412MAXLOC(relational ARRAY(..) [, DIM, MASK, KIND=KIND(0), BACK=.FALSE. ])
413MINLOC(relational ARRAY(..) [, DIM, MASK, KIND=KIND(0), BACK=.FALSE. ])
peter klausler3cecff62018-09-25 20:26:35414```
415
peter klauslere7c5a4702018-09-25 22:23:01416## Data rearrangement transformational intrinsic functions
peter klausler3cecff62018-09-25 20:26:35417The optional `DIM` argument to these functions must be a scalar integer of
418any kind, and it takes a default value of 1 when absent.
419
420```
peter klausler9849cf52018-09-25 21:47:55421CSHIFT(any ARRAY(..), INTEGER(any) SHIFT(..) [, DIM ]) -> same type/kind/shape as ARRAY
peter klausler3cecff62018-09-25 20:26:35422```
peter klausler9849cf52018-09-25 21:47:55423Either `SHIFT` is scalar or `RANK(SHIFT) == RANK(ARRAY) - 1` and `SHAPE(SHIFT)` is that of `SHAPE(ARRAY)` with element `DIM` removed.
peter klausler3cecff62018-09-25 20:26:35424
425```
peter klausler9849cf52018-09-25 21:47:55426EOSHIFT(any ARRAY(..), INTEGER(any) SHIFT(..) [, BOUNDARY, DIM ]) -> same type/kind/shape as ARRAY
peter klausler3cecff62018-09-25 20:26:35427```
428* `SHIFT` is scalar or `RANK(SHIFT) == RANK(ARRAY) - 1` and `SHAPE(SHIFT)` is that of `SHAPE(ARRAY)` with element `DIM` removed.
429* If `BOUNDARY` is present, it must have the same type and parameters as `ARRAY`.
430* If `BOUNDARY` is absent, `ARRAY` must be of an intrinsic type, and the default `BOUNDARY` is the obvious `0`, `' '`, or `.FALSE.` value of `KIND(ARRAY)`.
431* If `BOUNDARY` is present, either it is scalar, or `RANK(BOUNDARY) == RANK(ARRAY) - 1` and `SHAPE(BOUNDARY)` is that of `SHAPE(ARRAY)` with element `DIM`
432 removed.
433
434```
peter klausler9849cf52018-09-25 21:47:55435PACK(any ARRAY(..), LOGICAL(any) MASK(..)) -> vector of same type and kind as ARRAY
peter klausler3cecff62018-09-25 20:26:35436```
437* `MASK` is conformable with `ARRAY` and may be scalar.
438* The length of the result vector is `COUNT(MASK)` if `MASK` is an array, else `SIZE(ARRAY)` if `MASK` is `.TRUE.`, else zero.
439
440```
peter klausler9849cf52018-09-25 21:47:55441PACK(any ARRAY(..), LOGICAL(any) MASK(..), any VECTOR(n)) -> vector of same type, kind, and size as VECTOR
peter klausler3cecff62018-09-25 20:26:35442```
443* `MASK` is conformable with `ARRAY` and may be scalar.
444* `VECTOR` has the same type and kind as `ARRAY`.
445* `VECTOR` must not be smaller than result of `PACK` with no `VECTOR` argument.
446* The leading elements of `VECTOR` are replaced with elements from `ARRAY` as
447 if `PACK` had been invoked without `VECTOR`.
448
449```
peter klausler9849cf52018-09-25 21:47:55450RESHAPE(any SOURCE(..), INTEGER(k) SHAPE(n) [, PAD(..), INTEGER(k2) ORDER(n) ]) -> SOURCE array with shape SHAPE
peter klausler3cecff62018-09-25 20:26:35451```
452* If `ORDER` is present, it is a vector of the same size as `SHAPE`, and
453 contains a permutation.
454* The element(s) of `PAD` are used to fill out the result once `SOURCE`
455 has been consumed.
456
457```
peter klausler9849cf52018-09-25 21:47:55458SPREAD(any SOURCE, DIM, scalar INTEGER(any) NCOPIES) -> same type as SOURCE, rank=RANK(SOURCE)+1
peter klauslerbab1f672018-09-26 17:42:55459TRANSFER(any SOURCE, any MOLD) -> scalar if MOLD is scalar, else vector; same type and kind as MOLD
460TRANSFER(any SOURCE, any MOLD, scalar INTEGER(any) SIZE) -> vector(SIZE) of type and kind of MOLD
peter klausler9849cf52018-09-25 21:47:55461TRANSPOSE(any MATRIX(n,m)) -> matrix(m,n) of same type and kind as MATRIX
peter klausler3cecff62018-09-25 20:26:35462```
463
peter klausler9849cf52018-09-25 21:47:55464The shape of the result of `SPREAD` is the same as that of `SOURCE`, with `NCOPIES` inserted
465at position `DIM`.
466
peter klausler3cecff62018-09-25 20:26:35467```
peter klausler9849cf52018-09-25 21:47:55468UNPACK(any VECTOR(n), LOGICAL(any) MASK(..), FIELD) -> type and kind of VECTOR, shape of MASK
peter klausler3cecff62018-09-25 20:26:35469```
470`FIELD` has same type and kind as `VECTOR` and is conformable with `MASK`.
471
peter klauslere7c5a4702018-09-25 22:23:01472## Other transformational intrinsic functions
peter klausler9849cf52018-09-25 21:47:55473```
474BESSEL_JN(INTEGER(n1) N1, INTEGER(n2) N2, REAL(k) X) -> REAL(k) vector (MAX(N2-N1+1,0))
475BESSEL_YN(INTEGER(n1) N1, INTEGER(n2) N2, REAL(k) X) -> REAL(k) vector (MAX(N2-N1+1,0))
476COMMAND_ARGUMENT_COUNT() -> scalar default INTEGER
477DOT_PRODUCT(LOGICAL(k) VECTOR_A(n), LOGICAL(k) VECTOR_B(n)) -> LOGICAL(k) = ANY(VECTOR_A .AND. VECTOR_B)
478DOT_PRODUCT(COMPLEX(any) VECTOR_A(n), numeric VECTOR_B(n)) = SUM(CONJG(VECTOR_A) * VECTOR_B)
479DOT_PRODUCT(INTEGER(any) or REAL(any) VECTOR_A(n), numeric VECTOR_B(n)) = SUM(VECTOR_A * VECTOR_B)
480MATMUL(numeric ARRAY_A(j), numeric ARRAY_B(j,k)) -> numeric vector(k)
481MATMUL(numeric ARRAY_A(j,k), numeric ARRAY_B(k)) -> numeric vector(j)
482MATMUL(numeric ARRAY_A(j,k), numeric ARRAY_B(k,m)) -> numeric matrix(j,m)
483MATMUL(LOGICAL(n1) ARRAY_A(j), LOGICAL(n2) ARRAY_B(j,k)) -> LOGICAL vector(k)
484MATMUL(LOGICAL(n1) ARRAY_A(j,k), LOGICAL(n2) ARRAY_B(k)) -> LOGICAL vector(j)
485MATMUL(LOGICAL(n1) ARRAY_A(j,k), LOGICAL(n2) ARRAY_B(k,m)) -> LOGICAL matrix(j,m)
486NULL([POINTER/ALLOCATABLE MOLD]) -> POINTER
peter klauslerbab1f672018-09-26 17:42:55487REDUCE(any ARRAY(..), function OPERATION [, DIM, LOGICAL(any) MASK(..), IDENTITY, LOGICAL ORDERED=.FALSE. ])
peter klausler9849cf52018-09-25 21:47:55488REPEAT(CHARACTER(k,n) STRING, INTEGER(any) NCOPIES) -> CHARACTER(k,n*NCOPIES)
489SELECTED_CHAR_KIND('DEFAULT' or 'ASCII' or 'ISO_10646' or ...) -> scalar default INTEGER
490SELECTED_INT_KIND(scalar INTEGER(any) R) -> scalar default INTEGER
491SELECTED_REAL_KIND([scalar INTEGER(any) P, scalar INTEGER(any) R, scalar INTEGER(any) RADIX]) -> scalar default INTEGER
peter klauslerbab1f672018-09-26 17:42:55492SHAPE(SOURCE, KIND=KIND(0)) -> INTEGER(KIND)(RANK(SOURCE))
peter klausler9849cf52018-09-25 21:47:55493TRIM(CHARACTER(k,n) STRING) -> CHARACTER(k)
494```
peter klausler3cecff62018-09-25 20:26:35495
peter klausler9849cf52018-09-25 21:47:55496The type and kind of the result of a numeric `MATMUL` is the same as would result from
497a multiplication of an element of ARRAY_A and an element of ARRAY_B.
peter klausler3cecff62018-09-25 20:26:35498
peter klausler9849cf52018-09-25 21:47:55499The kind of the `LOGICAL` result of a `LOGICAL` `MATMUL` is the same as would result
500from an intrinsic `.AND.` operation between an element of `ARRAY_A` and an element
501of `ARRAY_B`.
peter klausler3cecff62018-09-25 20:26:35502
peter klausler9849cf52018-09-25 21:47:55503Note that `DOT_PRODUCT` with a `COMPLEX` first argument operates on its complex conjugate,
504but that `MATMUL` with a `COMPLEX` argument does not.
peter klausler3cecff62018-09-25 20:26:35505
peter klausler9849cf52018-09-25 21:47:55506The `MOLD` argument to `NULL` may be omitted only in a context where the type of the pointer is known,
507such as an initializer or pointer assignment statement.
peter klausler3cecff62018-09-25 20:26:35508
peter klausler9849cf52018-09-25 21:47:55509At least one argument must be present in a call to `SELECTED_REAL_KIND`.
peter klausler3cecff62018-09-25 20:26:35510
peter klausler9849cf52018-09-25 21:47:55511An assumed-rank array may be passed to `SHAPE`, and if it is associated with an assumed-size array,
512the last element of the result will be -1.
peter klausler3cecff62018-09-25 20:26:35513
peter klauslere7c5a4702018-09-25 22:23:01514## Coarray transformational intrinsic functions
peter klausler9849cf52018-09-25 21:47:55515```
516FAILED_IMAGES([scalar TEAM_TYPE TEAM, KIND=KIND(0)]) -> INTEGER(KIND) vector
517GET_TEAM([scalar INTEGER(?) LEVEL]) -> scalar TEAM_TYPE
518IMAGE_INDEX(COARRAY, INTEGER(any) SUB(n) [, scalar TEAM_TYPE TEAM ]) -> scalar default INTEGER
519IMAGE_INDEX(COARRAY, INTEGER(any) SUB(n), scalar INTEGER(any) TEAM_NUMBER) -> scalar default INTEGER
520NUM_IMAGES([scalar TEAM_TYPE TEAM]) -> scalar default INTEGER
521NUM_IMAGES(scalar INTEGER(any) TEAM_NUMBER) -> scalar default INTEGER
522STOPPED_IMAGES([scalar TEAM_TYPE TEAM, KIND=KIND(0)]) -> INTEGER(KIND) vector
523TEAM_NUMBER([scalar TEAM_TYPE TEAM]) -> scalar default INTEGER
524THIS_IMAGE([COARRAY, DIM, scalar TEAM_TYPE TEAM]) -> default INTEGER
525```
526The result of `THIS_IMAGE` is a scalar if `DIM` is present or if `COARRAY` is absent,
527and a vector whose length is the corank of `COARRAY` otherwise.
528
peter klauslere7c5a4702018-09-25 22:23:01529# Inquiry intrinsic functions
530These are neither elemental nor transformational; all are pure.
531
532## Type inquiry intrinsic functions
peter klauslerad9aede2018-10-11 21:51:14533All of these functions return constants.
534The value of the argument is not used, and may well be undefined.
peter klausler9849cf52018-09-25 21:47:55535```
536BIT_SIZE(INTEGER(k) I(..)) -> INTEGER(k)
537DIGITS(INTEGER or REAL X(..)) -> scalar default INTEGER
538EPSILON(REAL(k) X(..)) -> scalar REAL(k)
539HUGE(INTEGER(k) X(..)) -> scalar INTEGER(k)
540HUGE(REAL(k) X(..)) -> scalar of REAL(k)
541KIND(intrinsic X(..)) -> scalar default INTEGER
542MAXEXPONENT(REAL(k) X(..)) -> scalar default INTEGER
543MINEXPONENT(REAL(k) X(..)) -> scalar default INTEGER
544NEW_LINE(CHARACTER(k,n) A(..)) -> scalar CHARACTER(k,1) = CHAR(10)
peter klauslerad9aede2018-10-11 21:51:14545PRECISION(REAL(k) or COMPLEX(k) X(..)) -> scalar default INTEGER
546RADIX(INTEGER(k) or REAL(k) X(..)) -> scalar default INTEGER, always 2
547RANGE(INTEGER(k) or REAL(k) or COMPLEX(k) X(..)) -> scalar default INTEGER
peter klausler9849cf52018-09-25 21:47:55548TINY(REAL(k) X(..)) -> scalar REAL(k)
549```
550
peter klauslere7c5a4702018-09-25 22:23:01551## Bound and size inquiry intrinsic functions
peter klausler9849cf52018-09-25 21:47:55552The results are scalar when `DIM` is present, and a vector of length=(co)rank(`(CO)ARRAY`)
553when `DIM` is absent.
554```
555LBOUND(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
556LCOBOUND(any COARRAY [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
557SIZE(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
558UBOUND(any ARRAY(..) [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
559UCOBOUND(any COARRAY [, DIM, KIND=KIND(0) ]) -> INTEGER(KIND)
560```
561
562Assumed-rank arrays may be used with `LBOUND`, `SIZE`, and `UBOUND`.
563
peter klauslere7c5a4702018-09-25 22:23:01564## Object characteristic inquiry intrinsic functions
peter klausler9849cf52018-09-25 21:47:55565```
566ALLOCATED(any type ALLOCATABLE ARRAY) -> scalar default LOGICAL
567ALLOCATED(any type ALLOCATABLE SCALAR) -> scalar default LOGICAL
568ASSOCIATED(any type POINTER POINTER [, same type TARGET]) -> scalar default LOGICAL
peter klauslerbab1f672018-09-26 17:42:55569COSHAPE(COARRAY, KIND=KIND(0)) -> INTEGER(KIND) vector of length corank(COARRAY)
peter klausler9849cf52018-09-25 21:47:55570EXTENDS_TYPE_OF(A, MOLD) -> default LOGICAL
571IS_CONTIGUOUS(any data ARRAY(..)) -> scalar default LOGICAL
572PRESENT(OPTIONAL A) -> scalar default LOGICAL
573RANK(any data A) -> scalar default INTEGER = 0 if A is scalar, SIZE(SHAPE(A)) if A is an array, rank if assumed-rank
574SAME_TYPE_AS(A, B) -> scalar default LOGICAL
peter klauslerbab1f672018-09-26 17:42:55575STORAGE_SIZE(any data A, KIND=KIND(0)) -> INTEGER(KIND)
peter klausler9849cf52018-09-25 21:47:55576```
577The arguments to `EXTENDS_TYPE_OF` must be of extensible derived types or be unlimited polymorphic.
578
579An assumed-rank array may be used with `IS_CONTIGUOUS` and `RANK`.
580
peter klauslere7c5a4702018-09-25 22:23:01581# Intrinsic subroutines
peter klausler970e746c2018-09-25 22:36:00582
583(*TODO*: complete these descriptions)
584
peter klauslere7c5a4702018-09-25 22:23:01585## One elemental intrinsic subroutine
peter klausler9849cf52018-09-25 21:47:55586```
587INTERFACE
588 SUBROUTINE MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)
589 INTEGER(k1) :: FROM, TO
590 INTENT(IN) :: FROM
591 INTENT(INOUT) :: TO
592 INTEGER(k2), INTENT(IN) :: FROMPOS
593 INTEGER(k3), INTENT(IN) :: LEN
594 INTEGER(k4), INTENT(IN) :: TOPOS
595 END SUBROUTINE
596END INTERFACE
597```
598
peter klauslere7c5a4702018-09-25 22:23:01599## Non-elemental intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55600```
601CALL CPU_TIME(REAL INTENT(OUT) TIME)
602```
603The kind of `TIME` is not specified in the standard.
604
605```
peter klauslerad9aede2018-10-11 21:51:14606CALL DATE_AND_TIME([DATE, TIME, ZONE, VALUES])
peter klausler9849cf52018-09-25 21:47:55607```
608* All arguments are `OPTIONAL` and `INTENT(OUT)`.
609* `DATE`, `TIME`, and `ZONE` are scalar default `CHARACTER`.
610* `VALUES` is a vector of at least 8 elements of `INTEGER(KIND >= 2)`.
611```
peter klausler3cecff62018-09-25 20:26:35612CALL EVENT_QUERY(EVENT, COUNT [, STAT])
613CALL EXECUTE_COMMAND_LINE(COMMAND [, WAIT, EXITSTAT, CMDSTAT, CMDMSG ])
614CALL GET_COMMAND([COMMAND, LENGTH, STATUS, ERRMSG ])
615CALL GET_COMMAND_ARGUMENT(NUMBER [, VALUE, LENGTH, STATUS, ERRMSG ])
616CALL GET_ENVIRONMENT_VARIABLE(NAME [, VALUE, LENGTH, STATUS, TRIM_NAME, ERRMSG ])
617CALL MOVE_ALLOC(ALLOCATABLE INTENT(INOUT) FROM, ALLOCATABLE INTENT(OUT) TO [, STAT, ERRMSG ])
618CALL RANDOM_INIT(LOGICAL(k1) INTENT(IN) REPEATABLE, LOGICAL(k2) INTENT(IN) IMAGE_DISTINCT)
619CALL RANDOM_NUMBER(REAL(k) INTENT(OUT) HARVEST(..))
620CALL RANDOM_SEED([SIZE, PUT, GET])
621CALL SYSTEM_CLOCK([COUNT, COUNT_RATE, COUNT_MAX])
peter klausler9849cf52018-09-25 21:47:55622```
peter klausler3cecff62018-09-25 20:26:35623
peter klauslere7c5a4702018-09-25 22:23:01624## Atomic intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55625```
peter klausler3cecff62018-09-25 20:26:35626CALL ATOMIC_ADD(ATOM, VALUE [, STAT=])
627CALL ATOMIC_AND(ATOM, VALUE [, STAT=])
628CALL ATOMIC_CAS(ATOM, OLD, COMPARE, NEW [, STAT=])
629CALL ATOMIC_DEFINE(ATOM, VALUE [, STAT=])
630CALL ATOMIC_FETCH_ADD(ATOM, VALUE, OLD [, STAT=])
631CALL ATOMIC_FETCH_AND(ATOM, VALUE, OLD [, STAT=])
632CALL ATOMIC_FETCH_OR(ATOM, VALUE, OLD [, STAT=])
633CALL ATOMIC_FETCH_XOR(ATOM, VALUE, OLD [, STAT=])
634CALL ATOMIC_OR(ATOM, VALUE [, STAT=])
635CALL ATOMIC_REF(VALUE, ATOM [, STAT=])
636CALL ATOMIC_XOR(ATOM, VALUE [, STAT=])
peter klausler9849cf52018-09-25 21:47:55637```
peter klausler3cecff62018-09-25 20:26:35638
peter klauslere7c5a4702018-09-25 22:23:01639## Collective intrinsic subroutines
peter klausler9849cf52018-09-25 21:47:55640```
peter klausler3cecff62018-09-25 20:26:35641CALL CO_BROADCAST
642CALL CO_MAX
643CALL CO_MIN
644CALL CO_REDUCE
645CALL CO_SUM
peter klausler9849cf52018-09-25 21:47:55646```
peter klausler370c44a2018-09-25 23:59:41647
648# Non-standard intrinsics
649## PGI
650```
651AND, OR, XOR
652LSHIFT, RSHIFT, SHIFT
653ZEXT, IZEXT
654COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D
655COMPL
656DCMPLX
657EQV, NEQV
658INT8
659JINT, JNINT, KNINT
660LOC
661```
662
663## Intel
664```
665DCMPLX(X,Y), QCMPLX(X,Y)
666DREAL(DOUBLE COMPLEX A) -> DOUBLE PRECISION
667DFLOAT, DREAL
668QEXT, QFLOAT, QREAL
669DNUM, INUM, JNUM, KNUM, QNUM, RNUM - scan value from string
670ZEXT
671RAN, RANF
672ILEN(I) = BIT_SIZE(I)
673SIZEOF
674MCLOCK, SECNDS
675COTAN(X) = 1.0/TAN(X)
676COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D, COTAND - degrees
677AND, OR, XOR
678LSHIFT, RSHIFT
679IBCHNG, ISHA, ISHC, ISHL, IXOR
680IARG, IARGC, NARGS, NUMARG
681BADDRESS, IADDR
682CACHESIZE, EOF, FP_CLASS, INT_PTR_KIND, ISNAN, LOC
683MALLOC
684```
peter klausler42b33da2018-09-29 00:02:11685