diff --git a/tensorproductmultigrid_Source/communication.f90 b/tensorproductmultigrid_Source/communication.f90 index 2cbb3ee82aaa751e0a5d2c4c8fcd7546bbffb062..5c6a85ab0abf684bed838628d9fc304b24cf7b40 100644 --- a/tensorproductmultigrid_Source/communication.f90 +++ b/tensorproductmultigrid_Source/communication.f90 @@ -582,6 +582,9 @@ contains integer :: n, ix_min,ix_max,iy_min,iy_max ! Update Real Boundary for Newman case u(0) = u(1) , etc ... + + !return + n = a%grid_param%n ix_min = a%ix_min ix_max = a%ix_max diff --git a/tensorproductmultigrid_Source/mode_mg_read_param.f90 b/tensorproductmultigrid_Source/mode_mg_read_param.f90 index 713eb21fef8d9c349382b5d36ab8d51205edcc97..87b1ae7f2b2d8e4c162e386a9f6d29ddb5015a28 100644 --- a/tensorproductmultigrid_Source/mode_mg_read_param.f90 +++ b/tensorproductmultigrid_Source/mode_mg_read_param.f90 @@ -79,13 +79,14 @@ subroutine read_solver_parameters(filename,solver_param_out) integer, parameter :: file_id = 16 integer :: ierr namelist /parameters_solver/ solvertype,resreduction, maxiter & - , LUseO , LUseT + , LUseO , LUseT , LMean if (i_am_master_mpi) then open(file_id,file=filename) read(file_id,NML=parameters_solver) close(file_id) write(STDOUT,NML=parameters_solver) write(STDOUT,'("---------------------------------------------- ")') + write(STDOUT,'(" LMean = ",L8)') LMean write(STDOUT,'(" LUseO = ",L8)') LUseO write(STDOUT,'(" LUseT = ",L8)') LUseT write(STDOUT,'("Solver parameters ")') @@ -104,6 +105,7 @@ subroutine read_solver_parameters(filename,solver_param_out) call mpi_bcast(solvertype,1,MPI_INTEGER,master_rank,MPI_COMM_WORLD,ierr) call mpi_bcast(maxiter,1,MPI_INTEGER,master_rank,MPI_COMM_WORLD,ierr) call mpi_bcast(resreduction,1,MPI_DOUBLE_PRECISION,master_rank,MPI_COMM_WORLD,ierr) + call mpi_bcast(LMean,1,MPI_LOGICAL,master_rank,MPI_COMM_WORLD,ierr) call mpi_bcast(LUseO,1,MPI_LOGICAL,master_rank,MPI_COMM_WORLD,ierr) call mpi_bcast(LUseT,1,MPI_LOGICAL,master_rank,MPI_COMM_WORLD,ierr) solver_param_out%solvertype = solvertype diff --git a/tensorproductmultigrid_Source/multigrid.f90 b/tensorproductmultigrid_Source/multigrid.f90 index 9438e254d79ff716acbc1d80b025786dd5e7fd57..ca0f97a64ba462ed78fc18f53bafe33f29569b94 100644 --- a/tensorproductmultigrid_Source/multigrid.f90 +++ b/tensorproductmultigrid_Source/multigrid.f90 @@ -1417,13 +1417,14 @@ contains integer :: maxiter integer :: n_gridpoints integer :: iter, level, finelevel, splitlevel - real(kind=rl) :: res_old, res_new, res_initial + real(kind=rl) :: res_old, res_new, res_initial , mean_initial , norm_initial logical :: solverconverged = .false. integer :: nlocalx, nlocaly integer :: halo_size type(time) :: t_prec, t_res, t_apply, t_l2norm, t_scalprod, t_mainloop type(scalar3d) :: pp type(scalar3d) :: q + type(scalar3d) :: zone real(kind=rl) :: alpha, beta, pq, rz, rz_old integer :: ierr @@ -1446,17 +1447,44 @@ contains call initialise_timer(t_res,"t_residual") call initialise_timer(t_mainloop,"t_mainloop") - ! Copy b to b(1) - ! Copy usolution to u(1) n_gridpoints = (nlocalx+2*halo_size) & * (nlocaly+2*halo_size) & * (usolution%grid_param%nz+2) + ! + ! Init 1 vector = zone + call create_scalar3d(MPI_COMM_HORIZ,bRHS%grid_param,halo_size,zone) + if (LUseO) then + zone%s(:,:,:) = 0.0_rl + zone%s(1:zone%grid_param%nz,1:zone%icompy_max,1:zone%icompx_max) = 1.0_rl + end if + if (LUseT) then + zone%st(:,:,:) = 0.0_rl + zone%st(1:zone%icompx_max,1:zone%icompy_max,1:zone%grid_param%nz) = 1.0_rl + end if + ! Mean / Norm of B + call scalarprod_mnh(pproc,zone,zone, mean_initial ) + call scalarprod_mnh(pproc,zone,bRHS, mean_initial ) + norm_initial = l2norm_mnh(bRHS,.true.) + mean_initial = mean_initial / (( zone%grid_param%nz ) * ( zone%grid_param%n )**2) + norm_initial = mean_initial / norm_initial + if (LMean) then + ! b <- b -mean_initial * zone + if (LUseO) call daxpy(n_gridpoints,-mean_initial,zone%s,1,bRHS%s,1) + if (LUseT) call daxpy(n_gridpoints,-mean_initial,zone%st,1,bRHS%st,1) + call scalarprod_mnh(pproc,zone,bRHS, mean_initial ) + endif + ! + ! Copy b to b(1) + ! Copy usolution to u(1) if (LUseO) call dcopy(n_gridpoints,bRHS%s,1,xb_mg(level,pproc)%s,1) if (LUseT) call dcopy(n_gridpoints,bRHS%st,1,xb_mg(level,pproc)%st,1) if (LUseO) call dcopy(n_gridpoints,usolution%s,1,xu_mg(level,pproc)%s,1) if (LUseT) call dcopy(n_gridpoints,usolution%st,1,xu_mg(level,pproc)%st,1) + ! Scale with volume of grid cells call volscale_scalar3d_mnh(xb_mg(level,pproc),1) + call scalarprod_mnh(pproc,zone,xb_mg(level,pproc), mean_initial ) + call start_timer(t_res) call calculate_residual_mnh(level, pproc, & xb_mg(level,pproc),xu_mg(level,pproc),xr_mg(level,pproc)) diff --git a/tensorproductmultigrid_Source/parameters.f90 b/tensorproductmultigrid_Source/parameters.f90 index a578dcf177616bcec8234c88097ab736edba2fa7..5195982fdeffc44390f2a2fa9fd116f6e0d76660 100644 --- a/tensorproductmultigrid_Source/parameters.f90 +++ b/tensorproductmultigrid_Source/parameters.f90 @@ -58,5 +58,7 @@ module parameters ! Use Original (K,J,I) or Transposed (I,J,K) array logical :: LUseO = .false. logical :: LUseT = .true. ! .false. ! .true. +! Remove mean to B = Right Hand side + logical :: LMean = .false. end module parameters diff --git a/tensorproductmultigrid_Source/profiles.f90 b/tensorproductmultigrid_Source/profiles.f90 index f383dbaa7d3bfeb1072604e6b287db1db8dd2775..489210645307e67cfc4c21e87f668963db60cbf4 100644 --- a/tensorproductmultigrid_Source/profiles.f90 +++ b/tensorproductmultigrid_Source/profiles.f90 @@ -75,7 +75,8 @@ private do iy=iy_min, iy_max do iz=1,u%grid_param%nz - u%s(iz,iy-iy_min+1,ix-ix_min+1) = 0.0_rl + if (LUseO) u%s(iz,iy-iy_min+1,ix-ix_min+1) = 0.0_rl + if (LUseT) u%st(ix-ix_min+1,iy-iy_min+1,iz) = 0.0_rl end do end do