Skip to content

Commit dbe6ba0

Browse files
authored
Merge pull request #101 from CaNS-World/stag-cmpt-rho_av
2 parents d7b7bc4 + 83f7dba commit dbe6ba0

File tree

4 files changed

+97
-22
lines changed

4 files changed

+97
-22
lines changed

src/main.f90

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,14 @@ program cans
8484
#endif
8585
use mod_timer , only: timer_tic,timer_toc,timer_print
8686
use mod_updatep , only: updatep
87-
use mod_utils , only: bulk_mean,bulk_mean_12
87+
use mod_utils , only: bulk_mean_12_stag
8888
!@acc use mod_utils , only: device_memory_footprint
8989
use mod_types
9090
implicit none
9191
integer , dimension(3) :: lo,hi,n,n_x_fft,n_y_fft,lo_z,hi_z,n_z
9292
real(rp), allocatable, dimension(:,:,:) :: u,v,w,p,pp,pn,po
93-
real(rp) :: rho_av
93+
real(rp), dimension(3) :: rho_av
94+
logical , dimension(3) :: is_cmpt_rho_av
9495
#if !defined(_OPENACC)
9596
type(C_PTR), dimension(2,2) :: arrplanp
9697
#else
@@ -425,10 +426,14 @@ program cans
425426
!$acc update device(u,v,w,p) async(1)
426427
call bounduvw(cbcvel,n,bcvel,nb,is_bound,.false.,dl,dzc,dzf,u,v,w)
427428
else
428-
rho_av = 0.
429-
if(any(abs(gacc(:))>0. .and. cbcpre(0,:)//cbcpre(1,:) == 'PP')) then
430-
call bulk_mean_12(n,grid_vol_ratio_c,psi,rho12,rho_av)
431-
end if
429+
rho_av(:) = 0.
430+
is_cmpt_rho_av(:) = (abs(gacc(:)) > 0.) .and. cbcpre(0,:)//cbcpre(1,:) == 'PP'
431+
if(is_cmpt_rho_av(1)) &
432+
call bulk_mean_12_stag(n,1,grid_vol_ratio_c,psi,rho12,rho_av(1))
433+
if(is_cmpt_rho_av(2)) &
434+
call bulk_mean_12_stag(n,2,grid_vol_ratio_c,psi,rho12,rho_av(2))
435+
if(is_cmpt_rho_av(3)) &
436+
call bulk_mean_12_stag(n,3,grid_vol_ratio_f,psi,rho12,rho_av(3))
432437
call tm(tm_coeff,n,dli,dzci,dzfi,dt,dt_r, &
433438
bforce,gacc,sigma,rho_av,rho12,mu12,beta12,rho0,psi,kappa,p,pn,po,s, &
434439
psio,psiflx_x,psiflx_y,psiflx_z,u,v,w)

src/mom.f90

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,11 @@ subroutine momz_d(nx,ny,nz,dxi,dyi,dzci,dzfi,mu12,psi,u,v,w,dwdt)
249249
end do
250250
end subroutine momz_d
251251
!
252-
subroutine momx_p(nx,ny,nz,dxi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dudt)
252+
subroutine momx_p(nx,ny,nz,dxi,dt_r,bforce,gacc,rho0,rhox_av,rho12,psi,p,pp,dudt)
253253
implicit none
254254
integer , intent(in) :: nx,ny,nz
255255
real(rp), intent(in) :: dxi,dt_r
256-
real(rp), intent(in) :: bforce,gacc,rho0,rho_av,rho12(2)
256+
real(rp), intent(in) :: bforce,gacc,rho0,rhox_av,rho12(2)
257257
real(rp), dimension(0:,0:,0:), intent(in ) :: psi,p,pp
258258
real(rp), dimension( :, :, :), intent(inout) :: dudt
259259
real(rp) :: rhop,dpdl
@@ -269,7 +269,7 @@ subroutine momx_p(nx,ny,nz,dxi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dudt)
269269
rhop = rho + drho*0.5*(psi(i+1,j,k)+psi(i,j,k))
270270
dpdl = (p(i+1,j,k)-p(i,j,k))*dxi
271271
!
272-
dudt(i,j,k) = dudt(i,j,k) + bforce + gacc*(rhop-rho_av) &
272+
dudt(i,j,k) = dudt(i,j,k) + bforce + gacc*(rhop-rhox_av) &
273273
#if defined(_CONSTANT_COEFFS_POISSON)
274274
-dpdl*rhop/rho0 - (1.-rhop/rho0)*( ((1.+dt_r)*p(i+1,j,k)-dt_r*(pp(i+1,j,k))) - &
275275
((1.+dt_r)*p(i ,j,k)-dt_r*(pp(i ,j,k))) &
@@ -282,11 +282,11 @@ subroutine momx_p(nx,ny,nz,dxi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dudt)
282282
end do
283283
end subroutine momx_p
284284
!
285-
subroutine momy_p(nx,ny,nz,dyi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dvdt)
285+
subroutine momy_p(nx,ny,nz,dyi,dt_r,bforce,gacc,rho0,rhoy_av,rho12,psi,p,pp,dvdt)
286286
implicit none
287287
integer , intent(in) :: nx,ny,nz
288288
real(rp), intent(in) :: dyi,dt_r
289-
real(rp), intent(in) :: bforce,gacc,rho0,rho_av,rho12(2)
289+
real(rp), intent(in) :: bforce,gacc,rho0,rhoy_av,rho12(2)
290290
real(rp), dimension(0:,0:,0:), intent(in ) :: psi,p,pp
291291
real(rp), dimension( :, :, :), intent(inout) :: dvdt
292292
integer :: i,j,k
@@ -302,7 +302,7 @@ subroutine momy_p(nx,ny,nz,dyi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dvdt)
302302
rhop = rho + drho*0.5*(psi(i,j+1,k)+psi(i,j,k))
303303
dpdl = (p(i,j+1,k)-p(i,j,k))*dyi
304304
!
305-
dvdt(i,j,k) = dvdt(i,j,k) + bforce + gacc*(rhop-rho_av) &
305+
dvdt(i,j,k) = dvdt(i,j,k) + bforce + gacc*(rhop-rhoy_av) &
306306
#if defined(_CONSTANT_COEFFS_POISSON)
307307
-dpdl*rhop/rho0 - (1.-1.*rhop/rho0)*( ((1.+dt_r)*p(i,j+1,k)-dt_r*(pp(i,j+1,k))) - &
308308
((1.+dt_r)*p(i,j ,k)-dt_r*(pp(i,j ,k))) &
@@ -315,12 +315,12 @@ subroutine momy_p(nx,ny,nz,dyi,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dvdt)
315315
end do
316316
end subroutine momy_p
317317
!
318-
subroutine momz_p(nx,ny,nz,dzci,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dwdt)
318+
subroutine momz_p(nx,ny,nz,dzci,dt_r,bforce,gacc,rho0,rhoz_av,rho12,psi,p,pp,dwdt)
319319
implicit none
320320
integer , intent(in) :: nx,ny,nz
321321
real(rp), intent(in), dimension(0:) :: dzci
322322
real(rp), intent(in) :: dt_r
323-
real(rp), intent(in) :: bforce,gacc,rho0,rho_av,rho12(2)
323+
real(rp), intent(in) :: bforce,gacc,rho0,rhoz_av,rho12(2)
324324
real(rp), dimension(0:,0:,0:), intent(in ) :: psi,p,pp
325325
real(rp), dimension( :, :, :), intent(inout) :: dwdt
326326
real(rp) :: rhop,dpdl
@@ -336,7 +336,7 @@ subroutine momz_p(nx,ny,nz,dzci,dt_r,bforce,gacc,rho0,rho_av,rho12,psi,p,pp,dwdt
336336
rhop = rho + drho*0.5*(psi(i,j,k+1)+psi(i,j,k))
337337
dpdl = (p(i,j,k+1)-p(i,j,k))*dzci(k)
338338
!
339-
dwdt(i,j,k) = dwdt(i,j,k) + bforce + gacc*(rhop-rho_av) &
339+
dwdt(i,j,k) = dwdt(i,j,k) + bforce + gacc*(rhop-rhoz_av) &
340340
#if defined(_CONSTANT_COEFFS_POISSON)
341341
-dpdl*rhop/rho0 - (1.-1.*rhop/rho0)*( ((1.+dt_r)*p(i,j,k+1)-dt_r*(pp(i,j,k+1))) - &
342342
((1.+dt_r)*p(i,j,k )-dt_r*(pp(i,j,k ))) &
@@ -860,7 +860,7 @@ subroutine mom_xyz_oth(n,dli,dzci,dzfi,dt_r,rho12,beta12,bforce,gacc,sigma,rho0,
860860
real(rp), intent(in ), dimension(2) :: rho12,beta12
861861
real(rp), intent(in ), dimension(3) :: bforce,gacc
862862
real(rp), intent(in ) :: sigma
863-
real(rp), intent(in ) :: rho0,rho_av
863+
real(rp), intent(in ) :: rho0,rho_av(3)
864864
real(rp), intent(in ), dimension(0:,0:,0:) :: p,psi,kappa
865865
real(rp), intent(in ), dimension(0:,0:,0:), optional :: s,pn,po
866866
real(rp), intent(inout), dimension( :, :, :) :: dudt,dvdt,dwdt
@@ -872,7 +872,7 @@ subroutine mom_xyz_oth(n,dli,dzci,dzfi,dt_r,rho12,beta12,bforce,gacc,sigma,rho0,
872872
q_ccc,q_pcc,q_cpc,q_ccp, &
873873
s_ccc,s_pcc,s_cpc,s_ccp, &
874874
k_ccc,k_pcc,k_cpc,k_ccp, &
875-
bforcex,bforcey,bforcez,gaccx,gaccy,gaccz, &
875+
bforcex,bforcey,bforcez,gaccx,gaccy,gaccz,rhox_av,rhoy_av,rhoz_av, &
876876
dzci_c,dzci_m,dzfi_c,dzfi_p, &
877877
psixp,psiyp,psizp
878878
real(rp) :: rhoxp,rhoyp,rhozp, &
@@ -889,6 +889,7 @@ subroutine mom_xyz_oth(n,dli,dzci,dzfi,dt_r,rho12,beta12,bforce,gacc,sigma,rho0,
889889
dxi = dli(1)
890890
dyi = dli(2)
891891
surf_factor = sigma*2./(rho12(1)+rho12(2))
892+
rhox_av = rho_av(1); rhoy_av = rho_av(2); rhoz_av = rho_av(3)
892893
!
893894
! making an exception for this kernel -- private variables not explicitly mentioned for the sake of conciseness
894895
! all scalars should be firstprivate/private
@@ -948,9 +949,9 @@ subroutine mom_xyz_oth(n,dli,dzci,dzfi,dt_r,rho12,beta12,bforce,gacc,sigma,rho0,
948949
dpdx = (p_pcc-p_ccc)*dxi
949950
dpdy = (p_cpc-p_ccc)*dyi
950951
dpdz = (p_ccp-p_ccc)*dzci_c
951-
dudt_aux = bforcex + (rhoxp-rho_av)*gaccx
952-
dvdt_aux = bforcey + (rhoyp-rho_av)*gaccy
953-
dwdt_aux = bforcez + (rhozp-rho_av)*gaccz
952+
dudt_aux = bforcex + (rhoxp-rhox_av)*gaccx
953+
dvdt_aux = bforcey + (rhoyp-rhoy_av)*gaccy
954+
dwdt_aux = bforcez + (rhozp-rhoz_av)*gaccz
954955
!
955956
skappaxp = 0.5*(k_pcc+k_ccc)*surf_factor
956957
skappayp = 0.5*(k_cpc+k_ccc)*surf_factor

src/rk.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ subroutine rk(rkpar,n,dli,dzci,dzfi,dt,dt_r, &
2626
real(rp), intent(in) :: dt,dt_r
2727
real(rp), intent(in ), dimension(0:) :: dzci,dzfi
2828
real(rp), intent(in ), dimension(3) :: bforce,gacc
29-
real(rp), intent(in ) :: sigma,rho_av
29+
real(rp), intent(in ) :: sigma,rho_av(3)
3030
real(rp), intent(in ), dimension(2) :: rho12,mu12,beta12
3131
real(rp), intent(in ) :: rho0
3232
real(rp), intent(in ), dimension(0:,0:,0:) :: psi,kappa

src/utils.f90

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
module mod_utils
88
implicit none
99
private
10-
public bulk_mean,bulk_mean_12,f_sizeof,swap
10+
public bulk_mean,bulk_mean_12,bulk_mean_12_stag,f_sizeof,swap
1111
!@acc public device_memory_footprint
1212
contains
1313
subroutine bulk_mean(n,grid_vol_ratio,p,mean)
@@ -65,6 +65,75 @@ subroutine bulk_mean_12(n,grid_vol_ratio,psi,p12,mean)
6565
!$acc wait(1)
6666
call MPI_ALLREDUCE(MPI_IN_PLACE,mean,1,MPI_REAL_RP,MPI_SUM,MPI_COMM_WORLD,ierr)
6767
end subroutine bulk_mean_12
68+
subroutine bulk_mean_12_stag(n,idir,grid_vol_ratio,psi,p12,mean)
69+
!
70+
! compute the mean value of an observable over the entire domain
71+
!
72+
use mpi
73+
use mod_types
74+
implicit none
75+
integer , intent(in), dimension(3) :: n
76+
integer , intent(in) :: idir
77+
real(rp), intent(in), dimension(0:) :: grid_vol_ratio
78+
real(rp), intent(in), dimension(0:,0:,0:) :: psi
79+
real(rp), intent(in), dimension(2) :: p12
80+
real(rp), intent(out) :: mean
81+
real(rp) :: psi_loc
82+
integer :: i,j,k
83+
integer :: ierr
84+
mean = 0.
85+
select case(idir)
86+
case(1)
87+
!$acc data copy(mean) async(1)
88+
!$acc parallel loop collapse(3) default(present) private(psi_loc) reduction(+:mean) async(1)
89+
do k=1,n(3)
90+
do j=1,n(2)
91+
do i=1,n(1)
92+
psi_loc = 0.5*(psi(i+1,j,k)+psi(i,j,k))
93+
mean = mean + (psi_loc*p12(1)+(1.-psi_loc)*p12(2))*grid_vol_ratio(k)
94+
end do
95+
end do
96+
end do
97+
!$acc end data
98+
case(2)
99+
!$acc data copy(mean) async(1)
100+
!$acc parallel loop collapse(3) default(present) private(psi_loc) reduction(+:mean) async(1)
101+
do k=1,n(3)
102+
do j=1,n(2)
103+
do i=1,n(1)
104+
psi_loc = 0.5*(psi(i,j+1,k)+psi(i,j,k))
105+
mean = mean + (psi_loc*p12(1)+(1.-psi_loc)*p12(2))*grid_vol_ratio(k)
106+
end do
107+
end do
108+
end do
109+
!$acc end data
110+
case(3)
111+
!$acc data copy(mean) async(1)
112+
!$acc parallel loop collapse(3) default(present) private(psi_loc) reduction(+:mean) async(1)
113+
do k=1,n(3)
114+
do j=1,n(2)
115+
do i=1,n(1)
116+
psi_loc = 0.5*(psi(i,j,k+1)+psi(i,j,k))
117+
mean = mean + (psi_loc*p12(1)+(1.-psi_loc)*p12(2))*grid_vol_ratio(k)
118+
end do
119+
end do
120+
end do
121+
!$acc end data
122+
case default
123+
!$acc data copy(mean) async(1)
124+
!$acc parallel loop collapse(3) default(present) reduction(+:mean) async(1)
125+
do k=1,n(3)
126+
do j=1,n(2)
127+
do i=1,n(1)
128+
mean = mean + (psi(i,j,k)*p12(1)+(1.-psi(i,j,k))*p12(2))*grid_vol_ratio(k)
129+
end do
130+
end do
131+
end do
132+
!$acc end data
133+
end select
134+
!$acc wait(1)
135+
call MPI_ALLREDUCE(MPI_IN_PLACE,mean,1,MPI_REAL_RP,MPI_SUM,MPI_COMM_WORLD,ierr)
136+
end subroutine bulk_mean_12_stag
68137
pure integer function f_sizeof(val) result(isize)
69138
!
70139
! returns storage size of the scalar argument val in bytes

0 commit comments

Comments
 (0)