#define writeTopic(x) write(0,*) ""; write(0,*) "TESTING SIZE OF ",x
#define getSizeOf(x) write(0,'(A30,A,I4)') #x,":", SIZEOF(x)
#define getSizeOfDesc(d,x) write(0,'(A30,A,I4)') d,":", SIZEOF(x);write(0,*) " Arg:",x
Program testSizeof
Integer testIntegerDefaultKind
Integer(KIND=1) testIntegerKind1
Integer(KIND=2) testIntegerKind2
Integer(KIND=4) testIntegerKind4
Integer(KIND=8) testIntegerKind8
Real testRealDefaultKind
Real(KIND=4) testRealKind4
Real(KIND=8) testRealKind8
Real(KIND=16) testRealKind16
Complex testComplexDefaultKind
Complex(KIND=4) testComplexKind4
Complex(KIND=8) testComplexKind8
Complex(KIND=16) testComplexKind16
writeTopic("Constants-Integer")
getSizeOf(0)
getSizeOf(0_1)
getSizeOf(0_2)
getSizeOf(0_4)
getSizeOf(0_8)
getSizeOf(1/2)
getSizeOf(1/2_8)
getSizeOf(1/Z'7FFFFFFFFFFFFFFF') ! compiles on ifort only if -i8 is specified
getSizeOf(1_8/2)
getSizeOf(1_8/Z'7FFFFFFFFFFFFFFF')
writeTopic("Constants-Real")
getSizeOf(0.)
getSizeOf(0._4)
getSizeOf(0._8)
getSizeOf(0._16)
getSizeOf(1./2)
getSizeOf(1./2_8)
getSizeOf(1./Z'7FFFFFFFFFFFFFFF') ! compiles on ifort only if -r8 is specified
getSizeOf(1._16/Z'7FFFFFFFFFFFFFFF')
getSizeOf(1/2.)
getSizeOf(1/2._16)
getSizeOf(1._16/2)
writeTopic("Constants-Complex")
getSizeOf((0.,0.))
getSizeOf((0._4,0._4))
getSizeOf((0._8,0._8))
getSizeOf((0._16,0._16))
getSizeOf((1.,1.)/2)
getSizeOf((1.,1.)/2_8)
getSizeOf((1.,1.)/Z'7FFFFFFFFFFFFFFF') ! interestingly this works without -r8 on ifort
getSizeOf((1.,1.)/2.)
getSizeOf((1.,1.)/2._8)
getSizeOf((1.,1.)/2._16)
getSizeOf(1/(1.,1.))
getSizeOf(1/(1._16,1._16))
getSizeOf((1._16,1._16)/2)
writeTopic("Integer")
testIntegerDefaultKind=0
testIntegerKind1=0_1
testIntegerKind2=0_2
testIntegerKind4=0_4
testIntegerKind8=0_8
getSizeOf(testIntegerDefaultKind)
getSizeOf(testIntegerKind1)
getSizeOf(testIntegerKind2)
getSizeOf(testIntegerKind4)
getSizeOf(testIntegerKind8)
writeTopic("Real")
testRealDefaultKind=0.
testRealKind4=0._4
testRealKind4=0.E0_4 ! 0.E0 is strictly speaking not enough since -r8 would change the behaviour
testRealKind8=0._8
testRealKind8=0.D0 !0.E0_8 would also be valid
testRealKind16=0._16
testRealKind16=0.Q0
getSizeOf(testRealDefaultKind)
getSizeOf(testRealKind4)
getSizeOf(testRealKind8)
getSizeOf(testRealKind16)
writeTopic("Complex")
testComplexDefaultKind=(0.,0.)
testComplexKind4=(0.E0_4,0.E0_4) ! See Real for additional notations
testComplexKind8=(0.E0_8,0.E0_8)
testComplexKind16=(0.E0_16,0.E0_16)
getSizeOf(testComplexDefaultKind)
getSizeOf(Real(testComplexDefaultKind))
getSizeOf(Imag(testComplexDefaultKind))
getSizeOf(testComplexKind4)
getSizeOf(Real(testComplexKind4))
getSizeOf(Imag(testComplexKind4))
getSizeOf(testComplexKind8)
getSizeOf(Real(testComplexKind8))
getSizeOf(Imag(testComplexKind8))
getSizeOf(testComplexKind16)
getSizeOf(Real(testComplexKind16))
getSizeOf(Imag(testComplexKind16))
writeTopic("Wrong assignments - Integer")
testIntegerKind8=Z'7FFFFFFFFFFFFFFF'
testIntegerDefaultKind=testIntegerKind8
getSizeOfDesc("Kind8 in default",testIntegerDefaultKind)
testIntegerKind1=testIntegerKind8
getSizeOfDesc("Kind8 in Kind1",testIntegerKind1)
testIntegerKind2=testIntegerKind8
getSizeOfDesc("Kind8 in Kind2",testIntegerKind2)
testIntegerKind4=testIntegerKind8
getSizeOfDesc("Kind8 in Kind4",testIntegerKind4)
testIntegerKind8=testIntegerKind8
getSizeOfDesc("Kind8 in Kind8",testIntegerKind8)
testIntegerDefaultKind=0_1
getSizeOfDesc("0_1 in default",testIntegerDefaultKind)
testIntegerDefaultKind=0_2
getSizeOfDesc("0_2 in default",testIntegerDefaultKind)
testIntegerDefaultKind=0_4
getSizeOfDesc("0_4 in default",testIntegerDefaultKind)
testIntegerDefaultKind=0_8
getSizeOfDesc("0_8 in default",testIntegerDefaultKind)
testIntegerDefaultKind=Z'7FFFFFFFFFFFFFFF' ! compiles on ifort only if -i8 is specified
getSizeOfDesc("8byte Hex in default",testIntegerDefaultKind)
testIntegerKind8=0_1
getSizeOfDesc("0_1 in Kind8",testIntegerKind8)
testIntegerKind8=0_2
getSizeOfDesc("0_2 in Kind8",testIntegerKind8)
testIntegerKind8=0_4
getSizeOfDesc("0_4 in Kind8",testIntegerKind8)
testIntegerKind8=0_8
getSizeOfDesc("0_8 in Kind8",testIntegerKind8)
end Program
This small codesnipplet shows the various sizes of different datatypes. This is especially interesting when specifying -rN or -iN when using the ifort. Also pay special attention how your compiler handles line 30, 41 and 125. For example IBM’s compiler f90 just gives the warning “Source is longer than target. Truncation will occur on the left.”. I wrote this small program to verify the correct behaviour of the various compiler I use.
