diff --git a/tensorproductmultigrid_Source/communication.f90 b/tensorproductmultigrid_Source/communication.f90 index f0856420bb9b7209750330fab75ec3691882e3af..c0b82d05c6752be4fad908f66468b0527f4aca82 100644 --- a/tensorproductmultigrid_Source/communication.f90 +++ b/tensorproductmultigrid_Source/communication.f90 @@ -38,7 +38,8 @@ module communication use messages use datatypes use parameters - use mpi + !use mpi + use modd_mpif use timer implicit none diff --git a/tensorproductmultigrid_Source/conjugategradient.f90 b/tensorproductmultigrid_Source/conjugategradient.f90 index b58adae6bb572e192aee480f35b94b2137388c20..eaa98b3a05f564ec7d48c3fbe11f7196e3379c8a 100644 --- a/tensorproductmultigrid_Source/conjugategradient.f90 +++ b/tensorproductmultigrid_Source/conjugategradient.f90 @@ -40,7 +40,8 @@ module conjugategradient use discretisation use messages use communication - use mpi + !use mpi + use modd_mpif implicit none diff --git a/tensorproductmultigrid_Source/datatypes.f90 b/tensorproductmultigrid_Source/datatypes.f90 index b0bfbecc3ba82cb8dd7efd828e55af5c9e901219..4705e12019fa94b3924ec61bfc7184d14024fcff 100644 --- a/tensorproductmultigrid_Source/datatypes.f90 +++ b/tensorproductmultigrid_Source/datatypes.f90 @@ -39,7 +39,8 @@ module datatypes - use mpi + !use mpi + use modd_mpif use parameters use messages diff --git a/tensorproductmultigrid_Source/discretisation.f90 b/tensorproductmultigrid_Source/discretisation.f90 index 2a45884d2504aed2fbedc5ff08b78621e984c57f..35f8b0c89d0240ed055df7bfa6da744829042009 100644 --- a/tensorproductmultigrid_Source/discretisation.f90 +++ b/tensorproductmultigrid_Source/discretisation.f90 @@ -65,7 +65,8 @@ module discretisation use messages use datatypes use communication - use mpi + !use mpi + use modd_mpif implicit none diff --git a/tensorproductmultigrid_Source/messages.f90 b/tensorproductmultigrid_Source/messages.f90 index 4ade93172d586a6ab3e890f46f0aadb279cd0453..ce0fd76c35e8517fa73c433258e2b3f2d23fe0e2 100644 --- a/tensorproductmultigrid_Source/messages.f90 +++ b/tensorproductmultigrid_Source/messages.f90 @@ -36,7 +36,8 @@ module messages use parameters - use mpi + !use mpi + use modd_mpif implicit none diff --git a/tensorproductmultigrid_Source/mg_main.f90 b/tensorproductmultigrid_Source/mg_main.f90 index 4ff09112121ed11aafe1e03b80aa20b943594d27..0fef587424479d8c9b93dd5a81b6723203962f7e 100644 --- a/tensorproductmultigrid_Source/mg_main.f90 +++ b/tensorproductmultigrid_Source/mg_main.f90 @@ -51,7 +51,8 @@ program mg_main use messages use communication use timer - use mpi + !use mpi + use modd_mpif use mode_mg_read_param use mode_mg diff --git a/tensorproductmultigrid_Source/mg_main_mnh.f90 b/tensorproductmultigrid_Source/mg_main_mnh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e99d66fd516a6ec29587387003956aad16ab509b --- /dev/null +++ b/tensorproductmultigrid_Source/mg_main_mnh.f90 @@ -0,0 +1,150 @@ +!=== COPYRIGHT AND LICENSE STATEMENT === +! +! This file is part of the TensorProductMultigrid code. +! +! (c) The copyright relating to this work is owned jointly by the +! Crown, Met Office and NERC [2014]. However, it has been created +! with the help of the GungHo Consortium, whose members are identified +! at https://puma.nerc.ac.uk/trac/GungHo/wiki . +! +! Main Developer: Eike Mueller +! +! TensorProductMultigrid is free software: you can redistribute it and/or +! modify it under the terms of the GNU Lesser General Public License as +! published by the Free Software Foundation, either version 3 of the +! License, or (at your option) any later version. +! +! TensorProductMultigrid is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU Lesser General Public License for more details. +! +! You should have received a copy of the GNU Lesser General Public License +! along with TensorProductMultigrid (see files COPYING and COPYING.LESSER). +! If not, see <http://www.gnu.org/licenses/>. +! +!=== COPYRIGHT AND LICENSE STATEMENT === + + +!================================================================== +! +! Main program for multigrid solver code for Helmholtz/Poisson +! equation, discretised in the cell centred finite volume scheme +! +! Eike Mueller, University of Bath, Feb 2012 +! +!================================================================== + +!================================================================== +! Main program +!================================================================== + +module mode_mg_main_mnh + + use discretisation + use parameters + use datatypes + use multigrid + use conjugategradient + use solver + use profiles + use messages + use communication + use timer + !use mpi + use modd_mpif + + use mode_mg_read_param + use mode_mg + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine mg_main_mnh_init() + implicit none + + call mg_init_mnh() + + ! Initialise ghosts in initial solution, as mg_solve assumes that they + ! are up-to-date + call haloswap(mg_param%n_lev,pproc,u) + + end subroutine mg_main_mnh_init + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +subroutine mg_main_initialise_rhs_mnh(xcoef) + +implicit none + +real(kind=rl) :: xcoef + + call initialise_rhs_mnh(grid_param,model_param,b,xcoef) + +end subroutine mg_main_initialise_rhs_mnh +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +subroutine mg_main_initialise_u_mnh(xcoef) + +implicit none + +real(kind=rl) :: xcoef + + u%s(:,:,:) = xcoef + +end subroutine mg_main_initialise_u_mnh +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine mg_main_mnh_solve() + + implicit none + + ! Solve using multigrid + call initialise_timer(t_solve,"t_solve") + call start_timer(t_solve) + comm_measuretime = .True. + + call mg_solve_mnh(b,u,solver_param) + + comm_measuretime = .False. + call finish_timer(t_solve) + + end subroutine mg_main_mnh_solve + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine mg_main_mnh_finalize() + + + end subroutine mg_main_mnh_finalize + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine mg_main_mnh + + implicit none + + integer :: it + + call mg_main_mnh_init() + + DO it=1,10 + + call mg_main_initialise_rhs_mnh(1.0*2.0**it) + call mg_main_initialise_u_mnh(1.0*it) + + print*,'************************ IT=',it,' ***************************' + + call mg_main_mnh_solve() + + ENDDO + + call mg_finalize() + + end subroutine mg_main_mnh +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +end module mode_mg_main_mnh + +program mg_main_mnh_all + + use mode_mg_main_mnh + + call mg_main_mnh() + +end program mg_main_mnh_all diff --git a/tensorproductmultigrid_Source/mode_mg.f90 b/tensorproductmultigrid_Source/mode_mg.f90 index 1ee7c5ad60c10ae82c26f66890f70b7e2203c1f9..a607eecf284b6c06672b5fd194bfc6268960d581 100644 --- a/tensorproductmultigrid_Source/mode_mg.f90 +++ b/tensorproductmultigrid_Source/mode_mg.f90 @@ -8,7 +8,8 @@ module mode_mg use solver use parameters use timer - use mpi + !use mpi + use modd_mpif use profiles use mode_mg_read_param @@ -56,8 +57,13 @@ subroutine mg_init_mnh() implicit none +logical :: gisinit + ! Initialise MPI ... - call mpi_init(ierr) + call mpi_initialized(gisinit, ierr ) + if (.not. gisinit ) then + call mpi_init(ierr) + end if ! ... and pre initialise communication module call comm_preinitialise() @@ -137,11 +143,9 @@ implicit none call create_scalar3d(MPI_COMM_HORIZ,grid_param,comm_param%halo_size,u) call create_scalar3d(MPI_COMM_HORIZ,grid_param,comm_param%halo_size,b) call create_scalar3d(MPI_COMM_HORIZ,grid_param,comm_param%halo_size,r) - call initialise_rhs(grid_param,model_param,b) -#ifdef TESTCONVERGENCE - call create_scalar3d(MPI_COMM_HORIZ,grid_param,comm_param%halo_size,uerror) - call analytical_solution(grid_param,uerror) -#endif + +!!$ call mg_initialise_rhs_mnh() + call finish_timer(t_initialise) if (i_am_master_mpi) then write(STDOUT,*) '' diff --git a/tensorproductmultigrid_Source/mode_mg_read_param.f90 b/tensorproductmultigrid_Source/mode_mg_read_param.f90 index 8e4887ad01b98d0214413f76b746272c250ea3a3..62b8ac478da3e4c4a05e4a2e5d413be59c480036 100644 --- a/tensorproductmultigrid_Source/mode_mg_read_param.f90 +++ b/tensorproductmultigrid_Source/mode_mg_read_param.f90 @@ -36,7 +36,8 @@ subroutine read_general_parameters(filename,savefields_out) use parameters use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename logical, intent(out) :: savefields_out @@ -67,7 +68,8 @@ subroutine read_solver_parameters(filename,solver_param_out) use parameters use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(solver_parameters), intent(out) :: solver_param_out @@ -112,7 +114,8 @@ subroutine read_grid_parameters(filename,grid_param) use datatypes use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(grid_parameters), intent(out) :: grid_param @@ -133,8 +136,8 @@ subroutine read_grid_parameters(filename,grid_param) write(STDOUT,'("Grid parameters")') write(STDOUT,'(" n = ",I15)') n write(STDOUT,'(" nz = ",I15)') nz - write(STDOUT,'(" L = ",F8.4)') L - write(STDOUT,'(" H = ",F8.4)') H + write(STDOUT,'(" L = ",E15.6)') L + write(STDOUT,'(" H = ",E15.6)') H if (vertbc == VERTBC_DIRICHLET) then write(STDOUT,'(" vertbc = DIRICHLET")') else if (vertbc == VERTBC_NEUMANN) then @@ -170,7 +173,8 @@ subroutine read_comm_parameters(filename,comm_param) use parameters use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(comm_parameters), intent(out) :: comm_param @@ -208,7 +212,8 @@ subroutine read_model_parameters(filename,model_param) use discretisation use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(model_parameters), intent(out) :: model_param @@ -245,7 +250,8 @@ subroutine read_smoother_parameters(filename,smoother_param) use discretisation use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(smoother_parameters), intent(out) :: smoother_param @@ -309,7 +315,8 @@ subroutine read_multigrid_parameters(filename,mg_param) use multigrid use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(mg_parameters), intent(out) :: mg_param @@ -406,7 +413,8 @@ subroutine read_conjugategradient_parameters(filename,cg_param) use conjugategradient use communication use messages - use mpi + !use mpi + use modd_mpif implicit none character(*), intent(in) :: filename type(cg_parameters), intent(out) :: cg_param diff --git a/tensorproductmultigrid_Source/multigrid.f90 b/tensorproductmultigrid_Source/multigrid.f90 index f3017ef94447c1a9f778a1baa9ac277eb97ac016..2ac7232f0dd01590ab5f44645ec548e209942e15 100644 --- a/tensorproductmultigrid_Source/multigrid.f90 +++ b/tensorproductmultigrid_Source/multigrid.f90 @@ -36,7 +36,8 @@ !================================================================== module multigrid - use mpi + !use mpi + use modd_mpif use parameters use datatypes use discretisation @@ -51,6 +52,7 @@ module multigrid public::mg_parameters public::mg_initialise public::mg_finalise +public::mg_solve_mnh public::mg_solve public::measurehaloswap public::REST_CELLAVERAGE diff --git a/tensorproductmultigrid_Source/profiles.f90 b/tensorproductmultigrid_Source/profiles.f90 index 7baf05ed192b5f677b4bbf031ea5c189494dc915..f54093c076fe45b89e2efcea94f4fb90bc8eab4b 100644 --- a/tensorproductmultigrid_Source/profiles.f90 +++ b/tensorproductmultigrid_Source/profiles.f90 @@ -42,6 +42,7 @@ module profiles implicit none + public::initialise_rhs_mnh public::initialise_rhs public::analytical_solution @@ -50,6 +51,47 @@ private !================================================================== ! Initialise RHS vector +!================================================================== + subroutine initialise_rhs_mnh(grid_param,model_param,b,xcoef) + implicit none + 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 + real(kind=rl) :: x, y, z + real(kind=rl) :: rho, sigma, theta, phi, r, b_low, b_up, pi + real(kind=rl) :: xcoef + + ix_min = b%ix_min + ix_max = b%ix_max + iy_min = b%iy_min + iy_max = b%iy_max + 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)) + + b%s(iz,iy-iy_min+1,ix-ix_min+1) = 0.0_rl + + if ( ( x .ge. 0.1_rl ) .and. ( x .le. 0.4_rl ) & + .and. (y .ge. 0.3_rl ) .and. ( y .le. 0.6_rl ) & + .and. (z .ge. 0.2_rl ) .and. ( z .le. 0.7_rl ) ) & + then + b%s(iz,iy-iy_min+1,ix-ix_min+1) = 1.0_rl * xcoef + end if + + end do + end do + end do + end subroutine initialise_rhs_mnh +!================================================================== +! Initialise RHS vector !================================================================== subroutine initialise_rhs(grid_param,model_param,b) implicit none @@ -132,7 +174,6 @@ private end do end do end subroutine initialise_rhs - !================================================================== ! Exact solution for test problem ! u(x,y,z) = x*(1-x)*y*(1-y)*z*(1-z) diff --git a/tensorproductmultigrid_Source/timer.f90 b/tensorproductmultigrid_Source/timer.f90 index 32c980f236a898c3f9a45d048ca2851b76e818a9..54db8c541451934a7da6cda7e4f71c1fce824f36 100644 --- a/tensorproductmultigrid_Source/timer.f90 +++ b/tensorproductmultigrid_Source/timer.f90 @@ -36,7 +36,8 @@ module timer - use mpi + !use mpi + use modd_mpif use parameters implicit none diff --git a/tridz.f90 b/tridz.f90 index 0073ac7c93c35b9a7fed835d7e52c4dca1a6d92a..442ce8974f672afc37a7e1906b22e0e171b8fd04 100644 --- a/tridz.f90 +++ b/tridz.f90 @@ -201,6 +201,8 @@ USE MODE_REPRO_SUM !JUAN USE MODE_MPPDB ! +USE mode_mg_main_mnh +! IMPLICIT NONE ! ! @@ -533,6 +535,7 @@ PCF_ZS(IIB:IIE,IJB:IJE,IKB-1) = 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKB-1) + PRHO_Z PAF_ZS(IIB:IIE,IJB:IJE,IKB-1) = 0.0 PCF_ZS(IIB:IIE,IJB:IJE,IKE+1) = 0.0 +call mg_main_mnh_init() !------------------------------------------------------------------------------ !* 7. COMPUTE THE DIAGONAL ELEMENTS B OF THE MATRIX