@@ -193,7 +193,6 @@ int feenox_mesh_read_frd(mesh_t *this) {
193193
194194 char buffer [BUFFER_SIZE ];
195195 char tmp [BUFFER_SIZE ];
196- int * tag2index = NULL ;
197196
198197 if (this -> file -> pointer == NULL ) {
199198 feenox_call (feenox_instruction_file_open (this -> file ));
@@ -259,7 +258,8 @@ int feenox_mesh_read_frd(mesh_t *this) {
259258
260259 feenox_check_alloc (this -> node = calloc (this -> n_nodes , sizeof (node_t )));
261260
262- int tag_max = this -> n_nodes ;
261+ size_t tag_min = 0 ;
262+ size_t tag_max = this -> n_nodes ;
263263 for (size_t j = 0 ; j < this -> n_nodes ; j ++ ) {
264264 int minusone ;
265265 if (fscanf (this -> file -> pointer , "%d" , & minusone ) != 1 ) {
@@ -280,7 +280,11 @@ int feenox_mesh_read_frd(mesh_t *this) {
280280 sparse = 1 ;
281281 }
282282
283- if ((this -> node [j ].tag = tag ) > tag_max ) {
283+ if ((this -> node [j ].tag = tag ) < tag_min ) {
284+ tag_min = this -> node [j ].tag ;
285+ }
286+
287+ if (tag > tag_max ) {
284288 tag_max = this -> node [j ].tag ;
285289 }
286290
@@ -316,13 +320,9 @@ int feenox_mesh_read_frd(mesh_t *this) {
316320
317321 // finished reading the nodes, handle sparse node tags
318322 if (sparse ) {
319- // TODO: use the array/map from vtk
320- feenox_check_alloc (tag2index = malloc ((tag_max + 1 ) * sizeof (int )));
321- for (size_t k = 0 ; k <= tag_max ; k ++ ) {
322- tag2index [k ] = -1 ;
323- }
323+ feenox_call (feenox_mesh_tag2index_alloc (this , tag_min , tag_max ));
324324 for (size_t j = 0 ; j < this -> n_nodes ; j ++ ) {
325- tag2index [this -> node [j ].tag ] = j ;
325+ this -> tag2index [this -> node [j ].tag ] = j ;
326326 }
327327 }
328328
@@ -465,7 +465,7 @@ int feenox_mesh_read_frd(mesh_t *this) {
465465 j_gmsh = ccx2gmsh_hex20 [j ];
466466 }
467467
468- int node_index = (sparse == 0 ) ? node - 1 : tag2index [node ];
468+ int node_index = (sparse == 0 ) ? node - 1 : this -> tag2index_from_tag_min [node ];
469469 if (node_index < 0 ) {
470470 feenox_push_error_message ("node %d in element %d does not exist" , node , tag );
471471 return FEENOX_ERROR ;
@@ -663,7 +663,7 @@ int feenox_mesh_read_frd(mesh_t *this) {
663663 return FEENOX_ERROR ;
664664 }
665665 if (function [g ] != NULL ) {
666- int node_index = (sparse == 0 ) ? node - 1 : tag2index [node ];
666+ int node_index = (sparse == 0 ) ? node - 1 : this -> tag2index_from_tag_min [node ];
667667 if (node_index < 0 ) {
668668 feenox_push_error_message ("node %d does not exist" , node );
669669 return FEENOX_ERROR ;
@@ -691,11 +691,6 @@ int feenox_mesh_read_frd(mesh_t *this) {
691691 fclose (this -> file -> pointer );
692692 this -> file -> pointer = NULL ;
693693
694- if (tag2index != NULL ) {
695- feenox_free (tag2index );
696- }
697-
698-
699694 // verificamos que la malla tenga la dimension esperada
700695 if (this -> dim_topo == 0 ) {
701696 this -> dim = bulk_dimensions ;
0 commit comments