00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022
00023 #include <string.h>
00024 #include <stdlib.h>
00025
00026 med_err
00027 MEDgro2famCr(med_idt fid,char *maillage,char *groupes,med_int *index,med_int ngroup,med_int *entites,
00028 med_int nent,med_entite_maillage type_ent,med_geometrie_element *type_geo,med_int *indexgeo,
00029 med_int ngeo)
00030 {
00031 med_err ret = 0;
00032 med_int nfam = 0;
00033 int i,j,k,l,m;
00034 int col,bit,som;
00035 int est_egale, trouvee;
00036 unsigned char ajout,tmp;
00037 unsigned char *groupes_par_entite;
00038 med_int *numfam;
00039 med_int numgro;
00040 char nom[MED_TAILLE_NOM+1];
00041 char nomgro[MED_TAILLE_LNOM+1];
00042 char *gro;
00043 med_int num,ngro,natt;
00044 med_int *nummai;
00045 med_entite_maillage _type_ent=type_ent;
00046
00047 if ( type_ent == MED_NOEUD_MAILLE ) _type_ent=MED_NOEUD ;
00048
00049
00050
00051 groupes_par_entite = (unsigned char *) malloc(sizeof(unsigned char)*nent*(ngroup/8+1));
00052 for (i=0;i<nent;i++)
00053 for (j=0;j<ngroup/8+1;j++)
00054 *(groupes_par_entite+i*(ngroup/8+1)+j) = 0;
00055 for (i=0;i<ngroup;i++) {
00056 col = i/8;
00057 bit = 7-i%8;
00058 for (j=*(index+i)-1;j<*(index+i+1)-1;j++) {
00059 ajout = 1;
00060 for (k=0;k<bit;k++)
00061 ajout = ajout*2;
00062 *(groupes_par_entite + (*(entites+j)-1)*(ngroup/8+1) + col) += ajout;
00063 }
00064 }
00065
00066
00067
00068
00069 numfam = (med_int *) malloc(sizeof(med_int)*nent);
00070 for (i=0;i<nent;i++) {
00071
00072 som = 0;
00073 for (j=0;j<ngroup/8+1;j++)
00074 som += (int) *(groupes_par_entite+i*(ngroup/8+1)+j);
00075
00076 if (som == 0)
00077
00078 *(numfam+i) = 0;
00079 else {
00080
00081
00082
00083
00084 trouvee = 0;
00085 for (j=0;j<i;j++)
00086 if (*(numfam+j) != 0) {
00087 est_egale = 1;
00088 for (k=0;k<ngroup/8+1;k++)
00089 if (*(groupes_par_entite+i*(ngroup/8+1)+k) != *(groupes_par_entite+j*(ngroup/8+1)+k))
00090 est_egale = 0;
00091 if (est_egale) {
00092 *(numfam+i) = *(numfam+j);
00093 trouvee = 1;
00094 break;
00095 }
00096 }
00097
00098 if (! trouvee) {
00099 nfam ++;
00100 if (_type_ent == MED_NOEUD)
00101 *(numfam+i) = nfam;
00102 else
00103 *(numfam+i) = -nfam;
00104 }
00105 }
00106 }
00107
00108
00109
00110
00111
00112 natt = 0;
00113 gro = (char *) malloc(sizeof(char)*(MED_TAILLE_LNOM*ngroup+1));
00114 for (i=1;i<nfam+1;i++) {
00115 trouvee = 0;
00116 for (j=0;j<nent;j++)
00117 if ((*(numfam+j) == -i) || (*(numfam+j) == i)) {
00118 trouvee = 1;
00119
00120
00121 num = *(numfam+j);
00122 if (_type_ent == MED_NOEUD)
00123 sprintf(nom,"FAMILLE_NOEUD_%d",i);
00124 else
00125 sprintf(nom,"FAMILLE_ELEMENT_%d",i);
00126 ngro = 0;
00127 for (k=0;k<ngroup/8+1;k++)
00128 if (*(groupes_par_entite+j*(ngroup/8+1)+k) != 0) {
00129 tmp = *(groupes_par_entite+j*(ngroup/8+1)+k);
00130 for (l=0;l<ngroup;l++) {
00131 col = l/8;
00132 bit = 7-l%8;
00133 ajout = 1;
00134 for (m=0;m<bit;m++)
00135 ajout = ajout*2;
00136 if (ajout & tmp) {
00137 numgro = col + (7 - bit);
00138 ngro++;
00139 strncpy(nomgro,groupes+numgro*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
00140 nomgro[MED_TAILLE_LNOM] = '\0';
00141 if (ngro == 1)
00142 strcpy(gro,nomgro);
00143 else
00144 strcat(gro+(ngro-1)*MED_TAILLE_LNOM,nomgro);
00145 }
00146 }
00147 }
00148
00149 ret = MEDfamCr(fid,maillage,nom,num,NULL,NULL,NULL,natt,gro,ngro);
00150
00151 break;
00152 }
00153 }
00154
00155
00156
00157
00158 if (ret == 0) {
00159 if (_type_ent == MED_NOEUD)
00160 ret = MEDfamEcr(fid,maillage,numfam,nent,MED_NOEUD,(med_geometrie_element) 0);
00161 if (_type_ent == MED_MAILLE || _type_ent == MED_FACE || _type_ent == MED_ARETE) {
00162 som = 0;
00163 for (i=0;i<ngeo;i++) {
00164 if (ret == 0) {
00165
00166 m = *(indexgeo+i+1)-*(indexgeo+i);
00167 nummai = (med_int *) malloc(sizeof(med_int)*m);
00168 for(j=0;j<m;j++)
00169 *(nummai+j) = *(numfam+som+j);
00170 ret = MEDfamEcr(fid,maillage,nummai,m,_type_ent,*(type_geo+i));
00171 free(nummai);
00172 som += m;
00173 }
00174 }
00175 }
00176 }
00177
00178
00179
00180
00181
00182 free(groupes_par_entite);
00183 free(numfam);
00184 free(gro);
00185
00186 return ret;
00187 }