REAL A, B, C PARAMETER (A = 3.141592654) DIMENSION B(3) DATA B /1.0, 2.0, 3.0 / DIMENSION C(100) DATA C /100*0.0/that is one variable can occur in several lines. Using Fortran 90 you can instead write
REAL, PARAMETER :: A = 3.141592654 REAL, DIMENSION(1:3) :: B = (/1.0, 2.0, 3.0 /) REAL, DIMENSION(1:100) :: C = (/ ( 0.0, I = 1, 100 ) /)The difference is not so large here but it's much larger in more complicated examples with many variables, especially since in Fortran 90 you have access to more properties. In the last example an extra parenthesis ( ) is required. I am grateful to Kristof Richmond for pointing that out to me.
The last example can also be generalized to assign different values to different parts of the vector.
REAL, DIMENSION(5) :: D = (/ (4.0, I = 1, 3) , (17.0, I = 4, 5) /)Since there are variables of different types there is an intrinsic function that shows the exact subtype of the variable used. This function is called KIND(x). This function can also be used for particular types of subtypes or kinds:
KIND (0) integer KIND (0.0) floating point number KIND (.FALSE.) logical variable KIND ("A") string of charactersThere is an intrinsic function SELECTED_REAL_KIND, which returns the kind of the type REAL that has a representation with (at least) the precision and the exponential range requested. For example, the function SELECTED_REAL_KIND (8,70) is that kind of REAL that has at least 8 decimal digits accuracy and permits an exponent between 10**-70 and 10**70. The corresponding function for integers is called SELECTED_INT_KIND and of course has only one argument. With the choice SELECTED_INT_KIND (5) all integers between (but not including the limits) -100 000 and +100 000 are permitted. The kind of a type can be given a name.
INTEGER, PARAMETER :: K5 = SELECTED_INT_KIND(5)This kind of integers can be used in constants according to the following line
-12345_K5 +1_K5 2_K5which is a rather unnatural specification, after the value we have to give an underscore _ followed by the name of the kind.
Use of variables of the new integer type can be declared in a nicer way
INTEGER (KIND=K5) :: IVARThe corresponding is true for floating-point variables, if we first introduce a high-precision kind LONG with
INTEGER, PARAMETER :: LONG = SELECTED_REAL_KIND(15,99)then we get the floating-point kind with at least 15 decimal digits accuracy and with an exponent range from 10**-99 to 10**+99. The corresponding constants are obtained as
2.6_LONG 12.34567890123456E30_LONGand variables are declared with
REAL (KIND=LONG) :: LASSEThe old type conversions INT, REAL and CMPLX have been extended with the functions
INT(X, KIND = K5)which converts a floating-point number X to an integer of the kind K5, if Z is a complex number with
REAL(Z, KIND(Z))you get it converted to a floating-point number of the real type and of the same kind of Z (that is of course the real part of Z).
Double precision is not included in the new Fortran 90 in any other way than in the "old" Fortran 77, but it is assumed that the compiler supports the double or quadruple precision that may be available in the hardware. You can then define a suitable kind of the REAL, named DP or QP. You can of course use the old concept of DOUBLE PRECISION.
The reason for this rather cumbersome way is that it is not desirable to have too many compulsory precisions (for example single, double, quadruple, perhaps for both the cases REAL and COMPLEX) and also that the old concept DOUBLE PRECISION did not give a specified machine accuracy. Now you can relatively easily specify both which precision and which range of exponent you wish to use. Additional information about the kind is given in Appendix 6, where the different data types and their normal kinds for the NAG compiler on DEC, SUN, and the IBM PC, the Cray compiler, and the Absoft compiler on the Power Macintosh.
(2.1) What does the specification LOGIC ALL mean?
(2.2) Specify a constant K with the value 0.75.
(2.3) Specify an integer matrix PELLE with 3 rows and 4 columns.
(2.4) Specify a floating-point number which corresponds to the
double precision on an IBM and a single precision on Cray.
(2.5) Specify some variables of the type above.
(2.6) Specify some constants of the type above.
(2.7) Is the following specification correct?
REAL DIMENSION(1:3,2:3) :: AASolution.
(2.8) Is the following specification correct?
(2.9) Is the following specification correct?
COMMON :: ASolution.