Back to index

salome-med  6.5.0
MEDfam2groB.cxx
Go to the documentation of this file.
00001 /*************************************************************************
00002 * COPYRIGHT (C) 1999 - 2002  EDF R&D
00003 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
00004 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
00005 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
00006 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
00007 *  
00008 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
00009 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
00010 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
00011 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
00012 *
00013 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
00014 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
00015 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
00016 *
00017 *************************************************************************/
00018 
00019 
00020 #include <stdio.h>
00021 #include <stdlib.h>
00022 #include <string.h>
00023 #include "med.hxx"
00024 
00025 /***********************************************************************
00026  * FONCTION MEDfam2groB
00027  * 
00028  * - DESCRIPTION : 2e etape dans la conversion des familles MED en 
00029  *      groupes de noeuds et d'elements. Les tables allouees a partir
00030  *      des parametres calcules par MEDfam2groA() sont passees en argument
00031  *      a MEDfam2groB et remplies par cette derniere fonction.
00032  *      Il s'agit de :
00033  *      1 - la table des noms de groupes de noeuds, chaque nom ayant
00034  *          une taille de MED_TAILLE_LNOM
00035  *      2 - la table des noms des groupes d'elements
00036  *      3 - la table des groupes de noeuds -i.e. pour chaque groupe
00037  *          la liste des numeros des noeuds qui le composent
00038  *      4 - la table d'indexation de la table des groupes de noeuds
00039  *      5 - la table des groupes d'elements
00040  *      6 - la table d'indexation de la table des groupes d'elements
00041  *
00042  * - PARAMETRES :
00043  *   NOM            .E/S. TYPE    . DESCRIPTION
00044  *   ------------------------------------------------------------------- 
00045  *   nfam           .E  . med_int . nombre de familles
00046  *   numfam         .E  . med_int*. table des numeros de familles
00047  *   numfamnoe      .E  . med_int*. table des numeros de familles
00048  *                  .   .         . des noeuds
00049  *   nnoeuds        .E  . med_int . nombre de noeuds
00050  *   numfamele      .E  . med_int*. table des numeros de familles
00051  *                  .   .         . des elements
00052  *   nelememts      .E  . med_int . nombre total d'elements
00053  *   grofam         .E  . char*   . liste des groupes de familles
00054  *   indfamgro      .E  . int*    . liste des indices des groupes
00055  *                  .   .         . de familles dans indfamgro
00056  *   numnoeuds      .E  . med_int*. numeros des noeuds
00057  *   numele         .E  . med_int*. numeros des elements
00058  *   ngn            .E  . med_int . nombre de groupes de noeuds
00059  *   nge            .E  . med_int . nombre de groupes d'elements
00060  *   nindn          .E  . med_int . nombre d'indices dans la table
00061  *                  .             . des groupes de noeuds a creer
00062  *   ninde          .E  . med_int . nombre d'indices dans la table
00063  *                  .             . des groupes d'elements
00064  *   nomgronoe      .  S. char*   . noms des groupes de noeuds
00065  *   nomgroele      .  S. char*   . noms des groupes d'elements
00066  *   indgronoe      .  S. int*    . indices des groupes de noeuds
00067  *   indgroele      .  S. int*    . indices des groupes d'elements
00068  *   tabgronoe      .  S. med_int*. table des groupes de noeuds
00069  *   tabgroele      .  S. med_int*. table des groupes d'elements
00070  *
00071  * - RESULTAT : 0
00072  * 
00073  ***********************************************************************/
00074 
00075 namespace med_2_1{
00076 
00077 med_err 
00078 MEDfam2groB(med_int nfam,med_int *numfam,med_int *numfamnoe,
00079             med_int nnoeuds,med_int *numfamele,med_int nelements, 
00080             char *grofam,int *indfamgro,med_int *numnoeuds,
00081             med_int *numele,med_int ngn,med_int nge,med_int nindn, 
00082             med_int ninde,char *nomgronoe,char *nomgroele,
00083             int *indgronoe,int *indgroele,
00084             med_int *tabgronoe,med_int *tabgroele)
00085 {
00086   int i,j,k;
00087   char groupe[MED_TAILLE_LNOM];
00088   med_int numc;
00089   int nnoe = 0, nele = 0;
00090   int flag = 0;
00091   int nn = 0, ne = 0;
00092   int pos, cpt;
00093 
00094   /* initialisations */
00095   for (i=0;i<=ngn;i++)
00096     *(indgronoe+i) = 0;
00097   for (i=0;i<=nge;i++)
00098     *(indgroele+i) = 0;
00099 
00100   /* 1ere passe : on passe en revue toutes les familles :
00101      1 - on etablit dans (nomgronoe) et dans (nomgroele) les listes 
00102      des noms de groupes de noeuds et d'elements
00103      2 - on place dans les tables d'index (indgronoe) et (indgroele)
00104      le nombre de noeuds ou d'elements que chaque groupe se verra 
00105      attribuer */
00106   for (i=1;i<=nfam;i++)
00107       {
00108         numc = *(numfam+i-1);
00109         nnoe = 0;
00110         nele = 0;
00111         if (numc > 0)
00112             for (j=0;j<nnoeuds;j++)
00113               if (*(numfamnoe+j) == numc)
00114                 nnoe++;
00115         if (numc < 0)
00116           for (j=0;j<nelements;j++)
00117             if (*(numfamele+j) == numc)
00118               nele++;     
00119         for (j=0;j<(*(indfamgro+i)-*(indfamgro+i-1))/MED_TAILLE_LNOM; j++)
00120           {
00121             strncpy(groupe, grofam+*(indfamgro+i-1)+j*MED_TAILLE_LNOM,
00122                     MED_TAILLE_LNOM);
00123             if (numc > 0)
00124               {
00125                 if (nn == 0)
00126                   {
00127                     strncpy(nomgronoe,groupe,MED_TAILLE_LNOM);
00128                     nn = 1;
00129                     pos = 1;
00130                   }
00131                 else
00132                   {
00133                     flag = 0;
00134                     for (k=0; k<nn;k++)
00135                       if (strncmp(groupe,nomgronoe+k*MED_TAILLE_LNOM,
00136                                   MED_TAILLE_LNOM) == 0)
00137                         {
00138                           flag = 1;
00139                           pos = k+1;
00140                         }
00141                     if (flag == 0)
00142                       {
00143                         strncpy(nomgronoe+nn*MED_TAILLE_LNOM,groupe, 
00144                                 MED_TAILLE_LNOM);
00145                         pos = nn + 1;
00146                         nn = nn + 1;
00147                       }
00148                   }
00149                 *(indgronoe+pos) = *(indgronoe+pos) + nnoe;
00150               } 
00151             if (numc < 0)
00152               {
00153                 if (ne == 0)
00154                   {
00155                     strncpy(nomgroele,groupe,MED_TAILLE_LNOM);
00156                     ne = 1;
00157                     pos = 1;
00158                   }
00159                 else
00160                   {
00161                     flag = 0;
00162                     for (k=0; k<ne;k++)
00163                       if (strncmp(groupe,nomgroele+k*MED_TAILLE_LNOM,
00164                                   MED_TAILLE_LNOM) == 0)
00165                         {
00166                           flag = 1;
00167                           pos = k + 1;
00168                         }
00169                     if (flag == 0)
00170                       {
00171                         strncpy(nomgroele+ne*MED_TAILLE_LNOM,groupe, 
00172                                 MED_TAILLE_LNOM);
00173                         pos = ne + 1;
00174                         ne = ne + 1;
00175                       }
00176                   }
00177                 *(indgroele+pos) = *(indgroele+pos) + nele;
00178               }
00179           } 
00180       }
00181   *(nomgronoe+ngn*MED_TAILLE_LNOM) = '\0';
00182   *(nomgroele+nge*MED_TAILLE_LNOM) = '\0';
00183 
00184   /* 2e passe : on construit les listes des index ainsi que les
00185      les tables des groupes */
00186   for (i=1;i<=ngn;i++)
00187     {
00188       cpt = 0;
00189       *(indgronoe+i) = *(indgronoe+i-1) + *(indgronoe+i);
00190       strncpy(groupe,nomgronoe+(i-1)*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
00191       for (j=1;j<=nfam;j++)
00192           {
00193             numc = *(numfam+j-1);
00194             if (numc > 0)
00195               {
00196                 flag = 0;
00197                 for (k=0;k<(*(indfamgro+j)-*(indfamgro+j-1))/MED_TAILLE_LNOM;
00198                      k++)
00199                   if (! strncmp(groupe,
00200                                 grofam+*(indfamgro+j-1)+k*MED_TAILLE_LNOM,
00201                                 MED_TAILLE_LNOM))
00202                     flag = 1;
00203                 if (flag == 1)
00204                   for (k=0;k<nnoeuds;k++)
00205                     if (*(numfamnoe+k) == numc)
00206                       {
00207                         *(tabgronoe+*(indgronoe+i-1)+cpt) = *(numnoeuds+k);
00208                         cpt++;
00209                       }
00210               }
00211           }
00212     }         
00213   
00214   for (i=1;i<=nge;i++)
00215     {
00216       cpt = 0;
00217       *(indgroele+i) = *(indgroele+i-1) + *(indgroele+i);  
00218       strncpy(groupe,nomgroele+(i-1)*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
00219       for (j=1;j<=nfam;j++)
00220           {
00221             numc = *(numfam+j-1);
00222             if (numc < 0)
00223               {
00224                 flag = 0;
00225                 for (k=0;k<(*(indfamgro+j)-*(indfamgro+j-1))/MED_TAILLE_LNOM;
00226                      k++)
00227                   if (! strncmp(groupe,
00228                                 grofam+*(indfamgro+j-1)+k*MED_TAILLE_LNOM,
00229                                 MED_TAILLE_LNOM))
00230                     flag = 1;
00231                 if (flag == 1)
00232                   for (k=0;k<nelements;k++)
00233                     if (*(numfamele+k) == numc)
00234                       {
00235                         *(tabgroele+*(indgroele+i-1)+cpt) = *(numele+k);
00236                         cpt++;
00237                       }
00238               }
00239           }
00240     }
00241   
00242   return 0;
00243 }
00244 
00245 }