PROGRAM test IMPLICIT NONE REAL(KIND=8), DIMENSION(2) :: aa, rr aa(1)=10. aa(2)=11. WRITE(*,*) 'Both f1 and ff work if the optional parameter is present:' rr=f1(aa,1) WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) rr=ff(aa,1) WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) WRITE(*,*) 'But only f1 works if the optional parameter is absent:' rr=f1(aa) WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) rr=ff(aa) WRITE(*,*) ' rr(1)=', rr(1), ' rr(2)=', rr(2) CONTAINS ELEMENTAL REAL(KIND=8) FUNCTION ff(a,b) IMPLICIT NONE REAL(KIND=8), INTENT(IN) :: a INTEGER, INTENT(IN), OPTIONAL :: b REAL(KIND=8), DIMENSION(2) :: ac ac(1)=a ac(2)=a**2 ff=SUM(gg(ac,b)) END FUNCTION ff ELEMENTAL REAL(KIND=8) FUNCTION f1(a,b) IMPLICIT NONE REAL(KIND=8), INTENT(IN) :: a INTEGER, INTENT(IN), OPTIONAL :: b REAL(KIND=8), DIMENSION(2) :: ac ac(1)=a ac(2)=a**2 f1=gg(ac(1),b)+gg(ac(2),b) ! This is the same as in ff, but without using the elemental feature of gg END FUNCTION f1 ELEMENTAL REAL(KIND=8) FUNCTION gg(a,b) IMPLICIT NONE REAL(KIND=8), INTENT(IN) :: a INTEGER, INTENT(IN), OPTIONAL :: b INTEGER ::b1 IF(PRESENT(b)) THEN b1=b ELSE b1=1 ENDIF gg=a**b1 END FUNCTION gg END PROGRAM test