The ``replicate'' set of m4 macros is used to replicate a routine so that a version exists for every possible array dimensioning (scalars plus up to seven-dimensioned arrays, the maximum allowed in F90). To use the replicate macros in the CÆSAR Code Package,
Take the following code segment as an example:
module test_replicate REPLICATE_INTERFACE([Generic_Routine], [Specific_Routine]) contains define([REPLICATE_ROUTINE],[ function Specific_Routine_$1 (R REP_ARGS([var[]i])) type(real,$1) :: R REP_DECLARE([type(integer)], [var[]i]) REP_ALLOCATE(R, [var[]i], [status]) ARRAY_ONLY DEALLOCATE(R) SCALAR_ONLY R = 999. <other routine contents> end function Specific_Routine_$1 ]) REPLICATE end module test_replicate
This code is expanded by Gnu m4 into the following valid F90 code:
module test_replicate interface Generic_Routine module procedure Specific_Routine_0 module procedure Specific_Routine_1 module procedure Specific_Routine_2 module procedure Specific_Routine_3 module procedure Specific_Routine_4 module procedure Specific_Routine_5 module procedure Specific_Routine_6 module procedure Specific_Routine_7 end interface contains function Specific_Routine_0 (R) real (kind=KIND(1.0d0)) :: R ! DEALLOCATE(R) R = 999. <other routine contents> end function Specific_Routine_0 function Specific_Routine_1 (R, var1) real (kind=KIND(1.0d0)), pointer, dimension(:) :: R integer (kind=KIND(1)) :: var1 ALLOCATE(R(var1), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_1 function Specific_Routine_2 (R, var1, var2) real (kind=KIND(1.0d0)), pointer, dimension(:,:) :: R integer (kind=KIND(1)) :: var1, var2 ALLOCATE(R(var1, var2), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_2 function Specific_Routine_3 (R, var1, var2, var3) real (kind=KIND(1.0d0)), pointer, dimension(:,:,:) :: R integer (kind=KIND(1)) :: var1, var2, var3 ALLOCATE(R(var1, var2, var3), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_3 function Specific_Routine_4 (R, var1, var2, var3, var4) real (kind=KIND(1.0d0)), pointer, dimension(:,:,:,:) :: R integer (kind=KIND(1)) :: var1, var2, var3, var4 ALLOCATE(R(var1, var2, var3, var4), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_4 function Specific_Routine_5 (R, var1, var2, var3, var4, var5) real (kind=KIND(1.0d0)), pointer, dimension(:,:,:,:,:) :: R integer (kind=KIND(1)) :: var1, var2, var3, var4, var5 ALLOCATE(R(var1, var2, var3, var4, var5), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_5 function Specific_Routine_6 (R, var1, var2, var3, var4, var5, var6) real (kind=KIND(1.0d0)), pointer, dimension(:,:,:,:,:,:) :: R integer (kind=KIND(1)) :: var1, var2, var3, var4, var5, var6 ALLOCATE(R(var1, var2, var3, var4, var5, var6), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_6 function Specific_Routine_7 (R, var1, var2, var3, var4, var5, var6, var7) real (kind=KIND(1.0d0)), pointer, dimension(:,:,:,:,:,:,:) :: R integer (kind=KIND(1)) :: var1, var2, var3, var4, var5, var6, var7 ALLOCATE(R(var1, var2, var3, var4, var5, var6, var7), stat=status) DEALLOCATE(R) ! R = 999. <other routine contents> end function Specific_Routine_7 end module test_replicate
Note that this set of m4 macros depends on the m4 commands in the settings.m4 file and on the REPLICATE_ROUTINE macro definition.
m4 macros defined in the include/replicate.m4 file:
ARRAY_ONLY | Used to comment out lines for scalars, but leave them untouched for arrays. | ||
REPLICATE | Replicates a routine for all array dimensions and scalars. | ||
REPLICATE_ARRAYS | Replicates a routine for all array dimensions only. | ||
REPLICATE_INTERFACE | Defines the interface block for the replicated routine. | ||
REP_ALLOCATE | Used to allocate a replicated variable. | ||
REP_ARGS | Used to replicate an argument list. | ||
REP_DECLARE | Used to decalre a replicated variable. | ||
REP_EXPAND | Used in the REPLICATE_ROUTINE macro to expand to text that varies with the dimensioning (see code listing for input/output details). | ||
REP_NUMBER | The number of the dimension of the current routine, used internally. | ||
SCALAR_ONLY | Used to comment out lines for arrays, but leave them untouched for scalars. | ||
type(vartype,$1) | A useful construction for replicated procedures which is defined by the types macros. |
The Replicate m4 Macros code listing contains additional documentation.
Michael L. Hall