<p><b>croesch@ucar.edu</b> 2011-12-13 16:31:56 -0700 (Tue, 13 Dec 2011)</p><p>BRANCH COMMIT<br>
<br>
Created exclusive halo 2 exchange list, renamed halo objects, updated halo logic for rtheta_pp in atm time integration<br>
<br>
M src/core_nhyd_atmos/mpas_atm_time_integration.F<br>
M src/core_nhyd_atmos/mpas_atm_mpas_core.F<br>
M src/framework/mpas_io_input.F<br>
M src/framework/mpas_dmpar.F<br>
M src/framework/mpas_grid_types.F<br>
</p><hr noshade><pre><font color="gray">Modified: branches/halo/src/core_nhyd_atmos/mpas_atm_mpas_core.F
===================================================================
--- branches/halo/src/core_nhyd_atmos/mpas_atm_mpas_core.F        2011-12-12 20:02:40 UTC (rev 1254)
+++ branches/halo/src/core_nhyd_atmos/mpas_atm_mpas_core.F        2011-12-13 23:31:56 UTC (rev 1255)
@@ -192,7 +192,7 @@
call mpas_dmpar_exch_halo_field2d_real(dminfo, block % state % time_levs(1) % state % u % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
if (.not. config_do_restart .or. (config_do_restart .and. config_do_DAcycling)) then
call atm_init_coupled_diagnostics( block % state % time_levs(1) % state, block % diag, mesh)
@@ -201,13 +201,13 @@
call mpas_dmpar_exch_halo_field2d_real(dminfo, block % diag % pv_edge % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
call mpas_dmpar_exch_halo_field2d_real(dminfo, block % diag % ru % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
call mpas_dmpar_exch_halo_field2d_real(dminfo, block % diag % rw % array, &
block % mesh % nVertLevels+1, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
call mpas_rbf_interp_initialize(mesh)
call mpas_init_reconstruct(mesh)
Modified: branches/halo/src/core_nhyd_atmos/mpas_atm_time_integration.F
===================================================================
--- branches/halo/src/core_nhyd_atmos/mpas_atm_time_integration.F        2011-12-12 20:02:40 UTC (rev 1254)
+++ branches/halo/src/core_nhyd_atmos/mpas_atm_time_integration.F        2011-12-13 23:31:56 UTC (rev 1255)
@@ -132,23 +132,22 @@
! theta_m
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % state % time_levs(1) % state % theta_m % array(:,:), &
block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! scalars
call mpas_dmpar_exch_halo_field3d_real(domain % dminfo, block % state % time_levs(1) % state % scalars % array(:,:,:), &
block % state % time_levs(1) % state % num_scalars, block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! pressure_p
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % pressure_p % array(:,:), &
block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! rtheta_p
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rtheta_p % array(:,:), &
block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
-!surface_pressure
-! call mpas_dmpar_exch_halo_field1d_real(domain % dminfo, block % diag % surface_pressure % array(:), &
-! block % mesh % nCells, &
-! block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
+
+!surface_pressure does not need to be exchanged
+
block => block % next
end do
@@ -191,7 +190,7 @@
if (debug) write(0,*) ' add physics tendencies '
block => domain % blocklist
do while (associated(block))
- call physics_addtend( domain % dminfo , block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv, &
+ call physics_addtend( domain % dminfo , block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv, &
block % mesh , block % state % time_levs(2) % state, block % diag, block % tend, &
block % tend_physics , block % state % time_levs(2) % state % rho_zz % array(:,:), &
block % diag % rho_edge % array(:,:) )
@@ -210,7 +209,7 @@
! tend_u
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % tend % u % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % ownPerimEdgesToSend, block % parinfo % ownPerimEdgesToRecv)
+ block % parinfo % ownCellBoundedEdgesToSend, block % parinfo % ownCellBoundedEdgesToRecv)
block => block % next
end do
@@ -244,7 +243,7 @@
! rtheta_pp
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rtheta_pp % array(:,:), &
block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % halo1CellsToSend, block % parinfo % halo1CellsToRecv)
block => block % next
end do
@@ -266,22 +265,28 @@
! rw_p
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rw_p % array(:,:), &
block % mesh % nVertLevels+1, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! MGD seems necessary
! ru_p
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % ru_p % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
! rho_pp
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rho_pp % array(:,:), &
block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
block => block % next
end do
block => domain % blocklist
+
+ ! the second layer of halo cells must be exchanged before calling atm_recover_large_step_variables
+ call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rtheta_pp % array(:,:), &
+ block % mesh % nVertLevels, block % mesh % nCells, &
+ block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+
do while (associated(block))
- call atm_recover_large_step_variables( block % state % time_levs(2) % state, &
+ call atm_recover_large_step_variables( block % state % time_levs(2) % state, &
block % diag, block % tend, block % mesh, &
rk_timestep(rk_step), number_sub_steps(rk_step), rk_step )
@@ -295,7 +300,7 @@
! u
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % state % time_levs(2) % state % u % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
block => block % next
end do
@@ -320,7 +325,7 @@
block % state % time_levs(1) % state, block % state % time_levs(2) % state, &
block % diag, &
block % mesh, rk_timestep(rk_step), rk_step, 3, &
- domain % dminfo, block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv )
+ domain % dminfo, block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv )
end if
block => block % next
end do
@@ -330,10 +335,10 @@
! do while (associated(block))
! call mpas_dmpar_exch_halo_field3d_real(domain % dminfo, block % tend % scalars % array(:,:,:), &
! block % tend % num_scalars, block % mesh % nVertLevels, block % mesh % nCells, &
-! block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+! block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! call mpas_dmpar_exch_halo_field3d_real(domain % dminfo, block % state % time_levs(2) % state % scalars % array(:,:,:), &
! block % state % time_levs(2) % state % num_scalars, block % mesh % nVertLevels, block % mesh % nCells, &
-! block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+! block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! block => block % next
! end do
@@ -367,22 +372,22 @@
! w
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % state % time_levs(2) % state % w % array(:,:), &
block % mesh % nVertLevels+1, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
! pv_edge
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % pv_edge % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
! rho_edge
call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % diag % rho_edge % array(:,:), &
block % mesh % nVertLevels, block % mesh % nEdges, &
- block % parinfo % halo2EdgesToSend, block % parinfo % halo2EdgesToRecv)
+ block % parinfo % allEdgesToSend, block % parinfo % allEdgesToRecv)
! **** this will always be needed - perhaps we can cover this with compute_solve_diagnostics
! scalars
call mpas_dmpar_exch_halo_field3d_real(domain % dminfo, block % state % time_levs(2) % state % scalars % array(:,:,:), &
block % state % time_levs(2) % state % num_scalars, block % mesh % nVertLevels, block % mesh % nCells, &
- block % parinfo % halo2CellsToSend, block % parinfo % halo2CellsToRecv)
+ block % parinfo % allCellsToSend, block % parinfo % allCellsToRecv)
block => block % next
end do
Modified: branches/halo/src/framework/mpas_dmpar.F
===================================================================
--- branches/halo/src/framework/mpas_dmpar.F        2011-12-12 20:02:40 UTC (rev 1254)
+++ branches/halo/src/framework/mpas_dmpar.F        2011-12-13 23:31:56 UTC (rev 1255)
@@ -550,6 +550,48 @@
end subroutine mpas_dmpar_compute_index_range
+ subroutine mpas_dmpar_get_halo_subset(superSet, innerHalo, outerHalo)
+
+ type (exchange_list), pointer :: superSet, innerHalo ! in
+ type (exchange_list), pointer :: outerHalo ! out
+
+ type (exchange_list), pointer :: superSetPtr, innerHaloPtr, outerHaloPtr
+ integer :: i
+
+ allocate(outerHalo)
+ nullify(outerHalo % next)
+
+ superSetPtr => superSet
+ innerHaloPtr => innerHalo
+ outerHaloPtr => outerHalo
+
+ do while(associated(superSetPtr))
+
+ allocate(outerHaloPtr % next)
+ outerHaloPtr => outerHaloPtr % next
+ outerHaloPtr % procID = superSetPtr % procID
+ outerHaloPtr % nlist = superSetPtr % nlist - innerHaloPtr % nlist
+ allocate(outerHaloPtr % list(outerHaloPtr % nlist))
+ nullify(outerHaloPtr % next)
+
+ do i=1, outerHaloPtr % nlist
+ outerHaloPtr % list(i) = superSetPtr % list(i + innerHaloPtr % nlist)
+ end do
+
+ innerHaloPtr => innerHaloPtr % next
+ superSetPtr => superSetPtr % next
+ end do
+
+ nullify(outerHaloPtr % next)
+
+ outerHaloPtr => outerHalo
+ outerHalo => outerHalo % next
+ deallocate(outerHaloPtr)
+
+ end subroutine
+
+
+
subroutine mpas_dmpar_get_owner_list(dminfo, &
nOwnedList, nNeededList, &
ownedList, neededList, &
Modified: branches/halo/src/framework/mpas_grid_types.F
===================================================================
--- branches/halo/src/framework/mpas_grid_types.F        2011-12-12 20:02:40 UTC (rev 1254)
+++ branches/halo/src/framework/mpas_grid_types.F        2011-12-13 23:31:56 UTC (rev 1255)
@@ -104,15 +104,17 @@
type parallel_info
type (exchange_list), pointer :: halo1CellsToSend ! List of types describing which cells to send to other blocks
type (exchange_list), pointer :: halo1CellsToRecv ! List of types describing which cells to receive from other blocks
- type (exchange_list), pointer :: halo2CellsToSend ! List of types describing which cells to send to other blocks
- type (exchange_list), pointer :: halo2CellsToRecv ! List of types describing which cells to receive from other blocks
+ type (exchange_list), pointer :: halo2CellsToSend
+ type (exchange_list), pointer :: halo2CellsToRecv
+ type (exchange_list), pointer :: allCellsToSend
+ type (exchange_list), pointer :: allCellsToRecv
- type (exchange_list), pointer :: ownPerimEdgesToSend ! List of types describing which edges to send to other blocks
- type (exchange_list), pointer :: ownPerimEdgesToRecv ! List of types describing which edges to receive from other blocks
- type (exchange_list), pointer :: halo1EdgesToSend ! List of types describing which edges to send to other blocks
- type (exchange_list), pointer :: halo1EdgesToRecv ! List of types describing which edges to receive from other blocks
- type (exchange_list), pointer :: halo2EdgesToSend ! List of types describing which edges to send to other blocks
- type (exchange_list), pointer :: halo2EdgesToRecv ! List of types describing which edges to receive from other blocks
+ type (exchange_list), pointer :: ownCellBoundedEdgesToSend ! List of types describing edges on the own cell perimeter to send to other blocks
+ type (exchange_list), pointer :: ownCellBoundedEdgesToRecv ! List of types describing edges on the own cell perimeter to recieve from other blocks
+ type (exchange_list), pointer :: halo1BoundedEdgesToSend ! List of types describing edges from the own cell perimeter to the halo 1 perimeter to send to other blocks
+ type (exchange_list), pointer :: halo1BoundedEdgesToRecv ! List of types describing edges from the own cell perimeter to the halo 1 perimeter to receive from other blocks
+ type (exchange_list), pointer :: allEdgesToSend
+ type (exchange_list), pointer :: allEdgesToRecv
type (exchange_list), pointer :: verticesToSend ! List of types describing which vertices to send to other blocks
type (exchange_list), pointer :: verticesToRecv ! List of types describing which vertices to receive from other blocks
Modified: branches/halo/src/framework/mpas_io_input.F
===================================================================
--- branches/halo/src/framework/mpas_io_input.F        2011-12-12 20:02:40 UTC (rev 1254)
+++ branches/halo/src/framework/mpas_io_input.F        2011-12-13 23:31:56 UTC (rev 1255)
@@ -134,7 +134,7 @@
integer, parameter :: nHalos = 3
integer, dimension(nHalos) :: nCellsHalo
integer, dimension(nHalos) :: nEdgesWithinHaloPerimeter
- integer :: nOwnEdges, cellCount, edgeCount, iEdge
+ integer :: nOwnCells, nOwnEdges, nOwnVertex, cellCount, edgeCount, iEdge
type (hashtable) :: hash
@@ -484,7 +484,7 @@
block_graph_0Halo % maxDegree, block_graph_0Halo % nVertices, block_graph_1Halo % nVerticesTotal, &
send1Halo, recv1Halo)
-
+
!
! Work out exchange lists for 2-halo and exchange cell information for 2-halo
!
@@ -497,6 +497,8 @@
block_graph_2Halo % nVertices = block_graph_0Halo % nVertices
block_graph_2Halo % ghostStart = block_graph_2Halo % nVertices + 1
+ nOwnCells = block_graph_2Halo % nVertices
+
#ifdef HAVE_ZOLTAN
#ifdef _MPI
!! For now, only use Zoltan with MPI
@@ -589,21 +591,23 @@
sendVertexList, recvVertexList)
- call mpas_block_decomp_partitioned_edge_list(block_graph_2Halo % nVertices, &
- block_graph_2Halo % vertexID(1:block_graph_2Halo % nVertices), &
+ call mpas_block_decomp_partitioned_edge_list(nOwnCells, &
+ block_graph_2Halo % vertexID(1:nOwnCells), &
2, nlocal_edges, cellsOnEdge_2Halo, local_edge_list, ghostEdgeStart)
- call mpas_block_decomp_partitioned_edge_list(block_graph_2Halo % nVertices, &
- block_graph_2Halo % vertexID(1:block_graph_2Halo % nVertices), &
+ call mpas_block_decomp_partitioned_edge_list(nOwnCells, &
+ block_graph_2Halo % vertexID(1:nOwnCells), &
vertexDegree, nlocal_vertices, cellsOnVertex_2Halo, local_vertex_list, ghostVertexStart)
- nCellsHalo(1) = block_graph_2Halo % nVertices
+ !------- set owned and halo cell indices -------!
+
+ nCellsHalo(1) = nOwnCells
nCellsHalo(2) = block_graph_1Halo % nVerticesTotal
nCellsHalo(3) = block_graph_2Halo % nVerticesTotal
+ !------- determin the perimeter and owned edges of own cells and halos -------!
+
nOwnEdges = ghostEdgeStart-1
-
- !------- determin the perimeter and owned edges of own cells and halos -------!
! skip the own edges found at the beginning of local_edge_list
call mpas_hash_init(hash)
@@ -634,7 +638,7 @@
end do
- ! At this point, local_edge_list(1;ghostEdgeStart-1) contains all of the owned edges for this block
+ ! At this point, local_edge_list(1;nOwnEdges) contains all of the owned edges for this block
! and local_edge_list(ghostEdgeStart:nlocal_edges) contains all of the ghost edges
! At this point, local_vertex_list(1;ghostVertexStart-1) contains all of the owned vertices for this block
@@ -706,7 +710,7 @@
!!!!!!!!!!!!!!!!!!
!! Reorder edges
!!!!!!!!!!!!!!!!!!
- call mpas_zoltan_order_loc_hsfc_edges(ghostEdgeStart-1,local_edge_list,3,xEdge,yEdge,zEdge)
+ call mpas_zoltan_order_loc_hsfc_edges(nOwnEdges,local_edge_list,3,xEdge,yEdge,zEdge)
!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!
@@ -1000,38 +1004,43 @@
!
call mpas_dmpar_get_owner_list(domain % dminfo, &
- block_graph_2Halo % nVertices, nCellsHalo(2), &
- block_graph_2Halo % vertexID(1:block_graph_2Halo % nVertices), block_graph_2Halo % vertexID, &
+ nOwnCells, nCellsHalo(2), &
+ block_graph_2Halo % vertexID(1:nOwnCells), block_graph_2Halo % vertexID, &
domain % blocklist % parinfo % halo1CellsToSend, domain % blocklist % parinfo % halo1CellsToRecv)
call mpas_dmpar_get_owner_list(domain % dminfo, &
- block_graph_2Halo % nVertices, nCellsHalo(3), &
- block_graph_2Halo % vertexID(1:block_graph_2Halo % nVertices), block_graph_2Halo % vertexID, &
- domain % blocklist % parinfo % halo2CellsToSend, domain % blocklist % parinfo % halo2CellsToRecv)
+ nOwnCells, nCellsHalo(3), &
+ block_graph_2Halo % vertexID(1:nOwnCells), block_graph_2Halo % vertexID, &
+ domain % blocklist % parinfo % allCellsToSend, domain % blocklist % parinfo % allCellsToRecv)
+ ! retrieve halo2 exchange lists
+ call mpas_dmpar_get_halo_subset(domain % blocklist % parinfo % allCellsToRecv, domain % blocklist % parinfo % halo1CellsToRecv, domain % blocklist % parinfo % halo2CellsToRecv)
+ call mpas_dmpar_get_halo_subset(domain % blocklist % parinfo % allCellsToSend, domain % blocklist % parinfo % halo1CellsToSend, domain % blocklist % parinfo % halo2CellsToSend)
+
call mpas_dmpar_get_owner_list(domain % dminfo, &
- ghostEdgeStart-1, nEdgesWithinHaloPerimeter(1), &
- local_edge_list(1:ghostEdgeStart-1), local_edge_list, &
- domain % blocklist % parinfo % ownPerimEdgesToSend, domain % blocklist % parinfo % ownPerimEdgesToRecv)
+ nOwnEdges, nEdgesWithinHaloPerimeter(1), &
+ local_edge_list(1:nOwnEdges), local_edge_list, &
+ domain % blocklist % parinfo % ownCellBoundedEdgesToSend, domain % blocklist % parinfo % ownCellBoundedEdgesToRecv)
call mpas_dmpar_get_owner_list(domain % dminfo, &
- ghostEdgeStart-1, nEdgesWithinHaloPerimeter(2), &
- local_edge_list(1:ghostEdgeStart-1), local_edge_list, &
- domain % blocklist % parinfo % halo1EdgesToSend, domain % blocklist % parinfo % halo1EdgesToRecv)
+ nOwnEdges, nEdgesWithinHaloPerimeter(2), &
+ local_edge_list(1:nOwnEdges), local_edge_list, &
+ domain % blocklist % parinfo % halo1BoundedEdgesToSend, domain % blocklist % parinfo % halo1BoundedEdgesToRecv)
call mpas_dmpar_get_owner_list(domain % dminfo, &
- ghostEdgeStart-1, nEdgesWithinHaloPerimeter(3), &
- local_edge_list(1:ghostEdgeStart-1), local_edge_list, &
- domain % blocklist % parinfo % halo2EdgesToSend, domain % blocklist % parinfo % halo2EdgesToRecv)
+ nOwnEdges, nEdgesWithinHaloPerimeter(3), &
+ local_edge_list(1:nOwnEdges), local_edge_list, &
+ domain % blocklist % parinfo % allEdgesToSend, domain % blocklist % parinfo % allEdgesToRecv)
+
call mpas_dmpar_get_owner_list(domain % dminfo, &
ghostVertexStart-1, nlocal_vertices, &
local_vertex_list(1:ghostVertexStart-1), local_vertex_list, &
domain % blocklist % parinfo % verticesToSend, domain % blocklist % parinfo % verticesToRecv)
- domain % blocklist % mesh % nCellsSolve = block_graph_2Halo % nVertices
- domain % blocklist % mesh % nEdgesSolve = ghostEdgeStart-1
+ domain % blocklist % mesh % nCellsSolve = nOwnCells
+ domain % blocklist % mesh % nEdgesSolve = nOwnEdges
domain % blocklist % mesh % nVerticesSolve = ghostVertexStart-1
domain % blocklist % mesh % nVertLevelsSolve = domain % blocklist % mesh % nVertLevels ! No vertical decomp yet...
</font>
</pre>