1
/*============================================================================
2
* Définitions des fonctions de base
3
* associées à la structure `ecs_table_t' décrivant une table
4
*============================================================================*/
7
This file is part of Code_Saturne, a general-purpose CFD tool.
9
Copyright (C) 1998-2011 EDF S.A.
11
This program is free software; you can redistribute it and/or modify it under
12
the terms of the GNU General Public License as published by the Free Software
13
Foundation; either version 2 of the License, or (at your option) any later
16
This program is distributed in the hope that it will be useful, but WITHOUT
17
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
21
You should have received a copy of the GNU General Public License along with
22
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
23
Street, Fifth Floor, Boston, MA 02110-1301, USA.
26
/*----------------------------------------------------------------------------*/
29
/*============================================================================
31
*============================================================================*/
33
/*----------------------------------------------------------------------------
34
* Fichiers `include' librairie standard C
35
*----------------------------------------------------------------------------*/
39
#include <string.h> /* strcpy() */
42
/*----------------------------------------------------------------------------
43
* Fichiers `include' visibles du paquetage global "Utilitaire"
44
*----------------------------------------------------------------------------*/
51
/*----------------------------------------------------------------------------
52
* Fichiers `include' visibles des paquetages visibles
53
*----------------------------------------------------------------------------*/
55
#include "ecs_descr_chaine.h"
56
#include "ecs_descr.h"
59
/*----------------------------------------------------------------------------
60
* Fichiers `include' visibles du paquetage courant
61
*----------------------------------------------------------------------------*/
64
/*----------------------------------------------------------------------------
65
* Fichier `include' du paquetage courant associé au fichier courant
66
*----------------------------------------------------------------------------*/
68
#include "ecs_table.h"
71
/*----------------------------------------------------------------------------
72
* Fichiers `include' privés du paquetage courant
73
*----------------------------------------------------------------------------*/
75
#include "ecs_table_priv.h"
78
/*============================================================================
80
*============================================================================*/
82
/*----------------------------------------------------------------------------
83
* Fonction d'impression d'une table avec position réglée en ASCII
84
*----------------------------------------------------------------------------*/
87
_imprime_pos_pas(FILE *fic_imp,
90
const ecs_int_t val_int[],
93
/* Variables locales */
101
char pos_str[32]; /* Largement surdimensionné pour contenir une
102
chaîne de type [%10d], un entier "long" pouvant
103
nécessiter un format plus large */
107
assert(val_int != NULL);
109
ind_ent_2 = ECS_MIN(nbr_ent, nbr_imp);
112
/* Impression des valeurs */
113
/*========================*/
117
for (ient = ind_ent_1; ient < ind_ent_2; ient++) {
121
fprintf(fic_imp, "%50s %12lu %12ld" "\n",
122
" ", (unsigned long)(ient+1),
123
(long)val_int[ient]);
126
else if (pos_pas > 1) {
128
sprintf(pos_str, "[%d]", (int)(pos_pas*ient + 1));
130
fprintf(fic_imp, "%37s %12lu %12s %12ld" "\n",
131
" ", (unsigned long)(ient+1), pos_str,
132
(long)val_int[pos_pas*ient]);
134
for (iloc = 1; iloc < pos_pas; iloc++)
135
fprintf(fic_imp, "%63s %12ld" "\n",
136
" ", (long)val_int[pos_pas*ient + iloc]);
141
if (ind_ent_2 == nbr_ent)
144
ind_ent_1 = ECS_MAX(nbr_ent - nbr_imp, nbr_imp);
146
if (ind_ent_1 > ind_ent_2)
149
"%77s", "............\n");
157
/*----------------------------------------------------------------------------
158
* Fonction d'impression d'une table avec position non réglée en ASCII
159
* (Table entier uniquement)
160
*----------------------------------------------------------------------------*/
163
_imprime_pos_tab(FILE *fic_imp,
165
ecs_size_t pos_tab[],
166
const ecs_int_t val_tab[],
169
/* Variables locales */
174
size_t ind_ent_1 = 0;
182
assert(pos_tab != NULL);
184
ind_ent_2 = ECS_MIN(nbr_ent, nbr_imp);
188
/* Impression des valeurs */
189
/*========================*/
193
for (ient = ind_ent_1; ient < ind_ent_2; ient++) {
195
nbr_loc = pos_tab[ient + 1] - pos_tab[ient];
198
fprintf(fic_imp, "%37s %12lu %12lu %12ld\n",
199
" ", (unsigned long)(ient+1),
200
(unsigned long)pos_tab[ient],
201
(long)val_tab[pos_tab[ient] - 1]);
203
fprintf(fic_imp, "%37s %12lu %12lu\n",
204
" ", (unsigned long)(ient+1),
205
(unsigned long)pos_tab[ient]);
207
for (iloc = 1; iloc < nbr_loc; iloc++)
208
fprintf(fic_imp, "%63s %12ld\n",
209
" ", (long)val_tab[pos_tab[ient] + iloc - 1]);
213
if (ind_ent_2 == nbr_ent)
216
ind_ent_1 = ECS_MAX(nbr_ent - nbr_imp, nbr_imp);
218
if (ind_ent_1 > ind_ent_2)
221
"%77s", "............\n");
227
fprintf(fic_imp, "%50s %12lu\n",
228
" ", (unsigned long)pos_tab[nbr_ent]);
231
/*----------------------------------------------------------------------------
232
* Fonction qui concatène dans une table réceptrice donnée,
233
* une table à concaténer donnée
235
* La concaténation de 2 tables consiste à concaténer :
236
* - les tables des positions des 2 tables;
237
* - les tables des valeurs des 2 tables;
238
* - les listes chaînées des descripteurs des 2 tables
239
* (nécessaire uniquement pour des tables de type "attribut")
241
* Les autres membres de la table réceptrice ne sont pas modifiés
242
*----------------------------------------------------------------------------*/
245
_table__concatene(ecs_table_t *table_recept,
246
ecs_table_t *table_concat)
250
size_t nbr_elt_recept;
251
size_t nbr_val_recept;
252
size_t nbr_val_concat;
253
size_t pos_recept_fin;
255
ecs_descr_t *descr_concat_copie;
256
ecs_tab_int_t tab_renum_descr;
258
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
260
assert(table_recept != NULL);
261
assert(table_concat != NULL);
263
/* Dimensions avant concaténation */
265
nbr_elt_recept = table_recept->nbr;
266
nbr_val_recept = ecs_table__ret_val_nbr(table_recept);
267
nbr_val_concat = ecs_table__ret_val_nbr(table_concat);
269
/* Pour les attributs, */
270
/* il faut renuméroter les descripteurs */
271
/* et propager ces nouvelles valeurs sur les éléments */
273
tab_renum_descr.nbr = 0;
274
tab_renum_descr.val = NULL;
276
if (table_concat->descr != NULL) {
278
/* Unification des descripteurs d'attributs */
280
descr_concat_copie = ecs_descr_chaine__copie(table_concat->descr);
282
tab_renum_descr = ecs_descr_chaine__concatene(&table_recept->descr,
283
&descr_concat_copie);
286
/* Membres restant à modifier pour la table receptrice : */
291
table_recept->nbr += table_concat->nbr;
293
/* Traitement de la table des positions; si l'on n'a pas
294
une REGLE identique de part et d'autre, on doit la reconstruire */
296
/* Si l'on a un pas identique de part et d'autre, on n'a rien à faire */
298
if ( table_recept->pos != NULL
299
|| table_concat->pos != NULL
300
|| table_recept->pas != table_concat->pas) {
302
/* 1ère étape : construire ou agrandir le tableau des positions,
303
et le remplir des valeurs de la table initiale */
305
if (table_recept->pos == NULL) {
307
ECS_MALLOC(table_recept->pos, table_recept->nbr + 1, ecs_size_t);
308
table_recept->pos[0] = 1;
309
for (ipos = 0; ipos <= nbr_elt_recept; ipos++)
310
table_recept->pos[ipos] = (table_recept->pas * ipos) + 1;
314
ECS_REALLOC(table_recept->pos, table_recept->nbr + 1, ecs_size_t);
316
/* 2ème étape : ajouter les positions à concaténer */
318
pos_recept_fin = table_recept->pos[nbr_elt_recept];
320
if (table_concat->pos == NULL) {
322
for (ipos = 1; ipos <= table_concat->nbr; ipos++)
323
table_recept->pos[nbr_elt_recept + ipos]
324
= pos_recept_fin + (ipos * table_concat->pas);
327
else { /* if (table_concat->pos != NULL) */
329
for (ipos = 1; ipos <= table_concat->nbr; ipos++)
330
table_recept->pos[nbr_elt_recept + ipos]
331
= pos_recept_fin - 1 + table_concat->pos[ipos];
337
if (table_recept->pos != NULL)
338
table_recept->pas = 0;
340
/* Traitement de la table des valeurs */
341
/*------------------------------------*/
343
/* On concatène les tables de valeurs,
344
en renumérotant éventuellement des attributs */
346
if (table_recept->nbr > 0) {
348
/* 1ère étape : construire ou agrandir le tableau des valeurs,
349
et le remplir des valeurs de la table initiale */
351
if (nbr_elt_recept == 0) {
352
assert(table_recept->val == NULL);
353
ECS_MALLOC(table_recept->val,
354
nbr_val_recept + nbr_val_concat,
358
assert(table_recept->val != NULL);
359
ECS_REALLOC(table_recept->val,
360
nbr_val_recept + nbr_val_concat,
364
/* 2ème étape : ajouter les valeurs à concaténer, en les renumérotant,
367
if (tab_renum_descr.nbr == 0 && nbr_val_concat > 0)
369
memcpy(((ecs_int_t *)table_recept->val) + nbr_val_recept,
371
nbr_val_concat * sizeof(ecs_int_t));
375
ecs_int_t *tab_val_recept = table_recept->val;
376
ecs_int_t *tab_val_concat = table_concat->val;
378
for (ival = 0; ival < nbr_val_concat; ival++)
379
tab_val_recept[nbr_val_recept + ival]
380
= tab_renum_descr.val[ECS_ABS(tab_val_concat[ival]) - 1] + 1;
384
} /* Fin de la concaténation des tables de valeurs */
387
/* Suppression du tableau de renumérotation des descripteurs */
389
if (tab_renum_descr.nbr > 0)
390
ECS_FREE(tab_renum_descr.val);
393
/*============================================================================
394
* Fonctions publiques
395
*============================================================================*/
397
/*----------------------------------------------------------------------------
398
* Fonction qui crée une structure `ecs_table_t'
400
* La structure devient propriétaire des tableaux tab_pos et tab_val
401
* fournis en argument.
403
* nbr : Nombre d'éléments à remplir
404
* pas : Pas des positions si REGLE
405
* pos : Positions de la table si non REGLE
406
* val : Valeurs de la table
407
* descr : Pointeur sur le descripteur
408
* statut_e : Statut dans une transformation
409
*----------------------------------------------------------------------------*/
412
ecs_table__cree(size_t nbr,
418
ecs_table_t *this_table;
420
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
422
/* Allocation de la structure `ecs_table_t' */
423
/*------------------------------------------*/
425
ECS_MALLOC(this_table, 1, ecs_table_t);
427
this_table->nbr = nbr;
429
/* Définition des positions des valeurs (itérateur) */
430
/*--------------------------------------------------*/
432
this_table->pas = pas;
433
this_table->pos = pos;
435
ecs_table__pos_en_regle(this_table);
437
/* Définition de la table des valeurs (conteneur) */
438
/*------------------------------------------------*/
440
this_table->val = val;
442
/* Affectation du descripteur de table */
443
/*-------------------------------------*/
445
this_table->descr = descr;
450
/*----------------------------------------------------------------------------
451
* Fonction qui crée une structure `ecs_table_t'
453
* nbr : Nombre d'éléments à remplir
454
* nbr_val : Nombre de valeurs à remplir
455
*----------------------------------------------------------------------------*/
458
ecs_table__alloue(size_t nbr,
461
ecs_table_t *this_table;
463
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
465
/* Allocation de la structure `ecs_table_t' */
466
/*------------------------------------------*/
468
ECS_MALLOC(this_table, 1, ecs_table_t);
470
this_table->nbr = nbr;
472
/* Définition des positions des valeurs (itérateur) */
473
/*--------------------------------------------------*/
477
ECS_MALLOC(this_table->pos, nbr + 1, ecs_size_t);
479
/* Définition de la table des valeurs (conteneur) */
480
/*------------------------------------------------*/
482
ECS_MALLOC(this_table->val, nbr_val, ecs_int_t);
484
/* Affectation du descripteur de table */
485
/*-------------------------------------*/
487
this_table->descr = NULL;
492
/*----------------------------------------------------------------------------
493
* Fonction libérant une structure `ecs_table_t' donnée en argument.
494
*----------------------------------------------------------------------------*/
497
ecs_table__detruit(ecs_table_t **this_table)
499
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
501
if (this_table == NULL)
504
if (*this_table == NULL)
507
/* Libération du contenu de la structure `ecs_table_t' */
508
/*=================================================*/
510
/* Libération de la structure des positions */
511
/*------------------------------------------*/
513
if ((*this_table)->pos != NULL)
514
ECS_FREE((*this_table)->pos);
516
/* Libération de la structure des valeurs */
517
/*----------------------------------------*/
519
if ((*this_table)->val != NULL)
520
ECS_FREE((*this_table)->val);
522
/* Libération du descripteur de table */
523
/*------------------------------------*/
525
/* Appel à la fonction de libération d'un descripteur de table */
527
if ((*this_table)->descr != NULL)
528
ecs_descr_chaine__detruit(&((*this_table)->descr));
530
/* Libération de la structure `ecs_table_t' */
531
/*==========================================*/
533
ECS_FREE(*this_table);
536
/*----------------------------------------------------------------------------
537
* Fonction qui convertit, si possible,
538
* le tableau des positions d'une table en REGLE
539
*----------------------------------------------------------------------------*/
542
ecs_table__pos_en_regle(ecs_table_t *this_table)
548
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
550
assert(this_table != NULL);
554
if (this_table->pos != NULL && this_table->nbr > 0) {
558
pos_pas = this_table->pos[1] - this_table->pos[0];
560
for (ipos = 1; ipos < this_table->nbr; ipos++) {
562
if (this_table->pos[ipos + 1] - this_table->pos[ipos] != pos_pas) {
569
if (bool_regle == true) {
571
this_table->pas = pos_pas;
573
ECS_FREE(this_table->pos);
580
/*----------------------------------------------------------------------------
581
* Fonction qui construit, si nécessaire, un tableau des positions à
582
* partir d'une REGLE.
583
*----------------------------------------------------------------------------*/
586
ecs_table__regle_en_pos(ecs_table_t *this_table)
591
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
593
assert(this_table != NULL);
595
if (this_table->pos == NULL) {
597
ECS_MALLOC(tab_pos, this_table->nbr + 1, ecs_size_t);
599
for (ipos = 0; ipos <= this_table->nbr; ipos++)
600
tab_pos[ipos] = (ipos * this_table->pas) + 1;
602
this_table->pos = tab_pos;
606
/*----------------------------------------------------------------------------
607
* Fonction qui libère, si possible, le tableau des positions d'une table.
608
* Ce tableau ne doit pas avoir été modifié.
609
*----------------------------------------------------------------------------*/
612
ecs_table__libere_pos(ecs_table_t *this_table)
614
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
616
assert(this_table != NULL);
618
if (this_table->pas != 0 && this_table->pos != NULL)
619
ECS_FREE(this_table->pos);
622
/*----------------------------------------------------------------------------
623
* Fonction imprimant le contenu d'une structure `ecs_table_t' donnée
624
* sur le flux décrit par la structure `FILE'
625
*----------------------------------------------------------------------------*/
628
ecs_table__imprime(const ecs_table_t *this_table,
633
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
635
assert(this_table != NULL);
636
assert(fic_imp != NULL);
640
/* Impression des tables d'information de la table */
641
/*-------------------------------------------------*/
643
ecs_fic__imprime_val(fic_imp, imp_col, "nbr_elt", ECS_TYPE_size_t,
646
ecs_fic__imprime_val(fic_imp, imp_col, "pos_pas", ECS_TYPE_size_t,
649
ecs_fic__imprime_ptr(fic_imp, imp_col, "pos_tab", this_table->pos);
650
ecs_fic__imprime_ptr(fic_imp, imp_col, "val_tab", this_table->val);
653
/* Impression des positions et des valeurs */
654
/*-----------------------------------------*/
656
if (this_table->pos == NULL && this_table->val != NULL)
657
_imprime_pos_pas(fic_imp,
663
else if (this_table->pos != NULL)
664
_imprime_pos_tab(fic_imp,
670
/* Impression de la liste chaînée des descripteurs */
671
/*-------------------------------------------------*/
673
/* Impression du pointeur sur le descripteur de tête */
675
ecs_fic__imprime_val(fic_imp, imp_col, "descr_tete", ECS_TYPE_void,
678
if (this_table->descr != NULL) {
680
/* Appel à la fonction d'impression d'une chaîne de descripteurs de table */
682
ecs_descr_chaine__imprime(this_table->descr,
689
/*----------------------------------------------------------------------------
690
* Fonction qui renvoie la taille en octets d'une structure `ecs_table_t'
691
*----------------------------------------------------------------------------*/
694
ecs_table__ret_taille(const ecs_table_t *this_table)
699
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
701
if (this_table == NULL)
704
taille = sizeof(*this_table);
706
if (this_table->pos != NULL)
707
taille += (sizeof(ecs_int_t) * (this_table->nbr + 1));
709
if (this_table->val != NULL) {
710
nbr_val = ecs_table__ret_val_nbr(this_table);
711
taille += (sizeof(ecs_int_t) * nbr_val);
714
if (this_table->descr != NULL)
715
taille += ecs_descr_chaine__ret_taille(this_table->descr);
720
/*----------------------------------------------------------------------------
721
* Fonction qui renvoie une table entièrement réallouée
722
* dont le contenu est copié à partir de la table donnée
724
* Le membre donnant le lien sur une table suivant `l_table_sui'
725
* n'est pas copié et est mis à `NULL'
726
*----------------------------------------------------------------------------*/
729
ecs_table__copie(ecs_table_t *table_init)
732
ecs_table_t * this_table;
734
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
736
assert(table_init != NULL);
738
ECS_MALLOC(this_table, 1, ecs_table_t);
740
this_table->nbr = table_init->nbr;
742
this_table->pas = table_init->pas;
744
if (table_init->pos != NULL) {
745
ECS_MALLOC(this_table->pos, table_init->nbr + 1, ecs_size_t);
746
memcpy(this_table->pos,
748
(table_init->nbr + 1) * sizeof(ecs_size_t));
751
this_table->pos = NULL;
753
if (table_init->val != NULL) {
754
nbr_val = ecs_table__ret_val_nbr(table_init);
755
ECS_MALLOC(this_table->val, nbr_val, ecs_int_t);
756
memcpy(this_table->val,
758
sizeof(ecs_int_t) * nbr_val);
761
this_table->val = NULL;
763
this_table->descr = ecs_descr_chaine__copie(table_init->descr);
768
/*----------------------------------------------------------------------------
769
* Fonction qui créé une structure `ecs_table_t'
770
* à partir d'un tableau `tab_elt' contenant les valeurs de la table.
772
* Si un élément n'a pas de valeur associée, la valeur correspondante
773
* dans `tab_elt' est `0'
774
*----------------------------------------------------------------------------*/
777
ecs_table__transforme_tableau(size_t nbr_elt,
778
const ecs_int_t *tab_elt,
786
ecs_table_t * this_table;
788
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
790
assert(nbr_elt != 0);
791
assert(tab_elt != NULL);
793
/* Allocation de la structure `ecs_table_t' */
794
/*--------------------------------------*/
796
ECS_MALLOC(this_table, 1, ecs_table_t);
798
this_table->nbr = nbr_elt;
800
/* Construction des tableaux de positions et de valeurs */
801
/*------------------------------------------------------*/
803
ECS_MALLOC(pos_tab, nbr_elt + 1, ecs_size_t);
804
ECS_MALLOC(val_tab, nbr_elt , ecs_int_t);
809
for (ielt = 0; ielt < nbr_elt; ielt++) {
811
if (tab_elt[ielt] != 0) {
812
pos_tab[ielt + 1] = pos_tab[ielt] + 1;
813
val_tab[cpt_val++] = tab_elt[ielt];
816
pos_tab[ielt + 1] = pos_tab[ielt];
820
ECS_REALLOC(val_tab, cpt_val, ecs_int_t);
822
/* Création de la table des positions des valeurs (itérateur) */
823
/*------------------------------------------------------------*/
826
this_table->pos = pos_tab;
828
ecs_table__pos_en_regle(this_table);
830
/* Création de la table des valeurs (conteneur) */
831
/*----------------------------------------------*/
833
this_table->val = val_tab;
835
/* Affectation du descripteur de table */
836
/*-------------------------------------*/
838
this_table->descr = descr;
843
/*----------------------------------------------------------------------------
844
* Fonction renvoyant le nombre d'éléments associés à une table donnée
845
*----------------------------------------------------------------------------*/
848
ecs_table__ret_elt_nbr(const ecs_table_t *this_table)
852
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
854
if (this_table != NULL)
855
retval = this_table->nbr;
861
/*----------------------------------------------------------------------------
862
* Fonction renvoyant le nombre de valeurs associées à une table donnée
863
*----------------------------------------------------------------------------*/
866
ecs_table__ret_val_nbr(const ecs_table_t *this_table)
870
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
872
assert(this_table != NULL);
874
if (this_table->pos != NULL)
875
nbr_val = this_table->pos[this_table->nbr] - 1;
877
nbr_val = (this_table->pas * this_table->nbr);
882
/*----------------------------------------------------------------------------
883
* Fonction retournant le nombre de descripteurs d'une table donnée
884
*----------------------------------------------------------------------------*/
887
ecs_table__ret_descr_nbr(const ecs_table_t *this_table)
889
assert(this_table != NULL);
891
return ecs_descr_chaine__ret_nbr(this_table->descr);
894
/*----------------------------------------------------------------------------
895
* Fonction libérant un pointeur sur le tableau des positions d'une
896
* structure `ecs_table_t' donnée.
898
* Si les positions correspondent à une REGLE, le tableau est libéré.
899
* Sinon, il est conservé par la structure ecs_table_t.
900
*----------------------------------------------------------------------------*/
903
ecs_table__libere_pos_tab(const ecs_table_t *this_table,
906
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
908
assert(this_table != NULL);
909
assert(this_table->pos == NULL || this_table->pos == pos_tab);
911
if (this_table->pos == NULL)
915
/*----------------------------------------------------------------------------
916
* Fonction qui concatène deux tables, et supprime la table à concaténer
917
*----------------------------------------------------------------------------*/
920
ecs_table__concatene(ecs_table_t **this_table,
921
ecs_table_t **concat_table,
923
size_t nbr_elt_concat)
925
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
927
assert(this_table != NULL);
928
assert(concat_table != NULL);
930
/* ------------------------------------------------------------------ */
931
/* PARTIE REALISEE PENDANT LA FUSION */
932
/* ------------------------------------------------------------------ */
933
/* Si la table n'existe pas dans l'entité de maillage à concaténer */
934
/* et si c'est une table de type "attribut" */
935
/* (pour lequel tous les éléments doivent être renseignes) */
936
/* on initialise les valeurs de l'attribut pour la table à concaténer */
937
/* ------------------------------------------------------------------ */
939
/* La table existe dans l'entité de maillage à concaténer */
941
if (*concat_table != NULL) {
943
/* On le concatène */
945
if (*this_table != NULL) {
946
_table__concatene(*this_table, *concat_table);
947
ecs_table__detruit(concat_table);
950
ecs_table__prolonge(*concat_table,
953
*this_table = *concat_table;
954
*concat_table = NULL;
958
/* La table n'existe pas dans l'entité de maillage à concaténer */
961
ecs_table__prolonge(*this_table,
965
} /* Fin : boucle sur les tables de l'entité de maillage receptrice */
968
/*----------------------------------------------------------------------------
969
* Fonction qui prolonge une table réceptrice donné
971
* Il s'agit en fait de concaténer la table avec une table vide. Seule la
972
* table des positions est modifiée. Les autres membres de la structure de
973
* la table réceptrice ne sont pas modifiés.
974
*----------------------------------------------------------------------------*/
977
ecs_table__prolonge(ecs_table_t *this_table,
986
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
988
if (this_table == NULL)
991
ecs_table__regle_en_pos(this_table);
993
nbr_elt_ini = this_table->nbr;
995
#if defined(SX) && defined(_SX) /* NEC SX compiler may bug on : operator */
996
if (this_table->pos != NULL)
999
bool_pos_ini = false;
1001
bool_pos_ini = (this_table->pos != NULL) ? true : false;
1004
/* Mise à jour du nombre d'éléments */
1006
this_table->nbr += nbr_elt_prec + nbr_elt_suiv;
1008
/* Si la table n'est pas déjà vide, la table des positions ne
1009
correspondra pas à une REGLE, et devra être construite */
1011
if (this_table->pos != NULL || this_table->pas != 0) {
1013
ECS_REALLOC(this_table->pos, this_table->nbr + 1, ecs_size_t);
1015
if (bool_pos_ini == true) {
1016
memmove(this_table->pos + (nbr_elt_prec * sizeof(ecs_int_t)),
1018
(this_table->nbr + 1) * sizeof(ecs_int_t));
1021
for (ipos = 0; ipos <= nbr_elt_ini; ipos++)
1022
this_table->pos[nbr_elt_prec + ipos]
1023
= (ipos * this_table->pas) + 1;
1026
this_table->pos[0] = 1;
1028
for (ipos = 0; ipos < nbr_elt_prec; ipos++)
1029
this_table->pos[ipos + 1] = 1;
1031
pos_fin = this_table->pos[nbr_elt_prec + nbr_elt_ini];
1032
for (ipos = 0; ipos < nbr_elt_suiv; ipos++)
1033
this_table->pos[nbr_elt_prec + nbr_elt_ini + ipos + 1] = pos_fin;
1037
ecs_table__pos_en_regle(this_table);
1040
/*----------------------------------------------------------------------------
1041
* Fonction réalisant la transformation d'un table
1042
* en appliquant directement le vecteur de transformation donné
1045
* Le nombre de valeurs transformées doit être égal
1046
* au nombre de valeurs avant transformation
1047
*----------------------------------------------------------------------------*/
1050
ecs_table__transforme_pos(ecs_table_t *this_table,
1052
const ecs_tab_int_t vect_transf)
1054
ecs_table_t *table_ref;
1060
ecs_int_t elt_nbr_val;
1064
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
1066
if (this_table == NULL)
1069
ecs_table__regle_en_pos(this_table);
1071
assert(vect_transf.nbr == nbr_elt_ref);
1072
assert(this_table->nbr == nbr_elt_ref);
1074
nbr_val_ref = ecs_table__ret_val_nbr(this_table);
1076
table_ref = ecs_table__alloue(nbr_elt_ref, nbr_val_ref);
1078
for (ielt_ref = 0; ielt_ref < nbr_elt_ref + 1; ielt_ref++)
1079
table_ref->pos[ielt_ref] = this_table->pos[ielt_ref];
1081
for (ival_ref = 0; ival_ref < nbr_val_ref; ival_ref++)
1082
table_ref->val[ival_ref] = this_table->val[ival_ref];
1084
this_table->pos[0] = 1;
1088
for (ielt_transf = 0; ielt_transf < nbr_elt_ref; ielt_transf++) {
1090
pre_pos = table_ref->pos[vect_transf.val[ielt_transf]];
1093
= table_ref->pos[vect_transf.val[ielt_transf] + 1] - pre_pos;
1095
this_table->pos[ielt_transf + 1]
1096
= this_table->pos[ielt_transf] + elt_nbr_val;
1098
for (ival = 0; ival < elt_nbr_val; ival++) {
1100
this_table->val[cpt_val++]
1101
= table_ref->val[pre_pos - 1 + ival];
1106
ecs_table__detruit(&table_ref);
1108
ecs_table__pos_en_regle(this_table);
1111
/*----------------------------------------------------------------------------
1112
* Fonction qui incrémente les valeurs d'une table donnée
1113
* d'une constante donnée
1114
*----------------------------------------------------------------------------*/
1117
ecs_table__incremente_val(ecs_table_t *this_table,
1118
const ecs_int_t increment)
1123
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
1125
if (this_table == NULL)
1128
nbr_val = ecs_table__ret_val_nbr(this_table);
1130
for (ival = 0; ival < nbr_val; ival++) {
1132
if (this_table->val[ival] > 0)
1133
this_table->val[ival] += increment;
1134
else if (this_table->val[ival] < 0)
1135
this_table->val[ival] -= increment;
1139
/*----------------------------------------------------------------------------
1140
* Fonction réalisant la transformation d'un vecteur indexé
1141
* en appliquant directement le vecteur de transformation donné
1142
* sur les valeurs associées à ses éléments
1143
*----------------------------------------------------------------------------*/
1146
ecs_table__renumerote(ecs_table_t *this_table,
1147
const ecs_tab_int_t vect_transf,
1148
const ecs_tab_int_t signe_elt)
1150
ecs_table_t *table_ref;
1156
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
1158
if (this_table == NULL)
1161
nbr_val_ref = ecs_table__ret_val_nbr(this_table);
1163
table_ref = ecs_table__alloue(0, nbr_val_ref);
1165
for (ival_ref = 0; ival_ref < nbr_val_ref; ival_ref++)
1166
table_ref->val[ival_ref] = this_table->val[ival_ref];
1168
for (ival_ref = 0; ival_ref < nbr_val_ref; ival_ref++) {
1170
val_ref = ECS_ABS(table_ref->val[ival_ref]);
1171
sgn_ref = table_ref->val[ival_ref] / val_ref;
1173
this_table->val[ival_ref] = vect_transf.val[val_ref - 1] + 1;
1175
this_table->val[ival_ref] *= signe_elt.val[val_ref - 1] * sgn_ref;
1179
ecs_table__detruit(&table_ref);
1182
/*----------------------------------------------------------------------------
1183
* Fonction qui détermine une nouvelle table à partir d'une table de
1184
* référence en extrayant de ce dernier les éléments sélectionnés
1185
* par le tableau de booléens
1186
*----------------------------------------------------------------------------*/
1189
ecs_table__extrait(ecs_table_t *table_ref,
1190
const ecs_tab_bool_t bool_elt_select)
1194
size_t cpt_val_old_new;
1203
ecs_table_t *table_new;
1205
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
1207
ecs_table__regle_en_pos(table_ref);
1209
nbr_elt_ref = table_ref->nbr;
1210
nbr_val_ref = ecs_table__ret_val_nbr(table_ref);
1212
table_new = ecs_table__alloue(nbr_elt_ref,
1215
/* Extraction de la table */
1217
nbr_elt_ref = table_ref->nbr;
1218
nbr_val_ref = ecs_table__ret_val_nbr(table_ref);
1220
table_new->pos[0] = 1;
1223
cpt_val_old_new = 0;
1225
for (ielt_ref = 0; ielt_ref < nbr_elt_ref; ielt_ref++) {
1227
if (bool_elt_select.val[ielt_ref] == true) {
1229
/* L'élément est à extraire */
1231
pos_ref_inf = table_ref->pos[ielt_ref ] - 1;
1232
pos_ref_sup = table_ref->pos[ielt_ref + 1] - 1;
1234
for (ipos_ref = pos_ref_inf; ipos_ref < pos_ref_sup; ipos_ref++)
1235
table_new->val[cpt_val_new++] = table_ref->val[ipos_ref];
1237
table_new->pos[cpt_elt_new + 1] = cpt_val_new + 1;
1244
ECS_REALLOC(table_new->pos, cpt_elt_new + 1, ecs_size_t);
1245
ECS_REALLOC(table_new->val, cpt_val_new, ecs_int_t);
1247
table_new->nbr = cpt_elt_new;
1249
ecs_table__pos_en_regle(table_ref);
1254
/*----------------------------------------------------------------------------*/