Back to OASIS4 home
Routine psmile_mg_set_up (grid_id, range, tol, ierror)
Subroutine "PSMILe_MG_setup" sets up the multigrid
sequence for searching the neighbourhood information. The multigrid
sequence is setup for the grid with grid id "grid_id" and restricted to
subgrid "range" for gaussian reduced grids, else full range is required
for definition of virtual cells.
! Get number of levels to be generated ndlev
! my_range based on range or
grid_valid_shape
len = MAXVAL (my_range(2,1:ndim_3d)-my_range(1,1:ndim_3d)+1)
ndlev = log (dble(len)) / log (2.0d0)
if (2**ndlev .lt. len) ndlev = ndlev + 1
ndlev = ndlev + 1
Definition of levdim(levbeg:ndim_3d,
1:ndlev) and gp%mg_infos(levbeg:ndlev)
(gp => Grids (grid_id) )
lev = 1
levdim (1:ndim_3d, lev) = my_range(2,1:ndim_3d)-my_range(1,1:ndim_3d)
gp%mg_infos(lev)%levdim = levdim (1:ndim_3d, lev)
(will become mg_info in routines called by psmile_mg_set_up)
lev=1 is the finest level but the largest box
=> call psmile_mg_first_level (grid_id,
my_range, gp%mg_infos(lev), tol, simplified_grid, ierror) (lev=1)
=>
call
psmile_mg_first_level_dble (grid_id, range, mg_info, tol,
simplified_grid, ierror)
Grid_type
= PRISM_Reglonlatvrt
=> call
psmile_mg_first_subgrid_1d_dble (corner_pointer%corners_dble(i)%vector,
corner_pointer%corner_shape(1,i),corner_pointer%corner_shape(2,i), &
nc_reg, range (1, i), arrays%chmin(i)%vector, arrays%chmax(i)%vector,
arrays%midp(i)%vector, mg_info%levdim (i), ierror)
calculates
chmin, chmax and midp based on corners at each point
=> call
psmile_mg_ctrl_subgrid_1d_dble (corner_pointer%corners_dble(i)%vector,
corner_pointer%corner_shape(:,i), nc_reg, range (:, i),
arrays%chmin(i)%vector, &
arrays%chmax(i)%vector, mg_info%levdim (i), len_cyclic(i), grid_id, i,
ierror)
verifications
lev > 1 are coarser levels but
finer boxes
do lev = 2, ndlev
levf = lev - 1
! ... Compute dimensions of coarser level "lev"
icoarse (:) = 2
do j = 1, ndim_3d
n = levdim(j,levf) + 1
if (n .eq. 1) then
icoarse (j) = 1
levdim (j,lev) = levdim (j,levf)
else if ((n/2) * 2 == n) then
levdim (j,lev) = n/2 - 1 =>
half of point in the grid for this level
else
! add a dummy line
levdim (j,lev) =
n/2 => half of point in the grid for this
level
endif
end do
! ... Create level "lev" from finer level
"levf" = "lev-1"
gp%mg_infos(lev)%levdim = levdim (1:ndim_3d, lev)
=> call
psmile_mg_coars_level
(grid_id, gp%mg_infos(levf), gp%mg_infos(lev), icoarse, ierror)
=>
call
psmile_mg_coars_level_dble (grid_id, mg_info_fine, mg_info_coarse,
icoarse, ierror)
=> call
psmile_mg_coars_subgrid_3d_dble
new larger
cells (but less in number) based on 8 old cells are constructed