1 /*************************************************************************
2 * COPYRIGHT (C) 1999 - 2002 EDF R&D
3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE
5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
9 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
11 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
17 *************************************************************************/
25 /***********************************************************************
26 * FONCTION MEDfam2groB
28 * - DESCRIPTION : 2e etape dans la conversion des familles MED en
29 * groupes de noeuds et d'elements. Les tables allouees a partir
30 * des parametres calcules par MEDfam2groA() sont passees en argument
31 * a MEDfam2groB et remplies par cette derniere fonction.
33 * 1 - la table des noms de groupes de noeuds, chaque nom ayant
34 * une taille de MED_TAILLE_LNOM
35 * 2 - la table des noms des groupes d'elements
36 * 3 - la table des groupes de noeuds -i.e. pour chaque groupe
37 * la liste des numeros des noeuds qui le composent
38 * 4 - la table d'indexation de la table des groupes de noeuds
39 * 5 - la table des groupes d'elements
40 * 6 - la table d'indexation de la table des groupes d'elements
43 * NOM .E/S. TYPE . DESCRIPTION
44 * -------------------------------------------------------------------
45 * nfam .E . med_int . nombre de familles
46 * numfam .E . med_int*. table des numeros de familles
47 * numfamnoe .E . med_int*. table des numeros de familles
49 * nnoeuds .E . med_int . nombre de noeuds
50 * numfamele .E . med_int*. table des numeros de familles
52 * nelememts .E . med_int . nombre total d'elements
53 * grofam .E . char* . liste des groupes de familles
54 * indfamgro .E . int* . liste des indices des groupes
55 * . . . de familles dans indfamgro
56 * numnoeuds .E . med_int*. numeros des noeuds
57 * numele .E . med_int*. numeros des elements
58 * ngn .E . med_int . nombre de groupes de noeuds
59 * nge .E . med_int . nombre de groupes d'elements
60 * nindn .E . med_int . nombre d'indices dans la table
61 * . . des groupes de noeuds a creer
62 * ninde .E . med_int . nombre d'indices dans la table
63 * . . des groupes d'elements
64 * nomgronoe . S. char* . noms des groupes de noeuds
65 * nomgroele . S. char* . noms des groupes d'elements
66 * indgronoe . S. int* . indices des groupes de noeuds
67 * indgroele . S. int* . indices des groupes d'elements
68 * tabgronoe . S. med_int*. table des groupes de noeuds
69 * tabgroele . S. med_int*. table des groupes d'elements
73 ***********************************************************************/
78 MEDfam2groB(med_int nfam,med_int *numfam,med_int *numfamnoe,
79 med_int nnoeuds,med_int *numfamele,med_int nelements,
80 char *grofam,int *indfamgro,med_int *numnoeuds,
81 med_int *numele,med_int ngn,med_int nge,med_int nindn,
82 med_int ninde,char *nomgronoe,char *nomgroele,
83 int *indgronoe,int *indgroele,
84 med_int *tabgronoe,med_int *tabgroele)
87 char groupe[MED_TAILLE_LNOM];
89 int nnoe = 0, nele = 0;
100 /* 1ere passe : on passe en revue toutes les familles :
101 1 - on etablit dans (nomgronoe) et dans (nomgroele) les listes
102 des noms de groupes de noeuds et d'elements
103 2 - on place dans les tables d'index (indgronoe) et (indgroele)
104 le nombre de noeuds ou d'elements que chaque groupe se verra
106 for (i=1;i<=nfam;i++)
108 numc = *(numfam+i-1);
112 for (j=0;j<nnoeuds;j++)
113 if (*(numfamnoe+j) == numc)
116 for (j=0;j<nelements;j++)
117 if (*(numfamele+j) == numc)
119 for (j=0;j<(*(indfamgro+i)-*(indfamgro+i-1))/MED_TAILLE_LNOM; j++)
121 strncpy(groupe, grofam+*(indfamgro+i-1)+j*MED_TAILLE_LNOM,
127 strncpy(nomgronoe,groupe,MED_TAILLE_LNOM);
135 if (strncmp(groupe,nomgronoe+k*MED_TAILLE_LNOM,
136 MED_TAILLE_LNOM) == 0)
143 strncpy(nomgronoe+nn*MED_TAILLE_LNOM,groupe,
149 *(indgronoe+pos) = *(indgronoe+pos) + nnoe;
155 strncpy(nomgroele,groupe,MED_TAILLE_LNOM);
163 if (strncmp(groupe,nomgroele+k*MED_TAILLE_LNOM,
164 MED_TAILLE_LNOM) == 0)
171 strncpy(nomgroele+ne*MED_TAILLE_LNOM,groupe,
177 *(indgroele+pos) = *(indgroele+pos) + nele;
181 *(nomgronoe+ngn*MED_TAILLE_LNOM) = '\0';
182 *(nomgroele+nge*MED_TAILLE_LNOM) = '\0';
184 /* 2e passe : on construit les listes des index ainsi que les
185 les tables des groupes */
189 *(indgronoe+i) = *(indgronoe+i-1) + *(indgronoe+i);
190 strncpy(groupe,nomgronoe+(i-1)*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
191 for (j=1;j<=nfam;j++)
193 numc = *(numfam+j-1);
197 for (k=0;k<(*(indfamgro+j)-*(indfamgro+j-1))/MED_TAILLE_LNOM;
199 if (! strncmp(groupe,
200 grofam+*(indfamgro+j-1)+k*MED_TAILLE_LNOM,
204 for (k=0;k<nnoeuds;k++)
205 if (*(numfamnoe+k) == numc)
207 *(tabgronoe+*(indgronoe+i-1)+cpt) = *(numnoeuds+k);
217 *(indgroele+i) = *(indgroele+i-1) + *(indgroele+i);
218 strncpy(groupe,nomgroele+(i-1)*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
219 for (j=1;j<=nfam;j++)
221 numc = *(numfam+j-1);
225 for (k=0;k<(*(indfamgro+j)-*(indfamgro+j-1))/MED_TAILLE_LNOM;
227 if (! strncmp(groupe,
228 grofam+*(indfamgro+j-1)+k*MED_TAILLE_LNOM,
232 for (k=0;k<nelements;k++)
233 if (*(numfamele+k) == numc)
235 *(tabgroele+*(indgroele+i-1)+cpt) = *(numele+k);