From 8e1bc1719ec23b26587e6f482e411e68b0512a81 Mon Sep 17 00:00:00 2001 From: Juan Escobar <escj@aero.obs-mip.fr> Date: Tue, 19 Feb 2019 15:07:53 +0100 Subject: [PATCH] =?UTF-8?q?Juan=2019/02/2019=20:=20d=C3=A9but=20d=20integr?= =?UTF-8?q?ation=20de=20MG=20dans=20MesoNH=20=3D>=20mg=5Fmain=5Fmnh.f90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../communication.f90 | 3 +- .../conjugategradient.f90 | 3 +- tensorproductmultigrid_Source/datatypes.f90 | 3 +- .../discretisation.f90 | 3 +- tensorproductmultigrid_Source/messages.f90 | 3 +- tensorproductmultigrid_Source/mg_main.f90 | 3 +- tensorproductmultigrid_Source/mg_main_mnh.f90 | 150 ++++++++++++++++++ tensorproductmultigrid_Source/mode_mg.f90 | 18 ++- .../mode_mg_read_param.f90 | 28 ++-- tensorproductmultigrid_Source/multigrid.f90 | 4 +- tensorproductmultigrid_Source/profiles.f90 | 43 ++++- tensorproductmultigrid_Source/timer.f90 | 3 +- tridz.f90 | 3 + 13 files changed, 241 insertions(+), 26 deletions(-) create mode 100644 tensorproductmultigrid_Source/mg_main_mnh.f90 diff --git a/tensorproductmultigrid_Source/communication.f90 b/tensorproductmultigrid_Source/communication.f90 index f0856420b..c0b82d05c 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 b58adae6b..eaa98b3a0 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 b0bfbecc3..4705e1201 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 2a45884d2..35f8b0c89 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 4ade93172..ce0fd76c3 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 4ff091121..0fef58742 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 000000000..e99d66fd5 --- /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 1ee7c5ad6..a607eecf2 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 8e4887ad0..62b8ac478 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 f3017ef94..2ac7232f0 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 7baf05ed1..f54093c07 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 32c980f23..54db8c541 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 0073ac7c9..442ce8974 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 -- GitLab