1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/
20 /*************************************************************************
21 * COPYRIGHT (C) 1999 - 2002 EDF R&D
22 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
23 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE
24 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
25 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
27 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
28 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
29 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
30 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
32 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
33 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
34 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
36 *************************************************************************/
44 /***********************************************************************
45 * FONCTION MEDgro2famA
47 * - DESCRIPTION : 1ere etape dans la conversion des groupes de noeuds
48 * et d'elements en familles MED.
49 * Calcul des tailles des tableaux que l'on devra allouer pour
50 * stocker les familles qui seront construites par MEDgro2famB().
51 * Les parametres renvoyes sont :
52 * 1 - le nombre de familles MED a creer (nfamg)
53 * 2 - le nombre de noms groupes associes a l'ensemble des familles
55 * Ces parametres doivent permettre a l'appelant de creer les tables
57 * 1 - une table des noms des groupes propres a chaque famille,
58 * de taille : nindf*MED_TAILLE_LNOM+1
59 * 2 - une table d'index donnant pour chaque famille son numero d'indice
60 * dans la table des noms, de taille : nfamg+1
61 * 3 - une table destinee a contenir la liste des numeros de familles
62 * a creer, de taille : nfamg
65 * NOM .E/S. TYPE . DESCRIPTION
66 * -------------------------------------------------------------------
67 * nnoe .E . med_int . nombre de noeuds
68 * nele .E . med_int . nombre d'elements
69 * numnoe .E . med_int*. numeros des noeuds
70 * numele .E . med_int*. numeros des elements
71 * ngn .E . med_int . nombre de groupes de noeuds
72 * nge .E . med_int . nombre de groupes d'elements
73 * nindn .E . med_int . nombre d'indices dans la table
74 * . . . des groupes de noeuds
75 * ninde .E . med_int . nombre d'indices dans la table
76 * . . . de groupes d'elements
77 * indgronoe .E . int* . table index de la table des groupes
79 * indgroele .E . int* . table index de la table des groupes
81 * tabgronoe .E . med_int*. table des groupes de noeuds
82 * tabgroele .E . med_int*. table des groupes d'elements
83 * nfamg . S. med_int*. nombre de familles MED a creer
84 * nidnf . S. med_int*. nombre de noms groupes associes a
85 * . . . l'ensemble des familles MED
87 * - RESULTAT : 0 si succes, -1 sinon
89 ***********************************************************************/
94 MEDgro2famA (med_int nnoe,med_int nele,med_int *numnoe,med_int *numele,
95 med_int ngn,med_int nge,med_int nindn,
96 med_int ninde,int *indgronoe,int *indgroele,med_int *tabgronoe,
97 med_int *tabgroele,med_int *nfamg,med_int *nindf)
100 int *famnoe,*famele,*tmp;
107 /* initialisations */
116 if ((ngn > 0) || (nge > 0))
118 /* pour chaque noeud :
119 1 - on dresse la liste des groupes de noeuds auquel il appartient
120 2 - en la comparant avec les listes pre-existantes, on
121 estime s'il est necessaire de creer une nouvelle famille de noeuds.
122 Si oui => on incremente le compteur local nfamn (nombre de familles
124 on incremente le parametre nindf du nombre de groupes
125 que devra compter cette famille de noeuds
126 Si non => on ne fait rien */
129 if ((tmp = (int*) malloc(sizeof(int)*ngn)) == NULL)
135 /* on regarde si le noeud appartient au groupe */
136 for (k=0;k<*(indgronoe+j+1)-*(indgronoe+j);k++)
137 if (num == *(tabgronoe+*(indgronoe+j)+k))
139 /* on met le flag a jour dans tmp */
142 /* on note la creation de la famille 0 */
152 /* faut-il creer une nouvelle famille ? */
156 if ((famnoe = (int *) malloc (sizeof(int)*ngn)) == NULL)
160 *(famnoe+j) = *(tmp+j);
161 if (*(famnoe+j) == 1)
168 for (j=0;j<nfamn;j++)
173 if (*(p+k) != *(tmp+k))
188 if ((famnoe = (int*) malloc(sizeof(int)*ngn*nfamn)) == NULL)
190 for (j=0;j<nfamn-1;j++)
192 *(famnoe+j*ngn+k) = *(p+j*ngn+k);
194 p = famnoe+(nfamn-1)*ngn;
206 /* pour chaque element : idem que pour les noeuds */
209 if ((tmp = (int*) malloc(sizeof(int)*nge)) == NULL)
215 /* on regarde si l'element appartient au groupe */
216 for (k=0;k<*(indgroele+j+1)-*(indgroele+j);k++)
217 if (num == *(tabgroele+*(indgroele+j)+k))
219 /* on met le flag a jour dans tmp */
222 /* on note la creation de la famille 0 */
232 /* faut-il creer une nouvelle famille ? */
236 if ((famele = (int *) malloc (sizeof(int)*nge)) == NULL)
240 *(famele+j) = *(tmp+j);
241 if (*(famele+j) == 1)
248 for (j=0;j<nfame;j++)
253 if (*(p+k) != *(tmp+k))
268 if ((famele = (int*) malloc(sizeof(int)*nge*nfame)) == NULL)
270 for (j=0;j<nfame-1;j++)
272 *(famele+j*nge+k) = *(p+j*nge+k);
274 p = famele+(nfame-1)*nge;
286 /* la famille 0 existe pour les noeuds et les elements, on
287 ne la compte qu'une fois */
291 /* le nombre de familles a creer est egal au nombre de familles
292 de noeuds + nombre de familles d'elements */
293 *nfamg = nfamn + nfame;
296 /* Nettoyage memoire */
302 /* on a aucun groupes de noeuds ou d'elements */
303 *nfamg = 1; /* on a au moins la famille 0 */