OpenMP-Examples/sources/Example_udr.4.f90

59 lines
1.1 KiB
Fortran

! @@name: udr.4.f90
! @@type: F-free
! @@compilable: yes
! @@linkable: yes
! @@expect: success
module data_red
! Declare data type.
type dt
real :: r1
real :: r2
end type
! Declare the user-defined operator .add.
interface operator(.add.)
module procedure addc
end interface
! Declare the user-defined reduction operator .add.
!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in) &
!$omp& initializer(dt_init(omp_priv))
contains
! Declare the initialization routine.
subroutine dt_init(u)
type(dt) :: u
u%r1 = 0.0
u%r2 = 0.0
end subroutine
! Declare the specific procedure for the .add. operator.
function addc(x1, x2) result(xresult)
type(dt), intent(in) :: x1, x2
type(dt) :: xresult
xresult%r1 = x1%r1 + x2%r2
xresult%r2 = x1%r2 + x2%r1
end function
end module data_red
program main
use data_red, only : dt, dt_init, operator(.add.)
type(dt) :: xdt1, xdt2
integer :: i
xdt1 = dt(1.0,2.0)
xdt2 = dt(2.0,3.0)
! The reduction operation
!$omp parallel do reduction(.add.: xdt1)
do i = 1, 10
xdt1 = xdt1 .add. xdt2
end do
!$omp end parallel do
print *, xdt1
end program