bool s_to_r8vec ( std::string s, int n, double rvec[] ) { int begin; bool error; int i; int lchar; int length; begin = 0; length = s.length ( ); error = 0; for ( i = 0; i < n; i++ ) { rvec[i] = s_to_r8 ( s.substr(begin,length), &lchar, &error ); if ( error ) { return error; } begin = begin + lchar; length = length - lchar; } return error; }
int s_to_r8vec ( char *s, int n, double rvec[] ) /******************************************************************************/ /* Purpose: S_TO_R8VEC reads an R8VEC from a string. Licensing: This code is distributed under the GNU LGPL license. Modified: 19 February 2001 Author: John Burkardt Parameters: Input, char *S, the string to be read. Input, int N, the number of values expected. Output, double RVEC[N], the values read from the string. Output, int S_TO_R8VEC, is TRUE (1) if an error occurred and FALSE (0) otherwise. */ { int error; int i; int lchar; error = 0; for ( i = 0; i < n; i++ ) { rvec[i] = s_to_r8 ( s, &lchar, &error ); if ( error ) { return error; } s = s + lchar; } return error; }
void gmsh_size_read ( char *gmsh_filename, int *node_num, int *node_dim, int *element_num, int *element_order ) /******************************************************************************/ /* Purpose: GMSH_SIZE_READ reads sizes from a GMSH file. Licensing: This code is distributed under the GNU LGPL license. Modified: 19 October 2014 Author: John Burkardt Parameters: Input, character *GMSH_FILENAME, the GMSH filename. Output, int *NODE_NUM, the number of nodes. Output, int *NODE_DIM, the spatial dimension. Output, int *ELEMENT_NUM, the number of elements. Output, int *ELEMENT_ORDER, the order of the elements. */ { char *error; int ierror; int indx; FILE *input; int input_stat; int k; int length; int level; const double r8_big = 1.0E+30; char text[255]; char* text_pointer; double x; double x_max; double x_min; double y; double y_max; double y_min; double z; double z_max; double z_min; *node_num = 0; *node_dim = 0; x_max = - r8_big; x_min = + r8_big; y_max = - r8_big; y_min = + r8_big; z_max = - r8_big; z_min = + r8_big; input = fopen ( gmsh_filename, "rt" ); if ( ! input ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "GMSH_SIZE_READ - Fatal error!\n" ); fprintf ( stderr, " Could not open input file \"%s\"\n", gmsh_filename ); exit ( 1 ); } level = 0; for ( ; ; ) { text_pointer = text; error = fgets ( text_pointer, 255, input ); if ( !error ) { break; } if ( level == 0 ) { if ( s_begin ( text_pointer, "$Nodes" ) ) { level = 1; } } else if ( level == 1 ) { *node_num = s_to_i4 ( text_pointer, &length, &ierror ); level = 2; } else if ( level == 2 ) { if ( s_begin ( text_pointer, "$EndNodes" ) ) { break; } else { indx = s_to_i4 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; x = s_to_r8 ( text_pointer, &length, &ierror ); x_min = r8_min ( x_min, x ); x_max = r8_max ( x_max, x ); text_pointer = text_pointer + length; y = s_to_r8 ( text_pointer, &length, &ierror ); y_min = r8_min ( y_min, y ); y_max = r8_max ( y_max, y ); text_pointer = text_pointer + length; z = s_to_r8 ( text_pointer, &length, &ierror); text_pointer = text_pointer + length; z_min = r8_min ( z_min, z ); z_max = r8_max ( z_max, z ); } } } /* Make a very simple guess as to the dimensionality of the data. */ *node_dim = 3; if ( z_max == z_min ) { *node_dim = 2; if ( y_max == y_min ) { *node_dim = 1; } } /* Now read element information. */ level = 0; for ( ; ; ) { text_pointer = text; error = fgets ( text_pointer, 255, input ); if ( !error ) { break; } if ( level == 0 ) { if ( s_begin ( text_pointer, "$Elements" ) ) { level = 1; } } else if ( level == 1 ) { *element_num = s_to_i4 ( text_pointer, &length, &ierror ); level = 2; } else if ( level == 2 ) { if ( s_begin ( text_pointer, "$EndElements" ) ) { break; } else { k = 0; for ( ; ; ) { indx = s_to_i4 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; if ( ierror != 0 ) { break; } k = k + 1; } *element_order = k - 5; break; } } } fclose ( input ); return; }
void gmsh_data_read ( char *gmsh_filename, int node_dim, int node_num, double node_x[], int element_order, int element_num, int element_node[] ) /******************************************************************************/ /* Purpose: GMSH_DATA_READ reads data from a GMSH file. Licensing: This code is distributed under the GNU LGPL license. Modified: 20 October 2014 Author: John Burkardt Parameters: Input, character *GMSH_FILENAME, the GMSH filename. Input, int NODE_DIM, the spatial dimension. Input, int NODE_NUM, the number of nodes. Input, double NODE_X[NODE_DIM*NODE_NUM], the node coordinates. Input, int ELEMENT_ORDER, the order of the elements. Input, int ELEMENT_NUM, the number of elements. Input, int ELEMENT_NODE[ELEMENT_ORDER*ELEMENT_NUM], the nodes that make up each element. */ { char *error; int i; int i4_dummy; int ierror; int indx; FILE *input; int input_stat; int j; int k; int length; int level; const double r8_big = 1.0E+30; char text[255]; char* text_pointer; double x; double x_max; double x_min; double y; double y_max; double y_min; double z; double z_max; double z_min; x_max = - r8_big; x_min = + r8_big; y_max = - r8_big; y_min = + r8_big; z_max = - r8_big; z_min = + r8_big; input = fopen ( gmsh_filename, "rt" ); if ( ! input ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "GMSH_DATA_READ - Fatal error!\n" ); fprintf ( stderr, " Could not open input file \"%s\"\n", gmsh_filename ); exit ( 1 ); } level = 0; for ( ; ; ) { text_pointer = text; error = fgets ( text_pointer, 255, input ); if ( !error ) { break; } if ( level == 0 ) { if ( s_begin ( text_pointer, "$Nodes" ) ) { level = 1; j = 0; } } else if ( level == 1 ) { i4_dummy = s_to_i4 ( text_pointer, &length, &ierror ); level = 2; } else if ( level == 2 ) { if ( s_begin ( text_pointer, "$EndNodes" ) ) { break; } else { indx = s_to_i4 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; for ( i = 0; i < node_dim; i++ ) { x = s_to_r8 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; node_x[i+j*node_dim] = x; } j = j + 1; } } } /* Now read element information. */ level = 0; for ( ; ; ) { text_pointer = text; error = fgets ( text_pointer, 255, input ); if ( !error ) { break; } if ( level == 0 ) { if ( s_begin ( text_pointer, "$Elements" ) ) { level = 1; j = 0; } } else if ( level == 1 ) { i4_dummy = s_to_i4 ( text_pointer, &length, &ierror ); level = 2; } else if ( level == 2 ) { if ( s_begin ( text_pointer, "$EndElements" ) ) { break; } else { for ( k = 1; k <= 5; k++ ) { i4_dummy = s_to_i4 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; } for ( i = 0; i < element_order; i++ ) { k = s_to_i4 ( text_pointer, &length, &ierror ); text_pointer = text_pointer + length; element_node[i+j*element_order] = k; } j = j + 1; } } } fclose ( input ); return; }