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