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 MEDfam2groA
28 * - DESCRIPTION : 1ere etape dans la conversion des familles de groupes
29 * MED en goupes de noeuds et d'elements.
30 * Calcul des tailles des tableaux a allouer pour stocker les
31 * groupes que l'on veut creer.
32 * Les parametres renvoyes sont :
33 * 1 - le nombre de groupes de noeuds a creer (ngn)
34 * 2 - le nombre de groupes d'elements (nge)
35 * 3 - le nombre total de noeuds composant l'ensemble des groupes
37 * 4 - le nombre total d'elements composant l'ensemble des groupes
39 * Ces parametres doivent permettre de creer les tables suivantes :
40 * 1 - une table de taille (nindn) contenant pour chaque groupe
41 * de noeuds la liste des noeuds le composant. Cette table
42 * sera indexee par une table de taille (ngn) qui contiendra
43 * pour chaque noeud un numero d'indice. Une table de taille
44 * (ngn) qui contiendra la liste des noms des differents
46 * 2 - idem pour les elements
47 * Le remplissage de ces tables est realise par la fonction
51 * NOM .E/S. TYPE . DESCRIPTION
52 * -------------------------------------------------------------------
53 * nfam .E . med_int . nombre de familles
54 * numfam .E . med_int*. table des numeros de familles
55 * numfamnoe .E . med_int*. table des numeros de familles
57 * nnoeuds .E . med_int . nombre de noeuds
58 * numfamele .E . med_int*. table des numeros de familles
60 * nelememts .E . . nombre total d'elements
61 * grofam .E . char* . liste des groupes de familles
62 * indfamgro .E . int* . liste des indices des groupes
63 * . . . de familles dans grofam
64 * ngn . S. med_int*. nombre de groupes de noeuds a
66 * nge . S. med_int*. nombre de groupes d'elements a
68 * nindn . S. med_int*. taille de la table
69 * . . des groupes de noeuds a creer
70 * ninde . S. med_int*. taille de la table
71 * . . des groupes d'elements
73 * - RESULTAT : 0 si succes et -1 sinon
75 ***********************************************************************/
80 MEDfam2groA (med_int nfam,med_int *numfam,med_int *numfamnoe,
81 med_int nnoeuds,med_int *numfamele,med_int nelements,
82 char *grofam,int *indfamgro,
83 med_int *ngn,med_int *nge,med_int *nindn,med_int *ninde)
86 char groupe[MED_TAILLE_LNOM];
87 char *nomgronoe,*nomgroele,*tmp;
89 int nnoe = 0,nele = 0;
101 /* Pour chaque famille, on regarde s'il y a de nouveaux groupes
102 de noeuds ou d'elements a creer. Pour chaque nouveau groupe,
103 on compte le nombre de noeuds ou d'elements qui devront lui etre
105 for (i=1;i<=nfam;i++)
106 if ((*(indfamgro+i)-*(indfamgro+i-1))/MED_TAILLE_LNOM > 0)
108 /* on releve le numero de la famille courante */
109 numc = *(numfam+i-1);
112 /* si c'est une famille de noeuds, on compte le nombre de
113 noeuds qui y sont rattaches */
115 for (j=0;j<nnoeuds;j++)
116 if (*(numfamnoe+j) == numc)
118 /* si c'est une famille d'elements, on compte le nombre d'elements
119 qui y sont rattaches */
121 for (j=0;j<nelements;j++)
122 if (*(numfamele+j) == numc)
124 /* on parcourt la liste des groupes de la famille et pour chaque
126 1 - on met a jour les compteurs nindn et ninde ;
127 2 - on verifie s'il s'agit d'un groupe deja repertorie.
128 Si c'est le cas on ne fait rien, sinon on met a jour les
129 compteurs ngn ou nge */
130 for (j=0;j<(*(indfamgro+i)-*(indfamgro+i-1))/MED_TAILLE_LNOM;j++)
132 strncpy(groupe,grofam+*(indfamgro+i-1)+j*MED_TAILLE_LNOM,
136 *nindn = *nindn+nnoe;
140 if ((nomgronoe=(char*)malloc(sizeof(char)*MED_TAILLE_LNOM))
143 strncpy(nomgronoe,groupe,MED_TAILLE_LNOM);
148 for (k=0;k<(*ngn);k++)
149 if (strncmp(groupe,nomgronoe+k*MED_TAILLE_LNOM,
150 MED_TAILLE_LNOM) == 0)
155 if ((tmp=(char*)malloc(sizeof(char)*
156 MED_TAILLE_LNOM**ngn)) == NULL)
158 strncpy(tmp,nomgronoe,MED_TAILLE_LNOM*(*ngn-1));
159 strncpy(tmp+MED_TAILLE_LNOM*(*ngn-1),groupe,
168 *ninde = *ninde+nele;
172 if ((nomgroele=(char *)malloc(sizeof(char)*
173 MED_TAILLE_LNOM)) == NULL)
175 strncpy(nomgroele,groupe,MED_TAILLE_LNOM);
180 for (k=0;k<(*nge);k++)
181 if (strncmp(groupe,nomgroele+k*MED_TAILLE_LNOM,
182 MED_TAILLE_LNOM) == 0)
187 if ((tmp = (char*) malloc(sizeof(char)*MED_TAILLE_LNOM*
190 strncpy(tmp,nomgroele,MED_TAILLE_LNOM*(*nge-1));
191 strncpy(tmp+MED_TAILLE_LNOM*(*nge-1), groupe,
201 /* nettoyage memoire */