1! 2! Copyright (C) by Argonne National Laboratory 3! See COPYRIGHT in top-level directory 4! 5 MODULE MPI_SIZEOFS 6! This module contains the definitions for MPI_SIZEOF for the 7! predefined, named types in Fortran 90. This is provided 8! as a separate module to allow MPI_SIZEOF to supply the 9! basic size information even when we do not provide the 10! arbitrary choice types 11 IMPLICIT NONE 12! 13 PUBLIC :: MPI_SIZEOF 14 INTERFACE MPI_SIZEOF 15 MODULE PROCEDURE MPI_SIZEOF_I, MPI_SIZEOF_R, & 16 & MPI_SIZEOF_L, MPI_SIZEOF_CH, MPI_SIZEOF_CX,& 17 & MPI_SIZEOF_IV, MPI_SIZEOF_RV, & 18 & MPI_SIZEOF_LV, MPI_SIZEOF_CHV, MPI_SIZEOF_CXV 19@REQD@ MODULE PROCEDURE MPI_SIZEOF_D, MPI_SIZEOF_DV 20@REQI1@ MODULE PROCEDURE MPI_SIZEOF_I1, MPI_SIZEOF_I1V 21@REQI2@ MODULE PROCEDURE MPI_SIZEOF_I2, MPI_SIZEOF_I2V 22@REQI8@ MODULE PROCEDURE MPI_SIZEOF_I8, MPI_SIZEOF_I8V 23 END INTERFACE ! MPI_SIZEOF 24! 25 CONTAINS 26! 27 SUBROUTINE MPI_SIZEOF_I( X, SIZE, IERROR ) 28 INTEGER X 29 INTEGER SIZE, IERROR 30 SIZE = @SIZEOF_FC_INTEGER@ 31 IERROR = 0 32 END SUBROUTINE MPI_SIZEOF_I 33! 34 SUBROUTINE MPI_SIZEOF_R( X, SIZE, IERROR ) 35 REAL X 36 INTEGER SIZE, IERROR 37 SIZE = @SIZEOF_FC_REAL@ 38 IERROR = 0 39 END SUBROUTINE MPI_SIZEOF_R 40! 41! If reals and doubles have been forced to the same size (e.g., with 42! -i8 -r8 to compilers like g95), then the compiler may refuse to 43! allow interfaces that use real and double precision (failing to 44! determine which one is intended) 45@REQD@ SUBROUTINE MPI_SIZEOF_D( X, SIZE, IERROR ) 46@REQD@ DOUBLE PRECISION X 47@REQD@ INTEGER SIZE, IERROR 48@REQD@ SIZE = @SIZEOF_FC_DOUBLE_PRECISION@ 49@REQD@ IERROR = 0 50@REQD@ END SUBROUTINE MPI_SIZEOF_D 51! 52 SUBROUTINE MPI_SIZEOF_L( X, SIZE, IERROR ) 53 LOGICAL X 54 INTEGER SIZE, IERROR 55 SIZE = @SIZEOF_FC_INTEGER@ 56 IERROR = 0 57 END SUBROUTINE MPI_SIZEOF_L 58! 59 SUBROUTINE MPI_SIZEOF_CH( X, SIZE, IERROR ) 60 CHARACTER X 61 INTEGER SIZE, IERROR 62 SIZE = @SIZEOF_FC_CHARACTER@ 63 IERROR = 0 64 END SUBROUTINE MPI_SIZEOF_CH 65! 66 SUBROUTINE MPI_SIZEOF_CX( X, SIZE, IERROR ) 67 COMPLEX X 68 INTEGER SIZE, IERROR 69 SIZE = 2*@SIZEOF_FC_REAL@ 70 IERROR = 0 71 END SUBROUTINE MPI_SIZEOF_CX 72! 73 SUBROUTINE MPI_SIZEOF_IV( X, SIZE, IERROR ) 74 INTEGER X(*) 75 INTEGER SIZE, IERROR 76 SIZE = @SIZEOF_FC_INTEGER@ 77 IERROR = 0 78 END SUBROUTINE MPI_SIZEOF_IV 79! 80 SUBROUTINE MPI_SIZEOF_RV( X, SIZE, IERROR ) 81 REAL X(*) 82 INTEGER SIZE, IERROR 83 SIZE = @SIZEOF_FC_REAL@ 84 IERROR = 0 85 END SUBROUTINE MPI_SIZEOF_RV 86! 87! If reals and doubles have been forced to the same size (e.g., with 88! -i8 -r8 to compilers like g95), then the compiler may refuse to 89! allow interfaces that use real and double precision (failing to 90! determine which one is intended) 91@REQD@ SUBROUTINE MPI_SIZEOF_DV( X, SIZE, IERROR ) 92@REQD@ DOUBLE PRECISION X(*) 93@REQD@ INTEGER SIZE, IERROR 94@REQD@ SIZE = @SIZEOF_FC_DOUBLE_PRECISION@ 95@REQD@ IERROR = 0 96@REQD@ END SUBROUTINE MPI_SIZEOF_DV 97! 98 SUBROUTINE MPI_SIZEOF_LV( X, SIZE, IERROR ) 99 LOGICAL X(*) 100 INTEGER SIZE, IERROR 101 SIZE = @SIZEOF_FC_INTEGER@ 102 IERROR = 0 103 END SUBROUTINE MPI_SIZEOF_LV 104! 105 SUBROUTINE MPI_SIZEOF_CHV( X, SIZE, IERROR ) 106 CHARACTER X(*) 107 INTEGER SIZE, IERROR 108 SIZE = @SIZEOF_FC_CHARACTER@ 109 IERROR = 0 110 END SUBROUTINE MPI_SIZEOF_CHV 111! 112 SUBROUTINE MPI_SIZEOF_CXV( X, SIZE, IERROR ) 113 COMPLEX X(*) 114 INTEGER SIZE, IERROR 115 SIZE = 2*@SIZEOF_FC_REAL@ 116 IERROR = 0 117 END SUBROUTINE MPI_SIZEOF_CXV 118! 119! Support for the optional Integer*8 type 120! Note that we may want to replace this with code that handles 121! MPI_OFFSET_KIND or MPI_ADDRESS_KIND integers 122@REQI8@ SUBROUTINE MPI_SIZEOF_I8( X, SIZE, IERROR ) 123@REQI8@ INTEGER*8 X 124@REQI8@ INTEGER SIZE, IERROR 125@REQI8@ SIZE = 8 126@REQI8@ IERROR = 0 127@REQI8@ END SUBROUTINE MPI_SIZEOF_I8 128@REQI8@ SUBROUTINE MPI_SIZEOF_I8V( X, SIZE, IERROR ) 129@REQI8@ INTEGER*8 X(*) 130@REQI8@ INTEGER SIZE, IERROR 131@REQI8@ SIZE = 8 132@REQI8@ IERROR = 0 133@REQI8@ END SUBROUTINE MPI_SIZEOF_I8V 134! 135@REQI1@ SUBROUTINE MPI_SIZEOF_I1( X, SIZE, IERROR ) 136@REQI1@ INTEGER*1 X 137@REQI1@ INTEGER SIZE, IERROR 138@REQI1@ SIZE = 1 139@REQI1@ IERROR = 0 140@REQI1@ END SUBROUTINE MPI_SIZEOF_I1 141@REQI1@ SUBROUTINE MPI_SIZEOF_I1V( X, SIZE, IERROR ) 142@REQI1@ INTEGER*1 X(*) 143@REQI1@ INTEGER SIZE, IERROR 144@REQI1@ SIZE = 1 145@REQI1@ IERROR = 0 146@REQI1@ END SUBROUTINE MPI_SIZEOF_I1V 147! 148@REQI2@ SUBROUTINE MPI_SIZEOF_I2( X, SIZE, IERROR ) 149@REQI2@ INTEGER*2 X 150@REQI2@ INTEGER SIZE, IERROR 151@REQI2@ SIZE = 2 152@REQI2@ IERROR = 0 153@REQI2@ END SUBROUTINE MPI_SIZEOF_I2 154@REQI2@ SUBROUTINE MPI_SIZEOF_I2V( X, SIZE, IERROR ) 155@REQI2@ INTEGER*2 X(*) 156@REQI2@ INTEGER SIZE, IERROR 157@REQI2@ SIZE = 2 158@REQI2@ IERROR = 0 159@REQI2@ END SUBROUTINE MPI_SIZEOF_I2V 160! 161! 162! We don't include double complex. If we did, we'd need to include the 163! same hack as for real and double above if the compiler has been forced 164! to make them the same size. 165 END MODULE MPI_SIZEOFS 166