diff --git a/src/ZSOLVER/tensorproductmultigrid_Source/multigrid.f90 b/src/ZSOLVER/tensorproductmultigrid_Source/multigrid.f90 index e2a0b94a9f31087bb2ffe8b1173fd72963bab935..b43fa68dd42e6783c41cae69e3396b0f145fdbb7 100644 --- a/src/ZSOLVER/tensorproductmultigrid_Source/multigrid.f90 +++ b/src/ZSOLVER/tensorproductmultigrid_Source/multigrid.f90 @@ -473,7 +473,7 @@ contains type(scalar3d), intent(inout) :: phicoarse ! local var integer :: ix,iy,iz - integer :: ix_min, ix_max, iy_min, iy_max, n + integer :: ix_min, ix_max, iy_min, iy_max, n ,nz real(kind=rl) :: xn,xs,xw,xe real , dimension(:,:,:) , pointer , contiguous :: zphifine_st , zphicoarse_st @@ -483,13 +483,14 @@ contains ix_max = phicoarse%icompx_max iy_min = phicoarse%icompy_min iy_max = phicoarse%icompy_max + nz = phicoarse%grid_param%nz ! three dimensional cell average if (mg_param%restriction == REST_CELLAVERAGE) then ! Do not coarsen in z-direction if (LUseO) then do ix=ix_min,ix_max do iy=iy_min,iy_max - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phicoarse%s(iz,iy,ix) = & phifine%s(iz ,2*iy ,2*ix ) + & phifine%s(iz ,2*iy-1,2*ix ) + & @@ -503,7 +504,7 @@ contains zphifine_st => phifine%st zphicoarse_st => phicoarse%st !$acc kernels loop independent collapse(3) - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do iy=iy_min,iy_max do ix=ix_min,ix_max zphicoarse_st(ix,iy,iz) = & @@ -529,7 +530,7 @@ contains xn=1.0 if (iy==1) xs=0.0 if (iy==n) xn=0.0 - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phicoarse%s(iz,iy,ix) = 0.25_rl * ( & phifine%s(iz,2*iy+1,2*ix-1) * xn + & phifine%s(iz,2*iy+1,2*ix ) * xn + & @@ -548,7 +549,7 @@ contains end do end if if (LUseT) then - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do iy=iy_min,iy_max xs=1.0 xn=1.0 @@ -587,19 +588,21 @@ contains type(scalar3d), intent(in) :: phifine type(scalar3d), intent(inout) :: phicoarse integer :: ix,iy,iz - integer :: ix_min, ix_max, iy_min, iy_max + integer :: ix_min, ix_max, iy_min, iy_max , nz ix_min = phicoarse%icompx_min ix_max = phicoarse%icompx_max iy_min = phicoarse%icompy_min iy_max = phicoarse%icompy_max + nz = phicoarse%grid_param%nz + ! three dimensional cell average if (mg_param%restriction == REST_CELLAVERAGE) then ! Do not coarsen in z-direction if (LUseO) then do ix=ix_min,ix_max do iy=iy_min,iy_max - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phicoarse%s(iz,iy,ix) = & phifine%s(iz ,2*iy ,2*ix ) + & phifine%s(iz ,2*iy-1,2*ix ) + & @@ -610,7 +613,7 @@ contains end do end if if (LUseT) then - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do iy=iy_min,iy_max do ix=ix_min,ix_max phicoarse%st(ix,iy,iz) = & @@ -755,14 +758,16 @@ contains subroutine loop_over_grid_constant_mnh(iblock) implicit none integer, intent(in) :: iblock - integer :: ix,iy,iz + integer :: ix,iy,iz, nz + + nz = phicoarse%grid_param%nz if (LUseO) then do ix=ixmin(iblock),ixmax(iblock) do iy=iymin(iblock),iymax(iblock) do dix = -1,0 do diy = -1,0 - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phifine%s(iz,2*iy+diy,2*ix+dix) = phicoarse%s(iz,iy,ix) end do end do @@ -775,7 +780,7 @@ contains do iy=iymin(iblock),iymax(iblock) do dix = -1,0 do diy = -1,0 - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phifine%st(2*ix+dix,2*iy+diy,iz) = phicoarse%st(ix,iy,iz) end do end do @@ -797,6 +802,10 @@ contains real , dimension(:,:,:) , pointer , contiguous :: zphifine_st , zphicoarse_st + integer :: nz + + nz = phicoarse%grid_param%nz + ! optimisation for newman MNH case : all coef constant rhox = 0.25_rl rhoy = 0.25_rl @@ -805,7 +814,7 @@ contains do ix=ixmin(iblock),ixmax(iblock) do iy=iymin(iblock),iymax(iblock) ! Piecewise linear interpolation - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do dix = -1,0 do diy = -1,0 phifine%s(iz,2*iy+diy,2*ix+dix) = & @@ -827,7 +836,7 @@ contains zphicoarse_st => phicoarse%st !$acc kernels loop independent collapse(5) - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do diy = -1,0 do dix = -1,0 do iy=iymin(iblock),iymax(iblock) @@ -981,7 +990,7 @@ contains do iy=iymin(iblock),iymax(iblock) do dix = -1,0 do diy = -1,0 - do iz=1,phicoarse%grid_param%nz + do iz=1,nz phifine%s(iz,2*iy+diy,2*ix+dix) = phicoarse%s(iz,iy,ix) end do end do @@ -1001,7 +1010,7 @@ contains do iy=iymin(iblock),iymax(iblock) #ifdef PIECEWISELINEAR ! Piecewise linear interpolation - do iz=1,phicoarse%grid_param%nz + do iz=1,nz do dix = -1,0 do diy = -1,0 if ( (ix+(2*dix+1)+phicoarse%ix_min-1 < 1 ) .or. & @@ -1105,7 +1114,7 @@ contains end do ! invert A call invertA(A) - do iz=1,phicoarse%grid_param%nz + do iz=1,nz ! Calculate gradient on each level dxu(1:2) = dx(1,1:2)*phicoarse%s(iz,iy ,ix-1) & + dx(2,1:2)*phicoarse%s(iz,iy ,ix+1) & @@ -1498,6 +1507,7 @@ contains real(kind=rl) :: alpha, beta, pq, rz, rz_old integer :: ierr real(kind=rl) , pointer , contiguous , dimension(:,:,:) :: z_one_st + integer :: icompx_max, icompy_max, nz solvertype = solver_param%solvertype resreduction = solver_param%resreduction @@ -1524,22 +1534,27 @@ contains ! ! Init 1 vector = z_one call create_scalar3d(MPI_COMM_HORIZ,bRHS%grid_param,halo_size,z_one) + ! + icompx_max = z_one%icompx_max + icompy_max = z_one%icompy_max + nz = z_one%grid_param%nz + ! if (LUseO) then z_one%s(:,:,:) = 0.0_rl - z_one%s(1:z_one%grid_param%nz,1:z_one%icompy_max,1:z_one%icompx_max) = 1.0_rl + z_one%s(1:nz,1:icompy_max,1:icompx_max) = 1.0_rl end if if (LUseT) then z_one_st => z_one%st !$acc kernels z_one_st(:,:,:) = 0.0_rl - z_one_st(1:z_one%icompx_max,1:z_one%icompy_max,1:z_one%grid_param%nz) = 1.0_rl + z_one_st(1:icompx_max,1:icompy_max,1:nz) = 1.0_rl !$acc end kernels end if ! Mean / Norm of B call scalarprod_mnh(pproc,z_one,z_one, mean_initial ) call scalarprod_mnh(pproc,z_one,bRHS, mean_initial ) norm_initial = l2norm_mnh(bRHS,.true.) - mean_initial = mean_initial / (( z_one%grid_param%nz ) * ( z_one%grid_param%n )**2) + mean_initial = mean_initial / (( nz ) * ( z_one%grid_param%n )**2) norm_initial = mean_initial / norm_initial if (LMean) then ! b <- b -mean_initial * z_one diff --git a/src/ZSOLVER/tensorproductmultigrid_Source/profiles.f90 b/src/ZSOLVER/tensorproductmultigrid_Source/profiles.f90 index 72338e703e1ab7a938de88d82c72d8b43c2ac763..70e7508d52411b9bd9e9c28b5dd81054d9f7a86f 100644 --- a/src/ZSOLVER/tensorproductmultigrid_Source/profiles.f90 +++ b/src/ZSOLVER/tensorproductmultigrid_Source/profiles.f90 @@ -58,7 +58,7 @@ private type(grid_parameters), intent(in) :: grid_param type(model_parameters), intent(in) :: model_param type(scalar3d), intent(inout) :: u - integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max + integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max, nz real(kind=rl) :: x, y, z real(kind=rl) :: rho, sigma, theta, phi, r, b_low, b_up, pi @@ -71,12 +71,14 @@ private ix_max = u%ix_max iy_min = u%iy_min iy_max = u%iy_max + nz = u%grid_param%nz + IF (.NOT. PRESENT(KIB) ) THEN ! Initialise RHS if (LUseO) then do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,u%grid_param%nz + do iz=1,nz u%s(iz,iy-iy_min+1,ix-ix_min+1) = 0.0_rl @@ -87,7 +89,7 @@ private if (LUseT) then zu_st => u%st !$acc kernels loop independent collapse(3) - do iz=1,u%grid_param%nz + do iz=1,nz do iy=iy_min, iy_max do ix=ix_min, ix_max @@ -103,7 +105,7 @@ private if (LUseO) then do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,u%grid_param%nz + do iz=1,nz u%s(iz,iy-iy_min+1,ix-ix_min+1) = PU(IX-ix_min+KIB,IY-iy_min+KJB,IZ) end do end do @@ -112,7 +114,7 @@ private if (LUseT) then zu_st => u%st !$acc kernels loop independent collapse(3) - do iz=1,u%grid_param%nz + do iz=1,nz do iy=iy_min, iy_max do ix=ix_min, ix_max zu_st(ix-ix_min+1,iy-iy_min+1,iz) = PU(IX-ix_min+KIB,IY-iy_min+KJB,IZ) @@ -131,7 +133,7 @@ private type(grid_parameters), intent(in) :: grid_param type(model_parameters), intent(in) :: model_param type(scalar3d), intent(inout) :: u - integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max + integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max, nz real(kind=rl) :: x, y, z real(kind=rl) :: rho, sigma, theta, phi, r, b_low, b_up, pi @@ -144,6 +146,8 @@ private ix_max = u%ix_max iy_min = u%iy_min iy_max = u%iy_max + nz = u%grid_param%nz + IF (.NOT. PRESENT(KIB) ) THEN ! ELSE @@ -151,7 +155,7 @@ private if (LUseO) then do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,u%grid_param%nz + do iz=1,nz PU(IX-ix_min+KIB,IY-iy_min+KJB,IZ) = u%s(iz,iy-iy_min+1,ix-ix_min+1) end do end do @@ -159,7 +163,7 @@ private else zu_st => u%st !$acc kernels loop independent collapse(3) - do iz=1,u%grid_param%nz + do iz=1,nz do iy=iy_min, iy_max do ix=ix_min, ix_max PU(IX-ix_min+KIB,IY-iy_min+KJB,IZ) = zu_st(ix-ix_min+1,iy-iy_min+1,iz) @@ -178,7 +182,7 @@ private type(grid_parameters), intent(in) :: grid_param type(model_parameters), intent(in) :: model_param type(scalar3d), intent(inout) :: b - integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max + integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max, nz, n real(kind=rl) :: x, y, z real(kind=rl) :: rho, sigma, theta, phi, r, b_low, b_up, pi @@ -191,15 +195,18 @@ private ix_max = b%ix_max iy_min = b%iy_min iy_max = b%iy_max + nz = b%grid_param%nz + n = b%grid_param%n + ! IF (.NOT. PRESENT(KIB) ) THEN ! Initialise RHS if (LUseO) then do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,b%grid_param%nz - x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*b%grid_param%n)) - y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*b%grid_param%n)) - z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*b%grid_param%nz)) + do iz=1,nz + x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*n)) + y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*n)) + z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*nz)) b%s(iz,iy-iy_min+1,ix-ix_min+1) = 0.0_rl @@ -219,12 +226,12 @@ private if (LUseT) then zb_st => b%st !$acc kernels loop independent collapse(3) - do iz=1,b%grid_param%nz + do iz=1,nz do iy=iy_min, iy_max do ix=ix_min, ix_max - x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*b%grid_param%n)) - y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*b%grid_param%n)) - z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*b%grid_param%nz)) + x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*n)) + y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*n)) + z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*nz)) zb_st(ix-ix_min+1,iy-iy_min+1,iz) = 0.0_rl @@ -247,7 +254,7 @@ private if (LUseO) then do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,b%grid_param%nz + do iz=1,nz b%s(iz,iy-iy_min+1,ix-ix_min+1) = PY(IX-ix_min+KIB,IY-iy_min+KJB,IZ) end do end do @@ -256,7 +263,7 @@ private if (LUseT) then zb_st => b%st !$acc kernels loop independent collapse(3) - do iz=1,b%grid_param%nz + do iz=1,nz do iy=iy_min, iy_max do ix=ix_min, ix_max zb_st(ix-ix_min+1,iy-iy_min+1,iz) = PY(IX-ix_min+KIB,IY-iy_min+KJB,IZ) @@ -275,7 +282,7 @@ private type(grid_parameters), intent(in) :: grid_param type(model_parameters), intent(in) :: model_param type(scalar3d), intent(inout) :: b - integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max + integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max, nz, n real(kind=rl) :: x, y, z real(kind=rl) :: rho, sigma, theta, phi, r, b_low, b_up, pi @@ -287,16 +294,18 @@ private ix_max = b%ix_max iy_min = b%iy_min iy_max = b%iy_max + nz = b%grid_param%nz + n = b%grid_param%n b_low = 1.0_rl+0.25*b%grid_param%H b_up = 1.0_rl+0.75*b%grid_param%H pi = 4.0_rl*atan2(1.0_rl,1.0_rl) ! Initialise RHS do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,b%grid_param%nz - x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*b%grid_param%n)) - y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*b%grid_param%n)) - z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*b%grid_param%nz)) + do iz=1,nz + x = 1.0_rl*((ix-0.5_rl)/(1.0_rl*n)) + y = 1.0_rl*((iy-0.5_rl)/(1.0_rl*n)) + z = 1.0_rl*((iz-0.5_rl)/(1.0_rl*nz)) #ifdef TESTCONVERGENCE ! RHS for analytical solution x*(1-x)*y*(1-y)*z*(1-z) if (grid_param%vertbc == VERTBC_DIRICHLET) then @@ -359,21 +368,23 @@ private implicit none type(grid_parameters), intent(in) :: grid_param type(scalar3d), intent(inout) :: u - integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max + integer :: ix, iy, iz, ix_min, ix_max, iy_min, iy_max, nz, n real(kind=rl) :: x, y, z ix_min = u%ix_min ix_max = u%ix_max iy_min = u%iy_min iy_max = u%iy_max + nz = u%grid_param%nz + n = u%grid_param%n ! Initialise RHS do ix=ix_min, ix_max do iy=iy_min, iy_max - do iz=1,u%grid_param%nz - x = u%grid_param%L*((ix-0.5_rl)/(1.0_rl*u%grid_param%n)) - y = u%grid_param%L*((iy-0.5_rl)/(1.0_rl*u%grid_param%n)) - z = u%grid_param%H*((iz-0.5_rl)/(1.0_rl*u%grid_param%nz)) + do iz=1,nz + x = u%grid_param%L*((ix-0.5_rl)/(1.0_rl*n)) + y = u%grid_param%L*((iy-0.5_rl)/(1.0_rl*n)) + z = u%grid_param%H*((iz-0.5_rl)/(1.0_rl*nz)) if (grid_param%vertbc == VERTBC_DIRICHLET) then u%s(iz,iy-iy_min+1,ix-ix_min+1) & = x*(1.0_rl-x) &