*******************************************************************************
*******************************************************************************
******* Structure Matricielle par blocs ligne (ou colonne) ********************
*******************************************************************************
*******************************************************************************
Le plus précis exigeant un langage adapté, le mieux est de décrire la routine
de ker qui passe de la répresentation par blocs (SM) à la bonne vieille
représentation pleine de zéros (TM). On prend l'option d'une SM par BLigne pour
les commentaires; c'est semblable pour la description par colonnes.
On donne ici la description complète d'une matrice carrée par sa SM, ce qui
englobe les descriptions plus partielles (une seule BLigne par exemple)

SUBROUTINE OMBNCH(KMXBU,JMXBU,LMXBU);
!...............................................................
!   Bunch a matrix stored in the standard MXT-MXR-MX structure;.
!   the bunched matrix is stored in a single matrix bank linked.
!   in LQ(KMXBU-JMXBU).
!                                                              .
!   Input : KMXBU = address of the bank to which the bunched   .
!                   matrix bank will be linked                 .
!           JMXBU = offset of this link                        .
!           LMXT  = address of the input MXT; found in COMMON  .
!                                                              .
!   Output : LMXBU = Bunched matrix address                    .
!                                                              .
!   Variables : NSZR = TOTAL NUMBER OF ROWS                    .
!               NSZC = TOTAL NUMBER OF COLUMNS                 .
!               NCT = # OF BLOCK-COLUMNS                       .
!               NRT = # OF BLOCK-ROWS                          .
!...............................................................
DIMENSION MMXBU(4);
DATA MMXBU/'MXBU',1,1,0/;
                             ****  Info Globale  : MXT et Size ****
NBLOC=IQ(LMXT+2);           Numero de la BLigne (une IN ou une IX)
LSZR = @(LMXT.MT).SR;       Les deux Size Banks donnent :
LSZC = @(LMXT.MT).SC;
NRT=IQ(LSZR+2);                  le nombre de BLignes (=1)
NCT=IQ(LSZC+2);                       "       Bcol (= # IF)
NSZR=IQ(LSZR+1);                 Nbre de lignes de la matrice complete (TM)
NSZC=IQ(LSZC+1);                   "     colonnes       "       "
Ainsi, les banks Size decrivent la matrice expansee (dite TM = True Matrix), cad
l'ensemble des IF (IN ou IX) ordonnees, meme vide du fait de la connectique.

"---------CREATION du MXBU'Bank d'accueil de la matrice
MMXBU(4)=NSZC*NSZR;    Dimension de la matrice, pour reservation d'un bank
NODVKE=NODV;           de la division MX
NODV=NOMX;
CALL MQZERO(LMXBU,KMXBU,JMXBU,MMXBU);
NODV=NODVKE;                *** Info dans les BRow tables chainees ***
LMXR = @(LMXT.MT).RT(1);     decrivant chaque Bloc (correspondant a une IF)
  Les MXR Banks donnent la liste des blocs (BCol) non vides corespondant chacun
  a un couple d'IFi,IFj non vide du fait de la connectique.
MR=1;
MSZ=0;        TM 0 pointeur sur l'element de matrice expansee de la BLigne courante
 ISZ=0;       TM 0 pointeur de l'element de matrice expansee de la BLigne suivante

DO IR=1,NRT               Boucle sur les BLignes de la matrice expanse
<  NR=IQ(LSZR+2+IR);        Nbre de lignes de la IReme BLigne
   ISZ=ISZ+NR*NSZC;         Fin de derniere ligne de la nouvelle BLigne expansee
   IF(IR.EQ.IQ(LMXR+2)"=NUMR")     La BLigne correspond a une BLigne non vide
   <  M=1;
   " "MR=MR+1;
   " "DO  IC=1,NCT            Boucle sur les BCol de la BLigne expansee
   " "<  NC=IQ(LSZC+2+IC);      Nbre de colonnes du bloc BCol (meme vide)
   " "   NUMC=IQ(LMXR+3+M);     Numero du bloc a copier
   " "   IF(NUMC. EQ .IC)       Copie d'un bloc non vide
   " "   <  LMX = @(LMXR.RT).MX(M);  le bloc matrice qui contiend les valeurs
   " "   " "M=M+1;
   " "   " "L=MSZ;               Copie d'un bloc de dim NC*NR,  (NUMC,NUMR) dans [IC,JR]
   " "   " "DO JR=1,NR           du bank LMX, ligne par ligne  >>>>>>>>>
   " "   " "<  NDEB=NC*(JR-1)+1;                                        `
   " "   " "   NFIN=NC*JR;                                              `
   " "   " "   DO JC=NDEB,NFIN "--WRITE A ROW of Bloc"                   `
   " "   " "   <  L=L+1;                                                `
   " "   " "   " "Q(LMXBU+L)=Q(LMX+JC);   Element de matrice IFi.IFj(JC,JR)`
   " "   " "   >                                                        `
   " "   " "   L=NSZC*JR+MSZ;    ligne suivante de la matrice expansee                                       `
   " "   " "   "-----NEXT ROW"                                          `
   " "   " ">                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<`
   " "   >
   " "   MSZ=MSZ+NC;        0 pointeur sur la colonne de la BLigne expansee
   " ">
   " "MSZ=ISZ;              TM pointeur sur le debut de la suivante
   " "LMXR=LQ(LMXR+ONX);   "NEXT BLOCK-ROW"  la suivante de celle que l'on a recopie
   >                       (y a pas de bug, car on n'utilise OMBNCH que pour les [g]
   ELSE                     matrix, dont la SM a les memes BRow que la TM).
   <  MSZ=ISZ;
   >
>
RETURN;
END;

**************************************** Features ******************************
Il vaudrait mieux boucler sur la structure MT~RT~MX et remplir les blocs de la TM
non vides en utilisant les inverse table donnant la position de chaque (Blocs) dans
la [TM]. Reste a donner le TM pointeur correspondant a un bloc non vide.

Feature : ces pointeurs pourraient etre ranges soit dans les Size,
soit dans la CTBR reverse table.

