!!****************************************************************************** !! !! This file is part of the AMUN source code, a program to perform !! Newtonian or relativistic magnetohydrodynamical simulations on uniform or !! adaptive mesh. !! !! Copyright (C) 2017-2024 Grzegorz Kowal !! !! This program is free software: you can redistribute it and/or modify !! it under the terms of the GNU General Public License as published by !! the Free Software Foundation, either version 3 of the License, or !! (at your option) any later version. !! !! This program 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 General Public License for more details. !! !! You should have received a copy of the GNU General Public License !! along with this program. If not, see . !! !!***************************************************************************** !! !! module: USER_PROBLEM !! !! This module provides subroutines to setup custom problem. !! !!***************************************************************************** ! module user_problem implicit none private public :: initialize_user_problem, finalize_user_problem public :: user_statistics !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! contains ! !=============================================================================== ! ! subroutine INITIALIZE_USER_PROBLEM: ! ---------------------------------- ! ! Subroutine initializes user problem. It could read problem parameters which ! are used in all subroutines defining this specific problem. ! ! Arguments: ! ! problem - the problem name ! rcount - the run count for restarted jobs ! verbose - a logical flag turning the information printing; ! status - an integer flag for error return value; ! !=============================================================================== ! subroutine initialize_user_problem(problem, rcount, verbose, status) implicit none character(len=64), intent(in) :: problem integer , intent(in) :: rcount logical , intent(in) :: verbose integer , intent(out) :: status !------------------------------------------------------------------------------- ! status = 0 !------------------------------------------------------------------------------- ! end subroutine initialize_user_problem ! !=============================================================================== ! ! subroutine FINALIZE_USER_PROBLEM: ! -------------------------------- ! ! Subroutine releases memory used by the module. ! ! Arguments: ! ! status - an integer flag for error return value; ! !=============================================================================== ! subroutine finalize_user_problem(status) implicit none integer, intent(out) :: status !------------------------------------------------------------------------------- ! status = 0 !------------------------------------------------------------------------------- ! end subroutine finalize_user_problem ! !=============================================================================== ! ! subroutine SETUP_USER_PROBLEM: ! ----------------------------- ! ! Subroutine sets the initial conditions for the user specific problem. ! ! Arguments: ! ! pdata - pointer to the datablock structure of the currently initialized ! block; ! !=============================================================================== ! subroutine setup_user_problem(pdata) use blocks, only : block_data implicit none type(block_data), pointer, intent(inout) :: pdata !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine setup_user_problem ! !=============================================================================== ! ! subroutine UPDATE_USER_SOURCES: ! ------------------------------ ! ! Subroutine adds the user defined source terms. ! ! Arguments: ! ! t, dt - the time and time increment; ! pdata - the pointer to a data block; ! !=============================================================================== ! subroutine update_user_sources(t, dt, pdata) use blocks, only : block_data implicit none real(kind=8) , intent(in) :: t, dt type(block_data), pointer, intent(inout) :: pdata !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine update_user_sources ! !=============================================================================== ! ! subroutine UPDATE_USER_SHAPES: ! ----------------------------- ! ! Subroutine defines the regions updated by user. ! ! Arguments: ! ! pdata - pointer to the data block structure of the currently initialized ! block; ! time - time at the moment of update; ! dt - time step since the last update; ! !=============================================================================== ! subroutine update_user_shapes(pdata, time, dt) use blocks, only : block_data implicit none type(block_data), pointer, intent(inout) :: pdata real(kind=8) , intent(in) :: time, dt !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine update_user_shapes ! !=============================================================================== ! ! subroutine USER_BOUNDARY_X: ! -------------------------- ! ! Subroutine updates ghost zones within the specific region along ! the X direction. ! ! Arguments: ! ! is - the block side along the X direction for the ghost zone update; ! jl, ju - the cell index limits for the Y direction; ! kl, ku - the cell index limits for the Z direction; ! t, dt - time and time increment; ! x, y, z - the block coordinates; ! qn - the array of variables to update; ! !=============================================================================== ! subroutine user_boundary_x(is, jl, ju, kl, ku, t, dt, x, y, z, qn) implicit none integer , intent(in) :: is, jl, ju, kl, ku real(kind=8) , intent(in) :: t, dt real(kind=8), dimension(:) , intent(in) :: x, y, z real(kind=8), dimension(:,:,:,:), intent(inout) :: qn !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine user_boundary_x ! !=============================================================================== ! ! subroutine USER_BOUNDARY_Y: ! -------------------------- ! ! Subroutine updates ghost zones within the specific region along ! the Y direction. ! ! Arguments: ! ! js - the block side along the Y direction for the ghost zone update; ! il, iu - the cell index limits for the X direction; ! kl, ku - the cell index limits for the Z direction; ! t, dt - time and time increment; ! x, y, z - the block coordinates; ! qn - the array of variables to update; ! !=============================================================================== ! subroutine user_boundary_y(js, il, iu, kl, ku, t, dt, x, y, z, qn) implicit none integer , intent(in) :: js, il, iu, kl, ku real(kind=8) , intent(in) :: t, dt real(kind=8), dimension(:) , intent(in) :: x, y, z real(kind=8), dimension(:,:,:,:), intent(inout) :: qn !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine user_boundary_y ! !=============================================================================== ! ! subroutine USER_BOUNDARY_Z: ! -------------------------- ! ! Subroutine updates ghost zones within the specific region along ! the Z direction. ! ! Arguments: ! ! ks - the block side along the Z direction for the ghost zone update; ! il, iu - the cell index limits for the X direction; ! jl, ju - the cell index limits for the Y direction; ! t, dt - time and time increment; ! x, y, z - the block coordinates; ! qn - the array of variables to update; ! !=============================================================================== ! subroutine user_boundary_z(ks, il, iu, jl, ju, t, dt, x, y, z, qn) implicit none integer , intent(in) :: ks, il, iu,jl, ju real(kind=8) , intent(in) :: t, dt real(kind=8), dimension(:) , intent(in) :: x, y, z real(kind=8), dimension(:,:,:,:), intent(inout) :: qn !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine user_boundary_z ! !=============================================================================== ! ! subroutine USER_STATISTICS: ! ------------------------------- ! ! Subroutine can be use to store user defined time statistics. The file to ! store these statistics should be properly created in subroutine ! initialize_user_problem() and closed in finalize_user_problem(). ! ! Arguments: ! ! time - the current simulation time; ! !=============================================================================== ! subroutine user_statistics(time) implicit none real(kind=8), intent(in) :: time !------------------------------------------------------------------------------- ! !------------------------------------------------------------------------------- ! end subroutine user_statistics !=============================================================================== ! end module user_problem