COMMON/CAF1/ A1(100)[*],B1(100) ! not in subset
COMMON/CAF2/ A2(100)[*],B2(100)[0:*] ! subset co-array fortran
REAL, SAVE :: A(100)[*],B(50)[*]
EQUIVALENCE (A,B) ! not in subset
REAL A(9,9,9,9,9,9,9)[9,9,9,9,9,9,*] ! not in subset
REAL B(9,9,9,9)[9,9,9,*] ! not in subset
REAL B(9,9,9,9,9,9,9)[*] ! not in subset
REAL C(9,9,9,9,9,9)[*] ! subset co-array fortran
REAL D(9)[9,9,9,9,9,*] ! subset co-array fortran
SUBROUTINE SUBX(A)
REAL A(*)[*] ! not in subset, assumed size array
SUBROUTINE SUBA( AA, AB )
REAL :: AA(:,:)[9,*] ! not in subset, co-rank 2
REAL :: AB(:,:)[*] ! subset co-array fortran
INTERFACE
SUBROUTINE SUB0( AA )
REAL :: AA(50)[*] ! explicit-shape dummy co-array
END SUBROUTINE SUB0
END INTERFACE
INTEGER, SAVE :: A(100)[*],B(50)[*],C(5,10)[0:*]
CALL SUB0(A) ! not in subset
CALL SUB0(A(1:50)) ! not co-array fortran
CALL SUB0(A(1)) ! not in subset
CALL SUB0(A(51)) ! not in subset
CALL SUB0(B) ! subset co-array fortran
CALL SUB0(B(1:50)) ! not co-array fortran
CALL SUB0(B(1)) ! not in subset
CALL SUB0(C) ! subset co-array fortran
REAL A_TILE,TIME
COMMON/TILED/ A_TILE(0:IH/IPR+1,0:JH/JPR+1)[IPR,*],TIME[*]
SAVE /TILED/
REAL*4 HINS
COMMON/G2I/ HINS(NMAX*3)[0:*]
SAVE /G2I/
TIME[@] = T1 - T0
A_TILE(1:IH/IPR,1:JH/JPR)[IPR,@] = A_ORIG(I+1:I+IH/IPR,J+1:J+JH/JPR)
DO I= 1,3*N
HINS(I)[0:@] = HOEW(I)
ENDDO
INTERFACE ! ignored by caf2omp, but required by OpenMP
SUBROUTINE SUB4( AB )
REAL :: AB(:)[*] ! assumed-shape dummy co-array
END SUBROUTINE SUB4
END INTERFACE
INTERFACE ! ignored by caf2omp, optional for OpenMP
SUBROUTINE SUB5( BB )
REAL :: BB(50)[*] ! explicit-shape dummy co-array
END SUBROUTINE SUB5
END INTERFACE
INTERFACE ! ignored by caf2omp, but required by OpenMP
SUBROUTINE SUB1( AA )
REAL :: AA(:)[*] ! assumed-shape dummy co-array
END SUBROUTINE SUB1
END INTERFACE
INTEGER, SAVE :: A(100)[*]
CALL SUB1(A) ! standard co-array fortran
CALL SUB1(A[1:NUM_IMAGES()]) ! not allowed by caf2omp
CALL SUB1(A(:)[1:NUM_IMAGES()]) ! required for caf2omp
CALL SUB1(A(:)[1:NIMG]) ! ok if NIMG==NUM_IMAGES()
CALL SUB1(A(:)[:]) ! not allowed by caf2omp
CALL SUB1(A(2:100:2)) ! standard co-array fortran
CALL SUB1(A(2:100:2)[1:NUM_IMAGES()]) ! required for caf2omp
CALL SUB1(A(2:100:2)[:]) ! not allowed by caf2omp
INTERFACE
SUBROUTINE SUB2( AB )
REAL :: AB(:) ! assumed-shape dummy array
END SUBROUTINE SUB2
SUBROUTINE SUB3( BB )
REAL :: BB(50) ! explicit-shape dummy array
END SUBROUTINE SUB3
END INTERFACE
INTEGER, SAVE :: A(100)[*]
CALL SUB2(A) ! standard co-array fortran
CALL SUB2(A[@]) ! not allowed by caf2omp
CALL SUB2(A(:)) ! standard co-array fortran
CALL SUB2(A(:)[@]) ! required for caf2omp
CALL SUB2(A(:)[ME]) ! ok if ME==THIS_IMAGE(A)
CALL SUB2(A(2:8:2)) ! standard co-array fortran
CALL SUB2(A(2:8:2)[@]) ! required for caf2omp
CALL SUB3(A) ! standard co-array fortran
CALL SUB3(A[@]) ! not allowed by caf2omp
CALL SUB3(A(1)) ! standard co-array fortran
CALL SUB3(A(1)[@]) ! required for caf2omp
CALL SUB3(A(51)) ! standard co-array fortran
CALL SUB3(A(51)[@]) ! required for caf2omp
CALL SUB2(A(51)[ME]) ! ok if ME==THIS_IMAGE(A)
ALL = (/ (I, I=1,NUM_IMAGES()) /)
OPEN( UNIT=IUNIT, FILE=CFILE, ACTION='READ', TEAM=ALL, &
FORM=CFORM, STATUS=CSTAT, IOSTAT=IOS)
READ( UNIT=IUNIT,NML=SOLVER,TEAM=ALL) ! all images read same values
CLOSE(UNIT=IUNIT, TEAM=ALL)
Only the TEAM READ extension would be needed by an actual source to source compiler. All the other extensions are work-arounds for the limitations of caf2omp.
OPEN(UNIT=11,ACCESS='direct',ACTION='write',
1 FILE='fort.11',STATUS='new',
2 FORM='unformatted',RECL=N) ! not allowed by caf2omp
OPEN(UNIT=11,ACCESS='direct',ACTION='write',&
FILE='fort.11',STATUS='new',&
FORM='unformatted',RECL=N) ! allowed by caf2omp
A = 1; B = 2 ! not allowed by caf2omp
SAVE = 0.0 ! not allowed by caf2omp
TEAM = (/ 1, 3 /) ! not allowed by caf2omp
A(:) = B&
[1:NUM_IMAGES()] ! not allowed by caf2omp
A(:) = B[1:NUM_IMAGES()] ! allowed by caf2omp
PROGRAM CAF_MAIN ! required by caf2omp
INTEGER :: KDATA,LDATA=2 ! LDATA implicitly saved
DATA KDATA / 2 / ! KDATA implicitly saved
SAVE KDATA, LDATA ! required by caf2omp
INTEGER, SAVE :: ISAVE,JDATA=2 ! not allowed by caf2omp
INTEGER ISAVE,JDATA ! use this instead
SAVE ISAVE,JDATA
DATA JDATA / 2 / ! JDATA must be explicitly SAVEd
REAL A2(100)[*],B2(100)[0:*]
COMMON/CAF2/ A2,B2 ! not allowed by caf2omp
REAL A2,B2
COMMON/CAF2/ A2(100)[*],B2(100)[0:*] ! use this for COMMON co-arrays
INTEGER, SAVE, DIMENSION(100) :: KCAF[*] ! not allowed by caf2omp
INTEGER, SAVE :: KCAF(100)[*] ! use this for local co-arrays
INTEGER :: ICAF[*] ! not allowed by caf2omp
INTEGER, SAVE :: LOCAL,ICAF[*] ! not allowed by caf2omp
INTEGER, SAVE :: ICAF[*] ! use this for local co-arrays
INTEGER LOCAL ! use this and
SAVE LOCAL ! this for saved variables
REAL, ALLOCATABLE :: S1(:,:)[:], S2(:,:)[:,:]
ALLOCATE( S1(0:IH+1, 0:JHQ/JQR+1)[*] )
ALLOCATE( S2(0:IH/IPR+1,0:JH /JPR+1)[IPR,*] )
OPEN(UNIT=11,ACCESS='direct',ACTION='write',TEAM=TEAM,&
FILE='fort.11',STATUS='new',FORM='unformatted',RECL=N)
CLOSE(UNIT=11,TEAM=TEAM)
PI = SUM(MYPI[:]) ! not allowed by caf2omp
PI = SUM(MYPI[1:NIMG]) ! use this instead
AI = AI[ME-1] ! not allowed by caf2omp
AI(:,:,:) = AI(:,:,:)[ME-1] ! not allowed by caf2omp
AI(:,:,:)[ME] = AI(:,:,:)[ME-1] ! use this instead
AI(:,:,:)[@] = AI(:,:,:)[ME-1] ! or this (caf2omp extension)
REAL, SAVE :: A[0:*]
ME_A = THIS_IMAGE(A) ! not allowed by caf2omp
ME_A = THIS_IMAGE(A[0:@]) ! caf2omp extension
REAL, SAVE :: CAF[0:*]
RESULT = FUNCTION(CAF) ! no automatic sync_memorys
CALL SYNC_MEMORY() ! needed if FUNCTION includes a sync
RESULT = FUNCTION(CAF)
CALL SYNC_MEMORY() ! needed if FUNCTION includes a sync
READ(100001,*) S ! not allowed by caf2omp
INTERFACE ! ignored by caf2omp, but required by OpenMP
SUBROUTINE SUB1( AA )
REAL :: AA(:)[*] ! assumed-shape dummy co-array
END SUBROUTINE SUB1
END INTERFACE
INTEGER, SAVE :: A(100)[*]
CALL SUB1(A) ! not allowed by caf2omp
CALL SUB1(A[1:NUM_IMAGES()]) ! illegal extension
CALL SUB1(A(:)[:]) ! illegal extension
CALL SUB1(A(:)[1:NUM_IMAGES()]) ! caf2omp extension
CALL SUB1(A(:)[1:NIMG]) ! ok if NIMG==NUM_IMAGES()
CALL SUB1(A(2:100:2)) ! not allowed by caf2omp
CALL SUB1(A(2:100:2)[:]) ! illegal extension
CALL SUB1(A(2:100:2)[1:NUM_IMAGES()]) ! caf2omp extension
INTERFACE ! ignored by caf2omp, optional for OpenMP
SUBROUTINE SUBC( AA )
REAL :: AA(50)[*] ! explicit-shape dummy co-array
END SUBROUTINE SUBC
SUBROUTINE SUBL( BB )
REAL :: BB(50) ! explicit-shape dummy
END SUBROUTINE SUBC
END INTERFACE
INTEGER, SAVE :: A(100)[*],B(50)[*]
CALL SUBC(B) ! allowed by caf2omp
CALL SUBL(A) ! not allowed by caf2omp
CALL SUBL(A(1)) ! not allowed by caf2omp
CALL SUBL(A(1)[@]) ! caf2omp extension
CALL SUBL(A(51)) ! not allowed by caf2omp
CALL SUBL(A(51)[@]) ! caf2omp extension
CALL SUBL(B) ! not allowed by caf2omp
CALL SUBL(B(1)) ! not allowed by caf2omp
CALL SUBL(B(1)[@]) ! caf2omp extension
CALL SUB2(B(1)[ME]) ! ok if ME==THIS_IMAGE(B)
All 18 limitations could be removed by an actual source to source compiler.