cpass2.c

Go to the documentation of this file.
00001 #include <stdlib.h> 
00002 #include <stdio.h>
00003 #include <math.h>
00004 
00005 #include "sci_mem_alloc.h" /* MALLOC */
00006 
00007 #include "machine.h"
00008 #include "cc_pass2.h"
00009 #include <memory.h>
00010 #include <string.h>
00011 
00012 /********************************** la fonctoin OR ********************************************/
00013 int OR(int* Vect)
00014 {
00015   int i=1;  
00016   int next=false;  
00017 
00018   while(!(next) && (i<Vect[0]+1))
00019     {
00020       next=(Vect[i]!=0)? true:false ;
00021       i++;
00022     }
00023   return next;
00024 }
00025 /************************************************* fin du OR *******************************/
00026 /**************************** la fonction de Sign *****************************************/
00027 int Sign(int x)
00028 {
00029   int y;
00030   if  (x < 0) y=-1;
00031   else if (x > 0) y=1;
00032   else y=0;
00033   return y;
00034 }
00035 /******************************* fin de Sign  *************************************************/
00036 /**************************** la fonction de Max1 *****************************************/
00037 int Max1(int* vect)
00038 {
00039   int i,max1;
00040   if (vect[0]<1){
00041     max1=0;
00042   }else{
00043     max1=vect[1];
00044     for(i=2;i<vect[0]+1;i++)
00045       {
00046         max1=(max1<vect[i])? vect[i]:max1;
00047       }
00048   }
00049   return max1;
00050 }
00051 /******************************* fin de Max1  *************************************************/
00052 /**************************** la fonction de Min1 *****************************************/
00053 int Min1(int* vect)
00054 {
00055   int i,min1;
00056   if (vect[0]<1){
00057     min1=0;
00058   }else{
00059     min1=vect[1];
00060     for(i=2;i<vect[0]+1;i++)
00061       {
00062         min1=(min1>vect[i])? vect[i]:min1;
00063       }
00064   }
00065   return min1;
00066 }
00067 /******************************* fin de Min1  *************************************************/
00068 
00069 /***************************** fonction AND ************************************************/
00070 int AND(int* Vect)
00071 {
00072   int i=1;  
00073   int next=false;  
00074   while((!(next)) && (i<Vect[0]+1))
00075     {
00076       next=(Vect[i]==0)? true :false;
00077       i++;
00078     }
00079   return !next;
00080 }
00081 /************************************** fin de AND *******************************************/
00082 
00083 /******************************functio main *********************************************************/
00084 int cpass2(bllst111,bllst112,bllst2,bllst3,bllst4,bllst5,bllst9,bllst10,
00085            bllst11,bllst12,bllst13,nmode,nzcross,bllst2ptr,bllst3ptr,bllst4ptr,bllst5ptr,bllst6ptr,bllst9ptr,typ_x,
00086            bllst11ptr,connectmat,clkconnect,corinvec,corinvptr,
00087            iz0,tevts,evtspt,pointi,outtb,zcptr,modptr,outlnk,inplnk,
00088            lnkptr,ordptr,execlk,ordclk,cord,oord,zord,critev,nb,ztyp,
00089            nblk,ndcblk,subscr,iord,ok)
00090      
00091      char ***bllst10,***bllst13,***bllst111;
00092      int **bllst2,**bllst3,**bllst4,**bllst5,**bllst2ptr,**bllst3ptr,**bllst4ptr;
00093      int **bllst5ptr,**typ_x,**bllst11ptr,*ok,**bllst112,**bllst9,**bllst9ptr;
00094      int **corinvec,**corinvptr,**evtspt,*pointi,**outtb,**zcptr,**modptr,**inplnk;
00095      int **outlnk,**lnkptr,**ordptr,**execlk,**ordclk,**cord,**oord;
00096      int **zord,**critev,**iz0,**subscr,**nzcross,**nmode,**bllst6ptr;
00097      int *nb,**ztyp,*nblk,*ndcblk,**iord,**bllst12,**connectmat,**clkconnect;
00098      double **bllst11,**tevts;  
00099 { 
00100  
00101   /*take care of the heritage*/
00102   int need_newblk=1,i,l,nombr,a,prime_pointer=1;
00103   int done,ncblk,nxblk,ndblk,nblk1; 
00104   int *typ_l,*typ_r,*typ_m,*tblock,*prime_act,*vec;
00105   int *typ_cons,*typ_z,*typ_s,*bexe,*boptr,*blnk,*blptr,*outoinptr,*typ_zx;
00106   int *outoin,*exe_cons,*evoutoin,*evoutoinptr,*ordptr1,*execlk0,*execlk_cons;
00107   double *initexe;
00108   nblk1=((int*) (*bllst10))[0];
00109   if (TEST) 
00110     {
00111       Message("No block can be activated");
00112       *ok=false;
00113       return 0;
00114     }
00115   
00116   mini_extract_info(*bllst2,bllst4,*bllst10,*bllst12,*bllst2ptr,*bllst3ptr,bllst4ptr,*typ_x,*connectmat,
00117                     *clkconnect,inplnk,outlnk,&typ_l,&typ_r,&typ_m,&tblock,&typ_cons,&typ_zx,*nzcross,ok);
00118  
00119   conn_mat(*inplnk,*outlnk,*bllst2ptr,*bllst3ptr,&outoin,&outoinptr,nblk);
00120   critical_events(*connectmat,*clkconnect,*bllst12,typ_r,typ_l,typ_zx,outoin,outoinptr,*bllst5ptr,critev);
00121   pak_ersi(clkconnect,typ_r,typ_l,outoin,outoinptr,tblock,typ_cons,*bllst5ptr,&exe_cons,*nblk);
00122   FREE(typ_r);
00123   typ_r=NULL;
00124   FREE(tblock);
00125   tblock=NULL;
00126   FREE(typ_zx);
00127   typ_zx=NULL;
00128   FREE(typ_cons);
00129   typ_cons=NULL;
00130   done=false; 
00131   if ((prime_act=MALLOC(sizeof(int)*2))== NULL ) return 0;
00132   prime_act[0]=1;
00133   prime_act[1]=0;
00134  
00135   for (i = 1; i <= nblk1; i++){
00136     if (!typ_l[i] && ((*bllst5ptr)[i+1]-(*bllst5ptr)[i] != 0)){
00137       if ((vec=MALLOC(sizeof(int)*((*bllst5ptr)[i+1]-(*bllst5ptr)[i]+1)))== NULL ) return 0;
00138       vec[0]=(*bllst5ptr)[i+1]-(*bllst5ptr)[i];
00139       if ((prime_act=(int*)REALLOC(prime_act,sizeof(int)*(prime_act[0]+vec[0]+1))) == NULL ) return 0;      
00140       for (l = 1; l <= vec[0]; l++){
00141         prime_act[prime_act[0]+l]=(*bllst5ptr)[i]+l-1;
00142       }
00143       prime_act[0]=prime_act[0]+vec[0];
00144       FREE(vec);
00145     }
00146   }
00147   while(!done)
00148     {
00149       make_ptr(*bllst10,&typ_l,&typ_m);
00150       cleanup(clkconnect);
00151       if (OR(typ_l))
00152         paksazi(bllst111,bllst112,bllst2,bllst3,bllst4,bllst5,bllst9,bllst10,bllst12,nzcross,bllst2ptr,bllst3ptr,
00153                 bllst4ptr,bllst5ptr,bllst9ptr,connectmat,clkconnect,typ_l,typ_m,&done,ok,&need_newblk,
00154                 corinvec,corinvptr,critev,&prime_pointer,&prime_act);
00155       else done=true;
00156       if(!(*ok)) return 0;
00157     }
00158   FREE(prime_act);  
00159   FREE(typ_l);
00160   typ_l=NULL;
00161   nombr=((int*) (*bllst10))[0];
00162   if (nblk1 < nombr) 
00163     {
00164       if (((*typ_x)=(int*)REALLOC((*typ_x),sizeof(int)*(nombr+1))) == NULL ) return 0;
00165       (*typ_x)[0]=nombr;
00166       if (((*bllst11ptr)=(int*)REALLOC((*bllst11ptr),sizeof(int)*((*bllst11ptr)[0]+nombr-nblk1+1))) == NULL ) return 0;
00167       (*bllst11ptr)[0]=(*bllst11ptr)[0]+nombr-nblk1;
00168       if (((*bllst11)=(double*)REALLOC((*bllst11),sizeof(double)*(((int*) (*bllst11))[0]+2*(nombr-nblk1)+1))) == NULL ) return 0;
00169       ((int*)(*bllst11))[0]=((int*)(*bllst11))[0]+2*(nombr-nblk1);
00170       if (((*nmode)=(int*)REALLOC((*nmode),sizeof(int)*(nombr+1))) == NULL ) return 0;
00171       (*nmode)[0]=nombr;      
00172       if (((*bllst13)=(char**)REALLOC((*bllst13),sizeof(char*)*(nombr+1))) == NULL )  return 0;
00173       ((int*) (*bllst13))[0]=nombr;
00174       for(i=nblk1+1;i<nombr+1;i++)
00175         {         
00176           (*typ_x)[i]=0;
00177           (*nmode)[i]=1;                  
00178           (*bllst11ptr)[i+1]=(*bllst11ptr)[i]+2;
00179           for(l=(*bllst11ptr)[i];l<=(*bllst11ptr)[i+1]-1;l++)
00180             {
00181               (*bllst11)[l]=-1;
00182             }
00183           if (( (*bllst13)[i]=(char*) MALLOC(sizeof(char)*(2))) ==NULL )  return 0;
00184           ((char*) (*bllst13)[i])[1]='\0';
00185           *((*bllst13)[i])=' ';
00186         }      
00187 
00188     }
00189   FREE(typ_m);
00190   FREE(*inplnk);
00191   FREE(*outlnk);
00192   extract_info(*bllst2,*bllst3,*bllst5,*bllst10,*bllst11,*bllst12,*bllst2ptr,*bllst3ptr,*bllst4ptr,*bllst5ptr,
00193                *bllst11ptr,*connectmat,*clkconnect,lnkptr,inplnk,outlnk,*nzcross,*nmode,
00194                &typ_s,typ_x,&typ_m,&initexe,&bexe,&boptr,&blnk,&blptr,ok,*corinvec,*corinvptr);
00195   FREE(typ_m);
00196   typ_m=NULL;
00197   if(!(*ok)) 
00198     {
00199       Message("Problem in port size.");
00200       return 0;
00201     }
00202   
00203   FREE(outoinptr);
00204   FREE(outoin);
00205   conn_mat(*inplnk,*outlnk,*bllst2ptr,*bllst3ptr,&outoin,&outoinptr,nblk);
00206   *nblk=nblk1;
00207   synch_clkconnect(typ_s,*clkconnect,&evoutoin,&evoutoinptr);
00208   discard(*bllst5ptr,*clkconnect,exe_cons,&ordptr1,execlk,&execlk0,&execlk_cons);
00209   FREE(*clkconnect);
00210   *clkconnect=NULL;
00211   FREE(exe_cons);
00212   exe_cons=NULL;
00213   
00214   scheduler(*bllst12,*bllst5ptr,*execlk,execlk0,execlk_cons,ordptr1,outoin,outoinptr,evoutoin,
00215             evoutoinptr,&typ_z,typ_x,typ_s,bexe,boptr,blnk,blptr,ordptr,ordclk,cord,iord,oord,zord,ok,*nzcross);
00216   
00217   FREE(typ_s);
00218   typ_s=NULL;
00219   FREE(*typ_x);
00220   *typ_x=NULL;
00221   FREE(bexe);
00222   bexe=NULL;
00223   FREE(boptr);
00224   boptr=NULL;
00225   FREE(blnk);
00226   blnk=NULL;
00227   FREE(blptr);
00228   blptr=NULL;
00229   FREE(outoinptr);
00230   outoinptr=NULL;
00231   FREE(outoin);
00232   outoin=NULL;
00233   FREE(evoutoin);
00234   evoutoin=NULL;
00235   FREE(evoutoinptr);
00236   evoutoinptr=NULL;
00237   FREE(ordptr1);
00238   ordptr1=NULL;
00239   FREE(execlk0);
00240   execlk0=NULL;
00241   FREE(execlk_cons);
00242   execlk_cons=NULL;
00243   
00244   if(!(*ok)) return 0;
00245   if (((*zcptr)=MALLOC(sizeof(int)*((nombr+2))))== NULL ) return 0;
00246   (*zcptr)[0]=nombr+1;
00247   (*zcptr)[1]=1;
00248   if (((*modptr)=MALLOC(sizeof(int)*((nombr+2))))== NULL ) return 0;
00249   (*modptr)[0]=nombr+1;
00250   (*modptr)[1]=1;
00251   for (i=1; i<= nombr; i++)
00252     {
00253       (*zcptr)[i+1]=(*zcptr)[i] + typ_z[i];
00254       a=Sign(typ_z[i]);
00255       (*modptr)[i+1]=(*modptr)[i]+a*(*nmode)[i];
00256     }
00257   FREE(typ_z);
00258   /*completement inutile pour simulation, c'est pour la generation de code*/
00259   *ztyp=VecEg1(*nzcross); 
00260   for (i=1;i<=(*ztyp)[0];i++)
00261     {
00262       if ((*nzcross)[i] < 0) 
00263         {
00264           (*ztyp)[i]=-1;
00265         }
00266       else if ((*nzcross)[i] > 0)
00267         {
00268           (*ztyp)[i]=1;
00269         }
00270       else
00271         {
00272           (*ztyp)[i]=0;  
00273         }
00274     }
00275   /* if xptr($)==1 & zcptr($)>1 then */
00276   if ((*bllst6ptr)[(*bllst6ptr)[0]]==1 && (*zcptr)[(*zcptr)[0]] > 1) {
00277     Message("No continuous-time state. Tresholds are ignored.");
00278   }
00279   ncblk=0;nxblk=0;ndblk=0;*ndcblk=0;
00280 
00281   *nb=nombr;
00282   
00283   init_agenda(initexe,*bllst5ptr,tevts,evtspt,pointi);
00284   FREE(initexe);
00285   initexe=NULL;
00286   if (((*outtb)=(int*)CALLOC((*lnkptr)[(*lnkptr)[0]],sizeof(int)))== NULL ) return 0;
00287   (*outtb)[0]=(*lnkptr)[(*lnkptr)[0]]-1;
00288   if (((*iz0)=(int*)CALLOC(*nb+1,sizeof(int)))== NULL ) return 0;
00289   (*iz0)[0]=*nb;
00290   
00291   /* *iz0=NULL; */
00292   *subscr=NULL;
00293   return 0;
00294 } /*endfuncton cpass*/
00295 
00296 /***************************************** fin de c_pass2 ************************************/
00297 /***************************************** fonction scheduler*********************************/
00298 int scheduler(bllst12,bllst5ptr,execlk,execlk0,execlk_cons,ordptr1,outoin,outoinptr,evoutoin,
00299                evoutoinptr,typ_z,typ_x,typ_s,bexe,boptr,blnk,blptr,ordptr2,ordclk,cord,iord,oord,
00300                zord,ok,nzcross)
00301      int *bllst5ptr,*outoinptr,*evoutoin,*evoutoinptr,**typ_z,**typ_x,*typ_s,*bexe,*boptr;
00302      int *blnk,*blptr,**ordptr2,*ok,*ordptr1,*bllst12,*nzcross;
00303      int *execlk,*execlk0,*execlk_cons,*outoin,**ordclk,**cord,**iord,**oord,**zord;
00304 {
00305   int i,iii,k,l,j,jj,hh,o,maX,n,nblk=(*typ_x)[0],f,fin=0;
00306   int *vec,*wec,*ii,*ii1,*ii2,*r,*ext_cord1,*pp,*ppget,*ppget1,*ext_cord2,*typ_z_save;
00307   int *orddif,*cordX,*ext_cord,*ext_cord_old,*oordii,*ind,a,val=0;
00308   Mat2C ordclki,ext_cord1i;
00309   
00310   vec=NULL;
00311   wec=NULL;
00312   cordX=NULL;
00313   oordii=NULL;
00314   r=NULL;
00315   orddif=NULL;
00316   ii=NULL;
00317   ii1=NULL;
00318   ii2=NULL;
00319   ext_cord=NULL;
00320   ext_cord1=NULL;
00321   ind=NULL;
00322   *typ_z=VecEg1(nzcross);
00323   if (execlk0)
00324     {
00325       /* compute cord */
00326       ind=GetPartVect(execlk0,1,execlk0[0]/2);
00327       if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00328       vec[0]=ind[0];
00329       wec=GetPartVect(execlk0,execlk0[0]/2+1,execlk0[0]/2);
00330       tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,cord,ok);
00331       if (ind) FREE(ind);
00332       if(vec) FREE(vec);
00333       vec=NULL;
00334       if(wec) FREE(wec);
00335       wec=NULL;
00336     } 
00337   else 
00338     {
00339       (*cord)=NULL;
00340     } 
00341       
00342   /* compute iord */
00343   if (execlk_cons)
00344     {
00345       ind=GetPartVect(execlk_cons,1,execlk_cons[0]/2);
00346       if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00347       vec[0]=ind[0];
00348       wec=GetPartVect(execlk_cons,execlk_cons[0]/2+1,execlk_cons[0]/2);
00349       tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,iord,ok);
00350       if (ind) FREE(ind);
00351       if(vec) FREE(vec);
00352       vec=NULL;
00353       if(wec) FREE(wec);
00354       wec=NULL;
00355     } 
00356   else 
00357     {
00358       (*iord)=NULL;
00359     }
00360 
00361   if (!(*ok))
00362     {
00363       Message("Algebraic loop detected; cannot be compiled");
00364       (*cord)=NULL;
00365       (*iord)=NULL;
00366       return 0;
00367     }
00368  if (((*ordclk)=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00369  (*ordclk)[0]=0; 
00370  (*ordptr2)=VecEg1(ordptr1);
00371  for(o=1;o<bllst5ptr[nblk+1];o++)
00372    {
00373      ind=GetPartVect(execlk,ordptr1[o],ordptr1[o+1]-ordptr1[o]);
00374      if (ind)
00375        {
00376          if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00377          vec[0]=ind[0];
00378          wec=GetPartVect(execlk,ordptr1[o]+execlk[0]/2,ordptr1[o+1]-ordptr1[o]);
00379          tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,&r,ok);
00380          if (ind) FREE(ind);
00381          if(vec) FREE(vec);
00382          vec=NULL;
00383          if(wec) FREE(wec);
00384          wec=NULL;
00385          if (!(*ok))
00386            {
00387              Message("Algebraic loop detected; cannot be compiled");
00388              (*cord)=NULL;
00389              (*iord)=NULL;
00390              (*ordclk)=NULL;
00391              (*ordptr2)=NULL;
00392              return 0;
00393            }
00394          (*ordptr2)[o+1]=r[0]/2+(*ordptr2)[o];
00395          if ((ordclki.col1=(int*)MALLOC(sizeof(int)*((*ordclk)[0]/2+r[0]/2+1))) == NULL) return 0;
00396          ordclki.col1[0]=(*ordclk)[0]/2+r[0]/2;
00397          if ((ordclki.col2=(int*)MALLOC(sizeof(int)*((*ordclk)[0]/2+r[0]/2+1))) == NULL) return 0;
00398          ordclki.col2[0]=(*ordclk)[0]/2+r[0]/2;
00399          pp=&(ordclki.col1)[1];
00400          pp=memcpy(pp,&(*ordclk)[1],sizeof(int)*((*ordclk)[0]/2));
00401          pp=&(ordclki.col2)[1];
00402          pp=memcpy(pp,&(*ordclk)[(*ordclk)[0]/2+1],sizeof(int)*((*ordclk)[0]/2));
00403          pp=&(ordclki.col1)[(*ordclk)[0]/2+1];
00404          pp=memcpy(pp,&r[1],sizeof(int)*(r[0]/2));
00405          pp=&(ordclki.col2)[(*ordclk)[0]/2+1];
00406          pp=memcpy(pp,&r[1+r[0]/2],sizeof(int)*(r[0]/2));
00407          if (((*ordclk)=(int*)REALLOC((*ordclk),sizeof(int)*((*ordclk)[0]+r[0]+1))) == NULL ) return 0;
00408          (*ordclk)[0]=r[0]+(*ordclk)[0];
00409          pp=&(*ordclk)[1];
00410          pp=memcpy(pp,&(ordclki.col1)[1],sizeof(int)*(ordclki.col1[0]));
00411          pp=&(*ordclk)[(*ordclk)[0]/2+1];
00412          pp=memcpy(pp,&(ordclki.col2)[1],sizeof(int)*(ordclki.col1[0]));
00413          if(ordclki.col1) FREE(ordclki.col1);
00414          ordclki.col1=NULL;
00415          if(ordclki.col2) FREE(ordclki.col2);
00416          ordclki.col2=NULL;
00417          
00418          if(r) FREE(r);
00419          r=NULL; 
00420        }
00421    }
00422  if ((orddif=(int*)MALLOC(sizeof(int)*(ordptr1[0]+1)))== NULL ) return 0;
00423  orddif[0]=ordptr1[0];
00424  for (k=1;k<orddif[0]+1;k++)
00425    {
00426      if (ordptr1[k]!=(*ordptr2)[k]) orddif[k]=1;
00427      else orddif[k]=0;
00428    }
00429  if (AND(orddif))
00430    {
00431      sciprint("serious bug,report0");
00432    }
00433  if(orddif) FREE(orddif);
00434  if (!(*cord))
00435    {
00436     if ((*cord=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00437      (*cord)[0]=0; 
00438    }
00439  
00440  if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1)))== NULL ) return 0;
00441  vec[0]=nblk;
00442  Setmem(vec,-1);   
00443  for(i=1;i<(*cord)[0]/2+1;i++)
00444    {
00445      vec[(*cord)[i]]=0;
00446    }
00447  
00448  ext_cord1=VecEg1(*cord);
00449  if (ext_cord1[0] != 0){
00450    j=1;
00451    while (true) {
00452      if (typ_s[ext_cord1[j]]) {
00453        for (i=bllst5ptr[ext_cord1[j]]; i< bllst5ptr[ext_cord1[j]+1]; i++){
00454          a=ext_cord1[0]/2+ordptr1[i+1]-ordptr1[i];
00455          if ((ext_cord1i.col1=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
00456          ext_cord1i.col1[0]=a;
00457          if ((ext_cord1i.col2=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
00458          ext_cord1i.col2[0]=a;
00459          pp=&(ext_cord1i.col1)[1];
00460          pp=memcpy(pp,&ext_cord1[1],sizeof(int)*(ext_cord1[0]/2));
00461          pp=&(ext_cord1i.col2)[1];
00462          pp=memcpy(pp,&ext_cord1[ext_cord1[0]/2+1],sizeof(int)*(ext_cord1[0]/2));
00463          pp=&(ext_cord1i.col1)[ext_cord1[0]/2+1];
00464          pp=memcpy(pp,&(*ordclk)[ordptr1[i]],sizeof(int)*(ordptr1[i+1]-ordptr1[i]));
00465          pp=&(ext_cord1i.col2)[ext_cord1[0]/2+1];
00466          pp=memcpy(pp,&(*ordclk)[ordptr1[i]+(*ordclk)[0]/2],sizeof(int)*(ordptr1[i+1]-ordptr1[i]));
00467          if ((ext_cord1=(int*)REALLOC(ext_cord1,sizeof(int)*(2*a+1))) == NULL ) return 0;
00468          ext_cord1[0]=2*a;
00469          pp=&ext_cord1[1];
00470          pp=memcpy(pp,&(ext_cord1i.col1)[1],sizeof(int)*(a));
00471          pp=&ext_cord1[a+1];
00472          pp=memcpy(pp,&(ext_cord1i.col2)[1],sizeof(int)*(a));
00473          if(ext_cord1i.col1) FREE(ext_cord1i.col1);
00474          ext_cord1i.col1=NULL;
00475          if(ext_cord1i.col2) FREE(ext_cord1i.col2);
00476          ext_cord1i.col2=NULL;
00477        }
00478      }
00479      j++;
00480      if (j > ext_cord1[0]/2) break;
00481    }
00482  }
00483  /* ext_cord=unique(ext_cord1(:,1)') */ 
00484  if ((ext_cord=(int*)MALLOC(sizeof(int)*(ext_cord1[0]/2+1))) == NULL ) return 0;
00485  ext_cord[0]=ext_cord1[0]/2;  
00486  for (i=1; i<ext_cord[0]+1; i++){
00487    f=0;
00488    for (j=1; j<=val; j++){
00489      if ((ext_cord[j]-ext_cord1[i])==0){
00490        f=1;
00491        break;
00492      }
00493    }
00494    if ( !f ){
00495      val++;
00496      ext_cord[val]=ext_cord1[i];
00497    }
00498  }
00499  ext_cord[0]=val;
00500  /* adding zero crossing surfaces to cont. time synchros */ 
00501  
00502  tree3(vec,vec[0],bllst12,typ_s,bexe,boptr,blnk,blptr,&ext_cord_old,ok);
00503  if(vec) FREE(vec);
00504  vec=NULL; 
00505  if ((ind=(int*)MALLOC(sizeof(int)*(ext_cord_old[0]+1))) == NULL ) return 0;
00506  ind[0]=ext_cord_old[0];
00507  C2F(isort)(&ext_cord_old[1],&ext_cord_old[0],&ind[1]);
00508  FREE(ind);
00509  if ((ind=(int*)MALLOC(sizeof(int)*(ext_cord[0]+1))) == NULL ) return 0;
00510  ind[0]=ext_cord[0];
00511  ext_cord2=VecEg1(ext_cord);
00512  C2F(isort)(&ext_cord2[1],&ext_cord2[0],&ind[1]);
00513  FREE(ind);
00514  if ((vec=(int*)CALLOC((ext_cord[0]+1),sizeof(int))) == NULL ) return 0;
00515  vec[0]=ext_cord[0];
00516  for (i=1; i<=ext_cord[0]; i++){
00517    if (ext_cord2[i] != ext_cord_old[i]) vec[i]=1;
00518  }
00519  FREE(ext_cord2);
00520  if (ext_cord_old) FREE(ext_cord_old);
00521  if ( OR(vec)){
00522    FREE(vec);
00523    return 0;
00524  }
00525  if (vec) FREE(vec);
00526  /*pour mettre a zero les typ_z qui ne sont pas dans ext_cord
00527    noter que typ_z contient les tailles des nzcross (peut etre >1)*/
00528      
00529  for (i=1; i<=ext_cord[0]; i++)
00530    {
00531      (*typ_z)[ext_cord[i]]=-(*typ_z)[ext_cord[i]];
00532    }
00533  for (i=1; i<=(*typ_z)[0]; i++)
00534    {
00535      if ((*typ_z)[i] < 0) 
00536        {
00537          (*typ_z)[i]=-(*typ_z)[i];
00538        }
00539      else 
00540        {
00541          (*typ_z)[i]=0;
00542        }
00543    }
00544  if (!(*ok)) 
00545    {
00546      sciprint("serious bug,report1");
00547    }
00548  typ_z_save=VecEg1(*typ_z);
00549  while (!fin){
00550    fin=1;
00551    for (i=ext_cord[0]; i>0; i--){
00552      iii=ext_cord[i];
00553      ii=GetPartVect(outoin,outoinptr[iii],outoinptr[iii+1]-outoinptr[iii]);
00554      if (!ii)
00555        {
00556          if ((ii=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00557          ii[0]=0;
00558        }      
00559      ppget=GetPartVect(evoutoin,evoutoinptr[iii],evoutoinptr[iii+1]-evoutoinptr[iii]);
00560      if(ppget)
00561        {
00562          if ((ii=(int*)REALLOC(ii,sizeof(int)*(ii[0]+ppget[0]+1)))== NULL ) return 0;
00563          pp=&ii[ii[0]+1];
00564          pp=memcpy(pp,&(ppget)[1],sizeof(int)*(ppget[0]));
00565          ii[0]=ii[0]+ppget[0];
00566          FREE(ppget);
00567        }
00568      for (j=1;j<ii[0]+1;j++)
00569        {
00570          l=ii[j];
00571          if ((*typ_z)[l]) {
00572            if ((*typ_z)[iii] == 0){
00573              (*typ_z)[iii]=1;
00574              fin=0;
00575            }
00576          }
00577          if ((*typ_x)[l]) {
00578            if (!(*typ_x)[iii]) {
00579              (*typ_x)[iii]=1;
00580              fin=0;
00581            }
00582          }
00583          if ((*typ_z)[iii] && (*typ_x)[iii]) break;
00584        }
00585      if (ii) FREE(ii);
00586    }
00587  }
00588  
00589  FREE(ext_cord); ext_cord=NULL;
00590  
00591  if ((*cord)[0] != 0)
00592    {
00593      if ((ppget=(int*)CALLOC((*cord)[0]/2+1,sizeof(int))) == NULL ) return 0;
00594      ppget[0]=(*cord)[0]/2;
00595      ppget1=VecEg1(ppget);
00596      for (i=1; i <= (*cord)[0]/2; i++){
00597        if ((*typ_z)[(*cord)[i]]) ppget[i]=1;
00598        if ((*typ_x)[(*cord)[i]]) ppget1[i]=1;
00599      }
00600      ii=FindDif(ppget,0);
00601      FREE(ppget);
00602      if (ii)
00603        {
00604          if (((*zord)=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
00605          (*zord)[0]=2*ii[0];     
00606          for(i=1;i<ii[0]+1;i++)
00607            {
00608              (*zord)[i]=(*cord)[ii[i]];
00609              (*zord)[i+ii[0]]=(*cord)[ii[i]+(*cord)[0]/2];
00610            }     
00611          FREE(ii);
00612        }
00613      ii=FindDif(ppget1,0);
00614      FREE(ppget1);
00615      if (ii)
00616        {
00617          if (((*oord)=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
00618          (*oord)[0]=2*ii[0];     
00619          for(i=1;i<ii[0]+1;i++)
00620            {
00621              (*oord)[i]=(*cord)[ii[i]];
00622              (*oord)[i+ii[0]]=(*cord)[ii[i]+(*cord)[0]/2];
00623            }     
00624          FREE(ii);
00625        }
00626    } /* fin de if *cord[0] !=0 */
00627  else
00628    {
00629      *oord=NULL;
00630      *zord=NULL;
00631    }
00632      
00633  FREE(*typ_z);
00634  (*typ_z)=VecEg1(typ_z_save);
00635  FREE(typ_z_save);
00636  ii=GetPartVect(ext_cord1,1,ext_cord1[0]/2);
00637  if ((ii=(int*)REALLOC(ii,sizeof(int)*(ext_cord1[0]/2+(*ordclk)[0]/2+1))) == NULL ) return 0;
00638  ii[0]=ext_cord1[0]/2+(*ordclk)[0]/2;
00639  pp=&ii[ext_cord1[0]/2+1];
00640  pp=memcpy(pp,&(*ordclk)[1],sizeof(int)*((*ordclk)[0]/2));
00641  maX=Max1(ii)+1;
00642  FREE(ii);
00643  ii=NULL;
00644  if ((cordX=(int*)MALLOC(sizeof(int)*(ext_cord1[0]/2+1))) == NULL ) return 0;
00645  cordX[0]=ext_cord1[0]/2;
00646  ii1=GetPartVect(ext_cord1,1,ext_cord1[0]/2);
00647  ii2=GetPartVect(ext_cord1,ext_cord1[0]/2+1,ext_cord1[0]/2);
00648  if (ii1 && ii2)
00649    {
00650      for(i=1;i<ext_cord1[0]/2+1;i++)
00651        {
00652          cordX[i]=maX*ii1[i]+ii2[i];
00653        }
00654      FREE(ii1);
00655      FREE(ii2);     
00656    }
00657  if (ext_cord1) FREE(ext_cord1);
00658  
00659  for (i=1;i<bllst5ptr[nblk+1];i++)
00660    {     
00661      for (hh=ordptr1[i];hh<ordptr1[i+1];hh++)
00662        {
00663          jj=(*ordclk)[hh];
00664          if ((ii=(int*)MALLOC(sizeof(int)*(cordX[0]+1))) == NULL ) return 0;
00665          ii[0]=cordX[0];
00666          n=jj*maX+(*ordclk)[hh+(*ordclk)[0]/2];
00667          for (j=1;j<cordX[0]+1;j++)
00668            {
00669              if (cordX[j]==n) ii[j]=1;
00670              else ii[j]=0;
00671            }
00672          if (OR(ii))
00673            {
00674              (*ordclk)[hh+(*ordclk)[0]/2]=-(*ordclk)[hh+(*ordclk)[0]/2];
00675            } /* fin de if OR()*/
00676          if(ii) FREE(ii);
00677        } /* fin de for hh */
00678    } /* fin de for i */
00679  if(cordX) FREE(cordX);
00680  cordX=NULL;
00681  
00682  return 0;
00683 } /* end function */
00684 /***************************************** fin de scheduler**********************************/
00685 /* =======================================function paksazi=============================================== */
00686 int paksazi(char*** bllst111,int** bllst112,int** bllst2,int** bllst3,int** bllst4,int** bllst5,int** bllst9,
00687             char*** bllst10,int** bllst12,int** nzcross,int** bllst2ptr,int** bllst3ptr,int** bllst4ptr,int** bllst5ptr,
00688             int** bllst9ptr,int** connectmat,int** clkconnect,int* typ_l,int* typ_m,int* done,int* ok,
00689             int* need_newblk,int** corinvec,int** corinvptr,int** critev,int* prime_pointer,int** prime_act)
00690 {
00691   
00692   int i,j=1,k,l,o,leng,ki,sbb,m1,a;
00693   int *vectconnect,*iVect,*id,*dl,*ltmp,*idl,*lb,*indx,*tmpvect,*indxo,*indy,*bexe,*blnk;
00694   int *tmp,*clkconnecttmp,*clkconnect0,*texeclk0,*ind,*w2,*w1,*boptr,*blptr,*tclkconnect,*tcon,*ordptr1,*texeclki;
00695   int *b1,*typ_lm,*pointer,*r,*w3,*pointer1,*con,*vec,*clkconnectind,*connectmatind,*con1;
00696   int okk[1],nn=1,nblk=((int*) (*bllst10))[0];
00697   int nblkorg=nblk;
00698   int change=false;  
00699   Mat4C clkconnecti,connectmati;
00700   Mat2C bllst12i;
00701   int bl_out;  
00702   int *ptmp1,*ptmp2,*inter,*pp,*ppget;
00703   ptmp1=ptmp2=b1= typ_lm= pointer= r= w3= pointer1= con= vec= clkconnectind= connectmatind= con1=NULL;
00704   vectconnect=iVect= id= dl= ltmp= idl= lb= indx= tmpvect= indxo= indy= bexe= blnk=inter=NULL;
00705   tmp= clkconnecttmp= clkconnect0= texeclk0= ind= w2= w1= boptr= blptr= tclkconnect= tcon= ordptr1= texeclki=NULL;
00706   *ok=true;
00707   
00708   if(*need_newblk)
00709     {
00710       vectconnect=GetPartVect((*clkconnect),(*clkconnect)[0]/2+1,(*clkconnect)[0]/4);
00711       Inv(vectconnect);
00712       if ((iVect=(int*)MALLOC(sizeof(int)*(vectconnect[0]+1))) == NULL ) return 0;
00713       iVect[0]=vectconnect[0];
00714       C2F(isort)(&vectconnect[1],&vectconnect[0],&iVect[1]);
00715       FREE(vectconnect);
00716       vectconnect=NULL;
00717       clkconnectind=VecEg1(*clkconnect);
00718       for(i=1;i<iVect[0]+1;i++)
00719         {
00720           (*clkconnect)[i]=clkconnectind[iVect[i]];
00721           (*clkconnect)[i+iVect[0]]=clkconnectind[iVect[i]+iVect[0]];
00722           (*clkconnect)[i+2*iVect[0]]=clkconnectind[iVect[i]+2*iVect[0]];
00723           (*clkconnect)[i+3*iVect[0]]=clkconnectind[iVect[i]+3*iVect[0]];      
00724         }            
00725       FREE(iVect);
00726       iVect=NULL;
00727       if(clkconnectind) FREE(clkconnectind);
00728       clkconnectind=NULL;
00729       if ((id=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
00730       id[0]=(*clkconnect)[0]/4;
00731       a=(*clkconnect)[0]/2;
00732       for(i=1;i<(*clkconnect)[0]/4+1;i++)
00733         {
00734           if(typ_l[(*clkconnect)[a+i]]==1) id[j++]=i;
00735         }
00736       id[0]=j-1;
00737       ltmp=GetCollVect(*clkconnect,id,3);
00738       if ((idl=(int*)MALLOC(sizeof(int)*(3+ltmp[0]))) == NULL ) return 0;
00739       idl[1]=1;
00740       j=2;
00741       for(i=1;i<ltmp[0];i++)
00742         {
00743           if(ltmp[i+1]-ltmp[i] != 0) idl[j++]=i+1;
00744         }
00745       idl[0]=j;
00746       idl[j]=1+ltmp[0];
00747       if(ltmp) FREE(ltmp);
00748       ki=0;
00749       lb=FindEg(typ_l,1);
00750       for(i=1;i<lb[0]+1;i++)
00751         {
00752           ki++;
00753           if (id[0] != 0) {
00754             indx=GetPartVect(id,idl[ki],idl[ki+1]-idl[ki]);
00755           } else { indx=NULL;}
00756           if (indx==NULL) 
00757             {
00758               Message("A synchro block is inactive; cannot be compile");
00759               *ok=false;
00760               return 0;
00761             }
00762           if ((tmpvect=(int*)MALLOC(sizeof(int)*(indx[0]+1))) == NULL ) return 0;
00763           tmpvect[0]=indx[0];
00764           ppget=GetCollVect(*clkconnect,indx,1);
00765           for (l=1;l<ppget[0]+1;l++)
00766             {
00767               if (ppget[l]==lb[i]) tmpvect[l]=1;
00768               else tmpvect[l]=0;
00769             }
00770           FREE (ppget);
00771           if (OR(tmpvect))
00772             {
00773               Message("A algebric loop detected; on activation links");
00774               *ok=false;
00775               return 0;
00776             }         
00777           FREE(tmpvect);
00778           tmpvect=NULL;
00779           *need_newblk=false;
00780           nn=indx[0];
00781           if (nn >= 2)
00782             {
00783               *need_newblk=true;
00784               ppget=GetPartVect(*clkconnect,1,(*clkconnect)[0]/4);
00785               indxo=FindEg(ppget,lb[i]);
00786               FREE(ppget);
00787               ppget=GetPartVect(*connectmat,(*connectmat)[0]/2+1,(*connectmat)[0]/4);
00788               indy=FindEg(ppget,lb[i]);
00789               FREE(ppget);
00790               if (indy[0] > 1) sciprint("Synchro block cannot have more than 1 input");
00791               if (((*bllst2ptr)=(int*)REALLOC((*bllst2ptr),sizeof(int)*((*bllst2ptr)[0]+nn))) == NULL ) return 0;
00792               if (((*bllst3ptr)=(int*)REALLOC((*bllst3ptr),sizeof(int)*((*bllst3ptr)[0]+nn))) == NULL ) return 0;
00793               if (((*bllst4ptr)=(int*)REALLOC((*bllst4ptr),sizeof(int)*((*bllst4ptr)[0]+nn))) == NULL ) return 0;
00794               if (((*bllst5ptr)=(int*)REALLOC((*bllst5ptr),sizeof(int)*((*bllst5ptr)[0]+nn))) == NULL ) return 0;             
00795               if (((*bllst9ptr)=(int*)REALLOC((*bllst9ptr),sizeof(int)*((*bllst9ptr)[0]+nn))) == NULL ) return 0;
00796               if ((*bllst10=(char**)REALLOC(*bllst10,(nblk+nn)*sizeof(char*))) ==NULL )  return 0;
00797               ((int*)(*bllst10))[0]=nblk+nn-1;
00798               if ((*bllst111=(char**)REALLOC(*bllst111,sizeof(char*)*(nblk+nn))) == NULL )  return 0;
00799               ((int*) (*bllst111))[0]=nblk+nn-1;
00800               if (((*bllst112)=(int*)REALLOC((*bllst112),sizeof(int)*(nn+nblk))) == NULL ) return 0;
00801               (*bllst112)[0]=nblk+nn-1;
00802               if ((bllst12i.col1=(int*)MALLOC(sizeof(int)*(nblk+nn))) == NULL ) return 0;
00803               bllst12i.col1[0]=nblk+nn-1;
00804               if ((bllst12i.col2=(int*)MALLOC(sizeof(int)*(nblk+nn))) == NULL ) return 0;
00805               bllst12i.col2[0]=nblk+nn-1;
00806               if (((*bllst12)=(int*)REALLOC((*bllst12),sizeof(int)*(2*(nn+nblk)-1))) == NULL ) return 0;
00807               (*bllst12)[0]=2*(nblk+nn-1);
00808               if (((*corinvptr)=(int*)REALLOC((*corinvptr),sizeof(int)*((*corinvptr)[0]+nn))) == NULL ) return 0;
00809               if (((*corinvec)=(int*)REALLOC((*corinvec),sizeof(int)*((*corinvec)[0]+4*nn+1))) == NULL ) return 0;
00810               if (((*nzcross)=(int*)REALLOC((*nzcross),sizeof(int)*(nblk+nn))) == NULL ) return 0;
00811               (*nzcross)[0]=nblk+nn-1;
00812               
00813               for(k=2;k<nn+1;k++)
00814                 {
00815                   if (((*critev)=(int*)REALLOC((*critev),sizeof(int)*((*critev)[0]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]]+1))) == NULL ) return 0;
00816                   a=(*critev)[0]-(*bllst5ptr)[lb[i]]+1;
00817                   for(l=(*bllst5ptr)[lb[i]]; l<(*bllst5ptr)[lb[i]+1]; l++)
00818                     (*critev)[l+a]=(*critev)[l];
00819                   (*critev)[0]=(*critev)[0]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]];  
00820   
00821                   (*clkconnect)[indx[k]+(*clkconnect)[0]/2]=nblk+1;
00822                   
00823                   if (((*bllst111)[nblk+1]=(char*) MALLOC(sizeof(char)*(strlen((*bllst111)[lb[i]])+1))) ==NULL )  return 0;
00824                   ((char*) (*bllst111)[nblk+1])[strlen((*bllst111)[lb[i]])]='\0';
00825                   strcpy((*bllst111)[nblk+1],(*bllst111)[lb[i]]);
00826                   (*bllst112)[nblk+1]=(*bllst112)[lb[i]];
00827                   
00828                   (*bllst2ptr)[(*bllst2ptr)[0]+1]=(*bllst2ptr)[(*bllst2ptr)[0]]+(*bllst2ptr)[lb[i]+1]-(*bllst2ptr)[lb[i]];
00829                   (*bllst2ptr)[0]++;
00830                   if (((*bllst2)=(int*)REALLOC((*bllst2),sizeof(int)*((*bllst2)[0]+(*bllst2ptr)[nblk+2]-(*bllst2ptr)[nblk+1]+1))) == NULL ) return 0;
00831                   (*bllst2)[0]=(*bllst2)[0]+(*bllst2ptr)[nblk+2]-(*bllst2ptr)[nblk+1];
00832                   a=(*bllst2ptr)[lb[i]]-(*bllst2ptr)[nblk+1];            
00833                   for(l=(*bllst2ptr)[nblk+1];l<(*bllst2ptr)[nblk+2];l++)
00834                     {
00835                       (*bllst2)[l]=(*bllst2)[a+l];
00836                     }
00837                   (*bllst3ptr)[(*bllst3ptr)[0]+1]=(*bllst3ptr)[(*bllst3ptr)[0]]+(*bllst3ptr)[lb[i]+1]-(*bllst3ptr)[lb[i]];
00838                   (*bllst3ptr)[0]++;
00839                   if (((*bllst3)=(int*)REALLOC((*bllst3),sizeof(int)*((*bllst3)[0]+(*bllst3ptr)[nblk+2]-(*bllst3ptr)[nblk+1]+1))) == NULL ) return 0;
00840                   (*bllst3)[0]=(*bllst3)[0]+(*bllst3ptr)[nblk+2]-(*bllst3ptr)[nblk+1];
00841                   a=(*bllst3ptr)[lb[i]]-(*bllst3ptr)[nblk+1];
00842                   for(l=(*bllst3ptr)[nblk+1];l<=(*bllst3ptr)[nblk+2]-1;l++)
00843                     {
00844                       (*bllst3)[l]=(*bllst3)[a+l];
00845                     }
00846                   (*bllst4ptr)[(*bllst4ptr)[0]+1]=(*bllst4ptr)[(*bllst4ptr)[0]]+(*bllst4ptr)[lb[i]+1]-(*bllst4ptr)[lb[i]];
00847                   (*bllst4ptr)[0]++;
00848                   if (((*bllst4)=(int*)REALLOC((*bllst4),sizeof(int)*((*bllst4)[0]+(*bllst4ptr)[nblk+2]-(*bllst4ptr)[nblk+1]+1))) == NULL ) return 0;
00849                   (*bllst4)[0]=(*bllst4)[0]+(*bllst4ptr)[nblk+2]-(*bllst4ptr)[nblk+1];
00850                   a=(*bllst4ptr)[lb[i]]-(*bllst4ptr)[nblk+1];
00851                   for(l=(*bllst4ptr)[nblk+1];l<=(*bllst4ptr)[nblk+2]-1;l++)
00852                     {
00853                       (*bllst4)[l]=(*bllst4)[a+l];
00854                     }
00855                   (*bllst5ptr)[(*bllst5ptr)[0]+1]=(*bllst5ptr)[(*bllst5ptr)[0]]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]];
00856                   (*bllst5ptr)[0]++;
00857                   if (((*bllst5)=(int*)REALLOC((*bllst5),sizeof(int)*((*bllst5)[0]+(*bllst5ptr)[nblk+2]-(*bllst5ptr)[nblk+1]+1))) == NULL ) return 0;
00858                   (*bllst5)[0]=(*bllst5)[0]+(*bllst5ptr)[nblk+2]-(*bllst5ptr)[nblk+1];
00859                   a=(*bllst5ptr)[lb[i]]-(*bllst5ptr)[nblk+1];
00860                   for(l=(*bllst5ptr)[nblk+1];l<=(*bllst5ptr)[nblk+2]-1;l++)
00861                     {
00862                       (*bllst5)[l]=(*bllst5)[a+l];
00863                     }
00864                   (*bllst9ptr)[(*bllst9ptr)[0]+1]=(*bllst9ptr)[(*bllst9ptr)[0]]+(*bllst9ptr)[lb[i]+1]-(*bllst9ptr)[lb[i]];
00865                   (*bllst9ptr)[0]++;
00866                   if (((*bllst9)=(int*)REALLOC((*bllst9),sizeof(int)*((*bllst9)[0]+(*bllst9ptr)[nblk+2]-(*bllst9ptr)[nblk+1]+1))) == NULL ) return 0;
00867                   (*bllst9)[0]=(*bllst9)[0]+(*bllst9ptr)[nblk+2]-(*bllst9ptr)[nblk+1];
00868                   a=(*bllst9ptr)[lb[i]]-(*bllst9ptr)[nblk+1];
00869                   for(l=(*bllst9ptr)[nblk+1];l<=(*bllst9ptr)[nblk+2]-1;l++)
00870                     {
00871                       (*bllst9)[l]=(*bllst9)[a+l];
00872                     }
00873                   
00874                   if (((*bllst10)[nblk+1]=(char*)MALLOC(sizeof(char)*2)) ==NULL )  return 0;
00875                   *(*bllst10)[nblk+1]=*(*bllst10)[lb[i]];
00876                   (*bllst10)[nblk+1][1]='\0';
00877                   
00878                   for (l=1;l<nblk+1;l++)
00879                     {
00880                       bllst12i.col1[l]=(*bllst12)[l];
00881                       bllst12i.col2[l]=(*bllst12)[l+nblk];
00882                     }
00883                   bllst12i.col1[nblk+1]=(*bllst12)[lb[i]];
00884                   bllst12i.col2[nblk+1]=(*bllst12)[lb[i]+nblk];
00885                   for (l=1;l<nblk+2;l++)
00886                     {
00887                       (*bllst12)[l]=bllst12i.col1[l];
00888                       (*bllst12)[l+nblk+1]=bllst12i.col2[l];
00889                     }
00890                   (*nzcross)[nblk+1]=(*nzcross)[lb[i]];
00891                   
00892                   (*corinvptr)[(*corinvptr)[0]+1]=(*corinvptr)[(*corinvptr)[0]]+(*corinvptr)[lb[i]+1]-(*corinvptr)[lb[i]];
00893                   (*corinvptr)[0]++;
00894                   (*corinvec)[0]=(*corinvec)[0]+(*corinvptr)[nblk+2]-(*corinvptr)[nblk+1];
00895                   a=(*corinvptr)[lb[i]]-(*corinvptr)[nblk+1];
00896                   for(l=(*corinvptr)[nblk+1];l<(*corinvptr)[nblk+2];l++)
00897                     {
00898                       (*corinvec)[l]=(*corinvec)[a+l];
00899                     }
00900                   
00901                   
00902                   if ((tmp=(int*)MALLOC(sizeof(int)*(1+4*indxo[0]))) == NULL ) return 0;;
00903                   tmp[0]=4*indxo[0];
00904                   for(l=1;l<indxo[0]+1;l++)
00905                     {
00906                       tmp[l]=(*clkconnect)[indxo[l]];
00907                       tmp[l+indxo[0]]=(*clkconnect)[indxo[l]+(*clkconnect)[0]/4];
00908                       tmp[l+2*indxo[0]]=(*clkconnect)[indxo[l]+(*clkconnect)[0]/2];
00909                       tmp[l+3*indxo[0]]=(*clkconnect)[indxo[l]+3*((*clkconnect)[0]/4)];
00910                     }
00911                   
00912                   leng=(*clkconnect)[0]/4;
00913                   if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+tmp[0]/4+1))) == NULL ) return 0;
00914                   clkconnecti.col1[0]=leng+tmp[0]/4;  
00915                   if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00916                   clkconnecti.col2[0]=leng+tmp[0]/4;  
00917                   if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00918                   clkconnecti.col3[0]=leng+tmp[0]/4;
00919                   if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00920                   clkconnecti.col4[0]=leng+tmp[0]/4;  
00921                   for(l=1;l<leng+1;l++)
00922                     {
00923                       clkconnecti.col1[l]=(*clkconnect)[l];
00924                       clkconnecti.col2[l]=(*clkconnect)[l+leng];
00925                       clkconnecti.col3[l]=(*clkconnect)[l+leng*2];
00926                       clkconnecti.col4[l]=(*clkconnect)[l+leng*3];
00927                     }
00928                   for(l=1;l<tmp[0]/4+1;l++)
00929                     {
00930                       clkconnecti.col1[l+leng]=nblk+1;
00931                       clkconnecti.col2[l+leng]=tmp[l+tmp[0]/4];
00932                       clkconnecti.col3[l+leng]=tmp[l+tmp[0]/2];
00933                       clkconnecti.col4[l+leng]=tmp[l+3*tmp[0]/4];
00934                     }
00935                   FREE(*clkconnect);
00936                   if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*leng+tmp[0]+1))) == NULL ) return 0;
00937                   (*clkconnect)[0]=4*leng+tmp[0];
00938                   if(tmp) FREE(tmp);
00939                   for(l=1;l<(*clkconnect)[0]/4+1;l++)
00940                     {
00941                       (*clkconnect)[l]=clkconnecti.col1[l];
00942                       (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
00943                       (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
00944                       (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
00945                     }
00946                   nblk++;
00947                   FREE(clkconnecti.col1);
00948                   clkconnecti.col1=NULL;
00949                   FREE(clkconnecti.col2);
00950                   clkconnecti.col2=NULL;
00951                   FREE(clkconnecti.col3);
00952                   clkconnecti.col3=NULL;
00953                   FREE(clkconnecti.col4);
00954                   clkconnecti.col4=NULL;
00955                 } /* end for k */
00956               FREE(bllst12i.col1);
00957               FREE(bllst12i.col2);
00958               leng=(*connectmat)[0]/4;
00959               if ((connectmati.col1=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00960               connectmati.col1[0]=leng+nn-1;  
00961               if ((connectmati.col2=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00962               connectmati.col2[0]=leng+nn-1;  
00963               if ((connectmati.col3=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00964               connectmati.col3[0]=leng+nn-1;
00965               if ((connectmati.col4=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00966               connectmati.col4[0]=leng+nn-1;  
00967               for(l=1;l<leng+1;l++)
00968                 {              
00969                   connectmati.col1[l]=(*connectmat)[l];
00970                   connectmati.col2[l]=(*connectmat)[l+leng];
00971                   connectmati.col3[l]=(*connectmat)[l+2*leng];
00972                   connectmati.col4[l]=(*connectmat)[l+3*leng];
00973                 }   
00974               for (l=1;l<nn;l++)
00975                 {                     
00976                   connectmati.col1[l+leng]=connectmati.col1[indy[1]];
00977                   connectmati.col2[l+leng]=connectmati.col2[indy[1]];
00978                   connectmati.col3[l+leng]=nblkorg+l;
00979                   connectmati.col4[l+leng]=1;
00980                 }
00981               FREE(*connectmat);
00982               leng=4*connectmati.col1[0];
00983               if (((*connectmat)=(int*)MALLOC(sizeof(int)*(leng+1))) == NULL ) return 0;
00984               (*connectmat)[0]=leng;
00985               for(l=1;l<(*connectmat)[0]/4+1;l++)
00986                 {
00987                   (*connectmat)[l]=connectmati.col1[l];
00988                   (*connectmat)[l+(*connectmat)[0]/4]=connectmati.col2[l];
00989                   (*connectmat)[l+(*connectmat)[0]/2]=connectmati.col3[l];
00990                   (*connectmat)[l+3*(*connectmat)[0]/4]=connectmati.col4[l];
00991                 }
00992               change=true;
00993               nblkorg=nblk;
00994               FREE(connectmati.col1);
00995               connectmati.col1=NULL;
00996               FREE(connectmati.col2);
00997               connectmati.col2=NULL;
00998               FREE(connectmati.col3);
00999               connectmati.col3=NULL;
01000               FREE(connectmati.col4);
01001               connectmati.col4=NULL;
01002               if (indy) {FREE(indy);
01003               indy=NULL;}
01004               if (indxo) {FREE(indxo);
01005               indxo=NULL;}
01006             }
01007           FREE(indx);
01008           indx=NULL;
01009         } /*fin de for i*/
01010       if (change) 
01011         {
01012           *done=false;
01013           FREE(lb);
01014           FREE(idl);
01015           FREE(id);  
01016           return 0;
01017         }
01018       if(lb) FREE(lb);
01019       if (idl) {FREE(idl);
01020       idl=NULL;}
01021       FREE(id);  
01022     }
01023   
01024   clkconnecttmp=VecEg1(*clkconnect);
01025   a=clkconnecttmp[0]/4;
01026   if ((ppget=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
01027   if ((idl=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;   
01028   j=k=1;
01029   for(l=1;l<a+1;l++)
01030     {
01031       if(clkconnecttmp[l] != 0) ppget[j++]=l;
01032       else idl[k++]=l;
01033     }
01034   ppget[0]=j-1;
01035   idl[0]=k-1;
01036   FREE(*clkconnect);
01037   if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*ppget[0]+1))) == NULL ) return 0;
01038   (*clkconnect)[0]=4*ppget[0];
01039   for(l=1;l<ppget[0]+1;l++)
01040     {
01041       (*clkconnect)[l]=clkconnecttmp[ppget[l]];
01042       (*clkconnect)[l+ppget[0]]=clkconnecttmp[ppget[l]+a];
01043       (*clkconnect)[l+2*ppget[0]]=clkconnecttmp[ppget[l]+2*a];
01044       (*clkconnect)[l+3*ppget[0]]=clkconnecttmp[ppget[l]+3*a];
01045     }
01046   FREE(ppget);
01047   if(!idl)
01048     {
01049       if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01050       idl[0]=0;
01051     }
01052   if ((clkconnect0=(int*)MALLOC(sizeof(int)*(4*idl[0]+1))) == NULL ) return 0;
01053   clkconnect0[0]=4*idl[0];
01054   for(l=1;l<idl[0]+1;l++)
01055     {
01056       clkconnect0[l]=clkconnecttmp[idl[l]];
01057       clkconnect0[l+idl[0]]=clkconnecttmp[idl[l]+a];
01058       clkconnect0[l+2*idl[0]]=clkconnecttmp[idl[l]+2*a];
01059       clkconnect0[l+3*idl[0]]=clkconnecttmp[idl[l]+3*a];
01060     }
01061   if(clkconnecttmp) FREE(clkconnecttmp);
01062   FREE(idl);
01063   inter=GetPartVect(clkconnect0,1,clkconnect0[0]/4);
01064   if(!inter)
01065     {
01066       if ((inter=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01067       inter[0]=0;
01068     }
01069   idl=FindEg(inter,0);
01070   FREE(inter);
01071   inter=NULL;
01072   if(!idl)
01073     {
01074       if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01075       idl[0]=0;
01076     }
01077   if ((texeclk0=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
01078   texeclk0[0]=idl[0];
01079   a=clkconnect0[0]/2;
01080   for (l=1;l<idl[0]+1;l++)
01081    {
01082      texeclk0[l]=clkconnect0[idl[l]+a];
01083    } 
01084   FREE(idl);
01085   if ((con=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
01086   con[0]=(*clkconnect)[0]/4;
01087   for(l=1;l<con[0]+1;l++)
01088     {
01089       con[l]=-((*bllst5ptr)[(*clkconnect)[l]]+(*clkconnect)[l+(*clkconnect)[0]/4]-1);
01090     } 
01091   if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01092   ind[0]=con[0];
01093   C2F(isort)(&con[1],&con[0],&ind[1]);
01094   Inv(con);
01095   clkconnectind=VecEg1(*clkconnect);
01096   for(l=1;l<ind[0]+1;l++)
01097     {
01098       (*clkconnect)[l]=clkconnectind[ind[l]];
01099       (*clkconnect)[l+ind[0]]=clkconnectind[ind[l]+ind[0]];
01100       (*clkconnect)[l+2*ind[0]]=clkconnectind[ind[l]+2*ind[0]];
01101       (*clkconnect)[l+3*ind[0]]=clkconnectind[ind[l]+3*ind[0]];      
01102     } 
01103   FREE(clkconnectind);
01104   clkconnectind=NULL;  
01105   FREE(ind);
01106   bexe=GetPartVect(*clkconnect,(*clkconnect)[0]/2+1,(*clkconnect)[0]/4);
01107   sbb=(*clkconnect)[0]/4; 
01108   if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01109   idl[0]=sbb;
01110   for(l=1;l<sbb+1;l++)
01111     {
01112       idl[l]=l;
01113     }
01114   if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01115   w2[0]=sbb;
01116   w2[1]=(*clkconnect)[1];
01117   for(l=1;l<sbb;l++)
01118     {
01119       w2[l+1]=(*clkconnect)[l+1]-(*clkconnect)[l];
01120     }
01121   boptr=Duplicataa(idl,w2);
01122   FREE(w2);
01123   w2=NULL;
01124   if(idl) FREE(idl);
01125   if ((boptr=(int*)REALLOC(boptr,sizeof(int)*(nblk+2))) == NULL ) return 0;
01126   a=sbb+1;  
01127   for (l=1;l<nblk-boptr[0]+2;l++)
01128     {
01129       boptr[l+boptr[0]]=a;
01130     }
01131   boptr[0]=nblk+1;
01132   ptmp1=GetPartVect(*connectmat,(*connectmat)[0]/4+1,(*connectmat)[0]/4);
01133   m1=Max1(ptmp1);
01134   if ((w1=(int*)MALLOC(sizeof(int)*((*connectmat)[0]/4+1))) == NULL ) return 0;
01135   w1[0]=(*connectmat)[0]/4;
01136   for (l=1;l<w1[0]+1;l++)
01137     {
01138       w1[l]=-m1*(*connectmat)[l]-(*connectmat)[l+(*connectmat)[0]/4]+1;
01139     }
01140   FREE (ptmp1);
01141   if ((ind=(int*)MALLOC(sizeof(int)*(w1[0]+1))) == NULL ) return 0;
01142   ind[0]=w1[0];
01143   C2F(isort)(&w1[1],&w1[0],&ind[1]);
01144   FREE(w1);
01145   w1=NULL;
01146   connectmatind=VecEg1(*connectmat);
01147   for(l=1;l<ind[0]+1;l++)
01148     {
01149       (*connectmat)[l]=connectmatind[ind[l]];
01150       (*connectmat)[l+ind[0]]=connectmatind[ind[l]+ind[0]];
01151       (*connectmat)[l+2*ind[0]]=connectmatind[ind[l]+2*ind[0]];
01152       (*connectmat)[l+3*ind[0]]=connectmatind[ind[l]+3*ind[0]];      
01153     } 
01154   FREE(connectmatind);
01155   connectmatind=NULL;
01156   FREE(ind);     
01157   blnk=GetPartVect(*connectmat,(*connectmat)[0]/2+1,(*connectmat)[0]/4);
01158   sbb=(*connectmat)[0]/4; 
01159   if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01160   idl[0]=sbb;
01161   for(l=1;l<sbb+1;l++)
01162     {
01163       idl[l]=l;
01164     }
01165   if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01166   w2[0]=sbb;
01167   w2[1]=(*connectmat)[1];
01168   for(l=1;l<sbb;l++)
01169     {
01170       w2[l+1]=(*connectmat)[l+1]-(*connectmat)[l];
01171     }
01172   blptr=Duplicataa(idl,w2);
01173   FREE(w2);
01174   FREE(idl);
01175   idl=NULL;
01176   if ((blptr=(int*)REALLOC(blptr,sizeof(int)*(nblk+2))) == NULL ) return 0;
01177   a=sbb+1;
01178   for (l=1;l<nblk-blptr[0]+2;l++)
01179     {
01180       blptr[l+blptr[0]]=a;
01181     }
01182   blptr[0]=nblk+1;  
01183   if ((w1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
01184   w1[0]=(*clkconnect)[0]/4;  
01185   w2=GetPartVect(*clkconnect,1,(*clkconnect)[0]/4);
01186   for (l=1;l<w1[0]+1;l++)
01187     {
01188       w1[l]=typ_l[w2[l]];
01189     }
01190   FREE(w2);
01191   w2=FindEg(w1,0);
01192   FREE(w1);
01193   w1=NULL;
01194   if ((tclkconnect=(int*)MALLOC(sizeof(int)*(4*w2[0]+1))) == NULL ) return 0;
01195   tclkconnect[0]=4*w2[0];
01196   for(l=1;l<w2[0]+1;l++)
01197     {    
01198       tclkconnect[l]=(*clkconnect)[w2[l]];
01199       tclkconnect[l+w2[0]]=(*clkconnect)[w2[l]+(*clkconnect)[0]/4];
01200       tclkconnect[l+2*w2[0]]=(*clkconnect)[w2[l]+(*clkconnect)[0]/2];
01201       tclkconnect[l+3*w2[0]]=(*clkconnect)[w2[l]+3*(*clkconnect)[0]/4];
01202     }  
01203   if(w2) FREE(w2);
01204   w2=NULL;
01205   if ((tcon=(int*)MALLOC(sizeof(int)*(tclkconnect[0]/4+1))) == NULL ) return 0;
01206   tcon[0]=tclkconnect[0]/4;
01207   w1=GetPartVect(tclkconnect,1,tclkconnect[0]/4);
01208   w2=GetPartVect(tclkconnect,tclkconnect[0]/4+1,tclkconnect[0]/4);
01209   for(l=1;l<tcon[0]+1;l++)
01210     {
01211       tcon[l]=(*bllst5ptr)[w1[l]]+w2[l]-1;
01212     }
01213   FREE(w1);
01214   w1=NULL;
01215   FREE(w2);
01216   w2=NULL;
01217   sbb=tcon[0];
01218   if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01219   idl[0]=sbb;
01220   for(l=1;l<sbb+1;l++)
01221     {
01222       idl[l]=l;
01223     }
01224   if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01225   w2[0]=sbb;
01226   w2[1]=tcon[1];
01227   for(l=1;l<sbb;l++)
01228     {
01229       w2[l+1]=tcon[l+1]-tcon[l];
01230     }
01231   FREE(tcon);
01232   ordptr1=Duplicataa(idl,w2);
01233   FREE(w2);
01234   w2=NULL;
01235   FREE(idl);
01236   if ((ordptr1=(int*)REALLOC(ordptr1,sizeof(int)*((*bllst5ptr)[(*bllst5ptr)[0]-nn+1]+1))) == NULL ) return 0;
01237   a=sbb+1;
01238   for(l=1;l<(*bllst5ptr)[(*bllst5ptr)[0]-nn+1]-ordptr1[0]+1;l++)
01239     {
01240       ordptr1[l+ordptr1[0]]=a;
01241     }
01242   ordptr1[0]=(*bllst5ptr)[(*bllst5ptr)[0]-nn+1];
01243   leng=clkconnect0[0]/4;
01244   if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01245   clkconnecti.col1[0]=leng+(*clkconnect)[0]/4;  
01246   if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01247   clkconnecti.col2[0]=leng+(*clkconnect)[0]/4;  
01248   if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01249   clkconnecti.col3[0]=leng+(*clkconnect)[0]/4;
01250   if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01251   clkconnecti.col4[0]=leng+(*clkconnect)[0]/4;  
01252 
01253   for(l=1;l<clkconnect0[0]/4+1;l++)
01254     {     
01255       clkconnecti.col1[l]=clkconnect0[l];
01256       clkconnecti.col2[l]=clkconnect0[l+clkconnect0[0]/4];
01257       clkconnecti.col3[l]=clkconnect0[l+clkconnect0[0]/2];
01258       clkconnecti.col4[l]=clkconnect0[l+3*clkconnect0[0]/4];
01259     }
01260   for(l=1;l<(*clkconnect)[0]/4+1;l++)
01261     {
01262       clkconnecti.col1[l+clkconnect0[0]/4]=(*clkconnect)[l];
01263       clkconnecti.col2[l+clkconnect0[0]/4]=(*clkconnect)[l+(*clkconnect)[0]/4];
01264       clkconnecti.col3[l+clkconnect0[0]/4]=(*clkconnect)[l+(*clkconnect)[0]/2];
01265       clkconnecti.col4[l+clkconnect0[0]/4]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
01266     }
01267   FREE(*clkconnect);
01268   if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col4[0]+1))) == NULL ) return 0;
01269   (*clkconnect)[0]=4*clkconnecti.col4[0];
01270   for(l=1;l<clkconnecti.col4[0]+1;l++)
01271     {
01272       (*clkconnect)[l]=clkconnecti.col1[l];
01273       (*clkconnect)[l+clkconnecti.col4[0]]=clkconnecti.col2[l];
01274       (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
01275       (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
01276     }
01277   FREE(clkconnecti.col1);
01278   FREE(clkconnecti.col2);
01279   FREE(clkconnecti.col3);
01280   FREE(clkconnecti.col4);
01281   con1=VecEg1(con);
01282   FREE(con);
01283   if ((con=(int*)MALLOC(sizeof(int)*(con1[0]+clkconnect0[0]/4+1))) == NULL ) return 0;
01284   con[0]=con1[0]+clkconnect0[0]/4;
01285   pp=&con[clkconnect0[0]/4+1];
01286   pp=memcpy(pp,&con1[1],sizeof(int)*(con1[0]));
01287   FREE(con1);
01288   for(l=1;l<clkconnect0[0]/4+1;l++)
01289     {
01290       con[l]=0;     
01291     }
01292   FREE(clkconnect0);  
01293   /* ---------------- */
01294   while ( *prime_pointer <= (*prime_act)[0]){
01295     o=(*prime_act)[*prime_pointer];
01296     (*prime_pointer)++;
01297     if (o==0)
01298       {        
01299         texeclki=VecEg1(texeclk0);
01300         FREE(texeclk0);
01301       }
01302     else
01303       {
01304         w1=GetPartVect(tclkconnect,tclkconnect[0]/2+1,tclkconnect[0]/4);
01305         texeclki=GetPartVect(w1,ordptr1[o],ordptr1[o+1]-ordptr1[o]);
01306         if(w1) FREE(w1);
01307       }
01308     if (!texeclki)
01309       {
01310         if ((texeclki=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01311         texeclki[0]=0;
01312       }
01313     if ((idl=(int*)MALLOC(sizeof(int)*(texeclki[0]+1))) == NULL ) return 0;
01314     idl[0]=texeclki[0];
01315     for(l=1;l<texeclki[0]+1;l++)
01316       {
01317         idl[l]=typ_l[texeclki[l]];
01318       }
01319     if ( OR(idl) )
01320       {
01321         if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
01322         vec[0]=nblk;
01323         Setmem(vec,-1);
01324         for (l=1;l<texeclki[0]+1;l++)
01325           {
01326             vec[texeclki[l]]=0;
01327           }
01328         if ((typ_lm=(int*)MALLOC(sizeof(int)*(typ_l[0]+1))) == NULL ) return 0;
01329         typ_lm[0]=typ_l[0];
01330         for(l=1;l<typ_l[0]+1;l++)
01331           {
01332             if (typ_l[l]) typ_lm[l]=1;
01333             else 
01334               {
01335                 if (typ_m[l]) typ_lm[l]=-1;
01336                 else typ_lm[l]=0;
01337               }
01338           }
01339         tree3(vec,vec[0],*bllst12,typ_lm,bexe,boptr,blnk,blptr,&r,okk);
01340         FREE(typ_lm);
01341         FREE(vec);
01342         if (!*okk)
01343           {
01344             Message("Algebraic loop detected; cannot be compiled.");
01345             *bllst2=NULL;*bllst3=NULL;**bllst10=NULL;
01346             *ok=false;
01347             *done=true;     
01348             return 0;
01349           }
01350         pointer=FindEg(con,o);
01351         for(j=1;j<r[0]+1;j++)
01352           {
01353             if (typ_l[r[j]])
01354               {
01355                 
01356                 *((*bllst10)[r[j]])='s';
01357                 typ_l[r[j]]=false;
01358                 
01359                 if ((vec=MALLOC(sizeof(int)*((*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]]+1)))== NULL ) return 0;
01360                 vec[0]=(*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]];
01361                 if ((*prime_act=(int*)REALLOC(*prime_act,sizeof(int)*((*prime_act)[0]+vec[0]+1))) == NULL ) return 0;      
01362                 for (l = 1; l <= vec[0]; l++){
01363                   (*prime_act)[(*prime_act)[0]+l]=(*bllst5ptr)[r[j]]+l-1;
01364                 }
01365                 (*prime_act)[0]=(*prime_act)[0]+vec[0];
01366                 FREE(vec);              
01367                 
01368                 w1=GetCollVect(*clkconnect,pointer,3);                            
01369                 w2=FindDif(w1,r[j]);
01370                 pointer1=VecEg1(pointer);
01371                 if(pointer) FREE(pointer);
01372                 pointer=NULL;
01373                 if ((pointer=(int*)MALLOC(sizeof(int)*(w2[0]+1))) == NULL ) return 0;
01374                 pointer[0]=w2[0];
01375                 for(l=1;l<w2[0]+1;l++)
01376                   {
01377                     pointer[l]=pointer1[w2[l]];
01378                   }
01379                 if(w1) FREE(w1);
01380                 w1=NULL;
01381                 if(w2) FREE(w2);
01382                 FREE(pointer1);
01383                 w1=GetCollVect(*clkconnect,pointer,3);
01384                 w3=GetCollVect(*clkconnect,pointer,4);        
01385                 for (l=1;l<pointer[0]+1;l++)
01386                   {
01387                     (*clkconnect)[pointer[l]]=r[j];
01388                     (*clkconnect)[pointer[l]+(*clkconnect)[0]/4]=1;
01389                     (*clkconnect)[pointer[l]+(*clkconnect)[0]/2]=w1[l];
01390                     (*clkconnect)[pointer[l]+3*(*clkconnect)[0]/4]=w3[l];
01391                   }
01392                 if(w1) FREE(w1);
01393                 if(w3) FREE(w3);
01394                 for (bl_out=2;bl_out<(*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]]+1;bl_out++)
01395                   {
01396                     leng=(*clkconnect)[0]/4;
01397                     if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01398                     clkconnecti.col1[0]=leng+pointer[0];  
01399                     if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01400                     clkconnecti.col2[0]=leng+pointer[0];  
01401                     if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01402                     clkconnecti.col3[0]=leng+pointer[0];
01403                     if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01404                     clkconnecti.col4[0]=leng+pointer[0];  
01405                     for(l=1;l<(*clkconnect)[0]/4+1;l++)
01406                       {     
01407                         clkconnecti.col1[l]=(*clkconnect)[l];
01408                         clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
01409                         clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
01410                         clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
01411                       }
01412                     w1=GetCollVect(*clkconnect,pointer,3);
01413                     w3=GetCollVect(*clkconnect,pointer,4);    
01414                     for(l=1;l<pointer[0]+1;l++)
01415                       {
01416                         clkconnecti.col1[l+(*clkconnect)[0]/4]=r[j];
01417                         clkconnecti.col2[l+(*clkconnect)[0]/4]=bl_out;
01418                         clkconnecti.col3[l+(*clkconnect)[0]/4]=w1[l];
01419                         clkconnecti.col4[l+(*clkconnect)[0]/4]=w3[l];
01420                       }
01421                     if(w1) FREE(w1);
01422                     if(w3) FREE(w3);
01423                     FREE(*clkconnect);
01424                     if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
01425                     (*clkconnect)[0]=4*clkconnecti.col1[0];
01426                     for(l=1;l<(*clkconnect)[0]/4+1;l++)
01427                       {
01428                         (*clkconnect)[l]=clkconnecti.col1[l];
01429                         (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
01430                         (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
01431                         (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
01432                       }
01433                     FREE(clkconnecti.col1);
01434                     clkconnecti.col1=NULL;
01435                     FREE(clkconnecti.col2);
01436                     clkconnecti.col2=NULL;
01437                     FREE(clkconnecti.col3);
01438                     clkconnecti.col3=NULL;
01439                     FREE(clkconnecti.col4);
01440                     clkconnecti.col4=NULL;             
01441                   }
01442                 *need_newblk=true;
01443                 *ok=true;
01444                 *done=false;
01445                 FREE(r);
01446                 FREE(pointer);
01447                 FREE(idl);
01448                 FREE (texeclki);
01449                 FREE(bexe);
01450                 FREE(blnk);  
01451                 FREE(boptr);
01452                 FREE(blptr);
01453                 FREE(tclkconnect);  
01454                 FREE(ordptr1);  
01455                 FREE(con);
01456                 return 0;
01457               }
01458             else
01459               {
01460                 w1=GetCollVect(*clkconnect,pointer,3);
01461                 w2=FindDif(w1,r[j]);
01462                 if (w1) FREE(w1);
01463                 pointer1=VecEg1(pointer);
01464                 FREE(pointer);
01465                 if ((pointer=(int*)MALLOC(sizeof(int)*(w2[0]+1))) == NULL ) return 0;
01466                 pointer[0]=w2[0];
01467                 for(l=1;l<w2[0]+1;l++)
01468                   {
01469                     pointer[l]=pointer1[w2[l]];
01470                   }   
01471                 FREE(pointer1);
01472                 if (w2) FREE(w2);
01473               }
01474           } /*fin de for bl=r*/
01475         FREE(r);
01476       }  /* fin de test */
01477     if (pointer && pointer[0] != 0) 
01478       {
01479         FREE(pointer);
01480         sciprint("warning(problem1)");
01481         return 0;
01482       }
01483     FREE(idl);
01484     FREE (texeclki);
01485   } /* fin for o */
01486   if ( OR(typ_l) ) 
01487     {
01488       sciprint("warning(problem2)");
01489     }
01490   
01491   *ok=true;
01492   *done=true;
01493   FREE(bexe);
01494   FREE(blnk);  
01495   FREE(boptr);
01496   FREE(blptr);
01497   FREE(tclkconnect);  
01498   FREE(ordptr1);  
01499   FREE(con);
01500   
01501   return 0;
01502 } /* end function */
01503 /* ======================================= endfunction paksazi =============================================== */
01504 /* **************************************** function discard ************************************************* */
01505 void *discard(int* bllst5ptr,int* clkconnect,int* exe_cons,int** ordptr1,int** execlk,int** clkconnectj0,
01506   int** clkconnectj_cons )
01507 {
01508   /****** function discard1 a faire ********** */ 
01509   int mma,j,m,l,a,b,k,sum;
01510   int *clkconnectj,*con,*ind,*con1,*iini,*clkconnectj1,*clkconnecttmp,*clkconnect0;
01511   int *clkconnectjj,*new_ordptr1,*clkconnectjind,*clkconnectj3,*clkconnectj4;
01512   int *clkconnectjind3,*clkconnectjind4;
01513   double *clkconnectjd;
01514   int *ppget;
01515   Mat2C execlki;
01516   *clkconnectj0=NULL;
01517   *clkconnectj_cons=NULL;
01518   clkconnectjj=NULL;
01519   execlki.col1=NULL;
01520   execlki.col2=NULL;
01521   *execlk=NULL;
01522   clkconnectjd=NULL;
01523   con=NULL;
01524   ind=NULL;
01525   con1=NULL;
01526   iini=NULL;
01527   clkconnectj1=NULL;
01528   clkconnecttmp=NULL;
01529   clkconnect0=NULL;
01530   clkconnectj=NULL;
01531   clkconnectjind=NULL;
01532   execlki.col1=NULL;
01533   execlki.col2=NULL;
01534   clkconnectj3=NULL;
01535   clkconnectj4=NULL;
01536   clkconnectjind3=NULL;
01537   clkconnectjind4=NULL;
01538   if (exe_cons && exe_cons[0] !=0 )
01539     {
01540       a=exe_cons[0]/2;
01541       ppget=GetPartVect(exe_cons,a+1,a);
01542       mma=Max1(ppget)+1;
01543       FREE(ppget);
01544       if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01545       con[0]=a;
01546       for(j=1;j<a+1;j++)
01547         {
01548           con[j]=-mma*exe_cons[j]-exe_cons[j+a];
01549         } 
01550       if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01551       ind[0]=con[0];
01552       C2F(isort)(&con[1],&con[0],&ind[1]); 
01553       Inv(con);
01554       clkconnectjind=VecEg1(exe_cons);
01555       for(j=1;j<ind[0]+1;j++)
01556         {
01557           exe_cons[j]=clkconnectjind[ind[j]];
01558           exe_cons[j+ind[0]]=clkconnectjind[ind[j]+ind[0]];
01559         }
01560 
01561       FREE(clkconnectjind);
01562       clkconnectjind=NULL;
01563       FREE(ind);
01564       ind=NULL;
01565       if (con[0]>=2)
01566         {
01567           if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01568           k=1;
01569           for(j=1; j < con[0]; j++)
01570            {
01571              if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01572            }
01573           con1[0]=k-1;
01574           if (con1)
01575             {
01576              for(j=con1[0];j>0;j--)
01577                {
01578                  Incr2(exe_cons,con1[j]);
01579                }
01580              FREE(con1);con1=NULL;
01581             }      
01582         }
01583       FREE(con);con=NULL;
01584       a=exe_cons[0]/2;
01585       if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(a+1))) == NULL) return 0;
01586       clkconnectjd[0]=a;
01587       for(j=1;j<a+1;j++)
01588         {
01589 
01590           clkconnectjd[j]=powerd(2,exe_cons[j+a]-1);
01591           exe_cons[j+a]=(int) clkconnectjd[j];
01592         }
01593       FREE(clkconnectjd);
01594       clkconnectjd=NULL;
01595       con=GetPartVect(exe_cons,1,a);  
01596       if (con[0]>=2)
01597         {
01598           if ((iini=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01599           k=1;
01600           for(j=1; j < con[0]; j++)
01601             {
01602               if((con[j+1]-con[j]) != 0) iini[k++]=j;
01603             }
01604           iini[0]=k-1;
01605           if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01606           iini[iini[0]+1]=a;
01607           iini[0]++;
01608         }
01609       else
01610         {
01611           if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01612           iini[0]=1;
01613           iini[1]=1;                          
01614         }
01615       if (((*clkconnectj_cons)=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01616       (*clkconnectj_cons)[0]=2*iini[0];
01617       
01618       for (j=1;j<iini[0]+1;j++)
01619         {
01620           ind=FindEg(con,con[iini[j]]);
01621           (*clkconnectj_cons)[j]=con[iini[j]];
01622           sum=0;
01623           for(l=1; l < ind[0]+1; l++)
01624             {
01625               sum+=exe_cons[ind[l]+a];
01626             }   
01627           
01628           (*clkconnectj_cons)[j+iini[0]]=sum;
01629           FREE(ind);ind=NULL;  
01630         }
01631       FREE(con); con=NULL;
01632       FREE(iini); iini=NULL;
01633     } /* fin de if (exe_cons) */
01634     else
01635       {
01636         if ((*clkconnectj_cons))
01637           {
01638             FREE((*clkconnectj_cons));
01639             (*clkconnectj_cons)=NULL;
01640           }
01641       }
01642   /* *** fin de function discard1 ***** */
01643   if(clkconnect[0] !=0)
01644     {
01645       clkconnecttmp=VecEg1(clkconnect);
01646       a=clkconnecttmp[0]/4;
01647       ppget=GetPartVect(clkconnecttmp,1,a);
01648       ind=FindDif(ppget,0);
01649       FREE(ppget);
01650       if ((clkconnect=(int*)MALLOC(sizeof(int)*(4*ind[0]+1))) == NULL) return 0;
01651       clkconnect[0]=4*ind[0];
01652       for(l=1;l<ind[0]+1;l++)
01653         {
01654           clkconnect[l]=clkconnecttmp[ind[l]];
01655           clkconnect[l+ind[0]]=clkconnecttmp[ind[l]+a];
01656           clkconnect[l+2*ind[0]]=clkconnecttmp[ind[l]+clkconnecttmp[0]/2];
01657           clkconnect[l+3*ind[0]]=clkconnecttmp[ind[l]+3*a];
01658         }
01659       if(ind) FREE(ind);
01660       ind=NULL;
01661       ppget=GetPartVect(clkconnecttmp,1,a);
01662       ind=FindEg(ppget,0); 
01663       FREE(ppget);
01664       if (ind)
01665         {
01666           if ((clkconnect0=(int*)MALLOC(sizeof(int)*(4*ind[0]+1))) == NULL) return 0;
01667           clkconnect0[0]=4*ind[0];
01668           for(l=1;l<ind[0]+1;l++)
01669             {
01670               clkconnect0[l]=clkconnecttmp[ind[l]];
01671               clkconnect0[l+ind[0]]=clkconnecttmp[ind[l]+a];
01672               clkconnect0[l+2*ind[0]]=clkconnecttmp[ind[l]+clkconnecttmp[0]/2];
01673               clkconnect0[l+3*ind[0]]=clkconnecttmp[ind[l]+3*a];
01674             }
01675           FREE(ind);
01676           ind=NULL;
01677         }    
01678       FREE(clkconnecttmp);clkconnecttmp=NULL;
01679       if (clkconnect0 && clkconnect0[0] != 0)
01680         {
01681           a=clkconnect0[0]/4;
01682           clkconnectj3=GetPartVect(clkconnect0,a+a+1,a);                      
01683           clkconnectj4=GetPartVect(clkconnect0,3*a+1,a);
01684           mma=Max1(clkconnectj4)+1;
01685           if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01686           con[0]=a;
01687           for(j=1;j<a+1;j++)
01688             {
01689               con[j]=-mma*clkconnectj3[j]-clkconnectj4[j];
01690             } 
01691           if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01692           ind[0]=con[0];
01693           C2F(isort)(&con[1],&con[0],&ind[1]); 
01694           Inv(con);
01695           clkconnectjind3=VecEg1(clkconnectj3);
01696           clkconnectjind4=VecEg1(clkconnectj4);
01697           for(j=1;j<ind[0]+1;j++)
01698             {
01699               clkconnectj3[j]=clkconnectjind3[ind[j]];
01700               clkconnectj4[j]=clkconnectjind4[ind[j]];
01701             }
01702           FREE(clkconnectjind3); clkconnectjind3=NULL;
01703           FREE(clkconnectjind4); clkconnectjind4=NULL;
01704           FREE(ind); ind=NULL;
01705           if (con[0]>=2)
01706             {
01707               if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01708               k=1;
01709               for (j = 1; j< con[0]; j++)
01710                 {
01711                   if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01712                 }
01713               con1[0]=k-1;
01714               if (con1)
01715                 {
01716                   for(j=con1[0];j>0;j--)
01717                     {
01718                       Incr1(clkconnectj3,con1[j]);
01719                       Incr1(clkconnectj4,con1[j]);
01720                     }
01721                   FREE(con1);con1=NULL;
01722                 }     
01723             }
01724           a=clkconnectj3[0];
01725           FREE(con);con=NULL;
01726           if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(a+1))) == NULL) return 0;
01727           clkconnectjd[0]=a;
01728           for(j=1;j<a+1;j++)
01729             {
01730               clkconnectjd[j]=powerd(2,clkconnectj4[j]-1);
01731               clkconnectj4[j]=(int) clkconnectjd[j];  
01732             }
01733           
01734           FREE(clkconnectjd); clkconnectjd=NULL;
01735           if (clkconnectj3[0]>=2)
01736             {
01737               if ((iini=(int*)MALLOC(sizeof(int)*(a))) == NULL) return 0;
01738               k=1;
01739               for(j=1;j<a;j++)
01740                 {
01741                   if ((clkconnectj3[j+1]-clkconnectj3[j]) != 0) iini[k++]=j;
01742                 }
01743               iini[0]=k-1;
01744               if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01745               iini[iini[0]+1]=a;
01746               iini[0]++;
01747             }
01748           else
01749             {
01750               if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01751               iini[0]=1;
01752               iini[1]=1;                           
01753             }
01754           if (((*clkconnectj0)=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01755           (*clkconnectj0)[0]=2*iini[0];
01756           for (j=1;j<iini[0]+1;j++)
01757             {
01758               ind=FindEg(clkconnectj3,clkconnectj3[iini[j]]);
01759               (*clkconnectj0)[j]=clkconnectj3[iini[j]];
01760               sum=0;
01761               for (l=1; l <= ind[0]; l++)
01762                 {
01763                   sum+=clkconnectj4[ind[l]];
01764                 }
01765               (*clkconnectj0)[j+iini[0]]=sum;
01766               FREE(ind);ind=NULL; 
01767             }
01768           
01769           FREE(con);con=NULL;
01770           FREE(iini);iini=NULL;
01771           FREE(clkconnectj3);clkconnectj3=NULL;
01772           FREE(clkconnectj4);clkconnectj4=NULL;
01773         } /* fin de if (clkconnect0) */
01774       else
01775         {
01776           if ((*clkconnectj0))
01777             {
01778               FREE((*clkconnectj0));
01779               (*clkconnectj0)=NULL;
01780             }
01781         }
01782       FREE(clkconnect0);clkconnect0=NULL;
01783       a=clkconnect[0]/4;
01784       if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01785       con[0]=a;
01786       for(l=1;l<a+1;l++)
01787         {
01788           con[l]=-bllst5ptr[clkconnect[l]]-clkconnect[l+a]+1;
01789         }
01790       if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01791       ind[0]=con[0];
01792       C2F(isort)(&con[1],&con[0],&ind[1]); 
01793       Inv(con);
01794       clkconnectjind=VecEg1(clkconnect);
01795       for(j=1;j<ind[0]+1;j++)
01796         {
01797           clkconnect[j]=clkconnectjind[ind[j]];
01798           clkconnect[j+ind[0]]=clkconnectjind[ind[j]+ind[0]];
01799           clkconnect[j+2*ind[0]]=clkconnectjind[ind[j]+2*ind[0]];
01800           clkconnect[j+3*ind[0]]=clkconnectjind[ind[j]+3*ind[0]];
01801         }
01802       
01803       FREE(clkconnectjind);
01804       clkconnectjind=NULL;
01805       FREE(ind);ind=NULL;
01806     } /*fin de if (clkconnect[0]!=0) */
01807   else
01808     {
01809       if ((con=(int*)MALLOC(sizeof(int))) == NULL) return 0;
01810       con[0]=0;
01811     }
01812   if (((*ordptr1)=(int*)MALLOC(sizeof(int)*(bllst5ptr[bllst5ptr[0]]+1))) == NULL) return 0;
01813   (*ordptr1)[0]=bllst5ptr[bllst5ptr[0]];
01814   (*ordptr1)[1]=1;
01815   for (j=1;j<bllst5ptr[bllst5ptr[0]];j++)
01816     {
01817       con1=FindInfEg(con,j);
01818       if ((con1 == NULL) || (con1[0] == 0 ))
01819         {         
01820           (*ordptr1)[j+1]=(*ordptr1)[j];
01821         }
01822       else
01823         {
01824           (*ordptr1)[j+1]=Max1(con1)+1;
01825           FREE(con1);con1=NULL;
01826         }
01827       
01828     }
01829   
01830   if ((new_ordptr1=(int*)MALLOC(sizeof(int)*(bllst5ptr[bllst5ptr[0]]+1))) == NULL) return 0;
01831   new_ordptr1[0]=bllst5ptr[bllst5ptr[0]];
01832   new_ordptr1[1]=1;
01833   FREE(con); con=NULL;
01834   if (((*execlk)=(int*)MALLOC(sizeof(int))) == NULL) return 0;
01835   (*execlk)[0]=0;
01836   for (m=1;m<bllst5ptr[bllst5ptr[0]];m++)
01837     {
01838       if ((*ordptr1)[m]!=(*ordptr1)[m+1])
01839         {
01840           clkconnectj3=GetPartVect(clkconnect,(*ordptr1)[m]+a+a,(*ordptr1)[m+1]-(*ordptr1)[m]);
01841           clkconnectj4=GetPartVect(clkconnect,(*ordptr1)[m]+3*a,(*ordptr1)[m+1]-(*ordptr1)[m]);
01842           
01843        /* **************** debut de funct descard1 ************ */
01844           mma=Max1(clkconnectj4)+1;
01845           if ((con=(int*)MALLOC(sizeof(int)*(clkconnectj4[0]+1))) == NULL) return 0;
01846           con[0]=clkconnectj4[0];
01847           
01848           for(l=1;l<con[0]+1;l++)
01849             {
01850               con[l]=-mma*clkconnectj3[l]-clkconnectj4[l];
01851             } 
01852          if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01853          ind[0]=con[0];
01854          C2F(isort)(&con[1],&con[0],&ind[1]); 
01855          Inv(con);
01856          clkconnectjind3=VecEg1(clkconnectj3);
01857          clkconnectjind4=VecEg1(clkconnectj4);
01858          for(j=1;j<ind[0]+1;j++)
01859            {
01860              clkconnectj3[j]=clkconnectjind3[ind[j]];
01861              clkconnectj4[j]=clkconnectjind4[ind[j]];
01862            }
01863          FREE(clkconnectjind3); clkconnectjind3=NULL;
01864          FREE(clkconnectjind4); clkconnectjind4=NULL;
01865          FREE(ind); ind=NULL;
01866          if (con[0]>=2)
01867            {
01868              if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01869              k=1;
01870              for(j = 1;j < con[0]; j++)
01871                {
01872                  if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01873                }
01874              con1[0]=k-1;
01875              if (con1)
01876                {
01877                  for(j=con1[0];j>0;j--)
01878                    {
01879                      Incr1(clkconnectj3,con1[j]);
01880                      Incr1(clkconnectj4,con1[j]);
01881                    }
01882                  FREE(con1);con1=NULL;
01883                }        
01884            }
01885          FREE(con);con=NULL;
01886          b=clkconnectj3[0];
01887          if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(b+1))) == NULL) return 0;
01888          clkconnectjd[0]=b;
01889          for(j=1;j<b+1;j++)
01890            {
01891              clkconnectjd[j]=powerd(2,clkconnectj4[j]-1);
01892              clkconnectj4[j]=(int) clkconnectjd[j];      
01893            }
01894          FREE(clkconnectjd); clkconnectjd=NULL;
01895          if (clkconnectj3[0]>=2)
01896            {
01897              if ((iini=(int*)MALLOC(sizeof(int)*(clkconnectj3[0]))) == NULL) return 0;
01898              k=1;
01899              for(j=1; j < b; j++)
01900                {
01901                  if((clkconnectj3[j+1]-clkconnectj3[j]) != 0) iini[k++]=j;
01902                }
01903              iini[0]=k-1;
01904              if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01905              iini[iini[0]+1]=b;
01906              iini[0]++;
01907            }
01908          else
01909            {
01910              if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01911              iini[0]=1;
01912              iini[1]=1;                       
01913            }
01914          if ((clkconnectjj=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01915          clkconnectjj[0]=2*iini[0];
01916          for (j=1;j<iini[0]+1;j++)
01917            {
01918              ind=FindEg(clkconnectj3,clkconnectj3[iini[j]]);
01919              clkconnectjj[j]=clkconnectj3[iini[j]];
01920              sum=0;
01921              for (l=1; l <= ind[0]; l++)
01922                {
01923                  sum+=clkconnectj4[ind[l]];
01924                }
01925              clkconnectjj[j+iini[0]]=sum;
01926              FREE(ind); ind=NULL;       
01927            }
01928          
01929          FREE(con);con=NULL;
01930          FREE(iini);iini=NULL;
01931          FREE(clkconnectj3);clkconnectj3=NULL;
01932          FREE(clkconnectj4);clkconnectj4=NULL;
01933        } /* fin de if */
01934      else
01935        {
01936          if (clkconnectjj)
01937            {
01938              FREE(clkconnectjj);
01939              clkconnectjj=NULL;
01940            }  
01941        }     
01942 
01943      /* *** fin de function discard1 ***** */
01944      if(clkconnectjj)
01945        {
01946          if (((*execlk)=(int*)REALLOC((*execlk),sizeof(int)*((*execlk)[0]+clkconnectjj[0]+1))) == NULL ) return 0;
01947          if ((execlki.col1=(int*)MALLOC(sizeof(int)*((*execlk)[0]/2+clkconnectjj[0]/2+1))) == NULL) return 0;
01948          execlki.col1[0]=(*execlk)[0]/2+clkconnectjj[0]/2;
01949          if ((execlki.col2=(int*)MALLOC(sizeof(int)*((*execlk)[0]/2+clkconnectjj[0]/2+1))) == NULL) return 0;
01950          execlki.col2[0]=(*execlk)[0]/2+clkconnectjj[0]/2;
01951          for(l=1;l<(*execlk)[0]/2+1;l++)
01952            {
01953              execlki.col1[l]=(*execlk)[l];
01954              execlki.col2[l]=(*execlk)[l+(*execlk)[0]/2];
01955            }
01956          for(l=1;l<clkconnectjj[0]/2+1;l++)
01957            {
01958              execlki.col1[l+(*execlk)[0]/2]=clkconnectjj[l];
01959              execlki.col2[l+(*execlk)[0]/2]=clkconnectjj[l+clkconnectjj[0]/2];
01960            }
01961 
01962          (*execlk)[0]=clkconnectjj[0]+(*execlk)[0];
01963          for(l=1;l<(*execlk)[0]/2+1;l++)
01964            {
01965              (*execlk)[l]=execlki.col1[l];
01966              (*execlk)[l+(*execlk)[0]/2]=execlki.col2[l];
01967            }
01968          if(execlki.col1) FREE(execlki.col1);
01969          if(execlki.col2) FREE(execlki.col2);
01970          
01971          new_ordptr1[m+1]=new_ordptr1[m]+clkconnectjj[0]/2;
01972          FREE(clkconnectjj);
01973          clkconnectjj=NULL;
01974        }
01975      else
01976        {
01977          new_ordptr1[m+1]=new_ordptr1[m];
01978        }
01979      
01980     } /* for m */
01981   FREE( *ordptr1);
01982   *ordptr1=new_ordptr1;
01983   if (clkconnect[0] != 0) FREE(clkconnect);
01984   return NULL;
01985 }/* fin de funct */
01986 
01987 /* ======================================= endfunction discard =============================================== */
01988 /* *************************************** function extract_info ******************************************** */
01989 int extract_info(int* bllst2,int* bllst3,int* bllst5,char **bllst10,double* bllst11,int* bllst12,int* bllst2ptr,
01990                  int* bllst3ptr,int* bllst4ptr,int* bllst5ptr,int* bllst11ptr,int* connectmat,int* clkconnect,
01991                  int** lnkptr,int** inplnk,int** outlnk,int* nzcross,int* nmode,int** typ_s,int** typ_x,
01992                  int** typ_m,double** initexe,int** bexe,int** boptr,int** blnk,int** blptr,int* ok,
01993                  int* corinvec,int* corinvptr)
01994 {
01995   int j,l,ko,ki,nlnk,ptlnk,siz_unco,m1,n,jj,a,nbl=((int*)bllst10)[0];
01996   int *prt,*clkconnecttmp,*fff,*clkconnectind;
01997   int *idl,*ind,*con,*unco,*lnkbsz,*ppget,*mm;
01998   double *ll11;
01999   Mat3C initexei;
02000   ind=NULL;
02001   idl=NULL;
02002   ll11=NULL;
02003   clkconnecttmp=NULL;
02004   *ok=true;
02005   prt=NULL;
02006   if ((fff=(int*)MALLOC(sizeof(int)*(nbl+1))) == NULL) return 0;
02007   fff[0]=nbl;
02008   Setmem(fff,1);
02009 
02010   *typ_s=VecEg1(fff);
02011   *typ_m=VecEg1(fff);
02012   FREE(fff); fff=NULL;
02013   adjust_inout(bllst2,bllst3,bllst2ptr,bllst3ptr,nzcross,nmode,connectmat,ok,corinvec,corinvptr,nbl);
02014   if(!*ok) return 0;
02015 
02016   if (((*initexe)=(double*)MALLOC(sizeof(double))) == NULL) return 0;
02017   (*initexe)[0]=0;                
02018   
02019   for (j=1;j<nbl+1;j++)
02020     {
02021       if (nmode[j] < 0){
02022         Message("Number of modes in block j cannot be determined");     
02023         *ok=false;
02024       }
02025       if (*(bllst10[j]) == 's' ) (*typ_s)[j]=1;
02026       else (*typ_s)[j]=0;
02027       if (*(bllst10[j]) == 'x' ) (*typ_x)[j]=1;
02028       if (*(bllst10[j])=='m') (*typ_m)[j]=1;
02029       else (*typ_m)[j]=0;
02030       fff=GetPartVect(bllst5,bllst5ptr[j],bllst5ptr[j+1]-bllst5ptr[j]);
02031       if (fff) 
02032         {
02033           ll11=GetPartVectd(bllst11,bllst11ptr[j],bllst11ptr[j+1]-bllst11ptr[j]);
02034           if(ll11)
02035             {
02036               prt=FindSupEgd(ll11,0);
02037           
02038               if ((initexei.col1=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02039               initexei.col1[0]=(int) ((*initexe)[0])/3+prt[0];
02040               if ((initexei.col2=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02041               initexei.col2[0]=(int) ((*initexe)[0])/3+prt[0];
02042               if ((initexei.col3=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02043               initexei.col3[0]=(int) ((*initexe)[0])/3+prt[0];
02044               for(l=1;l<(int) ((*initexe)[0])/3+1;l++)
02045                 {                                  
02046                   initexei.col1[l]=(*initexe)[l];
02047                   initexei.col2[l]=(*initexe)[l+(int) ((*initexe)[0])/3];
02048                   initexei.col3[l]=(*initexe)[l+2* (int) ((*initexe)[0])/3];
02049                 }
02050               for(l=1;l<prt[0]+1;l++)
02051                 {
02052                   initexei.col1[l+(int) ((*initexe)[0])/3]=j;
02053                   initexei.col2[l+(int) ((*initexe)[0])/3]=prt[l];
02054                   initexei.col3[l+(int) ((*initexe)[0])/3]=ll11[prt[l]];
02055                 }
02056               if (((*initexe)=(double*)REALLOC((*initexe),(size_t) (sizeof(double)*(3*initexei.col1[0]+1)))) == NULL ) return 0;
02057               ((*initexe)[0])=3*((int) initexei.col1[0]);
02058               for(l=1;l<(int) (*initexe)[0]/3+1;l++)
02059                 {
02060                   (*initexe)[l]=initexei.col1[l];
02061                   (*initexe)[l+(int) ((*initexe)[0])/3]=initexei.col2[l];
02062                   (*initexe)[l+2*(int) ((*initexe)[0])/3]=initexei.col3[l];
02063                 }
02064               FREE(initexei.col1);
02065               FREE(initexei.col2);
02066               FREE(initexei.col3);
02067               FREE(prt);prt=NULL;
02068               FREE(ll11); ll11=NULL;
02069             }
02070           FREE(fff);
02071         }
02072     } /* end for j */
02073   if (clkconnect[0] != 0)
02074     { 
02075   clkconnecttmp=VecEg1(clkconnect);
02076   ppget=GetPartVect(clkconnecttmp,1,clkconnecttmp[0]/4);
02077   idl=FindDif(ppget,0);
02078   FREE(ppget);
02079   if ((clkconnect=(int*)MALLOC(sizeof(int)*(4*idl[0]+1))) == NULL ) return 0;
02080   clkconnect[0]=4*idl[0];
02081   for(l=1;l<idl[0]+1;l++)
02082     {
02083       clkconnect[l]=clkconnecttmp[idl[l]];
02084       clkconnect[l+idl[0]]=clkconnecttmp[clkconnecttmp[0]/4+idl[l]];
02085       clkconnect[l+2*idl[0]]=clkconnecttmp[idl[l]+clkconnecttmp[0]/2];
02086       clkconnect[l+3*idl[0]]=clkconnecttmp[idl[l]+3*clkconnecttmp[0]/4];
02087     }
02088   FREE(clkconnecttmp);clkconnecttmp=NULL;
02089   FREE(idl);idl=NULL;
02090   clkconnecttmp=GetPartVect(clkconnect,1,clkconnect[0]/4);
02091   idl=GetPartVect(clkconnect,clkconnect[0]/4+1,clkconnect[0]/4);
02092   if (!idl)
02093     {
02094       if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02095       idl[0]=0;
02096     }
02097   if ((con=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02098   con[0]=idl[0];
02099   for(l=1;l<clkconnect[0]/4+1;l++)
02100     {
02101       con[l]=-bllst5ptr[clkconnecttmp[l]]-idl[l]+1;
02102     }
02103   FREE(clkconnecttmp);clkconnecttmp=NULL;
02104   FREE(idl);idl=NULL;
02105   if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
02106   ind[0]=con[0];
02107   C2F(isort)(&con[1],&con[0],&ind[1]);
02108   FREE(con);con=NULL;
02109   clkconnectind=VecEg1(clkconnect);
02110   for(l=1;l<ind[0]+1;l++)
02111     {
02112       clkconnect[l]=clkconnectind[ind[l]];
02113       clkconnect[l+ind[0]]=clkconnectind[ind[l]+ind[0]];
02114       clkconnect[l+2*ind[0]]=clkconnectind[ind[l]+2*ind[0]];
02115       clkconnect[l+3*ind[0]]=clkconnectind[ind[l]+3*ind[0]];      
02116     } 
02117   FREE(clkconnectind);
02118   clkconnectind=NULL;
02119   FREE(ind);ind=NULL;
02120     }
02121   if (((*boptr)=(int*)MALLOC(sizeof(int)*(nbl+2))) == NULL ) return 0;
02122   (*boptr)[0]=nbl+1;
02123   (*boptr)[1]=1;
02124   if (((*bexe)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02125   (*bexe)[0]=0;
02126   ppget=GetPartVect(clkconnect,1,clkconnect[0]/4);
02127   if (!ppget)
02128     {
02129       if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02130       ppget[0]=0;
02131     }
02132   for (j=1;j<nbl+1;j++)
02133     {
02134       idl=FindEg(ppget,j);
02135       if(idl)
02136         {
02137           if ((ind=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02138           ind[0]=idl[0];
02139           for (l=1;l<ind[0]+1;l++)
02140             {
02141               ind[l]=clkconnect[idl[l]+clkconnect[0]/2];
02142             }      
02143           if (((*bexe)=(int*)REALLOC((*bexe),sizeof(int)*((*bexe)[0]+ind[0]+1))) == NULL ) return 0;
02144           for (l=1;l<ind[0]+1;l++)
02145             {
02146               (*bexe)[l+(*bexe)[0]]=ind[l];
02147             }
02148           (*bexe)[0]=(*bexe)[0]+ind[0];
02149           (*boptr)[j+1]=(*boptr)[j]+ind[0];
02150           FREE(idl);idl=NULL;
02151           FREE(ind);ind=NULL;
02152         }
02153       else (*boptr)[j+1]=(*boptr)[j];
02154     }
02155   FREE(ppget); ppget=NULL;
02156   if (clkconnect[0] != 0) {FREE(clkconnect);clkconnect=NULL;}
02157   if (((*blptr)=(int*)MALLOC(sizeof(int)*(nbl+2))) == NULL ) return 0;
02158   (*blptr)[0]=nbl+1;
02159   (*blptr)[1]=1;
02160   if (((*blnk)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02161   (*blnk)[0]=0;
02162   ppget=GetPartVect(connectmat,1,connectmat[0]/4);
02163   if(!ppget)
02164     {
02165       if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02166       ppget[0]=0;
02167     }
02168   for (j=1;j<nbl+1;j++)
02169     {      
02170       idl=FindEg(ppget,j);
02171       if(idl && idl[0] != 0)
02172         {
02173           if ((ind=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02174           ind[0]=idl[0];
02175           for (l=1;l<ind[0]+1;l++)
02176             {
02177               ind[l]=connectmat[idl[l]+connectmat[0]/2];
02178             }      
02179           if (((*blnk)=(int*)REALLOC((*blnk),sizeof(int)*((*blnk)[0]+ind[0]+1))) == NULL ) return 0;
02180           for (l=1;l<ind[0]+1;l++)
02181             {
02182               (*blnk)[l+(*blnk)[0]]=ind[l];
02183             }
02184           (*blnk)[0]=(*blnk)[0]+ind[0];
02185           (*blptr)[j+1]=(*blptr)[j]+ind[0];
02186           FREE(ind);ind=NULL;
02187         }
02188       else (*blptr)[j+1]=(*blptr)[j];
02189       FREE(idl);idl=NULL;
02190     }
02191   FREE(ppget);ppget=NULL;  
02192   
02193   nlnk=connectmat[0]/4;
02194   if (((*inplnk)=(int*)CALLOC(bllst2ptr[bllst2ptr[0]],sizeof(int))) == NULL ) return 0;
02195   (*inplnk)[0]=bllst2ptr[bllst2ptr[0]]-1;
02196   if (((*outlnk)=(int*)CALLOC(bllst3ptr[bllst3ptr[0]],sizeof(int))) == NULL ) return 0;
02197   (*outlnk)[0]=bllst3ptr[bllst3ptr[0]]-1;
02198   ptlnk=1; 
02199   if ((lnkbsz=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02200   lnkbsz[0]=0;
02201 
02202   for (jj=1;jj<nlnk+1;jj++)
02203     {
02204       ko=(*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1];
02205       ki=(*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1];
02206       if (ko != 0 && ki !=0)
02207         {
02208           if (ko > ki )
02209             {
02210               ind=FindSup(*outlnk,ko);
02211               for(l=1;l<ind[0]+1;l++)
02212                 {
02213                   (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
02214                 }
02215               FREE(ind);ind=NULL;
02216               ind=FindEg(*outlnk,ko);
02217               for(l=1;l<ind[0]+1;l++)
02218                 {
02219                   (*outlnk)[ind[l]]=ki;
02220                 }
02221               FREE(ind); ind=NULL;
02222               ind=FindSup(*inplnk,ko);
02223               for(l=1;l<ind[0]+1;l++)
02224                 {
02225                   (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
02226                 }
02227               FREE(ind);ind=NULL;
02228               ind=FindEg(*inplnk,ko);
02229               for(l=1;l<ind[0]+1;l++)
02230                 {
02231                   (*inplnk)[ind[l]]=ki;
02232                 }
02233               ptlnk--;
02234             }
02235           else if (ki > ko)
02236             {
02237               ind=FindSup(*outlnk,ki);
02238               for(l=1;l<ind[0]+1;l++)
02239                 {
02240                   (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
02241                 }
02242               FREE(ind); ind=NULL;
02243               ind=FindEg(*outlnk,ki);
02244               for(l=1;l<ind[0]+1;l++)
02245                 {
02246                   (*outlnk)[ind[l]]=ko;
02247                 }
02248               FREE(ind); ind=NULL;
02249               ind=FindSup(*inplnk,ki);
02250               for(l=1;l<ind[0]+1;l++)
02251                 {
02252                   (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
02253                 }
02254               FREE(ind); ind=NULL;
02255               ind=FindEg(*inplnk,ki);
02256               for(l=1;l<ind[0]+1;l++)
02257                 {
02258                   (*inplnk)[ind[l]]=ko;
02259                 }
02260               ptlnk--;
02261             }
02262         }
02263       else if (ko != 0)
02264         {
02265           (*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1]=ko;
02266         }
02267       else if (ki != 0)
02268         {
02269           (*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1]=ki;
02270         }
02271       else
02272         {
02273           (*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1]=ptlnk;
02274           (*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1]=ptlnk;
02275           ind=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02276           if ((lnkbsz=(int*)REALLOC(lnkbsz,sizeof(int)*(lnkbsz[0]+2))) == NULL ) return 0;
02277           lnkbsz[lnkbsz[0]+1]=ind[connectmat[jj+nlnk]];
02278           lnkbsz[0]++;                      
02279           ptlnk++;
02280           FREE(ind);ind=NULL;
02281         }
02282     } /* fin de for jj */
02283 
02284   if ((ind=(int*)MALLOC(sizeof(int)*(lnkbsz[0]+2))) == NULL ) return 0;
02285   ind[0]=lnkbsz[0]+1;
02286   ind[1]=1;
02287   for (l=2;l<ind[0]+1;l++)
02288     {
02289       ind[l]=lnkbsz[l-1];
02290     }
02291   FREE(lnkbsz);lnkbsz=NULL;
02292   CumSum(ind);
02293   if (((*lnkptr)=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02294   (*lnkptr)[0]=ind[0];
02295   for (l = 1; l < ind[0]+1; l++)
02296     {
02297       (*lnkptr)[l]=ind[l];
02298     } 
02299   FREE(ind);ind=NULL;
02300   unco=FindEg(*outlnk,0);
02301   if (unco && unco[0] !=0)
02302     {
02303       siz_unco=0;
02304       for (l=1;l<unco[0]+1;l++)
02305         {
02306           j=unco[l]; 
02307           ppget=FindInfEg(bllst3ptr,j);
02308           m1=Max1(ppget);
02309           n=j-bllst3ptr[m1]+1;
02310           FREE(ppget);ppget=NULL;
02311           ind=GetPartVect(bllst3,bllst3ptr[m1],bllst3ptr[m1+1]-bllst3ptr[m1]);
02312           if (ind)
02313             {
02314               if ((idl=(int*)MALLOC(sizeof(int)*(3))) == NULL ) return 0;
02315               idl[0]=2;
02316               idl[1]=siz_unco;
02317               idl[2]=ind[n];
02318               if (ind[n] < 1)
02319                 {
02320                   ppget=GetPartVect(corinvec,corinvptr[m1],corinvptr[m1+1]-corinvptr[m1]);
02321                   if ((mm=(int*)MALLOC(sizeof(int)*(2))) == NULL ) return 0;
02322                   mm[0]=1;
02323                   mm[1]=-1;
02324                   *ok=connection(ppget,mm);
02325                   FREE(ppget);
02326                   FREE(mm);
02327                   return 0;
02328                 }
02329               siz_unco=Max1(idl);
02330               FREE(idl);idl=NULL;
02331               FREE(ind);ind=NULL;
02332             }
02333         }
02334       if (((*lnkptr)=(int*)REALLOC((*lnkptr),sizeof(int)*((*lnkptr)[0]+2))) == NULL ) return 0; 
02335       (*lnkptr)[(*lnkptr)[0]+1]=(*lnkptr)[(*lnkptr)[0]]+siz_unco;
02336       (*lnkptr)[0]=(*lnkptr)[0]+1;
02337       a=Max1(*outlnk)+1;
02338       for (l=1;l<unco[0]+1;l++)
02339         {
02340           (*outlnk)[unco[l]]=a;                           
02341         }
02342     }
02343   FREE(unco);unco=NULL; 
02344   return 0;
02345 } /* end funct*/
02346      
02347 /* ======================================= endfunction extract_info ========================================== */
02348 
02349 /* ************************************* function conn_mat ************************************************** */
02350 int conn_mat(int* inplnk,int* outlnk,int* bllst2ptr,int* bllst3ptr,int** outoin,int** outoinptr,int* nblk)
02351 {
02352   int l,ll,j,jj,jjj,m1,n;
02353   int *outoini,*ind,*k,*ppget,a;
02354   int *ii;
02355   Mat2C outoinii;
02356   ii=NULL;  
02357   outoini=NULL;
02358   *nblk=bllst2ptr[0]-1;
02359   if (((*outoinptr)=(int*)MALLOC(sizeof(int)*(*nblk+2))) == NULL ) return 0;
02360   (*outoinptr)[0]=*nblk+1;
02361   if (((*outoin)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02362   (*outoin)[0]=0;
02363   (*outoinptr)[1]=1;
02364   for (j=1;j<*nblk+1;j++)
02365     {
02366       if ((k=(int*)MALLOC(sizeof(int)*(bllst3ptr[j+1]-bllst3ptr[j]+1))) == NULL ) return 0;
02367        k[0]=bllst3ptr[j+1]-bllst3ptr[j];
02368        a=-bllst3ptr[j]+1;
02369       for (l=bllst3ptr[j];l<bllst3ptr[j+1];l++)
02370         {
02371           k[l+a]=l;
02372         }
02373       if ((ii=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02374       ii[0]=0;
02375       for (l=1;l<k[0]+1;l++)
02376         {
02377           jjj=outlnk[k[l]];
02378           ind=FindEg(inplnk,jjj);
02379           if (ind)
02380             {
02381               if ((ii=(int*)REALLOC(ii,sizeof(int)*(ii[0]+ind[0]+1))) == NULL ) return 0;
02382               for (ll=1;ll<ind[0]+1;ll++)
02383                 {
02384                   ii[ii[0]+ll]=ind[ll];
02385                 }
02386               
02387               ii[0]=ii[0]+ind[0];
02388               FREE(ind); ind=NULL;
02389             }
02390         }
02391       jj=0;
02392       if (ii && ii[0] != 0)
02393         {
02394           if ((outoini=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
02395           outoini[0]=2*ii[0];
02396           for (ll=1;ll<ii[0]+1;ll++)
02397             {
02398               l=ii[ll];
02399               ppget=FindInfEg(bllst2ptr,l);
02400               m1=Max1(ppget);
02401               FREE(ppget);ppget=NULL;
02402               n=l-bllst2ptr[m1]+1;
02403               outoini[ll]=m1;
02404               outoini[ll+ii[0]]=n;
02405               jj++;
02406             }
02407           if ((outoinii.col1=(int*)MALLOC(sizeof(int)*(outoini[0]/2+(*outoin)[0]/2+1))) == NULL) return 0;
02408           outoinii.col1[0]=outoini[0]/2+(*outoin)[0]/2;
02409           if ((outoinii.col2=(int*)MALLOC(sizeof(int)*(outoini[0]/2+(*outoin)[0]/2+1))) == NULL) return 0;
02410           outoinii.col2[0]=outoini[0]/2+(*outoin)[0]/2;
02411           for(l=1;l<(*outoin)[0]/2+1;l++)
02412             {
02413               outoinii.col1[l]=(*outoin)[l];
02414               outoinii.col2[l]=(*outoin)[l+(*outoin)[0]/2];
02415             }
02416           for(l=1;l<outoini[0]/2+1;l++)
02417             {
02418               outoinii.col1[l+(*outoin)[0]/2]=outoini[l];
02419               outoinii.col2[l+(*outoin)[0]/2]=outoini[l+outoini[0]/2];
02420             }
02421           
02422           if (((*outoin)=(int*)REALLOC((*outoin),sizeof(int)*((*outoin)[0]+outoini[0]+1))) == NULL ) return 0;
02423           (*outoin)[0]=(*outoin)[0]+outoini[0];
02424           
02425           for(l=1;l<(*outoin)[0]/2+1;l++)
02426             {
02427               (*outoin)[l]=outoinii.col1[l];
02428               (*outoin)[l+(*outoin)[0]/2]=outoinii.col2[l];
02429             }
02430           FREE(outoinii.col1); outoinii.col1=NULL;
02431           FREE(outoinii.col2); outoinii.col2=NULL;
02432           FREE(outoini);outoini=NULL;
02433         }
02434       (*outoinptr)[j+1]=(*outoinptr)[j]+jj;
02435       FREE(k);k=NULL;
02436       FREE(ii);ii=NULL;
02437     } /* end for */
02438   return 0;
02439 } /* end function */
02440 /* ======================================= endfunction conn_mat ========================================== */
02441 
02442 /* ************************************* function  critical_events ************************************************** */
02443 int critical_events(int* connectmat,int* clkconnect,int *bllst12,int *typ_r,int *typ_l,int *typ_zx,int *outoin,
02444                     int *outoinptr,int *bllst5ptr,int **critev)
02445 {
02446   int i,j,k,*typ_c,done1,mm,a,*cll,val=0,*cllind,*typr;
02447   int *clkconnecttmp,*clkconnectind,*ind,*ii,*oo,*vec,nblk,*r,*nd,max1,nnd,done,*jj;
02448   Mat4C clkconnecti;
02449   
02450   typr=VecEg1(typ_r);
02451   nblk=bllst12[0]/2;
02452   if ((typ_c=(int*)MALLOC(sizeof(int)*(typ_l[0]+1))) == NULL ) return 0;
02453   typ_c[0]=typ_l[0];
02454   Setmem(typ_c,0);
02455   for (i=1; i<=typr[0]; i++){
02456     if (bllst12[i+bllst12[0]/2]){
02457       typr[i]=1;
02458     }
02459   }
02460   clkconnecttmp=VecEg1(clkconnect);
02461   done1=0;
02462   while (!done1){
02463     done1=1;
02464     mm=Max1(clkconnecttmp)+1;
02465     a=clkconnecttmp[0]/4;
02466     if ((cll=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
02467     cll[0]=a;
02468     for (i=1; i<=a; i++)
02469       {
02470         cll[i]=-clkconnecttmp[i]*mm-clkconnecttmp[i+a];
02471       }
02472     if ((ind=(int*)MALLOC(sizeof(int)*(a+2))) == NULL ) return 0;
02473     C2F(isort)(&cll[1],&a,&ind[0]);
02474     clkconnectind=VecEg1(clkconnecttmp);
02475     for(i=1; i<=a; i++)
02476       {
02477         clkconnecttmp[i]=clkconnectind[ind[i-1]];
02478         clkconnecttmp[i+a]=clkconnectind[ind[i-1]+a];
02479         clkconnecttmp[i+2*a]=clkconnectind[ind[i-1]+2*a];
02480         clkconnecttmp[i+3*a]=clkconnectind[ind[i-1]+3*a];      
02481       }
02482     if (ind) FREE(ind);
02483     FREE(clkconnectind); clkconnectind=NULL;
02484     if ((cll=(int*)REALLOC(cll,sizeof(int)*(a+3))) == NULL ) return 0;
02485     cll[0]=a+2;
02486     cllind=VecEg1(cll);
02487     for (j=2;j<cll[0]+1;j++)
02488       {
02489         cll[j]=-cllind[j-1];
02490       }   
02491     if(cllind) FREE(cllind);
02492     cllind=NULL;
02493     cll[1]=-1;
02494     cll[cll[0]]=mm;
02495     
02496     if ((ii=(int*)MALLOC(sizeof(int)*(a+2))) == NULL ) return 0;
02497     ii[0]=a+1;
02498     for (i=1; i<=ii[0]; i++)
02499       ii[i]=cll[i+1]-cll[i];
02500     if (cll) FREE(cll);
02501     
02502     ind=FindDif(ii,0);
02503     if (ii) FREE(ii);
02504     if (ind){
02505       for (i=1; i<ind[0]; i++){
02506         if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
02507         vec[0]=nblk;
02508         Setmem(vec,-1);
02509         a=clkconnecttmp[0]/4;
02510         for (j=ind[i]; j<ind[i+1]; j++)
02511           vec[clkconnecttmp[j+2*a]]=0;
02512                 
02513         nd=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
02514         if (!nd)
02515           {
02516             if ((nd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02517             nd[0]=0;
02518           }
02519         max1=Max1(nd);
02520         FREE(nd);
02521         nnd=max1+1;
02522         if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
02523         nd[0]=nblk*nnd;
02524         
02525         tree4(vec,nd,nnd,outoin,outoinptr,typr,&r);
02526         if(nd) FREE(nd);
02527         if(vec) FREE(vec); vec=NULL;
02528         
02529         if (r) {
02530           if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02531           clkconnecti.col1[0]=a+r[0]/2;
02532           if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02533           clkconnecti.col2[0]=a+r[0]/2;
02534           if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02535           clkconnecti.col3[0]=a+r[0]/2;
02536           if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02537           clkconnecti.col4[0]=a+r[0]/2;
02538           for(j=1; j<a+1; j++)
02539             {
02540               clkconnecti.col1[j]=clkconnecttmp[j];
02541               clkconnecti.col2[j]=clkconnecttmp[j+a];
02542               clkconnecti.col3[j]=clkconnecttmp[j+2*a];
02543               clkconnecti.col4[j]=clkconnecttmp[j+3*a];
02544             }
02545           for (j=1; j<r[0]/2+1; j++)
02546             {     
02547               clkconnecti.col1[j+a]=clkconnecttmp[ind[i]];
02548               clkconnecti.col2[j+a]=clkconnecttmp[ind[i]+a];
02549               clkconnecti.col3[j+a]=r[j];
02550               clkconnecti.col4[j+a]=r[j+r[0]/2];
02551             }
02552           FREE(clkconnecttmp);
02553           if ((clkconnecttmp=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
02554           clkconnecttmp[0]=4*clkconnecti.col1[0];
02555           for (j=1; j<clkconnecttmp[0]/4+1; j++)
02556             {
02557               clkconnecttmp[j]=clkconnecti.col1[j];
02558               clkconnecttmp[j+clkconnecttmp[0]/4]=clkconnecti.col2[j];
02559               clkconnecttmp[j+clkconnecttmp[0]/2]=clkconnecti.col3[j];
02560               clkconnecttmp[j+3*clkconnecttmp[0]/4]=clkconnecti.col4[j];
02561             }
02562           FREE(clkconnecti.col1);
02563           clkconnecti.col1=NULL;
02564           FREE(clkconnecti.col2);
02565           clkconnecti.col2=NULL;
02566           FREE(clkconnecti.col3);
02567           clkconnecti.col3=NULL;
02568           FREE(clkconnecti.col4);
02569           clkconnecti.col4=NULL;
02570           FREE(r); r=NULL;
02571         }
02572       }
02573       FREE(ind);
02574     }
02575     done=0;
02576     while (!done){
02577       done=1;
02578       if ((vec=(int*)CALLOC(typ_c[0]+1,sizeof(int))) == NULL ) return 0;
02579       vec[0]=typ_c[0];
02580       for (i=1; i<=typ_c[0]; i++){
02581         if ( typ_l[i] && !(typ_c[i]) )
02582           vec[i]=1;     
02583       }
02584       jj=FindEg(vec,1);
02585       if (vec) FREE(vec);
02586       if (jj[0] != 0){
02587         if ((vec=(int*)CALLOC(clkconnecttmp[0]/4+1,sizeof(int))) == NULL ) return 0;
02588         vec[0]=clkconnecttmp[0]/4;
02589         for (i=1; i<=jj[0]; i++){
02590           for (j=1; j<=clkconnecttmp[0]/4; j++){
02591             if (clkconnecttmp[j+clkconnecttmp[0]/2] == jj[i]) vec[j]=1;       
02592           }
02593           if (!OR(vec)){
02594             oo=GetPartVect(clkconnecttmp,1,clkconnecttmp[0]/4);
02595             ind=FindEg(oo,jj[i]);
02596             if (oo) FREE(oo);
02597             if (ind){
02598               for (j=1; j<=ind[0]; j++){
02599                 typr[clkconnecttmp[ind[j]+clkconnecttmp[0]/2]]=1;
02600                 clkconnecttmp[ind[j]]=-4321;
02601                 clkconnecttmp[ind[j]+clkconnecttmp[0]/4]=-4321;
02602                 clkconnecttmp[ind[j]+clkconnecttmp[0]/2]=-4321;
02603                 clkconnecttmp[ind[j]+3*clkconnecttmp[0]/4]=-4321;
02604               }
02605               for (j=1; j<clkconnecttmp[0]+1; j++)
02606                 {
02607                   if ( clkconnecttmp[j] != -4321 )  clkconnecttmp[j-val]=clkconnecttmp[j];
02608                   else
02609                     val++;
02610                 }
02611               clkconnecttmp[0]=clkconnecttmp[0]-4*ind[0];
02612               FREE(ind); ind=NULL;
02613             }
02614             typ_c[jj[i]]=1;
02615             done1=0;
02616             done=0;
02617           }
02618         }       
02619         if (vec) FREE(vec);
02620       }
02621       FREE(jj);
02622     }
02623   }
02624   FREE(typ_c);
02625   FREE(typr);
02626   if (((*critev)=(int*)CALLOC(bllst5ptr[bllst5ptr[0]],sizeof(int))) == NULL ) return 0;
02627   (*critev)[0]=bllst5ptr[bllst5ptr[0]]-1;
02628   for (i=1; i<bllst5ptr[0]; i++){
02629     for (j=bllst5ptr[i]; j<bllst5ptr[i+1]; j++){
02630       if ((vec=(int*)CALLOC(clkconnecttmp[0]/4+1,sizeof(int))) == NULL ) return 0;
02631       vec[0]=clkconnecttmp[0]/4;
02632       for (k=1; k<=clkconnecttmp[0]/4; k++){
02633         if ((clkconnecttmp[k] == i) && (clkconnecttmp[k+clkconnecttmp[0]/4] == j-bllst5ptr[i]+1)) vec[k]=1;
02634       }
02635       ind=FindEg(vec,1);
02636       if (ind){
02637         if (vec) FREE(vec);
02638         if ((vec=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02639         vec[0]=ind[0];
02640         for (k=1; k<=ind[0]; k++)
02641           vec[k]=typ_zx[clkconnecttmp[ind[k]+clkconnecttmp[0]/2]];
02642         if (OR(vec)) (*critev)[j]=1;
02643         if (vec) FREE(vec);
02644         FREE(ind);
02645       }
02646     }
02647   }
02648   FREE(clkconnecttmp);
02649   return 0;
02650 } /* end function */
02651 /* ======================================= endfunction critical_events ========================================== */
02652 
02653 /* *************************************** function make_ptr ******************************************* */
02654 int make_ptr(char** bllst10,int** typ_l,int** typ_m)
02655 {
02656   int ll,j=1;
02657   int *typ_l1,*pp,*typ_m1;
02658   if (((int *)bllst10)[0]<(*typ_l)[0]+1) return 0;
02659   ll=((int*)bllst10)[0]-(*typ_l)[0];
02660   if ((typ_l1=(int*)CALLOC((ll+1),sizeof(int))) == NULL ) return 0;
02661   typ_l1[0]=ll;
02662   if ((typ_m1=(int*)CALLOC((ll+1),sizeof(int))) == NULL ) return 0;
02663   typ_m1[0]=ll;
02664   if (*(bllst10[(*typ_l)[0]+1])=='l') typ_l1[1]=1;
02665   j=1;
02666   for (ll=(*typ_l)[0]+2;ll<((int*)bllst10)[0]+1;ll++)
02667     {
02668       j++;      
02669       if (*(bllst10[ll]) == 'l') typ_l1[j]=1;
02670       else typ_l1[j]=0;
02671     }
02672   if (((*typ_l)=(int*)REALLOC((*typ_l),sizeof(int)*((*typ_l)[0]+typ_l1[0]+1))) == NULL ) return 0;
02673   pp=&(*typ_l)[1+(*typ_l)[0]];
02674   pp=memcpy(pp,&typ_l1[1],sizeof(int)*(typ_l1[0]));
02675   (*typ_l)[0]+=typ_l1[0];
02676   
02677   if (((*typ_m)=(int*)REALLOC((*typ_m),sizeof(int)*((*typ_m)[0]+typ_m1[0]+1))) == NULL ) return 0;
02678   pp=&(*typ_m)[1+(*typ_m)[0]];
02679   pp=memcpy(pp,&typ_m1[1],sizeof(int)*(typ_m1[0]));
02680   (*typ_m)[0]+=typ_m1[0];
02681   FREE(typ_l1);typ_l1=NULL;
02682   FREE(typ_m1);typ_m1=NULL;
02683   return 0;
02684 } /* end function */
02685 /* ======================================= endfunction make_ptr ========================================== */
02686 /* *************************************** function adjust_inout ****************************************** */
02687 int adjust_inout(int* bllst2,int* bllst3,int* bllst2ptr,int* bllst3ptr,int* nzcross,int* nmode,int* connectmat,int* ok,int* corinvec,int* corinvptr,int nblk1)
02688 {
02689   int hhjj,j,hh,jj,nout,nin,findflag,mini1,mini2;
02690   int *wwi,*ww,*nww,*ind,*ind1,*wwi1,a,ninnout,*nww1;
02691   double k,k1;
02692   int kint,prt_out,prt_in;
02693   wwi=ww=nww=ind=ind1=wwi1=nww1=NULL;
02694   
02695   for (hhjj=1;hhjj<nblk1+2;hhjj++)
02696     {
02697       for (hh=1;hh<nblk1+2;hh++)
02698         {
02699           *ok=true;
02700           for (jj=1;jj<connectmat[0]/4+1;jj++)
02701             {
02702               ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02703               nout=ww[connectmat[jj+connectmat[0]/4]];
02704               FREE(ww);
02705               ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02706               nin=ww[connectmat[jj+3*connectmat[0]/4]];
02707               FREE(ww);
02708               if (nout>0 && nin>0)
02709                 {
02710                   if (nin != nout)
02711                     {
02712                       ind1=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
02713                       ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02714                       prt_out=connectmat[jj+connectmat[0]/4];
02715                       prt_in=connectmat[jj+3*connectmat[0]/4];
02716                       badconnection(ind1,prt_out,nout,ind,prt_in,nin);
02717                       *ok=false;
02718                       if(ind1) FREE (ind1); 
02719                       if(ind) FREE (ind); 
02720                       return 0;
02721                     }
02722                 } /* fin de if 1 */
02723               else if (nout>0 && nin<0)
02724                 {
02725                   wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02726                   ww=FindEg(wwi,nin);
02727                   for (j=1;j<ww[0]+1;j++)
02728                     {
02729                       wwi[ww[j]]=nout;
02730                     }
02731                   for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02732                     {
02733                       bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02734                     }
02735                   if(wwi) FREE(wwi);
02736                   if(ww) FREE(ww);
02737                   wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02738                   if (wwi) 
02739                     {
02740                       ww=FindEg(wwi,nin);
02741                       if (ww)
02742                         {
02743                           for (j=1;j<ww[0]+1;j++)
02744                             {
02745                               wwi[ww[j]]=nout;
02746                             }
02747                           FREE(ww);
02748                           for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02749                             {
02750                               bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02751                             }
02752                         }
02753                       
02754                       FREE(wwi);
02755                     }
02756                   wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02757                   if (wwi)
02758                     {
02759                       ww=FindEg(wwi,0);
02760                       wwi1=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02761                       mini1=Min1(wwi1);
02762                       if (ww && (mini1 > 0))
02763                         {
02764                           a=Sum(wwi1);
02765                           for (j=1;j<ww[0]+1;j++)
02766                             {
02767                               wwi[ww[j]]=a;
02768                             }
02769                           for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02770                             {
02771                               bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02772                             }
02773                         }
02774                       FREE(ww);ww=NULL;
02775                       FREE(wwi);wwi=NULL;
02776                       if (wwi1) FREE(wwi1);
02777                       wwi1=NULL;
02778                     }
02779                   if (nzcross[connectmat[jj+connectmat[0]/2]] == nin){
02780                     nzcross[connectmat[jj+connectmat[0]/2]] = nout;
02781                   }
02782                   if (nmode[connectmat[jj+connectmat[0]/2]] == nin){
02783                     nmode[connectmat[jj+connectmat[0]/2]] = nout;
02784                   }
02785                 }
02786               else if (nin>0 && nout<0)
02787                 {
02788                   wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02789                   ww=FindEg(wwi,nout);
02790                   for (j=1;j<ww[0]+1;j++)
02791                     {
02792                       wwi[ww[j]]=nin;
02793                     }
02794                   for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02795                     {
02796                       bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02797                     }
02798                   if(wwi) FREE(wwi);
02799                   if(ww) FREE(ww);
02800                   
02801                   wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02802                   if (wwi)
02803                     {
02804                       ww=FindEg(wwi,nout);
02805                       if (ww)
02806                         {
02807                           for (j=1;j<ww[0]+1;j++)
02808                             {
02809                               wwi[ww[j]]=nin;
02810                             }
02811                           if(ww) FREE(ww);
02812                         }
02813                       for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
02814                         {
02815                           bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
02816                         }                 
02817                       if(wwi) FREE(wwi);
02818                     }
02819                   wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02820                   if (!wwi)
02821                     {
02822                       if ((wwi=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02823                       wwi[0]=0;
02824                     }
02825                   ww=FindEg(wwi,0);
02826                   wwi1=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02827                   mini2=Min1(wwi1);
02828                   
02829                   if ((ww != NULL) && (mini2 > 0))
02830                     {
02831                       a=Sum(wwi1);
02832                       for (j=1;j<ww[0]+1;j++)
02833                         {
02834                           wwi[ww[j]]=a;
02835                         }
02836                       for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
02837                         {
02838                           bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
02839                         }
02840                     }
02841                   FREE(ww);ww=NULL;
02842                   if(wwi1) FREE(wwi1);
02843                   wwi1=NULL;
02844                   if(wwi) FREE(wwi);
02845                   wwi=NULL;
02846                   if (nzcross[connectmat[jj]] == nout){
02847                     nzcross[connectmat[jj]] = nin;
02848                   }
02849                   if (nmode[connectmat[jj]] == nout){
02850                     nmode[connectmat[jj]] = nin;
02851                   }
02852                 }
02853               else if (nin==0)
02854                 {
02855                   ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02856                   wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02857                   if (Min1(ww)>0)
02858                     {                                       
02859                       if (nout>0)
02860                         {
02861                           if (Sum(ww)==nout)
02862                             {                                               
02863                               wwi[connectmat[jj+3*connectmat[0]/4]]=nout;
02864                               for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02865                                 {
02866                                   bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02867                                 }
02868                             }
02869                           else
02870                             {
02871                               ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02872                               if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02873                               ind1[0]=1;
02874                               ind1[1]=-1;
02875                               badconnection(ind,0,0,ind1,0,0);
02876                               *ok=false;
02877                               if(ind) FREE (ind); 
02878                               if(ind1) FREE (ind1);
02879                               return 0;
02880                               }
02881                         }
02882                         else
02883                           {
02884                             wwi[connectmat[jj+3*connectmat[0]/4]]=Sum(ww);
02885                             for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02886                               {
02887                                 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02888                               }
02889                             *ok=false;
02890                           }
02891                     }
02892                   else
02893                     {
02894                       ind=FindInf(ww,0);
02895                       if ((nww=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02896                       nww[0]=ind[0];
02897                       for (j=1;j<ind[0]+1;j++)
02898                         {
02899                           nww[j]=ww[ind[j]]-ww[ind[1]];
02900                           }
02901                       if (Norm(nww)==0 && nout>0)
02902                         {
02903                           wwi[connectmat[jj+3*connectmat[0]/4]]=nout;
02904                           for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02905                               {
02906                                 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02907                               }                                           
02908                           ind1=FindSup(ww,0);
02909                           if ((nww1=(int*)MALLOC(sizeof(int)*(ind1[0]+1))) == NULL ) return 0;
02910                           nww1[0]=ind1[0];
02911                           for (j=1;j<ind1[0]+1;j++)
02912                             {
02913                               nww1[j]=ww[ind1[j]];
02914                             }
02915                           k1=nout-Sum(nww1);
02916                           k=k1/nww[0];
02917                           kint=(int) k;
02918                           FREE(nww1);
02919                           FREE(ind1);
02920                           if (k == (double) kint && k>0)
02921                             {
02922                               for (j=1;j<ind[0]+1;j++)
02923                                 {
02924                                   ww[ind[j]]=(int) k;
02925                                 }
02926                               for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02927                                 {
02928                                   bllst3[j]=ww[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02929                                 }
02930                             }
02931                           else
02932                             {
02933                               ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02934                               if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02935                               ind1[0]=1;
02936                               ind1[1]=-1;
02937                               badconnection(ind,0,0,ind1,0,0);
02938                               *ok=false;
02939                               if(ind) FREE (ind); 
02940                               if(ind1) FREE (ind1);
02941                               return 0; 
02942                             }
02943                         }
02944                       else
02945                         {
02946                           *ok=false;
02947                         }
02948                       FREE(ind);ind=NULL;
02949                       FREE(nww);
02950                     }
02951                     FREE(ww);ww=NULL;
02952                     FREE(wwi);wwi=NULL;
02953                 }                               
02954               else if (nout==0)
02955                 {
02956                   ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02957                   wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02958                   if (Min1(ww)>0)
02959                     {                                       
02960                       if (nin>0) 
02961                         {
02962                           if (Sum(ww)==nin)
02963                             {                                               
02964                               wwi[connectmat[jj+connectmat[0]/4]]=nin;
02965                               for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02966                                 {
02967                                   bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02968                                 }
02969                             }
02970                           else
02971                               {
02972                                 ind=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
02973                                 if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02974                                 ind1[0]=1;
02975                                 ind1[1]=-1;
02976                                 badconnection(ind,0,0,ind1,0,0);
02977                                 *ok=false;
02978                                 if(ind) FREE (ind); 
02979                                 if(ind1) FREE (ind1);
02980                                 return 0;
02981                               }
02982                         }
02983                       else
02984                         {
02985                           wwi[connectmat[jj+connectmat[0]/4]]=Sum(ww);
02986                           for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02987                             {
02988                               bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02989                             }
02990                           *ok=false;
02991                         }
02992                     }
02993                   else
02994                     {
02995                       ind=FindInf(ww,0);
02996                       if ((nww=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02997                       nww[0]=ind[0];
02998                       for (j=1;j<ind[0]+1;j++)
02999                         {
03000                           nww[j]=ww[ind[j]]-ww[ind[1]];
03001                         }
03002                       if (Norm(nww)==0 && nin>0)
03003                         {
03004                           wwi[connectmat[jj+connectmat[0]/4]]=nin;
03005                           for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
03006                             {
03007                               bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
03008                             }
03009                           ind1=FindSup(ww,0);
03010                           if ((nww1=(int*)MALLOC(sizeof(int)*(ind1[0]+1))) == NULL ) return 0;
03011                           nww1[0]=ind1[0];
03012                           for (j=1;j<ind1[0]+1;j++)
03013                             {
03014                               nww1[j]=ww[ind1[j]];
03015                             }
03016                           FREE(ind1);
03017                           k1=nin-Sum(nww1);
03018                           k=k1/nww[0];
03019                           FREE(nww1);
03020                           kint=(int)k;
03021                           if (k==(double) kint && k>0)
03022                             {
03023                               for (j=1;j<ind[0]+1;j++)
03024                                 {
03025                                   ww[ind[j]]= (int) k;
03026                                 }
03027                               for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03028                                 {
03029                                   bllst2[j]=ww[j-bllst2ptr[connectmat[jj]]+1];
03030                                 }
03031                             }
03032                           else
03033                             {
03034                               ind=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
03035                               if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
03036                               ind1[0]=1;
03037                               ind1[1]=-1;
03038                               badconnection(ind,0,0,ind1,0,0);
03039                               *ok=false;
03040                               if(ind) FREE (ind); 
03041                               if(ind1) FREE (ind1);
03042                               return 0;
03043                             }
03044                         }
03045                       else
03046                         {
03047                           *ok=false;
03048                         } 
03049                       if(ind) FREE(ind); ind=NULL;
03050                       if(nww) FREE(nww); nww=NULL;
03051                     }
03052                   
03053                   if(ww) FREE(ww); ww=NULL;
03054                   if(wwi) FREE(wwi); wwi=NULL;
03055                 }
03056               else
03057                 {
03058                   *ok=false;
03059                 }
03060             } /*fin de for jj */
03061           if (*ok) return 0;
03062         } /*  fin de for hh */
03063       Message("Not enough information to find port sizes, I try to find the problem");
03064       findflag=false;
03065       for (jj=1;jj<connectmat[0]/4+1;jj++)
03066         {
03067           ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03068           nout=ww[connectmat[jj+connectmat[0]/4]];
03069           FREE(ww);
03070           ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03071           nin=ww[connectmat[jj+3*connectmat[0]/4]];
03072           FREE(ww);
03073           if (nout<=0 && nin<=0)
03074             {
03075               findflag=true;
03076               ind1=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
03077               ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
03078               
03079               ninnout=connection(ind1,ind);
03080               if(ind1) FREE (ind1); 
03081               if(ind) FREE (ind); 
03082               if (!(ninnout)) 
03083                 {
03084                   *ok=false;
03085                   return 0;
03086                 }
03087               if (ninnout<=0) 
03088                 {
03089                   *ok=false;
03090                   return 0;
03091                 }
03092               wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03093               ww=FindEg(wwi,nout);
03094               for (j=1;j<ww[0]+1;j++)
03095                 {
03096                   wwi[ww[j]]=ninnout;
03097                 }
03098               for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
03099                 {
03100                   bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
03101                 }
03102               if(wwi) FREE(wwi);
03103               if(ww) FREE(ww);
03104               if (nzcross[connectmat[jj]] == nout){
03105                 nzcross[connectmat[jj]] = ninnout;
03106               }
03107               if (nmode[connectmat[jj]] == nout){
03108                 nmode[connectmat[jj]] = ninnout;
03109               }
03110               
03111               wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
03112               if (wwi)
03113                 {
03114                   ww=FindEg(wwi,nout);
03115                   if (ww)
03116                     {
03117                       for (j=1;j<ww[0]+1;j++)
03118                         {
03119                           wwi[ww[j]]=ninnout;
03120                         }
03121                       if(ww) FREE(ww);
03122                     }
03123                   for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03124                     {
03125                       bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
03126                     }                 
03127                   if(wwi) FREE(wwi);
03128                 }
03129               wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
03130               if (!wwi)
03131                 {
03132                   if ((wwi=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03133                   wwi[0]=0;
03134                 }
03135               ww=FindEg(wwi,0);
03136               wwi1=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03137               mini2=Min1(wwi1);
03138               
03139               if ((ww != NULL) && (mini2 > 0))
03140                 {
03141                   a=Sum(wwi1);
03142                   for (j=1;j<ww[0]+1;j++)
03143                     {
03144                       wwi[ww[j]]=a;
03145                     }
03146                   for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03147                     {
03148                       bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
03149                     }
03150                 }
03151               FREE(ww);ww=NULL;
03152               if(wwi1) FREE(wwi1);
03153               wwi1=NULL;
03154               if(wwi) FREE(wwi);
03155               wwi=NULL;
03156               
03157               wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03158               ww=FindEg(wwi,nin);
03159               for (j=1;j<ww[0]+1;j++)
03160                 {
03161                   wwi[ww[j]]=ninnout;
03162                 }
03163               for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03164                 {
03165                   bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
03166                 }
03167               if(wwi) FREE(wwi);
03168               if(ww) FREE(ww);
03169 
03170               if (nzcross[connectmat[jj+connectmat[0]/2]] == nin){
03171                 nzcross[connectmat[jj+connectmat[0]/2]] = ninnout;
03172               }
03173               if (nmode[connectmat[jj+connectmat[0]/2]] == nin){
03174                 nmode[connectmat[jj+connectmat[0]/2]] = ninnout;
03175               }
03176               wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
03177               if (wwi) 
03178                 {
03179                   ww=FindEg(wwi,nin);
03180                   if (ww)
03181                     {
03182                       for (j=1;j<ww[0]+1;j++)
03183                         {
03184                           wwi[ww[j]]=ninnout;
03185                         }
03186                       FREE(ww);
03187                       for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03188                         {
03189                           bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
03190                         }
03191                     }
03192                   
03193                   FREE(wwi);
03194                 }
03195               wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
03196               if (wwi)
03197                 {
03198                   ww=FindEg(wwi,0);
03199                   wwi1=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03200                   mini1=Min1(wwi1);
03201                   if (ww && (mini1 > 0))
03202                     {
03203                       a=Sum(wwi1);
03204                       for (j=1;j<ww[0]+1;j++)
03205                         {
03206                           wwi[ww[j]]=a;
03207                         }
03208                       for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03209                         {
03210                           bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
03211                         }
03212                     }
03213                   FREE(ww);ww=NULL;
03214                   FREE(wwi);wwi=NULL;
03215                   if (wwi1) FREE(wwi1);
03216                   wwi1=NULL;
03217                 }
03218             }
03219         }/* fin de for 2emme jj */
03220       if (!findflag )
03221         { 
03222           Message("I cannot find a link with undetermined size; My guess is that you have a block with unconnected; undetermined  output ports");
03223           *ok=false;
03224           return 0;
03225         }
03226     } /* fin de for hhjj */
03227   return 0;
03228 } /* end function */
03229 /* ======================================= endfunction adjust_inout ========================================== */
03230 
03231 /* **************************************** function pak_ersi **************************************************** */
03232 int pak_ersi(int** clkconnect,int* typ_r,int* typ_l,int* outoin,int* outoinptr,
03233               int* tblock,int* typ_cons,int* bllst5ptr,int** exe_cons,int nblk)
03234 {
03235   int *all_out,*ind,*ind1,*vec,*cll,*ii,*oo,*r,*clkconnectind,*cllind,*nd,*pp,*ppget;
03236   int mm,j,l,k,a,nnd,max1;
03237   Mat4C clkconnecti;
03238   Mat2C exe_consi;
03239   Mat2C all_outi;
03240   nd=ind=ind1=all_out=vec=cll=ii=oo=r=clkconnectind=cllind=ppget=NULL;
03241   *exe_cons=NULL;
03242   if ((all_out=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03243   all_out[0]=0;                       
03244   for (k=1;k<bllst5ptr[0];k++)
03245     {
03246       if (typ_l[k]!=1)
03247         {
03248           a=bllst5ptr[k+1]-bllst5ptr[k];
03249           if (a >= 1)
03250             {
03251               if ((all_out=(int*)REALLOC(all_out,sizeof(int)*(all_out[0]+2*a+1))) == NULL ) return 0;
03252               if ((all_outi.col1=(int*)MALLOC(sizeof(int)*(all_out[0]/2+a+1))) == NULL ) return 0;
03253               all_outi.col1[0]=all_out[0]/2+a;
03254               if ((all_outi.col2=(int*)MALLOC(sizeof(int)*(all_out[0]/2+a+1))) == NULL ) return 0;
03255               all_outi.col2[0]=all_out[0]/2+a;
03256               for(l=1;l<all_out[0]/2+1;l++)
03257                 {
03258                   all_outi.col1[l]=all_out[l];
03259                   all_outi.col2[l]=all_out[l+all_out[0]/2];
03260                 }
03261               for (j=1;j<a+1;j++)
03262                 {
03263                   all_outi.col1[all_out[0]/2+j]=k;
03264                   all_outi.col2[all_out[0]/2+j]=j;
03265                 }
03266               all_out[0]=2*all_outi.col1[0];
03267               for(l=1;l<all_out[0]/2+1;l++)
03268                 {
03269                   all_out[l]=all_outi.col1[l];
03270                   all_out[l+all_out[0]/2]=all_outi.col2[l];
03271                 }
03272               FREE(all_outi.col1); all_outi.col1=NULL;
03273               FREE(all_outi.col2); all_outi.col2=NULL;
03274             }
03275         }
03276     } 
03277   if ((all_outi.col1=(int*)MALLOC(sizeof(int)*(all_out[0]/2+2))) == NULL ) return 0;
03278   all_outi.col1[0]=all_out[0]/2+1;
03279   if ((all_outi.col2=(int*)MALLOC(sizeof(int)*(all_out[0]/2+2))) == NULL ) return 0;
03280   all_outi.col2[0]=all_out[0]/2+1;
03281   for(l=1;l<all_out[0]/2+1;l++)
03282     {
03283       all_outi.col1[l]=all_out[l];
03284       all_outi.col2[l]=all_out[l+all_out[0]/2];
03285     }
03286   all_outi.col1[all_out[0]/2+1]=0;
03287   all_outi.col2[all_out[0]/2+1]=0;
03288   if ((all_out=(int*)REALLOC(all_out,sizeof(int)*(2*all_outi.col1[0]+1))) == NULL ) return 0;
03289   all_out[0]=2*all_outi.col1[0];
03290   for(l=1;l<all_out[0]/2+1;l++)
03291     {
03292       all_out[l]=all_outi.col1[l];
03293       all_out[l+all_out[0]/2]=all_outi.col2[l];
03294     }
03295   FREE(all_outi.col1);
03296   all_outi.col1=NULL;
03297   FREE(all_outi.col2);
03298   all_outi.col2=NULL;
03299   
03300   ind=FindEg(tblock,1);
03301   if (!ind)
03302     {
03303       if ((ind=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03304       ind[0]=0;
03305     }
03306   for (j=1;j<ind[0]+1;j++)
03307     {
03308       k=ind[j];
03309       if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03310       clkconnecti.col1[0]=(*clkconnect)[0]/4+all_out[0]/2;
03311       if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03312       clkconnecti.col2[0]=(*clkconnect)[0]/4+all_out[0]/2;
03313       if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03314       clkconnecti.col3[0]=(*clkconnect)[0]/4+all_out[0]/2;
03315       if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03316       clkconnecti.col4[0]=(*clkconnect)[0]/4+all_out[0]/2;
03317       for(l=1;l<(*clkconnect)[0]/4+1;l++)
03318         {
03319           clkconnecti.col1[l]=(*clkconnect)[l];
03320           clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
03321           clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
03322           clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
03323         }
03324       for(l=1;l<all_out[0]/2+1;l++)
03325         {
03326           clkconnecti.col1[l+(*clkconnect)[0]/4]=all_out[l];
03327           clkconnecti.col2[l+(*clkconnect)[0]/4]=all_out[l+all_out[0]/2];
03328           clkconnecti.col3[l+(*clkconnect)[0]/4]=k;
03329           clkconnecti.col4[l+(*clkconnect)[0]/4]=0;
03330         }
03331       FREE(*clkconnect);
03332       if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
03333       (*clkconnect)[0]=4*clkconnecti.col1[0];
03334       for(l=1;l<(*clkconnect)[0]/4+1;l++)
03335         {
03336           (*clkconnect)[l]=clkconnecti.col1[l];
03337           (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
03338           (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
03339           (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
03340         }
03341       FREE(clkconnecti.col1);
03342       clkconnecti.col1=NULL;
03343       FREE(clkconnecti.col2);
03344       clkconnecti.col2=NULL;
03345       FREE(clkconnecti.col3);
03346       clkconnecti.col3=NULL;
03347       FREE(clkconnecti.col4);
03348       clkconnecti.col4=NULL;
03349     }/* fin de for k */
03350   FREE(all_out);all_out=NULL;
03351   ind1=FindEg(typ_cons,1);
03352   if (ind1)
03353     {
03354       if ((ind=(int*)REALLOC(ind,sizeof(int)*(ind[0]+ind1[0]+1))) == NULL ) return 0;
03355       pp=&ind[1+ind[0]];
03356       pp=memcpy(pp,&ind1[1],ind1[0]*sizeof(int));
03357       ind[0]=ind[0]+ind1[0];
03358       FREE(ind1); ind1=NULL;
03359     }
03360   if (((*exe_cons)=(int*)MALLOC(sizeof(int)*(2*ind[0]+1))) == NULL ) return 0;
03361   (*exe_cons)[0]=2*ind[0];
03362   for (j=1;j<ind[0]+1;j++)
03363     {
03364       (*exe_cons)[j]=ind[j];
03365       (*exe_cons)[j+ind[0]]=0;
03366     }
03367   if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
03368   vec[0]=nblk;
03369   Setmem(vec,-1);
03370   for (j=1;j<ind[0]+1;j++)
03371     {
03372       vec[ind[j]]=0;
03373     }
03374   nd=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03375   if (!nd)
03376     {
03377       if ((nd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03378       nd[0]=0;
03379     }
03380   max1=Max1(nd);
03381   FREE(nd);
03382   nnd=max1+1;
03383   if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
03384   nd[0]=nblk*nnd;
03385   
03386   tree4(vec,nd,nnd,outoin,outoinptr,typ_r,&r);
03387   if(nd) FREE(nd);
03388   if(vec) FREE(vec); vec=NULL;
03389   if (r)
03390     {  
03391       if ((exe_consi.col1=(int*)MALLOC(sizeof(int)*((*exe_cons)[0]/2+r[0]/2+1))) == NULL) return 0;
03392       
03393       if ((exe_consi.col2=(int*)MALLOC(sizeof(int)*(r[0]/2+(*exe_cons)[0]/2+1))) == NULL) return 0;
03394       exe_consi.col2[0]=(*exe_cons)[0]/2+r[0]/2;
03395       pp=&(exe_consi.col1)[1];
03396       pp=memcpy(pp,&(*exe_cons)[1],sizeof(int)*((*exe_cons)[0]/2));
03397       exe_consi.col1[0]=(*exe_cons)[0]/2+r[0]/2;
03398       pp=&(exe_consi.col2)[1];
03399       pp=memcpy(pp,&(*exe_cons)[(*exe_cons)[0]/2+1],sizeof(int)*((*exe_cons)[0]/2));
03400       pp=&(exe_consi.col1)[(*exe_cons)[0]/2+1];
03401       pp=memcpy(pp,&r[1],sizeof(int)*(r[0]/2));
03402       pp=&(exe_consi.col2)[(*exe_cons)[0]/2+1];
03403       pp=memcpy(pp,&r[1+r[0]/2],sizeof(int)*(r[0]/2));
03404       
03405       if (((*exe_cons)=(int*)REALLOC((*exe_cons),sizeof(int)*((*exe_cons)[0]+r[0]+1))) == NULL ) return 0;
03406       (*exe_cons)[0]=(*exe_cons)[0]+r[0];
03407       for(l=1;l<(*exe_cons)[0]/2+1;l++)
03408         {
03409           (*exe_cons)[l]=exe_consi.col1[l];
03410           (*exe_cons)[l+(*exe_cons)[0]/2]=exe_consi.col2[l];
03411         }
03412       FREE(exe_consi.col1);
03413       exe_consi.col1=NULL;
03414       exe_consi.col1=NULL;
03415       FREE(exe_consi.col2);
03416       exe_consi.col2=NULL;
03417       FREE(r); r=NULL;
03418     }
03419   if(ind) FREE(ind);
03420   
03421   mm=Max1(*clkconnect)+1;
03422   if ((cll=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
03423   cll[0]=(*clkconnect)[0]/4;
03424   for(j=1;j<cll[0]+1;j++)
03425     {
03426       cll[j]=-(*clkconnect)[j]*mm-(*clkconnect)[j+(*clkconnect)[0]/4];
03427     }
03428   if ((ind=(int*)MALLOC(sizeof(int)*(cll[0]+1))) == NULL ) return 0;
03429   ind[0]=cll[0];
03430   C2F(isort)(&cll[1],&cll[0],&ind[1]); 
03431   clkconnectind=VecEg1(*clkconnect);
03432   for(j=1;j<ind[0]+1;j++)
03433     {
03434       (*clkconnect)[j]=clkconnectind[ind[j]];
03435       (*clkconnect)[j+ind[0]]=clkconnectind[ind[j]+ind[0]];
03436       (*clkconnect)[j+2*ind[0]]=clkconnectind[ind[j]+2*ind[0]];
03437       (*clkconnect)[j+3*ind[0]]=clkconnectind[ind[j]+3*ind[0]];      
03438     }
03439   if(ind) FREE(ind);
03440   ind=NULL;
03441   if(clkconnectind) FREE(clkconnectind);
03442   clkconnectind=NULL;
03443   if ((cll=(int*)REALLOC(cll,sizeof(int)*((*clkconnect)[0]/4+3))) == NULL ) return 0;
03444   cll[0]=(*clkconnect)[0]/4+2;
03445   cllind=VecEg1(cll);
03446   for (j=2;j<cll[0]+1;j++)
03447     {
03448       cll[j]=-cllind[j-1];
03449     }   
03450   if(cllind) FREE(cllind);
03451   cllind=NULL;
03452   cll[1]=-1;
03453   cll[cll[0]]=mm;
03454   if ((vec=(int*)MALLOC(sizeof(int)*(cll[0]))) == NULL ) return 0;
03455   vec[0]=cll[0]-1;
03456   for (j=1;j<vec[0]+1;j++)
03457     {
03458       vec[j]=cll[j+1]-cll[j];
03459     }
03460   if(cll) FREE(cll);
03461   cll=NULL;
03462   ii=FindDif(vec,0);
03463   if(vec) FREE(vec);
03464   for (k=1;k<ii[0];k++)
03465     {
03466       if ((oo=(int*)MALLOC(sizeof(int)*(ii[k+1]-ii[k]+1))) == NULL ) return 0;
03467       oo[0]=ii[k+1]-ii[k];
03468       for (l=ii[k];l<ii[k+1];l++) 
03469         {
03470           oo[l-ii[k]+1]=l;
03471         }
03472       if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
03473       vec[0]=nblk;
03474       Setmem(vec,-1);
03475       for(j=1;j<oo[0]+1;j++)
03476         {
03477           vec[(*clkconnect)[oo[j]+(*clkconnect)[0]/2]]=0;
03478         }
03479       if (oo) FREE(oo); oo=NULL;
03480       ppget=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03481       if(!ppget)
03482         {
03483           if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03484           ppget[0]=0;
03485         }
03486       max1=Max1(ppget);
03487       if (ppget) FREE(ppget);
03488       ppget=NULL;
03489       nnd=max1+1;
03490       if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
03491       nd[0]=nblk*nnd;
03492       
03493       tree4(vec,nd,nnd,outoin,outoinptr,typ_r,&r);
03494       
03495       if (nd) FREE(nd); nd=NULL;
03496       if(vec) FREE(vec); vec=NULL;
03497       
03498       if (r)
03499         {
03500           if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03501           clkconnecti.col1[0]=(*clkconnect)[0]/4+r[0]/2;
03502           if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03503           clkconnecti.col2[0]=(*clkconnect)[0]/4+r[0]/2;
03504           if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03505           clkconnecti.col3[0]=(*clkconnect)[0]/4+r[0]/2;
03506           if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03507           clkconnecti.col4[0]=(*clkconnect)[0]/4+r[0]/2;
03508           for(l=1;l<(*clkconnect)[0]/4+1;l++)
03509             {
03510               clkconnecti.col1[l]=(*clkconnect)[l];
03511               clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
03512               clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
03513               clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
03514             }
03515           for(l=1;l<r[0]/2+1;l++)
03516             {     
03517               clkconnecti.col1[l+(*clkconnect)[0]/4]=(*clkconnect)[ii[k]];
03518               clkconnecti.col2[l+(*clkconnect)[0]/4]=(*clkconnect)[ii[k]+(*clkconnect)[0]/4];
03519               clkconnecti.col3[l+(*clkconnect)[0]/4]=r[l];
03520               clkconnecti.col4[l+(*clkconnect)[0]/4]=r[l+r[0]/2];
03521             }
03522           FREE(*clkconnect);
03523           if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
03524           (*clkconnect)[0]=4*clkconnecti.col1[0];
03525           for(l=1;l<(*clkconnect)[0]/4+1;l++)
03526             {
03527               (*clkconnect)[l]=clkconnecti.col1[l];
03528               (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
03529               (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
03530               (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
03531             }
03532           FREE(clkconnecti.col1);
03533           clkconnecti.col1=NULL;
03534           FREE(clkconnecti.col2);
03535           clkconnecti.col2=NULL;
03536           FREE(clkconnecti.col3);
03537           clkconnecti.col3=NULL;
03538           FREE(clkconnecti.col4);
03539           clkconnecti.col4=NULL;
03540           FREE(r); r=NULL;
03541         }
03542     }/* fin de for k */
03543   if(ii) FREE(ii);
03544   ii=NULL;
03545   
03546   return 0;
03547 }/* end function */
03548 /* ======================================= endfunction pak_ersi =================================================== */
03549 /* ************************************** function mini_extract_info ********************************************** */
03550 int mini_extract_info(int* bllst2,int** bllst4,char **bllst10,int* bllst12,int* bllst2ptr,int* bllst3ptr,int** bllst4ptr,
03551                       int* typ_x,int* connectmat,int* clkconnect,int** inplnk,int** outlnk,int** typ_l,int** typ_r,int** typ_m,
03552                       int** tblock,int** typ_cons,int** typ_zx,int* nzcross,int* ok)
03553 
03554 {
03555   int j,ptlnk,l,ko,ki,nbl=((int*)bllst10)[0];
03556   int *inpnum,*cinpnum,*bllst4i,*ind,*fff,*bllst4ptri;
03557   inpnum=cinpnum=bllst4i=ind=fff=bllst4ptri=NULL;
03558   *ok=true;     
03559   if ((fff=(int*)MALLOC(sizeof(int)*(nbl+1)))==NULL) return 0;
03560   fff[0]=nbl;   
03561   Setmem(fff,1);
03562   (*typ_l)=VecEg1(fff);
03563   (*typ_r)=VecEg1(fff);
03564   (*typ_cons)=VecEg1(fff);
03565   (*typ_m)=VecEg1(fff);
03566   (*typ_zx)=VecEg1(fff);
03567   (*tblock)=VecEg1(fff);
03568   if (fff) {FREE(fff);
03569   fff=NULL;}
03570   
03571   for(j=1;j<nbl+1;j++)
03572     {
03573       if ( !(typ_x[j]) && (nzcross[j] == 0)) (*typ_zx)[j]=0;
03574       bllst4ptri=VecEg1(*bllst4ptr);
03575       inpnum=GetPartVect(bllst2,bllst2ptr[j],bllst2ptr[j+1]-bllst2ptr[j]);
03576       cinpnum=GetPartVect(*bllst4,(*bllst4ptr)[j],(*bllst4ptr)[j+1]-(*bllst4ptr)[j]);
03577       if (cinpnum == NULL)
03578         {
03579           ok= false;
03580           ((int*)(*typ_r))[j]=!(bllst12[j+bllst12[0]/2]);
03581           ((int*)(*tblock))[j]=bllst12[j+bllst12[0]/2];
03582           if(!(bllst12[j+bllst12[0]/2]))
03583             {
03584               if (inpnum)
03585                 {
03586                   if ((cinpnum=(int*)MALLOC(sizeof(int)*(inpnum[0]+1))) == NULL) return 0;
03587                   cinpnum[0]=inpnum[0]; 
03588                   Setmem(cinpnum,1);
03589                   bllst4i=VecEg1(*bllst4);
03590                   if (((*bllst4)=(int*)REALLOC((*bllst4),sizeof(int)*((*bllst4)[0]+cinpnum[0]+1))) == NULL ) return 0;
03591                   (*bllst4)[0]=(*bllst4)[0]+cinpnum[0];
03592                   for(l=j+1;l<(*bllst4ptr)[0]+1;l++) (*bllst4ptr)[l]=bllst4ptri[l]+cinpnum[0];
03593                   
03594                   for (l=(*bllst4ptr)[1];l<(*bllst4ptr)[j];l++)
03595                     {
03596                       (*bllst4)[l]=bllst4i[l];
03597                     }
03598                   for (l=1;l<cinpnum[0]+1;l++)
03599                     {
03600                       (*bllst4)[l+(*bllst4ptr)[j]-1]=cinpnum[l];
03601                     }
03602                   for (l=(*bllst4ptr)[j+1];l<(*bllst4ptr)[(*bllst4ptr)[0]];l++)
03603                     {
03604                       (*bllst4)[l]=bllst4i[l-cinpnum[0]];
03605                     }
03606                   if (bllst4i) FREE(bllst4i);
03607                 }
03608             }
03609         } /* if cin */
03610       else
03611         {
03612           (*tblock)[j]=bllst12[j+bllst12[0]/2];
03613           (*typ_r)[j]=false;
03614         }       
03615       (*typ_l)[j]=*(bllst10[j]) == 'l';
03616       (*typ_m)[j]=*(bllst10[j]) == 'm';
03617       (*typ_cons)[j]=((cinpnum==NULL)&&(inpnum==NULL)&&(!bllst12[j+bllst12[0]/2]));
03618       if(bllst4ptri) FREE(bllst4ptri);
03619       if (inpnum) FREE(inpnum);
03620       if (cinpnum) FREE(cinpnum);
03621     } /* fin de for j */
03622   
03623   if (((*inplnk)=(int*)CALLOC(bllst2ptr[bllst2ptr[0]],sizeof(int))) == NULL) return 0;
03624   (*inplnk)[0]=bllst2ptr[bllst2ptr[0]]-1;       
03625   if (((*outlnk)=(int*)CALLOC(bllst3ptr[bllst3ptr[0]],sizeof(int))) == NULL) return 0;
03626   (*outlnk)[0]=bllst3ptr[bllst3ptr[0]]-1;       
03627   ptlnk=1;
03628   for (j=1;j<connectmat[0]/4+1;j++)
03629     {
03630       ko=(*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1];
03631       ki=(*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1];
03632       if (ko!=0 && ki!=0)
03633         {
03634           if (ko>ki)
03635             {
03636               ind=FindSup(*outlnk,ko);
03637               for (l=1;l<ind[0]+1;l++)
03638                 {
03639                   (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
03640                 }
03641               if(ind) FREE(ind); ind=NULL;
03642               ind=FindEg(*outlnk,ko);
03643               for (l=1;l<ind[0]+1;l++)
03644                 {
03645                   (*outlnk)[ind[l]]=ki;
03646                 }
03647 
03648               if(ind) FREE(ind);ind=NULL;
03649               ind=FindSup(*inplnk,ko);
03650               for (l=1;l<ind[0]+1;l++)
03651                 {
03652                   (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
03653                 }
03654               if (ind) FREE(ind);ind=NULL;
03655               ind=FindEg(*inplnk,ko);
03656               for (l=1;l<ind[0]+1;l++)
03657                 {
03658                   (*inplnk)[ind[l]]=ki;
03659                 }
03660               ptlnk--;
03661               if(ind) FREE(ind); ind=NULL;
03662             } /* fin du 2i f */
03663           else if (ki>ko)
03664             {
03665               ind=FindSup(*outlnk,ki);
03666               for (l=1;l<ind[0]+1;l++)
03667                 {
03668                   (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
03669                 }
03670               if(ind) FREE(ind); ind=NULL;
03671               ind=FindEg(*outlnk,ki);
03672               for (l=1;l<ind[0]+1;l++)
03673                 {
03674                   (*outlnk)[ind[l]]=ko;
03675                 }
03676              if(ind) FREE(ind); ind=NULL;
03677              ind=FindSup(*inplnk,ki);
03678              for (l=1;l<ind[0]+1;l++)
03679                {
03680                  (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
03681                }
03682              if (ind) FREE(ind); ind=NULL;
03683              ind=FindEg(*inplnk,ki);
03684              for (l=1;l<ind[0]+1;l++)
03685                {
03686                  (*inplnk)[ind[l]]=ko;
03687                }
03688              ptlnk--;
03689              if (ind) FREE(ind); ind=NULL;
03690             }
03691         } /*fin du 1 if */
03692       else if (ko!=0)
03693         {
03694           (*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1]=ko;
03695         }
03696       else if (ki!=0)
03697         {
03698           (*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1]=ki;
03699         }
03700       else 
03701         {
03702           (*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1]=ptlnk;
03703           (*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1]=ptlnk;
03704           ptlnk++;
03705         }
03706     } /* fin du 2 emme for j */
03707   ind=FindEg(*outlnk,0);
03708   if (ind)
03709     { 
03710       ko=Max1(*outlnk);
03711       for (j=1;j<ind[0]+1;j++)
03712         {
03713           (*outlnk)[ind[j]]=ko+1;
03714         }   
03715       FREE(ind);ind=NULL;
03716     }   
03717   
03718   return 0;
03719 } /* fin de function */
03720 /* ======================================= endfunction mini_extract_info =================================================== */
03721 /* *************************************** function synch_clkconnect ******************************************************* */
03722 int synch_clkconnect(int* typ_s,int* clkconnect,int** evoutoin,int** evoutoinptr)
03723 {
03724   int *dd,*ind,*ppget;
03725   register  int j,l;
03726   ind=NULL;
03727   dd=NULL;
03728   ppget=NULL;
03729   if (((*evoutoin)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03730   (*evoutoin)[0]=0;
03731   if (((*evoutoinptr)=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
03732   (*evoutoinptr)[0]=1;
03733   (*evoutoinptr)[1]=1;
03734   for (j=1;j<typ_s[0]+1;j++)
03735     {
03736       if (typ_s[j])
03737         {
03738           
03739           ppget=GetPartVect(clkconnect,1,clkconnect[0]/4);
03740           ind=FindEg(ppget,j);
03741           if (ppget)FREE(ppget); ppget=NULL;
03742           if (ind) 
03743             {
03744               if ((dd=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
03745               dd[0]=ind[0];
03746               for(l=1;l<ind[0]+1;l++)
03747                 {
03748                   dd[l]=clkconnect[ind[l]+clkconnect[0]/2];
03749                 }
03750               FREE(ind); ind=NULL;
03751               if (!dd) 
03752                 {
03753                   if ((dd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03754                   dd[0]=0;
03755                 }
03756             }    
03757         }
03758       else 
03759         {
03760           if ((dd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03761           dd[0]=0;
03762         }
03763               
03764       if (((*evoutoin)=(int*)REALLOC((*evoutoin),sizeof(int)*((*evoutoin)[0]+dd[0]+1))) == NULL ) return 0;
03765       if (((*evoutoinptr)=(int*)REALLOC((*evoutoinptr),sizeof(int)*((*evoutoinptr)[0]+2))) == NULL ) return 0;
03766       for(l=1;l<dd[0]+1;l++)
03767         {
03768           (*evoutoin)[l+(*evoutoin)[0]]=dd[l];
03769         }
03770       
03771       (*evoutoinptr)[(*evoutoinptr)[0]+1]=(*evoutoinptr)[(*evoutoinptr)[0]]+dd[0];
03772       (*evoutoin)[0]=(*evoutoin)[0]+dd[0];
03773       (*evoutoinptr)[0]++;
03774       FREE(dd); dd=NULL;      
03775     }
03776   
03777   return 0;
03778 } /* fin de function */
03779 /* ======================================= endfunction synch_clkconnect ===================================================== */
03780 /* *************************************** function cleanup ******************************************************* */
03781 int cleanup(int** clkconnect)
03782 {
03783   int a,i,mm,j,*ind,*vec,*clkconnectind,val=0;
03784   double *cc;
03785   ind=vec=NULL;
03786   cc=NULL;
03787   mm=Max1(*clkconnect)+1;
03788   if ((cc=(double*)MALLOC(sizeof(double)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
03789   a=(*clkconnect)[0]/4;
03790   cc[0]=a;
03791   for (j=1;j<(*clkconnect)[0]/4+1;j++)
03792     {
03793       cc[j]=-(*clkconnect)[j+3*(*clkconnect)[0]/4]-mm*(*clkconnect)[j+(*clkconnect)[0]/2]-power(mm,2)*(*clkconnect)[j+(*clkconnect)[0]/4]-(double) power(mm,3)*(*clkconnect)[j];
03794     }
03795   if ((ind=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
03796   ind[0]=a;
03797   C2F(dsort)(&cc[1],&a,&ind[1]);
03798   clkconnectind=VecEg1(*clkconnect);
03799   for(j=1;j<ind[0]+1;j++)
03800     {
03801       (*clkconnect)[j]=clkconnectind[ind[j]];
03802       (*clkconnect)[j+ind[0]]=clkconnectind[ind[j]+ind[0]];
03803       (*clkconnect)[j+2*ind[0]]=clkconnectind[ind[j]+2*ind[0]];
03804       (*clkconnect)[j+3*ind[0]]=clkconnectind[ind[j]+3*ind[0]];      
03805     }
03806   FREE(clkconnectind); clkconnectind=NULL;
03807   if(ind) FREE(ind);ind=NULL;
03808   if ((vec=(int*)MALLOC((size_t) (sizeof(int)*(cc[0])))) == NULL ) return 0;
03809   vec[0]=(int) cc[0]-1;
03810   for (j=1;j<vec[0]+1;j++)
03811     {
03812       vec[j]=(int) (cc[j+1]-cc[j]);
03813     }
03814   if(cc) FREE(cc); cc=NULL;
03815   ind=FindEg(vec,0);
03816   if(vec) FREE(vec); vec=NULL;
03817   if (ind)
03818     {
03819       for(j=1;j<ind[0]+1;j++)
03820         {
03821           (*clkconnect)[ind[j]]=-4321;
03822           (*clkconnect)[ind[j]+(*clkconnect)[0]/4]=-4321;
03823           (*clkconnect)[ind[j]+(*clkconnect)[0]/2]=-4321;
03824           (*clkconnect)[ind[j]+3*(*clkconnect)[0]/4]=-4321;
03825         }
03826       for(i=1;i<(*clkconnect)[0]+1;i++)
03827         {
03828           if( (*clkconnect)[i]!=-4321 )  (*clkconnect)[i-val]=(*clkconnect)[i];
03829           else
03830             val++;
03831         }
03832       (*clkconnect)[0]=(*clkconnect)[0]-4*ind[0];
03833       FREE(ind); ind=NULL;
03834     }
03835   
03836   return 0;
03837 } /* end function */
03838 /* ======================================= endfunction cleanup ===================================================== */
03839 /* *************************************** function init_agenda ******************************************************* */
03840 int init_agenda(double* initexe,int* bllst5ptr,double** tevts,int** evtspt,int* pointi)
03841 {
03842   int nblk,j,ninit,nevts;
03843   int *indtime,a;
03844   double *timevec,*initexeind,*pp;
03845   initexeind=NULL;
03846   timevec=NULL;
03847   indtime=NULL;
03848   nblk=bllst5ptr[0]-1;
03849   timevec=GetPartVectd(initexe,2*((int) initexe[0])/3+1,(int) initexe[0]/3);
03850   if ( timevec )
03851     {
03852       Invd(timevec);
03853       a=(int) timevec[0];
03854       if ((indtime=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
03855       indtime[0]=a;
03856       C2F(dsort)(&timevec[1],&a,&indtime[1]);
03857       if ((initexeind=(double*)MALLOC(sizeof(double)*((int) initexe[0]+1))) == NULL ) return 0; 
03858       initexeind[0]=(int) initexe[0];
03859       pp=&initexeind[1];
03860       pp=memcpy(pp,&initexe[1],sizeof(double)*((int) initexe[0]));
03861       for(j=1;j<indtime[0]+1;j++)
03862         {
03863           initexe[j]=initexeind[indtime[j]];
03864           initexe[j+(int) initexeind[0]/3]=initexeind[indtime[j]+(int) initexeind[0]/3];
03865           initexe[j+2* (int) initexeind[0]/3]=initexeind[indtime[j]+2* (int) initexeind[0]/3];
03866         }
03867       if(initexeind) FREE(initexeind);
03868       if(indtime) FREE(indtime);
03869       FREE(timevec);
03870       ninit=(int) initexe[0]/3;
03871     }
03872   else {initexe=NULL;ninit=0;}
03873   
03874   *pointi=0;
03875   nevts=bllst5ptr[nblk+1]-1;
03876   if (((*tevts)=(double*)CALLOC((nevts+1),sizeof(double))) == NULL) return 0 ;
03877   ((*tevts)[0])=nevts;
03878   if ( initexe != NULL)
03879     {
03880       for (j=1;j<ninit+1;j++)
03881         {
03882           (*tevts)[bllst5ptr[(int) initexe[j]]+(int) initexe[j+ninit]-1]=initexe[j+2*ninit];
03883         }
03884     }
03885   if (((*evtspt)=(int*)MALLOC(sizeof(int)*(nevts+1))) == NULL) return 0 ;
03886   (*evtspt)[0]=nevts;
03887   Setmem(*evtspt,-1);
03888   if ( ninit > 0 )
03889     {
03890       *pointi=bllst5ptr[(int) initexe[1]]+(int) initexe[1+ninit]-1;
03891       (*evtspt)[*pointi]=0;
03892     }
03893   if ( ninit > 1 )
03894     {
03895       for (j=1;j<ninit;j++)
03896         {
03897           (*evtspt)[bllst5ptr[(int) initexe[j]]+(int) initexe[j+ninit]-1]=bllst5ptr[(int) initexe[j+1]]+(int) initexe[j+1+ninit]-1;
03898         }
03899       (*evtspt)[bllst5ptr[(int) initexe[ninit]]+(int) initexe[ninit+ninit]-1]=0;
03900     }
03901   return 0;
03902 } /* end function */
03903 /* ======================================= endfunction init_agenda ===================================================== */
03904 /********************** function tree4 *********************************************/
03905 int tree4(int* vec,int* nd,int nnd,int* outoin,int* outoinptr,int* typ_r,int** r)
03906 {
03907   int i,j,fini=0,k,ii,*ind,*ind1,l,nb=vec[0];
03908   Mat2C ri;
03909   if ((*r=(int*)MALLOC(sizeof(int))) == NULL) return 0 ;
03910   (*r)[0]=0;
03911   ind=GetPartVect(outoin,1,outoin[0]/2);
03912   ind1=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03913   for (j = 1 ; (j < nb) &&  (! fini); j++)
03914     {
03915       fini=1;
03916       for (i=1;i<nb+1;i++)
03917         {
03918           if (vec[i] > -1)
03919             {
03920               if (outoinptr[i+1]-outoinptr[i] !=0){
03921               for (k=outoinptr[i];k<outoinptr[i+1];k++)
03922                 {                 
03923                   ii=ind[k];
03924                   if(typ_r[ii] == 1)
03925                     {
03926                       if(nd[ind1[k]+1+(ii-1)*nnd] == 0){
03927                       if ((ri.col1=(int*)MALLOC(sizeof(int)*((*r)[0]/2+2))) == NULL ) return 0;
03928                       ri.col1[0]=(*r)[0]/2+1;
03929                       if ((ri.col2=(int*)MALLOC(sizeof(int)*((*r)[0]/2+2))) == NULL ) return 0;
03930                       ri.col2[0]=(*r)[0]/2+1;
03931                       for(l=1;l<(*r)[0]/2+1;l++)
03932                         {
03933                           ri.col1[l]=(*r)[l];
03934                           ri.col2[l]=(*r)[l+(*r)[0]/2];
03935                         }
03936                       ri.col1[(*r)[0]/2+1]=ind[k];
03937                       ri.col2[(*r)[0]/2+1]=ind1[k];
03938                       FREE(*r);
03939                       if ((*r=(int*)MALLOC(sizeof(int)*(2*ri.col1[0]+1))) == NULL ) return 0;
03940                       (*r)[0]=2*ri.col1[0];
03941                       for(l=1;l<(*r)[0]/2+1;l++)
03942                         {
03943                           (*r)[l]=ri.col1[l];
03944                           (*r)[l+(*r)[0]/2]=ri.col2[l];
03945                         }
03946                       FREE(ri.col1);
03947                       ri.col1=NULL;
03948                       FREE(ri.col2);
03949                       ri.col2=NULL;
03950                       vec[ii]=0;
03951                       fini=0;
03952                       nd[ind1[k]+1+(ii-1)*nnd]=1;
03953                       }
03954                     } /* fin de if(typ_r)                 */
03955                 } /* fin de for k*/
03956               } /*fin de if*/
03957             } /* fin de if vec(i)*/
03958         } /* fin de for i*/
03959     } /* fin de for j*/
03960   if ((*r)[0]==0) 
03961     {
03962       FREE(*r);
03963       *r=NULL;
03964     }
03965   FREE(ind1);
03966   ind1=NULL;
03967   FREE(ind);
03968   ind=NULL;
03969   
03970   return 0;
03971 } /* end function*/
03972 
03973 /* =================== endfunction tree4 ========================================== */
03974 /************************* function tree2 *********************************/
03975 int tree2(vect, nb, wec, ind, deput, outoin, outoinptr, ord, ok)
03976 int *vect,nb,*wec,*ind,*deput,*outoin,*outoinptr,**ord,*ok;
03977 {
03978   int fini=0,i,j,k,m,ii,*ord1,n;
03979   ord1=NULL;
03980   *ok = 1;
03981   for (j = 1; (j <= nb+2) && (! fini); ++j) 
03982     {
03983       fini = 1;
03984       for (i = 1; i <= nb; ++i) 
03985         {
03986           if (vect[i] == j - 1) 
03987             {
03988               if (j == nb + 2) 
03989                 {
03990                   *ok = 0;
03991                   *ord=NULL;
03992                   return 0;
03993                 }
03994               if (outoinptr[ind[i] + 1] - outoinptr[ind[i]] != 0) 
03995                 {                 
03996                   for (k = outoinptr[ind[i]]; k <= outoinptr[ind[i] + 1] - 1; ++k) 
03997                     {
03998                       ii = outoin[k];
03999                       for (n = 1; n <= nb; ++n)
04000                         {
04001                           if (ind[n] == ii   && vect[n] > -1 && deput[ii] == 1) 
04002                             {
04003                               fini = 0;
04004                               vect[n] = j;
04005                             }
04006                         }
04007                     }
04008                 }
04009             }
04010         }
04011     }
04012   Inv(vect);  
04013   if ((ord1=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return 0;
04014   ord1[0]=vect[0];
04015   C2F(isort)(&vect[1],&vect[0],&ord1[1]);
04016   if ((*ord=(int*)MALLOC(sizeof(int)*(2*nb+1))) == NULL ) return 0;
04017   (*ord)[0]=2*nb;
04018   for(m=1 ; m <= nb; ++m)
04019     {
04020       (*ord)[m]=ind[ord1[m]];
04021       (*ord)[m+nb]=wec[ord1[m]];
04022     }
04023   if(ord1) FREE(ord1);
04024   ord1=NULL;
04025   return 0;
04026 } 
04027 /* ===========================================   fin de tree2 ======================================== */ 
04028 /* ********************************************** function tree3 ***************************************** */
04029 int tree3(vec, nb, deput, typl, bexe, boptr, blnk, blptr,ord, ok)
04030      int *vec,nb,*deput,*typl,*bexe,*boptr,*blnk,*blptr,**ord,*ok;
04031 {
04032   int fini,i,l,j,m,nkk,*w,kk,*ind;
04033   
04034   w=NULL;
04035   *ok = 1;
04036   for( i= 1; i <= nb; ++i)
04037     {
04038       if ((vec[i] == 0) && (typl[i] == 1)) vec[i]=1; 
04039     }
04040   fini=0;
04041   for (j = 1; (j <= nb+2) &&(! fini); ++j) 
04042     {
04043       fini = 1;
04044       if (j == nb + 2) 
04045         {
04046           *ok = 0;
04047           *ord = NULL;
04048           return 0;
04049         }
04050       
04051       for (i = 1; i <= nb; ++i) 
04052         {
04053           if (vec[i] > -1 && typl[i] != -1) 
04054             {
04055               if (typl[i] == 1) 
04056                 {
04057                   nkk = boptr[i + 1] - boptr[i];
04058                   if (nkk != 0) 
04059                     {
04060                       for (m = 1; m <= nkk; ++m) 
04061                         {
04062                           kk = bexe[m + boptr[i] - 1];
04063                           if (typl[kk] == 1) 
04064                             {
04065                               if (vec[kk] < vec[i]+2)
04066                                 {
04067                                   fini=0;
04068                                   vec[kk]=vec[i]+2;
04069                                 }
04070                             }
04071                           else
04072                             {
04073                               if (vec[kk] < vec[i]+1)
04074                                 {
04075                                   fini=0;
04076                                   vec[kk]=vec[i]+1;
04077                                 } 
04078                             }
04079                         }
04080                     }
04081                 } 
04082               else 
04083                 {
04084                   nkk = blptr[i+1]-blptr[i];
04085                   if (nkk != 0) 
04086                     {
04087                       for (m = 1; m <= nkk; ++m) 
04088                         {
04089                           kk = blnk[m+blptr[i]-1];
04090                           if (vec[kk] > -1 && (deput[kk] == 1 || typl[kk] == 1)) 
04091                             {
04092                               if (vec[kk] < vec[i])
04093                                 {
04094                                   fini=0;
04095                                   vec[kk]=vec[i];
04096                                 }
04097                             }
04098                         }
04099                     }
04100                 }
04101             }
04102           
04103         }
04104     }
04105   Inv(vec);
04106   if ((ind=(int*)MALLOC(sizeof(int)*(vec[0]+1))) == NULL ) return 0;
04107   ind[0]=vec[0];
04108   C2F(isort)(&vec[1],&vec[0],&ind[1]);
04109   w=FindDif(vec,1);
04110   if (((*ord)=(int*)MALLOC(sizeof(int)*(w[0]+1))) == NULL) return 0;
04111   (*ord)[0]=w[0];
04112   for (l= 1; l<w[0]+1;l++)
04113     {
04114       (*ord)[l]=ind[w[l]];
04115     }
04116   FREE(w); w=NULL;
04117   FREE(ind); ind=NULL;
04118   return 0;
04119 }
04120 /*===========================================   fin de tree3 ======================================== */
04121 
04122 
04123 /***************************************************************/
04124 /*    fonctions de gestions des matrices vecteurs             */ 
04125 /*************************************************************/
04126 
04127 int* GetCollVect(int* vect,int* vectid,int numcoll)
04128 {
04129   int *vectr;
04130   int i;
04131   if ((vectr=(int*)MALLOC(sizeof(int)*(vectid[0]+1))) == NULL ) return (int*) NULL;
04132   vectr[0]=vectid[0];
04133 
04134   for(i=1;i<vectid[0]+1;i++)
04135     {
04136       vectr[i]=vect[vectid[i]+vect[0]*(numcoll-1)/4];
04137     }
04138   return (int*) vectr;
04139 }
04140 
04141 int* FindDif(int* vect,int val)
04142 {
04143   int *vectr,i,j=1;
04144   if (vect[0]==0) return NULL;
04145   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04146   for(i=1; i<vect[0]+1;i++)
04147     {
04148        if(vect[i]!=val) vectr[j++]=i;
04149     }
04150   vectr[0]=j-1;
04151   return (int*) vectr;
04152 }
04153 
04154 int* FindEg(int* vect,int val)
04155 {     
04156   int *vectr,i,j=1;
04157   if (vect[0]==0) return NULL;
04158   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04159   for(i=1; i<vect[0]+1;i++)
04160     {
04161       if(vect[i]==val) vectr[j++]=i;
04162     }
04163   vectr[0]=j-1;
04164   return (int*) vectr; 
04165 }
04166 
04167 int* FindSupEgd(double* vect,int val)
04168 {     
04169   int *vectr;
04170   register int i,j=1;
04171   if (vect[0]==0) return NULL;
04172   if ((vectr=(int*)MALLOC(sizeof(int)*((int) vect[0]+1))) == NULL ) return (int*) NULL;
04173   for(i=1; i<vect[0]+1;i++)
04174     {
04175       if((int) vect[i]>=val) vectr[j++]=i;
04176     }
04177   vectr[0]=j-1;
04178   return (int*) vectr; 
04179 
04180 }
04181 
04182 int* GetPartVect(int* vect,int idebut,int taille)
04183 {
04184   int *vectr,*p;
04185   if (taille < 1) return (int*) NULL;
04186   if ((vectr=(int*)MALLOC(sizeof(int)*(taille+1))) == NULL ) return (int*) NULL;
04187   vectr[0]=taille;
04188   p=&vectr[1];
04189   p=memcpy(p,&vect[idebut],sizeof(int)*taille);
04190   return (int*) vectr;
04191 }
04192 
04193 double* GetPartVectd(double* vect,int idebut,int taille)
04194 {
04195   double *vectr,*p;
04196   if (taille < 1) return (double*) NULL;
04197   if ((vectr=(double*)MALLOC(sizeof(double)*(taille+1))) == NULL ) return (double*) NULL;
04198   vectr[0]=taille;
04199   p=&vectr[1];
04200   p=memcpy(p,&vect[idebut],sizeof(double)*taille);
04201   return (double*) vectr;
04202 }
04203 
04204 int* Duplicataa(v,w)
04205      int *v,*w;
04206 {
04207   register int i,j,k;
04208   int *ww;
04209   register int pp;
04210   k=1;
04211   if ((ww=(int*)MALLOC(sizeof(int))) == NULL ) return (int*) NULL;
04212   ww[0]=0;
04213   for (i=1;i<v[0]+1;i++) 
04214     {
04215       if (w[i]!=0)
04216         {
04217           if ((ww=(int*)REALLOC(ww,sizeof(int)*(w[i]+ww[0]+1))) == NULL ) return (int*) NULL;
04218           ww[0]=ww[0]+w[i];
04219           pp=v[i];
04220           for (j=1;j<w[i]+1;j++) 
04221             {
04222               ww[k]=pp;
04223               k++;
04224             }
04225         }
04226     }
04227   return (int*) ww;
04228 }
04229 
04230 int power (int base, int n) 
04231 {
04232   register int i,p;        
04233   p = 1;
04234   for (i = 1; i <= n; i++)
04235     p *= base;
04236   return p;
04237 }
04238 
04239 double powerd (double base, int n) 
04240 {
04241   int i;
04242   double p;        
04243   p = 1;
04244  
04245   if ( n < 0 ) 
04246     {
04247       base = 1/base;
04248       n=-n;
04249     }
04250   for (i = 1; i <= n; i++)
04251     p *= base;
04252   return (double) p;
04253 }
04254 
04255 int* FindInfEg(int* vect,int val)
04256 {  
04257   int *vectr;
04258   register int i,j=1;
04259   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04260   for(i=1; i<vect[0]+1;i++)
04261     {
04262       if(vect[i]<=val) vectr[j++]=i;
04263     }
04264   vectr[0]=j-1;
04265   return (int*) vectr;
04266 }
04267 
04268 int* FindInf(int* vect,int val)
04269 {  
04270   int *vectr;
04271   register int i,j=1;
04272   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04273   for(i=1; i<vect[0]+1;i++)
04274     {
04275       if(vect[i]<val) vectr[j++]=i;
04276     }
04277   vectr[0]=j-1;
04278   return (int*) vectr;
04279 }
04280 
04281 int* FindSup(int* vect,int val)
04282 {
04283   int *vectr;
04284   register int i,j=1;
04285   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04286   for(i=1; i<vect[0]+1;i++)
04287     {
04288       if(vect[i]>val) vectr[j++]=i;
04289     }
04290   vectr[0]=j-1;
04291   return (int*) vectr;
04292 }
04293 
04294 int Sum (int *vect) 
04295 {
04296   int i,sum=0; 
04297   for (i = 1; i <= vect[0]; i++)
04298     {
04299       sum+=vect[i];
04300     }
04301   return sum;
04302 }
04303 
04304 int Norm (int *vect) 
04305 {
04306   int i,sum=0; 
04307   for (i = 1; i <= vect[0]; i++)
04308     {
04309       if(vect[i]>=0) {
04310         sum+=vect[i];
04311       }else{
04312         sum+=-vect[i];
04313       }
04314     }
04315   return sum;
04316 }
04317 
04318 void CumSum (int* vect) 
04319 {
04320   int i;        
04321   for (i = 2; i <= vect[0]; i++)
04322     {
04323       vect[i]+=vect[i-1];
04324     }
04325 }
04326 
04327 
04328 
04329 int* VecEg1 (int* vect) 
04330 {  
04331   int *vectr;        
04332   if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04333   vectr=memcpy(vectr,vect,(vect[0]+1)*sizeof(int));
04334   return (int*) vectr;
04335 }
04336 
04337 void Setmem (int* vect,int val) 
04338 {   
04339   int j;        
04340   for (j = 1; j <= vect[0]; j++)
04341     {
04342       vect[j]=val;
04343     }
04344 }
04345 
04346 void Inv(int* vect) 
04347 {
04348   int i;   
04349   for(i=1;i<vect[0]+1;i++)
04350     {
04351       vect[i]=-vect[i];
04352     }
04353 }
04354 
04355 void Incr2(int* vect,int j) 
04356 {
04357   int i;        
04358   for (i = j; i <= vect[0]/2-1; i++)
04359     {
04360       vect[i]=vect[i+1];
04361       vect[i+vect[0]/2]=vect[i+1+vect[0]/2];      
04362     }
04363   vect[0]=vect[0]-2;
04364 }
04365 void Invd(double* vect) 
04366 {
04367   int i;   
04368   for(i=1;i<(int) vect[0]+1;i++)
04369     {
04370       vect[i]=-vect[i];
04371     }
04372 }
04373 void Incr1(int* vect,int j) 
04374 {
04375   int i;        
04376   for (i = j; i <= vect[0]-1; i++)
04377     {
04378       vect[i]=vect[i+1];
04379     }
04380   vect[0]--;
04381 }
04382 
04383 
04384 

Generated on Sun Mar 4 15:03:59 2007 for Scilab [trunk] by  doxygen 1.5.1