2025-09-05 09:42:21 +02:00

147 lines
5.8 KiB
Fortran
Executable File

module Agrif_Variables
!
use Agrif_CurgridFunctions
!
implicit none
!
contains
!
!===================================================================================================
! subroutine Agrif_Declare_Variable
!
!> Declare a new variable profile
!---------------------------------------------------------------------------------------------------
subroutine Agrif_Declare_Variable ( posvar, firstpoint, raf, lb, ub, varid, torestore )
!---------------------------------------------------------------------------------------------------
integer, dimension(:), intent(in) :: posvar !< position of the variable on the cell
!! (1 for the border of the edge, 2 for the center)
integer, dimension(:), intent(in) :: firstpoint !< index of the first point in the real domain
character(1), dimension(:), intent(in) :: raf !< Array indicating the type of dimension (space or not)
!! for each of them
integer, dimension(:), intent(in) :: lb !< Lower bounds of the array
integer, dimension(:), intent(in) :: ub !< Upper bounds of the array
integer, intent(out) :: varid !< Id number of the newly created variable
logical, optional, intent(in) :: torestore !< Indicates if the array restore is used
!---------------------------------------------------------------------------------------------------
type(Agrif_Variables_List), pointer :: new_varlist
type(Agrif_Variable), pointer :: var
integer :: nbdim, i
logical :: restore
restore = .FALSE.
if ( Agrif_Mygrid % ngridstep /= 0 ) then
if (present(torestore)) restore = torestore
endif
!
nbdim = SIZE(posvar)
!
allocate(new_varlist)
allocate(new_varlist % var)
var => new_varlist % var
allocate(var % posvar(nbdim))
allocate(var % interptab(nbdim))
allocate(var % coords(nbdim))
!
var % nbdim = nbdim
var % interptab = raf(1:nbdim)
var % posvar = posvar(1:nbdim)
var % point(1:nbdim) = firstpoint(1:nbdim)
var % restore = restore
!
do i = 1,nbdim
select case( raf(i) )
case('x') ; var % coords(i) = 1
case('y') ; var % coords(i) = 2
case('z') ; var % coords(i) = 3
case('N') ; var % coords(i) = 0
case default ; var % coords(i) = 0
end select
enddo
!
var % lb(1:nbdim) = lb(1:nbdim)
var % ub(1:nbdim) = ub(1:nbdim)
if ( restore ) then
select case(nbdim)
case(1)
allocate(var % Restore1D(lb(1):ub(1)))
var % Restore1D = 0
case(2)
allocate(var % Restore2D(lb(1):ub(1), &
lb(2):ub(2)))
var % Restore2D = 0
case(3)
allocate(var % Restore3D(lb(1):ub(1), &
lb(2):ub(2), &
lb(3):ub(3)))
var % Restore3D = 0
case(4)
allocate(var % Restore4D(lb(1):ub(1), &
lb(2):ub(2), &
lb(3):ub(3), &
lb(4):ub(4)))
var % Restore4D = 0
case(5)
allocate(var % Restore5D(lb(1):ub(1), &
lb(2):ub(2), &
lb(3):ub(3), &
lb(4):ub(4), &
lb(5):ub(5)))
var % Restore5D = 0
end select
endif
new_varlist % next => Agrif_Curgrid % variables
Agrif_Curgrid % variables => new_varlist
Agrif_Curgrid % Nbvariables = Agrif_Curgrid % Nbvariables + 1
varid = Agrif_Curgrid % Nbvariables
var % parent_var => Agrif_Search_Variable(Agrif_Curgrid % parent, Agrif_Curgrid % nbvariables)
var % root_var => Agrif_Search_Variable(Agrif_Mygrid, Agrif_Curgrid % nbvariables)
!---------------------------------------------------------------------------------------------------
end subroutine Agrif_Declare_Variable
!===================================================================================================
!
!===================================================================================================
! function Agrif_Search_Variable
!
!> Returns a pointer to the variable varid for the grid grid.
!---------------------------------------------------------------------------------------------------
function Agrif_Search_Variable ( grid, varid ) result(outvar)
!---------------------------------------------------------------------------------------------------
type(Agrif_Grid), pointer :: grid !< Pointer on the current grid.
integer, intent(in) :: varid !< ID number of the variable we are looking for.
!
type(Agrif_Variable), pointer :: outvar
type(Agrif_Variables_List), pointer :: parcours
integer :: nb, varidinv
!
if ( .not.associated(grid) ) then
outvar => NULL()
return
endif
!
parcours => grid % variables
if (.not. associated(parcours)) then ! can occur on the grand mother grid
outvar => NULL() ! during the first call by agrif_mygrid
return
endif
varidinv = 1 + grid % nbvariables - varid
do nb = 1,varidinv-1
parcours => parcours % next
enddo
outvar => parcours % var
!---------------------------------------------------------------------------------------------------
end function Agrif_Search_variable
!===================================================================================================
!
end module Agrif_Variables