===========================================================================
=== Démonstration par l'exemple ===========================================
=== (utile pour créer des arbres par "dichotomie" dans Zinit) =============
===========================================================================
! Pourvu que l'on gère le niveau (lvl) d'appel de la procédure, ainsi
! que ses bornes, la séquence suivante prétend créer à chaque niveau
! 4 cellules, avec une famille correspondante.
! On veut sous chacune de ces 4 familles, faire de même; il suffit
! pour cela d'apeller la procédure "ré-entrante" = quadrille.
!===========================================================================
! Les indices de "boucles" sont conservés par niveau =ij(lvl).
! Pour la gestion des adresses absolues des cellules créées, on a définit
! pour chaque niveau num0(lvl) pour 4 adresses num0+1 a +4;
! et en parallèle à l'indice de boucle courant, on conserve l'adresse
! des cellules du dessus dans ijnum(lvl), cad que ce tableau représente
! les branches courantes de l'arbre de objets actifs.
!===========================================================================
create Fm Vol;
under Vol
<   lvl=1; num0(lvl) = 0;
!  4 cellules  mesh-1a4;
    do i=1,4
    <  create Cl mesh-i, type = VORTX 8;
       set mesh(i) = mesh-i;
    >
!  4 familles  quad-1a4;
    <i=1,4; create Fm quad-i; >
!
   under quad-ij(lvl) = 1,4
   <  ijnum(lvl) = num0(lvl)+ij(lvl);
      lvl = lvl+1;
      execute quadrille"(lvl)";
:Back_main:; z_pr/back main loop/: lvl, ij(lvl), ijnum(lvl), num0(lvl);
   >
>;
stop;
!---------------------------------------------------------------------
procedure quadrille"(lvl)"
< num0(lvl) = 4*ijnum(lvl-1);
   z_pr/entree...4 cells/: lvl, ijnum(lvl-1), num0(lvl)+1, num0(lvl)+4;
! on cree 4 cellules connectees Up=lvl-1
  do i=1,4
  < create Cl mesh-i, type = VORTX 8;
    num=num0(lvl)+i; set mesh(num) = mesh-i;
! raccordements a echelle superieure
!    create Tr, type = ;
!!    join 1 to (mesh(ijnum(lvl-1)),bulk);
  >
  if lvl .lt. lvlmax
  <
!   on cree 4 familles quad-1a4
    do i=1,4
    < create Fm quad-i; ;
    >
!  boucle familles
    under quad-ij(lvl)=1,4
    < ijnum(lvl)=num0(lvl)+ij(lvl);
      lvl = lvl+1;
      execute quadrille"(lvl)";
      z_pr/fm-loop/: lvl, ij(lvl), ijnum(lvl);
    >
  >;
  lvl = lvl-1;
 z_pr/end quadrille/: lvl, ij(lvl), ijnum(lvl);
  if (lvl.le.1) goto :Back_main:;
!---------------------------------------------------------------------
>"end Vol";
***********************************************************************
featuring : specification d'une procedure re-entrante sans gestion par
goto :Back_main:; on peut essayer des "ASSIGN 10010 TO I10010(lvl)";
sauf que c,a n'est pas permis ...
alors ? if (lvl.eq.min) assign back_main=10011 to I10010
10014 GOTO IO10010(lvl),(10024,10011)
***********************************************************************

