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 *************************************************************************/
24 /***********************************************************************
25 * FONCTION MEDgro2famB
27 * - DESCRIPTION : 2eme etape dans la conversion des groupes de noeuds
28 * et d'elements en familles MED
29 * Mise a jour des tables suivantes passees en parametres :
30 * 1 - les nouveaux numeros des familles a creer
31 * 2 - les nouveaux numeros des familles des elements
32 * 3 - les nouveaux numeros des familles des noeuds
33 * 4 - les noms des groupes composant ces familles
34 * 5 - les index de la table des groupes
37 * NOM .E/S. TYPE . DESCRIPTION
38 * -------------------------------------------------------------------
39 * nnoe .E . med_int . nombre de noeuds
40 * nele .E . med_int . nombre d'elements
41 * numnoe .E . med_int*. numeros des noeuds
42 * numele .E . med_int*. numeros des elements
43 * ngn .E . med_int . nombre de groupes de noeuds
44 * nge .E . med_int . nombre de groupes d'elements
45 * nindn .E . med_int . nombre d'indices dans la table
46 * . . . des groupes de noeuds
47 * ninde .E . med_int . nombre d'indices dans la table
48 * . . . de groupes d'elements
49 * nomgronoe .E . char* . noms des groupes de noeuds
50 * nomgroele .E . char* . noms des groupes d'elements
51 * indgronoe .E . int* . table index de la table des groupes
53 * indgroele .E . int* . table index de la table des groupes
55 * tabgronoe .E . int* . table des groupes de noeuds
56 * tabgroele .E . int* . table des groupes d'elements
57 * nfamg .E . med_int . nombre de familles MED a creer
58 * nidnf .E . med_int . nombre de noms groupes associes a
59 * . . . l'ensemble des familles MED
60 * newnumfam . S. med_int*. nouveaux numeros de familles
61 * newnumfamele . S. med_int*. nouveaux numeros de familles des
63 * newnumfamnoe . S. med_int*. nouveaux numeros de familles des
65 * newindfamgro . S. int* . table des index de la table des
66 * . . . noms de groupes associes aux familles
67 * newfamgro . . char* . table des noms des groupes des
72 ***********************************************************************/
77 MEDgro2famB (med_int nnoe,med_int nele,med_int *numnoe,med_int *numele,
78 med_int ngn,med_int nge,med_int nindn,
79 med_int ninde, char *nomgronoe,char *nomgroele,
80 int *indgronoe,int *indgroele,med_int *tabgronoe,
81 med_int *tabgroele,med_int nfamg,med_int nindf,
82 med_int *newnumfam,med_int *newnumfamele,
83 med_int *newnumfamnoe,int *newindfamgro,
88 med_int *famnoe, *famele, *tmp;
94 int newnumnoe, newnumele;
111 /* pour chaque noeud :
112 1 - on dresse la liste des groupes de noeuds auquel il appartient
113 2 - en la comparant avec les listes pre-existantes, on
114 estime s'il est necessaire de creer une nouvelle famille de noeuds.
115 Si oui => - on cree le numero de famille que l'on reporte
117 - on reporte ce numero dans newnumnoe
118 - on met a jour la table des noms des groupes des familles
119 ainsi que sa table d'index
120 Si non => on ne fait rien
121 ATTENTION : pour la famille 0, on ne met a jour que les numeros */
124 if ((tmp = (med_int*) malloc(sizeof(med_int)*ngn)) == NULL)
130 /* on regarde si le noeud appartient au groupe */
131 for (k=0;k<*(indgronoe+j+1)-*(indgronoe+j);k++)
132 if (num == *(tabgronoe+*(indgronoe+j)+k))
134 /* on met le flag a jour dans tmp */
137 /* on regarde si le numero de famille est 0 */
146 *(newnumfamnoe+i) = 0;
148 if (flag == 1 && existfam0 == 0)
150 /* faut-il creer une nouvelle famille ? */
154 if ((famnoe = (med_int *) malloc (sizeof(med_int)*ngn)) == NULL)
156 /* on met a jour la table d'indices */
158 *(newindfamgro+nfamn) = *(newindfamgro+nfamn-1);
165 strncpy(newfamgro+*(newindfamgro+nfamn),
166 nomgronoe+j*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
167 *(newindfamgro+nfamn) = *(newindfamgro+nfamn) +
174 *newnumfamnoe = newnumnoe;
175 *newnumfam = newnumnoe;
182 for (j=0;j<nfamn;j++)
187 if (*(p+k) != *(tmp+k))
198 *(newnumfamnoe+i) = *(newnumfam+j);
205 *(newindfamgro+nfamn) = *(newindfamgro+nfamn-1);
207 if ((famnoe = (med_int*) malloc(sizeof(med_int)*ngn*nfamn))
210 for (j=0;j<nfamn-1;j++)
212 *(famnoe+j*ngn+k) = *(p+j*ngn+k);
214 p = famnoe+(nfamn-1)*ngn;
221 strncpy(newfamgro+*(newindfamgro+nfamn),
222 nomgronoe+j*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
223 *(newindfamgro+nfamn) = *(newindfamgro + nfamn)
229 newnumnoe = newnumnoe + 1;
230 *(newnumfamnoe+i) = newnumnoe;
231 *(newnumfam+nfamn-1) = newnumnoe;
234 *(newnumfam+nfamn-1) = 0;
240 /* pour chaque element :
241 1 - on dresse la liste des groupes de noeuds auquel il appartient
242 2 - en la comparant avec les listes pre-existantes, on
243 estime s'il est necessaire de creer une nouvelle famille d'elements.
244 Si oui => - on cree le numero de famille que l'on reporte
246 - on reporte ce numero dans newnumele
247 - on met a jour la table des noms des groupes des familles
248 ainsi que sa table d'index
249 Si non => on ne fait rien
250 ATTENTION : pour la famille 0, on ne met a jour que les numeros */
253 if ((tmp = (med_int*) malloc(sizeof(med_int)*nge)) == NULL)
259 /* on regarde si l'element appartient au groupe */
260 for (k=0;k<*(indgroele+j+1)-*(indgroele+j);k++)
261 if (num == *(tabgroele+*(indgroele+j)+k))
263 /* on met le flag a jour dans tmp */
266 /* on regarde si le numero de famille est 0 */
275 *(newnumfamele+i) = 0;
277 /* faut-il creer une nouvelle famille ? */
280 if (!(estfam0&&existfam0))
283 if ((famele = (med_int *) malloc (sizeof(med_int)*nge))
287 *(newindfamgro+nfamn+nfame) = *(newindfamgro+nfamn+nfame-1);
294 strncpy(newfamgro+*(newindfamgro+nfamn+nfame),
295 nomgroele+j*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
296 *(newindfamgro+nfamn+nfame) = *(newindfamgro+nfamn+nfame)
303 *(newnumfamele+i) = newnumele;
304 *(newnumfam+nfamn+nfame-1) = newnumele;
309 *(newnumfam+nfamn+nfame-1) = newnumele;
316 for (j=0;j<nfame;j++)
321 if (*(p+k) != *(tmp+k))
332 *(newnumfamele+i) = *(newnumfam+nfamn+j);
336 if (exist == 0 && !(estfam0 && existfam0))
337 /* on cree une nouvelle famille */
340 *(newindfamgro+nfamn+nfame) = *(newindfamgro+nfamn+nfame-1);
342 if ((famele = (med_int*) malloc(sizeof(med_int)*nge*nfame))
345 for (j=0;j<nfame-1;j++)
347 *(famele+j*nge+k) = *(p+j*nge+k);
349 p = famele+(nfame-1)*nge;
356 strncpy((newfamgro+*(newindfamgro+nfamn+nfame)),
357 nomgroele+j*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
358 *(newindfamgro+nfamn+nfame) =
359 *(newindfamgro+nfamn+nfame) + MED_TAILLE_LNOM;
364 newnumele = newnumele - 1;
365 *(newnumfamele+i) = newnumele;
366 *(newnumfam+nfamn+nfame-1) = newnumele;
371 *(newnumfam+nfamn+nfame-1) = 0;
379 *(newfamgro+MED_TAILLE_LNOM*nindf) = '\0';
388 *(newnumfamele+i) = 0;
390 *(newnumfamnoe+i) = 0;