From 1592382b14fb51496db1b594901f22b571387a2b Mon Sep 17 00:00:00 2001 From: Damian Rouson Date: Fri, 27 Jun 2025 08:00:24 -0700 Subject: [PATCH 1/2] refac(laplacian): add locality specifiers --- src/matcha/subdomain_s.F90 | 48 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/matcha/subdomain_s.F90 b/src/matcha/subdomain_s.F90 index 28eaa930..ce02ea65 100644 --- a/src/matcha/subdomain_s.F90 +++ b/src/matcha/subdomain_s.F90 @@ -82,38 +82,47 @@ end procedure module procedure laplacian - - integer i, j, k + integer i, j, k; real, allocatable :: halo_west(:,:), halo_east(:,:) call_assert(allocated(rhs%s_)) call_assert(allocated(halo_x)) allocate(laplacian_rhs%s_(my_nx, ny, nz)) - halo_west = merge(halo_x(west,:,:), rhs%s_(1,:,:), me/=1) i = my_internal_west call_assert_describe(i+1<=my_nx, "laplacian: westernmost subdomain too small") - do concurrent(j=2:ny-1, k=2:nz-1) - laplacian_rhs%s_(i,j,k) = ( halo_west(j,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i+1,j ,k ))/dx_**2 + & - (rhs%s_(i,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & - (rhs%s_(i,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 - end do - - do concurrent(i=my_internal_west+1:my_internal_east-1, j=2:ny-1, k=2:nz-1) - laplacian_rhs%s_(i,j,k) = (rhs%s_(i-1,j ,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i+1,j ,k ))/dx_**2 + & - (rhs%s_(i ,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & - (rhs%s_(i ,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 - end do + + associate( laplacian_phi => laplacian_rhs%s_, inbox => halo_west, phi=>rhs%s_) + do concurrent(j=2:ny-1, k=2:nz-1) & + default(none) shared(laplacian_phi, inbox, phi, dx_, dy_, dz_, i) + laplacian_phi(i,j,k) = (inbox(j,k ) - 2*phi(i,j,k) + phi(i+1,j ,k ))/dx_**2 + & + (phi(i,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & + (phi(i,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 + end do + end associate + + associate(laplacian_phi => laplacian_rhs%s_, phi=>rhs%s_) + do concurrent(i=my_internal_west+1:my_internal_east-1, j=2:ny-1, k=2:nz-1) & + default(none) shared(laplacian_phi, phi, dx_, dy_, dz_) + laplacian_phi(i,j,k) = (phi(i-1,j ,k ) - 2*phi(i,j,k) + phi(i+1,j ,k ))/dx_**2 + & + (phi(i ,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & + (phi(i ,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 + end do + end associate halo_east = merge(halo_x(east,:,:), rhs%s_(my_nx,:,:), me/=num_subdomains) i = my_internal_east call_assert_describe(i-1>0, "laplacian: easternmost subdomain too small") - do concurrent(j=2:ny-1, k=2:nz-1) - laplacian_rhs%s_(i,j,k) = (rhs%s_(i-1,j ,k ) - 2*rhs%s_(i,j,k) + halo_east(j ,k ))/dx_**2 + & - (rhs%s_(i ,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & - (rhs%s_(i ,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 - end do + + associate(laplacian_phi => laplacian_rhs%s_, inbox => halo_east, phi=>rhs%s_) + do concurrent(j=2:ny-1, k=2:nz-1) & + default(none) shared(laplacian_phi, inbox, phi, dx_, dy_, dz_, i) + laplacian_phi(i,j,k) = (phi(i-1,j ,k ) - 2*phi(i,j,k) + inbox( j ,k ))/dx_**2 + & + (phi(i ,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & + (phi(i ,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 + end do + end associate laplacian_rhs%s_(:, 1,:) = 0. laplacian_rhs%s_(:,ny,:) = 0. @@ -121,7 +130,6 @@ laplacian_rhs%s_(:,:,nz) = 0. if (me==1) laplacian_rhs%s_(1,:,:) = 0. if (me==num_subdomains) laplacian_rhs%s_(my_nx,:,:) = 0. - end procedure module procedure multiply From 073aae11aab6f52fc03c27b3832183fe379e6dc9 Mon Sep 17 00:00:00 2001 From: Damian Rouson Date: Fri, 27 Jun 2025 08:28:00 -0700 Subject: [PATCH 2/2] fix(laplacian): no locality specifiers w/GCC 14 --- src/matcha/subdomain_s.F90 | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/matcha/subdomain_s.F90 b/src/matcha/subdomain_s.F90 index ce02ea65..1ead2cbf 100644 --- a/src/matcha/subdomain_s.F90 +++ b/src/matcha/subdomain_s.F90 @@ -94,8 +94,12 @@ call_assert_describe(i+1<=my_nx, "laplacian: westernmost subdomain too small") associate( laplacian_phi => laplacian_rhs%s_, inbox => halo_west, phi=>rhs%s_) +#if HAVE_2018_LOCALITY_SPECIFIERS do concurrent(j=2:ny-1, k=2:nz-1) & default(none) shared(laplacian_phi, inbox, phi, dx_, dy_, dz_, i) +#else + do concurrent(j=2:ny-1, k=2:nz-1) +#endif laplacian_phi(i,j,k) = (inbox(j,k ) - 2*phi(i,j,k) + phi(i+1,j ,k ))/dx_**2 + & (phi(i,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & (phi(i,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 @@ -103,8 +107,12 @@ end associate associate(laplacian_phi => laplacian_rhs%s_, phi=>rhs%s_) +#if HAVE_2018_LOCALITY_SPECIFIERS do concurrent(i=my_internal_west+1:my_internal_east-1, j=2:ny-1, k=2:nz-1) & default(none) shared(laplacian_phi, phi, dx_, dy_, dz_) +#else + do concurrent(i=my_internal_west+1:my_internal_east-1, j=2:ny-1, k=2:nz-1) +#endif laplacian_phi(i,j,k) = (phi(i-1,j ,k ) - 2*phi(i,j,k) + phi(i+1,j ,k ))/dx_**2 + & (phi(i ,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & (phi(i ,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 @@ -116,20 +124,24 @@ call_assert_describe(i-1>0, "laplacian: easternmost subdomain too small") associate(laplacian_phi => laplacian_rhs%s_, inbox => halo_east, phi=>rhs%s_) +#if HAVE_2018_LOCALITY_SPECIFIERS do concurrent(j=2:ny-1, k=2:nz-1) & default(none) shared(laplacian_phi, inbox, phi, dx_, dy_, dz_, i) +#else + do concurrent(j=2:ny-1, k=2:nz-1) +#endif laplacian_phi(i,j,k) = (phi(i-1,j ,k ) - 2*phi(i,j,k) + inbox( j ,k ))/dx_**2 + & (phi(i ,j-1,k ) - 2*phi(i,j,k) + phi(i ,j+1,k ))/dy_**2 + & (phi(i ,j ,k-1) - 2*phi(i,j,k) + phi(i ,j ,k+1))/dz_**2 end do end associate - laplacian_rhs%s_(:, 1,:) = 0. - laplacian_rhs%s_(:,ny,:) = 0. - laplacian_rhs%s_(:,:, 1) = 0. - laplacian_rhs%s_(:,:,nz) = 0. - if (me==1) laplacian_rhs%s_(1,:,:) = 0. - if (me==num_subdomains) laplacian_rhs%s_(my_nx,:,:) = 0. + laplacian_rhs%s_(:, 1,:) = 0. ! y-direction low boundary + laplacian_rhs%s_(:,ny,:) = 0. ! y-direction high boundary + laplacian_rhs%s_(:,:, 1) = 0. ! z-direction low boundary + laplacian_rhs%s_(:,:,nz) = 0. ! z-direction high boundary + if (me==1) laplacian_rhs%s_(1,:,:) = 0. ! x-direction low boundary + if (me==num_subdomains) laplacian_rhs%s_(my_nx,:,:) = 0. ! x-direction high boundary end procedure module procedure multiply