int ex_put_init (int exoid, const char *title, int num_dim, int num_nodes, int num_elem, int num_elem_blk, int num_node_sets, int num_side_sets) { ex_init_params par; strcpy( par.title, title ); par.num_dim = num_dim; par.num_nodes = num_nodes; par.num_edge = 0; par.num_edge_blk = 0; par.num_face = 0; par.num_face_blk = 0; par.num_elem = num_elem; par.num_elem_blk = num_elem_blk; par.num_node_sets = num_node_sets; par.num_edge_sets = 0; par.num_face_sets = 0; par.num_side_sets = num_side_sets; par.num_elem_sets = 0; par.num_node_maps = 0; par.num_edge_maps = 0; par.num_face_maps = 0; par.num_elem_maps = 0; return (ex_put_init_ext( exoid, &par )); }
void write_to_exodus(int rank, int num_procs, char * out_file_name) /*****************************************************************************/ { int exo_access = EX_CLOBBER; int cpu_word_size = sizeof(double); int io_word_size = sizeof(float); int out_id; int i; int b; ex_init_params exinit; int error = 0; out_id = ex_create(out_file_name, exo_access, &cpu_word_size, &io_word_size); if (out_id < 0){ printf("error opening file"); } strncpy( exinit.title, mss.title, MAX_LINE_LENGTH-1 ); exinit.title[MAX_LINE_LENGTH-1] = 0; exinit.num_dim = mss.num_dim; exinit.num_nodes = mss.num_nodes; exinit.num_edge = 0; exinit.num_edge_blk = 0; exinit.num_face = 0; exinit.num_face_blk = 0; exinit.num_elem = mss.num_elem; exinit.num_elem_blk = mss.num_elem_blk; exinit.num_node_sets = mss.num_node_sets; exinit.num_edge_sets = 0; exinit.num_face_sets = 0; exinit.num_side_sets = mss.num_side_sets; exinit.num_elem_sets = 0; exinit.num_node_maps = 0; exinit.num_edge_maps = 0; exinit.num_face_maps = 0; exinit.num_elem_maps = 0; PERROR; if ( ex_put_init_ext(out_id, &exinit) < 0 ) ++error; PERROR; /*now write parallel global information*/ if ( ne_put_init_global( out_id, mss.num_nodes_global, mss.num_elems_global, mss.num_elm_blks_global, mss.num_node_sets_global, mss.num_side_sets_global ) < 0 ) ++error; PERROR; if ( ne_put_init_info( out_id, mss.num_total_proc, mss.num_proc_in_file, mss.type ) < 0 ) ++error; PERROR; if ( ne_put_eb_info_global(out_id,mss.elem_blk_ids_global,mss.elem_blk_cnts_global) < 0 ) ++error; PERROR; if ( mss.num_node_sets_global > 0 ) { if ( ne_put_ns_param_global( out_id, mss.ns_ids_global, mss.ns_cnts_global, mss.ns_df_cnts_global ) < 0 ) ++error; } PERROR; if ( mss.num_side_sets_global > 0 ) { if ( ne_put_ss_param_global( out_id, mss.ss_ids_global, mss.ss_cnts_global, mss.ss_df_cnts_global ) < 0 ) ++error; } PERROR; /*writingparallel info*/ if ( ne_put_loadbal_param( out_id, mss.num_internal_nodes, mss.num_border_nodes, mss.num_external_nodes, mss.num_internal_elems, mss.num_border_elems, mss.num_node_comm_maps, mss.num_elem_comm_maps, rank ) < 0 ) ++error; PERROR; if ( ne_put_cmap_params( out_id, mss.node_cmap_ids, (int*)mss.node_cmap_node_cnts, mss.elem_cmap_ids, (int*)mss.elem_cmap_elem_cnts, rank ) < 0 ) ++error; PERROR; if ( ne_put_elem_map( out_id, mss.internal_elements, mss.border_elements, rank ) < 0 ) ++error; PERROR; if ( ne_put_node_map( out_id, mss.internal_nodes, mss.border_nodes, mss.external_nodes, rank ) < 0 ) ++error; PERROR; for (i = 0; i < mss.num_node_comm_maps; i++) { if ( ne_put_node_cmap( out_id, mss.node_cmap_ids[i], mss.comm_node_ids[i], mss.comm_node_proc_ids[i], rank ) < 0 ) ++error; } PERROR; for (i = 0; i < mss.num_elem_comm_maps; i++) { if ( ne_put_elem_cmap( out_id, mss.elem_cmap_ids[i], mss.comm_elem_ids[i], mss.comm_side_ids[i], mss.comm_elem_proc_ids[i], rank ) < 0 ) ++error; } PERROR; /*coords*/ error += ex_put_coord(out_id, mss.coord, (mss.coord)+mss.num_nodes, (mss.coord)+2*mss.num_nodes); PERROR; error += ex_put_coord_names(out_id, mss.bptr); PERROR; /*map*/ error += ex_put_map(out_id, mss.element_order_map); PERROR; error += ex_put_elem_num_map(out_id, mss.global_element_numbers); PERROR; error += ex_put_node_num_map(out_id, mss.global_node_numbers); PERROR; /*block info*/ for(b = 0; b < mss.num_elem_blk; b++) { int gpe = 0; int fpe = 0; error += ex_put_block( out_id, EX_ELEM_BLOCK, mss.block_id[b], mss.element_types[b], mss.elements[b], mss.nodes_per_element[b], gpe, fpe, mss.element_attributes[b] ); /* num attr */ PERROR; } /* write element connectivity information */ for (b = 0; b < mss.num_elem_blk; b++) { if ( mss.elements[b] > 0 ){ error += ex_put_elem_conn(out_id,mss.block_id[b],mss.elmt_node_linkage[b]); PERROR; } } /* write in nodal boundary sets for the body. */ for(i = 0; i < mss.num_node_sets; i++) { error += ex_put_node_set_param(out_id, mss.node_set_id[i], mss.num_nodes_in_node_set[i], mss.num_df_in_node_set[i]); PERROR; if(mss.num_nodes_in_node_set[i]) error += ex_put_node_set(out_id, mss.node_set_id[i], mss.node_set_nodes[i]); PERROR; } for(i = 0; i < mss.num_side_sets; i++) { error += ex_put_side_set_param(out_id, mss.side_set_id[i], mss.num_elements_in_side_set[i], mss.num_df_in_side_set[i]); PERROR; if(mss.num_elements_in_side_set[i]) error += ex_put_side_set(out_id, mss.side_set_id[i], mss.side_set_elements[i], mss.side_set_faces[i]); PERROR; } error += ex_put_qa(out_id, mss.num_qa_records, mss.qaRecord); PERROR; ex_close(out_id); }
int main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block[10], num_total_nodes_per_blk[10]; int num_face_in_block[10], num_total_faces_per_blk[10]; int num_node_sets, error; int i, j, *connect; int bids, nnpe[20]; int num_qa_rec, num_info; int CPU_word_size,IO_word_size; float x[100], y[100], z[100]; char *coord_names[3], *qa_record[2][4], *info[3]; char *block_names[10]; char *title = "This is a test"; ex_opts (EX_VERBOSE | EX_ABORT ); /* Specify compute and i/o word size */ CPU_word_size = 0; /* sizeof(float) */ IO_word_size = 4; /* (4 bytes) */ /* create EXODUS II file */ exoid = ex_create ("test-nfaced.exo", /* filename path */ EX_CLOBBER, /* create mode */ &CPU_word_size, /* CPU float word size in bytes */ &IO_word_size); /* I/O float word size in bytes */ printf ("after ex_create for test.exo, exoid = %d\n", exoid); printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size); /* initialize file with parameters */ { ex_init_params par; num_dim = 3; num_nodes = 14; num_elem = 3; num_elem_blk = 1; num_node_sets = 0; strcpy( par.title, title ); par.num_dim = num_dim; par.num_nodes = num_nodes; par.num_edge = 0; par.num_edge_blk = 0; par.num_face = 15; par.num_face_blk = 1; par.num_elem = num_elem; par.num_elem_blk = num_elem_blk; par.num_node_sets = num_node_sets; par.num_edge_sets = 0; par.num_face_sets = 0; par.num_side_sets = 0; par.num_elem_sets = 0; par.num_node_maps = 0; par.num_edge_maps = 0; par.num_face_maps = 0; par.num_elem_maps = 0; error = ex_put_init_ext (exoid, &par); printf ("after ex_put_init_ext, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } /* write nodal coordinates values and names to database */ x[ 0] = 0.00000e+00 ; y[ 0] = 0.00000e+00 ; z[ 0] = 0.00000e+00 ; x[ 1] = 2.00000e+00 ; y[ 1] = 0.00000e+00 ; z[ 1] = 0.00000e+00 ; x[ 2] = 0.00000e+00 ; y[ 2] = 2.00000e+00 ; z[ 2] = 0.00000e+00 ; x[ 3] = 2.00000e+00 ; y[ 3] = 2.00000e+00 ; z[ 3] = 0.00000e+00 ; x[ 4] = 0.00000e+00 ; y[ 4] = 0.00000e+00 ; z[ 4] = 2.00000e+00 ; x[ 5] = 2.00000e+00 ; y[ 5] = 0.00000e+00 ; z[ 5] = 2.00000e+00 ; x[ 6] = 0.00000e+00 ; y[ 6] = 2.00000e+00 ; z[ 6] = 2.00000e+00 ; x[ 7] = 2.00000e+00 ; y[ 7] = 2.00000e+00 ; z[ 7] = 2.00000e+00 ; x[ 8] = 0.00000e+00 ; y[ 8] = 3.50000e+00 ; z[ 8] = 1.00000e+00 ; x[ 9] = 2.00000e+00 ; y[ 9] = 3.50000e+00 ; z[ 9] = 1.00000e+00 ; x[10] = 0.00000e+00 ; y[10] = 3.00000e+00 ; z[10] = 1.50000e+00 ; x[11] = 2.00000e+00 ; y[11] = 3.00000e+00 ; z[11] = 1.50000e+00 ; x[12] = 0.00000e+00 ; y[12] = 3.00000e+00 ; z[12] = 0.50000e+00 ; x[13] = 2.00000e+00 ; y[13] = 3.00000e+00 ; z[13] = 0.50000e+00 ; error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } coord_names[0] = "x"; coord_names[1] = "y"; coord_names[2] = "z"; error = ex_put_coord_names (exoid, coord_names); printf ("after ex_put_coord_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write the face block parameters */ block_names[0] = "face_block_1"; num_face_in_block[0] = 15; num_total_nodes_per_blk[0] = 58; bids = 10; error = ex_put_block (exoid, EX_FACE_BLOCK, bids, "nsided", num_face_in_block[0], num_total_nodes_per_blk[0], 0, 0, 0); printf ("after ex_put_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write face block names */ error = ex_put_names(exoid, EX_FACE_BLOCK, block_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write face connectivity */ connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int)); i = 0; j = 0; connect[i++] = 5; connect[i++] = 6; connect[i++] = 8; /* connectivity of face 1 of element 1 */ nnpe[j++] = 3; connect[i++] = 2; connect[i++] = 1; connect[i++] = 4; /* face 2 of element 1 */ nnpe[j++] = 3; connect[i++] = 6; connect[i++] = 2; connect[i++] = 4; connect[i++] = 8; /* face 3 of element 1 */ nnpe[j++] = 4; connect[i++] = 8; connect[i++] = 4; connect[i++] = 1; connect[i++] = 5; /* face 4 of element 1 */ nnpe[j++] = 4; connect[i++] = 1; connect[i++] = 2; connect[i++] = 6; connect[i++] = 5; /* face 5 of element 1 */ nnpe[j++] = 4; connect[i++] = 5; connect[i++] = 8; connect[i++] = 7; /* connectivity of face 1 of element 2 */ nnpe[j++] = 3; connect[i++] = 1; connect[i++] = 3; connect[i++] = 4; /* face 2 of element 2 */ nnpe[j++] = 3; connect[i++] = 7; connect[i++] = 8; connect[i++] = 4; connect[i++] = 3; /* face 3 of element 2 */ nnpe[j++] = 4; connect[i++] = 7; connect[i++] = 3; connect[i++] = 1; connect[i++] = 5; /* face 4 of element 2 */ nnpe[j++] = 4; connect[i++] = 8; connect[i++] = 4; connect[i++] = 14; connect[i++] = 10; connect[i++] = 12; /* connectivity of face 1 of element 3 */ nnpe[j++] = 5; connect[i++] = 7; connect[i++] = 11; connect[i++] = 9; connect[i++] = 13; connect[i++] = 3; /* face 2 of element 3 */ nnpe[j++] = 5; connect[i++] = 7; connect[i++] = 8; connect[i++] = 12; connect[i++] = 11; /* face 3 of element 3 */ nnpe[j++] = 4; connect[i++] = 11; connect[i++] = 12; connect[i++] = 10; connect[i++] = 9; /* face 4 of element 3 */ nnpe[j++] = 4; connect[i++] = 9; connect[i++] = 10; connect[i++] = 14; connect[i++] = 13; /* face 5 of element 3 */ nnpe[j++] = 4; connect[i++] = 13; connect[i++] = 14; connect[i++] = 4; connect[i++] = 3; /* face 6 of element 3 */ nnpe[j++] = 4; assert(i == num_total_nodes_per_blk[0]); assert(j == num_face_in_block[0]); error = ex_put_conn (exoid, EX_FACE_BLOCK, bids, connect, NULL, NULL); printf ("after ex_put_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); connect = NULL; error = ex_put_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, bids, nnpe); printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element block parameters */ block_names[0] = "nfaced_1"; num_elem_in_block[0] = 3; num_total_faces_per_blk[0] = 5 + 5 + 7; bids = 10; error = ex_put_block (exoid, EX_ELEM_BLOCK, bids, "nfaced", num_elem_in_block[0], 0, 0, num_total_faces_per_blk[0], 0); printf ("after ex_put_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write element block names */ error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element-face connectivity */ connect = (int *) calloc(num_total_faces_per_blk[0], sizeof(int)); i = 0; j = 0; connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4; connect[i++] = 5; nnpe[j++] = 5; /* Number of faces per element 1 */ connect[i++] = 4; connect[i++] = 6; connect[i++] = 7; connect[i++] = 8; connect[i++] = 9; nnpe[j++] = 5; /* Number of faces per element 2 */ connect[i++] = 8; connect[i++] = 10; connect[i++] = 11; connect[i++] = 12; connect[i++] = 13; connect[i++] = 14; connect[i++] = 15; nnpe[j++] = 7; /* Number of faces per element 3 */ assert(i == num_total_faces_per_blk[0]); assert(j == num_elem_in_block[0]); error = ex_put_conn (exoid, EX_ELEM_BLOCK, bids, NULL, NULL, connect); printf ("after ex_put_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); error = ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, bids, nnpe); printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write QA records; test empty and just blank-filled records */ num_qa_rec = 2; qa_record[0][0] = "TESTWT-NFACED"; qa_record[0][1] = "testwt-nfaced"; qa_record[0][2] = "2010/02/15"; qa_record[0][3] = "06:35:15"; qa_record[1][0] = ""; qa_record[1][1] = " "; qa_record[1][2] = ""; qa_record[1][3] = " "; error = ex_put_qa (exoid, num_qa_rec, qa_record); printf ("after ex_put_qa, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write information records; test empty and just blank-filled records */ num_info = 3; info[0] = "This is the first information record."; info[1] = ""; info[2] = " "; error = ex_put_info (exoid, num_info, info); printf ("after ex_put_info, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* close the EXODUS files */ error = ex_close (exoid); printf ("after ex_close, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } return 0; }
int main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block[10], num_total_nodes_per_blk[10]; int num_face_in_block[10], num_total_faces_per_blk[10]; int num_face_in_sset[10], num_nodes_in_nset[10]; int num_node_sets, num_side_sets, error; int i, j, k, m, *elem_map, *connect; int node_list[100],elem_list[100],side_list[100]; int bids[10], ssids[10], nsids[10], nnpe[10]; int num_qa_rec, num_info; int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars; int *truth_tab; int whole_time_step, num_time_steps; int CPU_word_size,IO_word_size; int prop_array[2]; float *glob_var_vals, *nodal_var_vals, *elem_var_vals; float *sset_var_vals, *nset_var_vals; float time_value; float x[100], y[100], z[100]; float dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3]; char *block_names[10], *nset_names[10], *sset_names[10]; char *prop_names[2], *attrib_names[2]; char *title = "This is a test"; ex_opts (EX_VERBOSE | EX_ABORT ); /* Specify compute and i/o word size */ CPU_word_size = 0; /* sizeof(float) */ IO_word_size = 4; /* (4 bytes) */ /* create EXODUS II file */ exoid = ex_create ("test-nfaced.exo", /* filename path */ EX_CLOBBER, /* create mode */ &CPU_word_size, /* CPU float word size in bytes */ &IO_word_size); /* I/O float word size in bytes */ printf ("after ex_create for test.exo, exoid = %d\n", exoid); printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size); /* ncopts = NC_VERBOSE; */ /* initialize file with parameters */ { ex_init_params par; num_dim = 3; num_nodes = 14; num_elem = 1; num_elem_blk = 1; num_node_sets = 0; strcpy( par.title, title ); par.num_dim = num_dim; par.num_nodes = num_nodes; par.num_edge = 0; par.num_edge_blk = 0; par.num_face = 5; par.num_face_blk = 1; par.num_elem = num_elem; par.num_elem_blk = num_elem_blk; par.num_node_sets = num_node_sets; par.num_edge_sets = 0; par.num_face_sets = 0; par.num_side_sets = 0; par.num_elem_sets = 0; par.num_node_maps = 0; par.num_edge_maps = 0; par.num_face_maps = 0; par.num_elem_maps = 0; error = ex_put_init_ext (exoid, &par); printf ("after ex_put_init_ext, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } /* write nodal coordinates values and names to database */ x[ 0] = 0.00000e+00 ; y[ 0] = 0.00000e+00 ; z[ 0] = 0.00000e+00 ; x[ 1] = 2.00000e+00 ; y[ 1] = 0.00000e+00 ; z[ 1] = 0.00000e+00 ; x[ 2] = 0.00000e+00 ; y[ 2] = 2.00000e+00 ; z[ 2] = 0.00000e+00 ; x[ 3] = 2.00000e+00 ; y[ 3] = 2.00000e+00 ; z[ 3] = 0.00000e+00 ; x[ 4] = 0.00000e+00 ; y[ 4] = 0.00000e+00 ; z[ 4] = 2.00000e+00 ; x[ 5] = 2.00000e+00 ; y[ 5] = 0.00000e+00 ; z[ 5] = 2.00000e+00 ; x[ 6] = 0.00000e+00 ; y[ 6] = 2.00000e+00 ; z[ 6] = 2.00000e+00 ; x[ 7] = 2.00000e+00 ; y[ 7] = 2.00000e+00 ; z[ 7] = 2.00000e+00 ; x[ 8] = 0.00000e+00 ; y[ 8] = 3.50000e+00 ; z[ 8] = 1.00000e+00 ; x[ 9] = 2.00000e+00 ; y[ 9] = 3.50000e+00 ; z[ 9] = 1.00000e+00 ; x[10] = 0.00000e+00 ; y[10] = 3.00000e+00 ; z[10] = 1.50000e+00 ; x[11] = 2.00000e+00 ; y[11] = 3.00000e+00 ; z[11] = 1.50000e+00 ; x[12] = 0.00000e+00 ; y[12] = 3.00000e+00 ; z[12] = 0.50000e+00 ; x[13] = 2.00000e+00 ; y[13] = 3.00000e+00 ; z[13] = 0.50000e+00 ; error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } coord_names[0] = "x"; coord_names[1] = "y"; coord_names[2] = "z"; error = ex_put_coord_names (exoid, coord_names); printf ("after ex_put_coord_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write the face block parameters */ block_names[0] = "face_block_1"; num_face_in_block[0] = 15; num_total_nodes_per_blk[0] = 54; bids[0] = 10; error = ex_put_block (exoid, EX_FACE_BLOCK, bids[0], "nsided", num_face_in_block[0], num_total_nodes_per_blk[0], 0, 0, 0); printf ("after ex_put_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write face connectivity */ connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int)); i = 0; j = 0; connect[i++] = 5; connect[i++] = 6; connect[i++] = 8; /* connectivity of face 1 of element 1 */ connect[i++] = 2; connect[i++] = 1; connect[i++] = 4; /* face 2 of element 1 */ connect[i++] = 6; connect[i++] = 2; connect[i++] = 4; connect[i++] = 8; /* face 3 of element 1 */ connect[i++] = 8; connect[i++] = 4; connect[i++] = 1; connect[i++] = 5; /* face 4 of element 1 */ connect[i++] = 1; connect[i++] = 2; connect[i++] = 6; connect[i++] = 5; /* face 5 of element 1 */ connect[i++] = 5; connect[i++] = 8; connect[i++] = 7; /* connectivity of face 1 of element 2 */ connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4; nnpe[j++] = 4; connect[i++] = 5; connect[i++] = 3; connect[i++] = 4; connect[i++] = 6; nnpe[j++] = 4; connect[i++] = 5; connect[i++] = 1; connect[i++] = 2; connect[i++] = 6; nnpe[j++] = 4; connect[i++] = 6; connect[i++] = 2; connect[i++] = 4; nnpe[j++] = 3; connect[i++] = 5; connect[i++] = 3; connect[i++] = 1; nnpe[j++] = 3; assert(i == num_total_nodes_per_blk[0]); assert(j == num_face_in_block[0]); error = ex_put_conn (exoid, EX_FACE_BLOCK, bids[0], connect, NULL, NULL); printf ("after ex_put_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); connect = NULL; error = ex_put_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, bids[0], nnpe); printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element block parameters */ block_names[0] = "nfaced_1"; num_elem_in_block[0] = 1; num_total_nodes_per_blk[0] = 6; /* Do we need this; does it make sense... */ num_total_faces_per_blk[0] = 5; bids[0] = 10; error = ex_put_block (exoid, EX_ELEM_BLOCK, bids[0], "nfaced", num_elem_in_block[0], 0, 0, num_total_faces_per_blk[0], 0); printf ("after ex_put_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write face block names */ error = ex_put_names(exoid, EX_FACE_BLOCK, block_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write element block names */ error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element-face connectivity */ connect = (int *) calloc(num_total_faces_per_blk[0], sizeof(int)); i = 0; j = 0; connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4; connect[i++] = 5; nnpe[j++] = 5; /* Number of faces per element */ assert(i == num_total_faces_per_blk[0]); assert(j == num_elem_in_block[0]); error = ex_put_conn (exoid, EX_ELEM_BLOCK, bids[0], NULL, NULL, connect); printf ("after ex_put_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); error = ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, bids[0], nnpe); printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write QA records; test empty and just blank-filled records */ num_qa_rec = 2; qa_record[0][0] = "TESTWT-NFACED"; qa_record[0][1] = "testwt-nfaced"; qa_record[0][2] = "2010/02/15"; qa_record[0][3] = "06:35:15"; qa_record[1][0] = ""; qa_record[1][1] = " "; qa_record[1][2] = ""; qa_record[1][3] = " "; error = ex_put_qa (exoid, num_qa_rec, qa_record); printf ("after ex_put_qa, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write information records; test empty and just blank-filled records */ num_info = 3; info[0] = "This is the first information record."; info[1] = ""; info[2] = " "; error = ex_put_info (exoid, num_info, info); printf ("after ex_put_info, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write results variables parameters and names */ num_glo_vars = 1; var_names[0] = "glo_vars"; error = ex_put_var_param (exoid, "g", num_glo_vars); printf ("after ex_put_var_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_var_names (exoid, "g", num_glo_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } num_nod_vars = 2; /* 12345678901234567890123456789012 */ var_names[0] = "node_variable_a_very_long_name_0"; var_names[1] = "n"; error = ex_put_var_param (exoid, "n", num_nod_vars); printf ("after ex_put_var_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_var_names (exoid, "n", num_nod_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } num_ele_vars = 3; var_names[0] = "ele_var0"; var_names[1] = "ele_var1"; var_names[2] = "ele_var2"; error = ex_put_var_param (exoid, "e", num_ele_vars); printf ("after ex_put_var_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_var_names (exoid, "e", num_ele_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element variable truth table */ truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int)); k = 0; for (i=0; i<num_elem_blk; i++) { for (j=0; j<num_ele_vars; j++) { truth_tab[k++] = 1; } } error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab); printf ("after ex_put_elem_var_tab, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (truth_tab); /* for each time step, write the analysis results; * the code below fills the arrays glob_var_vals, * nodal_var_vals, and elem_var_vals with values for debugging purposes; * obviously the analysis code will populate these arrays */ whole_time_step = 1; num_time_steps = 10; glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size); nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size); elem_var_vals = (float *) calloc (8, CPU_word_size); for (i=0; i<num_time_steps; i++) { time_value = (float)(i+1)/100.; /* write time value */ error = ex_put_time (exoid, whole_time_step, &time_value); printf ("after ex_put_time, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write global variables */ for (j=0; j<num_glo_vars; j++) { glob_var_vals[j] = (float)(j+2) * time_value; } error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, glob_var_vals); printf ("after ex_put_glob_vars, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write nodal variables */ for (k=1; k<=num_nod_vars; k++) { for (j=0; j<num_nodes; j++) { nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value); } error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes, nodal_var_vals); printf ("after ex_put_nodal_var, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } /* write element variables */ for (k=1; k<=num_ele_vars; k++) { for (j=0; j<num_elem_blk; j++) { for (m=0; m<num_elem_in_block[j]; m++) { elem_var_vals[m] = (float)(k+1) + (float)(j+2) + ((float)(m+1)*time_value); /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */ } error = ex_put_elem_var (exoid, whole_time_step, k, bids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } whole_time_step++; /* update the data file; this should be done at the end of every time step * to ensure that no data is lost if the analysis dies */ error = ex_update (exoid); printf ("after ex_update, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } free(glob_var_vals); free(nodal_var_vals); free(elem_var_vals); /* close the EXODUS files */ error = ex_close (exoid); printf ("after ex_close, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } return 0; }
int cCreateEdgeFace( int argc, char* argv[] ) { int exoid; int appWordSize = 8; int diskWordSize = 8; /* int concatBlocks = ex_have_arg( argc, argv, "-pcab" ); */ int concatSets = ex_have_arg( argc, argv, "-pcset" ); int concatResult = ex_have_arg( argc, argv, "-pvpax" ); double t; ex_init_params modelParams = { "CreateEdgeFace Test", /* title */ 3, /* num_dim */ 12, /* num_nodes */ 20, /* num_edge */ 1, /* num_edge_blk */ 11, /* num_face */ 3, /* num_face_blk */ 3, /* num_elem */ 2, /* num_elem_blk */ 1, /* num_node_sets */ 1, /* num_edge_sets */ 1, /* num_face_sets */ 1, /* num_side_sets */ 2, /* num_elem_sets */ 1, /* num_node_map */ 1, /* num_edge_map */ 1, /* num_face_map */ 1, /* num_elem_map */ }; ex_block edgeBlocks[1]; ex_block faceBlocks[3]; ex_block elemBlocks[2]; ex_var_params varParams; ex_opts (EX_VERBOSE | EX_ABORT ); edgeBlocks[0].type = EX_EDGE_BLOCK; edgeBlocks[0].id = 100; edgeBlocks[0].num_entry = 20; edgeBlocks[0].num_nodes_per_entry = 2; edgeBlocks[0].num_attribute = 1; strcpy(edgeBlocks[0].topology, "EDGE2"); faceBlocks[0].type = EX_FACE_BLOCK; faceBlocks[0].id = 500; faceBlocks[0].num_entry = 2; faceBlocks[0].num_nodes_per_entry = 4; faceBlocks[0].num_attribute = 1; strcpy(faceBlocks[0].topology, "QUAD4"); faceBlocks[1].type = EX_FACE_BLOCK; faceBlocks[1].id = 600; faceBlocks[1].num_entry = 1; faceBlocks[1].num_nodes_per_entry = 4; faceBlocks[1].num_attribute = 1; strcpy(faceBlocks[1].topology, "QUAD4"); faceBlocks[2].type = EX_FACE_BLOCK; faceBlocks[2].id = 700; faceBlocks[2].num_entry = 8; faceBlocks[2].num_nodes_per_entry = 4; faceBlocks[2].num_attribute = 1; strcpy(faceBlocks[2].topology, "QUAD4"); elemBlocks[0].type = EX_ELEM_BLOCK; elemBlocks[0].id = 200; elemBlocks[0].num_entry = 2; elemBlocks[0].num_nodes_per_entry = 8; elemBlocks[0].num_edges_per_entry = 12; elemBlocks[0].num_faces_per_entry = 6; elemBlocks[0].num_attribute = 2; strcpy(elemBlocks[0].topology, "HEX8"); elemBlocks[1].type = EX_ELEM_BLOCK; elemBlocks[1].id = 201; elemBlocks[1].num_entry = 1; elemBlocks[1].num_nodes_per_entry = 4; elemBlocks[1].num_edges_per_entry = 0; elemBlocks[1].num_faces_per_entry = 0; elemBlocks[1].num_attribute = 0; strcpy(elemBlocks[1].topology, "TET4"); varParams.edge_var_tab = (int*)malloc(2 * sizeof(int)); varParams.face_var_tab = (int*)malloc(3 * sizeof(int)); varParams.elem_var_tab = (int*)malloc(2 * sizeof(int)); varParams.nset_var_tab = (int*)0; varParams.eset_var_tab = (int*)0; varParams.fset_var_tab = (int*)malloc(1 * sizeof(int)); varParams.sset_var_tab = (int*)0; varParams.elset_var_tab = (int*)0; varParams.num_glob = 2; varParams.num_node = 1; varParams.num_edge = 2; varParams.edge_var_tab[0] = 1; varParams.edge_var_tab[1] = 1; varParams.num_face = 1; varParams.face_var_tab[0] = 1; varParams.face_var_tab[1] = 1; varParams.face_var_tab[2] = 1; varParams.num_elem = 1; varParams.elem_var_tab[0] = 1; varParams.elem_var_tab[1] = 0; varParams.num_nset = 0; varParams.num_eset = 0;; varParams.num_fset = 1; varParams.fset_var_tab[0] = 1; varParams.num_sset = 0; varParams.num_elset = 0; exoid = ex_create( EX_TEST_FILENAME, EX_CLOBBER, &appWordSize, &diskWordSize ); if ( exoid <= 0 ) { fprintf( stderr, "Unable to open \"%s\" for writing.\n", EX_TEST_FILENAME ); return 1; } EXCHECK( ex_put_init_ext( exoid, &modelParams ), "Unable to initialize database.\n" ); { int blk; for ( blk = 0; blk < modelParams.num_edge_blk; ++blk ) { EXCHECK( ex_put_block_param( exoid, edgeBlocks[blk]), "Unable to write edge block" ); } for ( blk = 0; blk < modelParams.num_face_blk; ++blk ) { EXCHECK( ex_put_block_param( exoid, faceBlocks[blk]), "Unable to write face block" ); } for ( blk = 0; blk < modelParams.num_elem_blk; ++blk ) { EXCHECK( ex_put_block_param( exoid, elemBlocks[blk]), "Unable to write elem block" ); } } EXCHECK( ex_put_coord( exoid, (void*)coordsX, (void*)coordsY, (void*)coordsZ ), "Unable to write coordinates.\n" ); EXCHECK( ex_put_coord_names( exoid, (char**)coordsNames ), "Unable to write coordinate names.\n" ); /* =============== Connectivity ================== */ /* *** NEW API *** */ EXCHECK( ex_put_conn( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, ebconn1, 0, 0 ), "Unable to write edge block connectivity.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[0].id, fbconn1, 0, 0 ), "Unable to write face block 1 connectivity.\n" ); EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[1].id, fbconn2, 0, 0 ), "Unable to write face block 2 connectivity.\n" ); EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[2].id, fbconn3, 0, 0 ), "Unable to write face block 3 connectivity.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, conn1, econn1, fconn1 ), "Unable to write elem block 1 connectivity.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, elemBlocks[1].id, conn2, 0, 0 ), "Unable to write elem block 2 connectivity.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_names( exoid, EX_EDGE_BLOCK, (char**)edblk_names ), "Unable to write edge block names.\n" ); EXCHECK( ex_put_names( exoid, EX_FACE_BLOCK, (char**)fablk_names ), "Unable to write face block names.\n" ); EXCHECK( ex_put_names( exoid, EX_ELEM_BLOCK, (char**) eblk_names ), "Unable to write element block names.\n" ); /* =============== Number Maps ================== */ /* *** NEW API *** */ EXCHECK( ex_put_num_map( exoid, EX_NODE_MAP, 300, nmap1 ), "Unable to write node map.\n" ); EXCHECK( ex_put_num_map( exoid, EX_EDGE_MAP, 800, edmap1 ), "Unable to write edge map.\n" ); EXCHECK( ex_put_num_map( exoid, EX_FACE_MAP, 900, famap1 ), "Unable to write face map.\n" ); EXCHECK( ex_put_num_map( exoid, EX_ELEM_MAP, 400, emap1 ), "Unable to write element map.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_names( exoid, EX_NODE_MAP, (char**) nmap_names ), "Unable to write node map names.\n" ); EXCHECK( ex_put_names( exoid, EX_EDGE_MAP, (char**)edmap_names ), "Unable to write edge map names.\n" ); EXCHECK( ex_put_names( exoid, EX_FACE_MAP, (char**)famap_names ), "Unable to write face map names.\n" ); EXCHECK( ex_put_names( exoid, EX_ELEM_MAP, (char**) emap_names ), "Unable to write element map names.\n" ); /* =============== Attribute names ================ */ /* *** NEW API *** */ EXCHECK( ex_put_attr_names( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, (char**)edge_attr_names1 ), "Unable to write edge block 1 attribute names.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[0].id, (char**)face_attr_names1 ), "Unable to write face block 1 attribute names.\n" ); EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[1].id, (char**)face_attr_names2 ), "Unable to write face block 1 attribute names.\n" ); EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[2].id, (char**)face_attr_names3 ), "Unable to write face block 1 attribute names.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, (char**)elem_attr_names1 ), "Unable to write elem block 1 attribute names.\n" ); /* =============== Attribute values =============== */ /* *** NEW API *** */ EXCHECK( ex_put_attr( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, edge_attr_values1 ), "Unable to write edge block 1 attribute values.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[0].id, face_attr_values1 ), "Unable to write face block 1 attribute values.\n" ); EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[1].id, face_attr_values2 ), "Unable to write face block 1 attribute values.\n" ); EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[2].id, face_attr_values3 ), "Unable to write face block 1 attribute values.\n" ); /* *** NEW API *** */ EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, elem_attr_values1 ), "Unable to write elem block 1 attribute values.\n" ); /* =============== Set parameters ================= */ /* *** NEW API *** */ EXCHECK( ex_put_names( exoid, EX_NODE_SET, (char**)nset_names ), "Unable to write node set names.\n" ); EXCHECK( ex_put_names( exoid, EX_EDGE_SET, (char**)eset_names ), "Unable to write edge set names.\n" ); EXCHECK( ex_put_names( exoid, EX_FACE_SET, (char**)fset_names ), "Unable to write face set names.\n" ); EXCHECK( ex_put_names( exoid, EX_SIDE_SET, (char**)sset_names ), "Unable to write side set names.\n" ); EXCHECK( ex_put_names( exoid, EX_ELEM_SET, (char**)elset_names ), "Unable to write element set names.\n" ); { ex_set allSets[1+1+1+1+2]; ex_set *nodeSets = &allSets[0]; ex_set *edgeSets = &allSets[1]; ex_set *faceSets = &allSets[2]; ex_set *sideSets = &allSets[3]; ex_set *elemSets = &allSets[4]; nodeSets[0].type = EX_NODE_SET; nodeSets[0].id = 1000; nodeSets[0].num_entry = 3; nodeSets[0].num_distribution_factor = 0; nodeSets[0].entry_list = nset_nodes; nodeSets[0].extra_list = NULL; nodeSets[0].distribution_factor_list = NULL; edgeSets[0].type = EX_EDGE_SET; edgeSets[0].id = 1200; edgeSets[0].num_entry = 6; edgeSets[0].num_distribution_factor = 6; edgeSets[0].entry_list = eset_edges; edgeSets[0].extra_list = eset_orient; edgeSets[0].distribution_factor_list = eset_df; faceSets[0].type = EX_FACE_SET; faceSets[0].id = 1400; faceSets[0].num_entry = 2; faceSets[0].num_distribution_factor = 0; faceSets[0].entry_list = fset_faces; faceSets[0].extra_list = fset_orient; faceSets[0].distribution_factor_list = NULL; sideSets[0].type = EX_SIDE_SET; sideSets[0].id = 1400; sideSets[0].num_entry = 5; sideSets[0].num_distribution_factor = 0; sideSets[0].entry_list = sset_elems; sideSets[0].extra_list = sset_sides; sideSets[0].distribution_factor_list = NULL; elemSets[0].type = EX_ELEM_SET; elemSets[0].id = 1800; elemSets[0].num_entry = 1; elemSets[0].num_distribution_factor = 0; elemSets[0].entry_list = &elset_elems[0]; elemSets[0].extra_list = NULL; elemSets[0].distribution_factor_list = NULL; elemSets[1].type = EX_ELEM_SET; elemSets[1].id = 1900; elemSets[1].num_entry = 1; elemSets[1].num_distribution_factor = 0; elemSets[1].entry_list = &elset_elems[1]; elemSets[1].extra_list = NULL; elemSets[1].distribution_factor_list = NULL; if ( concatSets ) { EXCHECK( ex_put_sets(exoid, 1+2+1+1+1, allSets), "Unable to output concatenated sets.\n" ); } else { EXCHECK( ex_put_sets( exoid, 1, nodeSets), "Unable to write node sets.\n" ); EXCHECK( ex_put_sets( exoid, 1, edgeSets), "Unable to write edge sets.\n" ); EXCHECK( ex_put_sets( exoid, 1, faceSets), "Unable to write face sets.\n" ); EXCHECK( ex_put_sets( exoid, 1, sideSets), "Unable to write side sets.\n" ); EXCHECK( ex_put_sets( exoid, 2, elemSets), "Unable to write element sets.\n" ); } } /* =============== Result variable params ========= */ /* *** NEW API *** */ if ( concatResult ) { EXCHECK( ex_put_all_var_param_ext( exoid, &varParams ), "Unable to write result variable parameter information.\n" ); } else { EXCHECK( ex_put_var_param( exoid, "G", 2 ), "Unable to write global result variable parameters.\n" ); EXCHECK( ex_put_var_param( exoid, "N", 1 ), "Unable to write nodal result variable parameters.\n" ); EXCHECK( ex_put_var_param( exoid, "E", 1 ), "Unable to write element result variable parameters.\n" ); EXCHECK( ex_put_var_param( exoid, "L", 2 ), "Unable to write edge result variable parameters.\n" ); EXCHECK( ex_put_var_param( exoid, "F", 1 ), "Unable to write face result variable parameters.\n" ); EXCHECK( ex_put_var_param( exoid, "A", 1 ), "Unable to write faceset result variable parameters.\n" ); } /* =============== Result variable names ========== */ /* *** NEW API *** */ EXCHECK( ex_put_var_name( exoid, "G", 1, "CALIBER" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "g", 2, "GUNPOWDER" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "N", 1, "RHO" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "l", 1, "GAMMA1" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "L", 2, "GAMMA2" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "f", 1, "PHI" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "E", 1, "EPSTRN" ), "Unable to write variable name.\n" ); EXCHECK( ex_put_var_name( exoid, "A", 1, "PHI0" ), "Unable to write variable name.\n" ); /* =============== Result variable values ========= */ t = 1.; /* *** NEW API *** */ EXCHECK( ex_put_time( exoid, 1, &t ), "Unable to write time value.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_GLOBAL, 1, 0/*N/A*/, 2, vals_glo_var[0] ), "Unable to write global var 1.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 1, 100, 20, vals_edge_var1eb1[0] ), "Unable to write edge block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 2, 100, 20, vals_edge_var2eb1[0] ), "Unable to write edge block 1 var 2.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 500, 2, vals_face_var1fb1[0] ), "Unable to write face block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 700, 8, vals_face_var1fb3[0] ), "Unable to write face block 3 var 1.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, 1, 200, 2, vals_elem_var1eb1[0] ), "Unable to write elem block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 1, EX_FACE_SET, 1, 1400, 2, vals_fset_var1fs1[0] ), "Unable to write face set 1 var 1.\n" ); t = 2.; EXCHECK( ex_put_time( exoid, 2, &t ), "Unable to write time value.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_GLOBAL, 1, 0/*N/A*/, 2, vals_glo_var[1] ), "Unable to write global var 1.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 1, 100, 20, vals_edge_var1eb1[1] ), "Unable to write edge block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 2, 100, 20, vals_edge_var2eb1[1] ), "Unable to write edge block 1 var 2.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 500, 2, vals_face_var1fb1[1] ), "Unable to write face block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 700, 8, vals_face_var1fb3[1] ), "Unable to write face block 3 var 1.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, 1, 200, 2, vals_elem_var1eb1[1] ), "Unable to write elem block 1 var 1.\n" ); EXCHECK( ex_put_var( exoid, 2, EX_FACE_SET, 1, 1400, 2, vals_fset_var1fs1[1] ), "Unable to write face set 1 var 1.\n" ); EXCHECK( ex_put_nodal_var( exoid, 1, 1, 12, vals_nod_var[0] ), "Unable to write nodal var 1.\n" ); EXCHECK( ex_put_nodal_var( exoid, 2, 1, 12, vals_nod_var[1] ), "Unable to write nodal var 1.\n" ); EXCHECK( ex_close( exoid ), "Unable to close database.\n" ); return 0; }
void exodus_file_write_mesh(exodus_file_t* file, fe_mesh_t* mesh) { ASSERT(file->writing); // See whether we have polyhedral blocks, and whether the non-polyhedral // blocks have supported element types. int num_blocks = fe_mesh_num_blocks(mesh); bool is_polyhedral = false; int pos = 0; char* block_name; fe_block_t* block; while (fe_mesh_next_block(mesh, &pos, &block_name, &block)) { fe_mesh_element_t elem_type = fe_block_element_type(block); if (elem_type == FE_POLYHEDRON) { is_polyhedral = true; break; } else if (elem_type != FE_INVALID) { // Check the number of nodes for the element. if (!element_is_supported(elem_type, fe_block_num_element_nodes(block, 0))) polymec_error("exodus_file_write_mesh: Element type in block %s has invalid number of nodes.", block_name); } else polymec_error("exodus_file_write_mesh: Invalid element type for block %s.", block_name); } // Write out information about elements, faces, edges, nodes. file->num_nodes = fe_mesh_num_nodes(mesh); ex_init_params params; strcpy(params.title, file->title); params.num_dim = 3; params.num_nodes = file->num_nodes; int num_edges = fe_mesh_num_edges(mesh); params.num_edge = num_edges; params.num_edge_blk = 0; int num_faces = fe_mesh_num_faces(mesh); params.num_face = num_faces; params.num_face_blk = (is_polyhedral) ? 1 : 0; int num_elem = fe_mesh_num_elements(mesh); params.num_elem = num_elem; params.num_elem_blk = num_blocks; params.num_elem_sets = file->num_elem_sets = fe_mesh_num_element_sets(mesh); params.num_face_sets = file->num_face_sets = fe_mesh_num_face_sets(mesh); params.num_edge_sets = file->num_edge_sets = fe_mesh_num_edge_sets(mesh); params.num_node_sets = file->num_node_sets = fe_mesh_num_node_sets(mesh); params.num_side_sets = file->num_side_sets = fe_mesh_num_side_sets(mesh); params.num_elem_maps = 0; params.num_face_maps = 0; params.num_edge_maps = 0; params.num_node_maps = 0; ex_put_init_ext(file->ex_id, ¶ms); // If we have any polyhedral element blocks, we write out a single face // block that incorporates all of the polyhedral elements. if (is_polyhedral) { // Generate face->node connectivity information. int num_pfaces = fe_mesh_num_faces(mesh); int face_node_size = 0; int num_face_nodes[num_pfaces]; for (int f = 0; f < num_pfaces; ++f) { int num_nodes = fe_mesh_num_face_nodes(mesh, f); num_face_nodes[f] = num_nodes; face_node_size += num_nodes; } int* face_nodes = polymec_malloc(sizeof(int) * face_node_size); int offset = 0; for (int f = 0; f < num_pfaces; ++f) { fe_mesh_get_face_nodes(mesh, f, &face_nodes[offset]); offset += num_face_nodes[f]; } for (int i = 0; i < face_node_size; ++i) face_nodes[i] += 1; // Write an "nsided" face block. ex_put_block(file->ex_id, EX_FACE_BLOCK, 1, "nsided", num_pfaces, face_node_size, 0, 0, 0); ex_put_name(file->ex_id, EX_FACE_BLOCK, 1, "face_block"); ex_put_conn(file->ex_id, EX_FACE_BLOCK, 1, face_nodes, NULL, NULL); // Clean up. polymec_free(face_nodes); // Number of nodes per face. ex_put_entity_count_per_polyhedra(file->ex_id, EX_FACE_BLOCK, 1, num_face_nodes); } // Go over the element blocks and write out the data. pos = 0; while (fe_mesh_next_block(mesh, &pos, &block_name, &block)) { int elem_block = pos; int num_e = fe_block_num_elements(block); fe_mesh_element_t elem_type = fe_block_element_type(block); if (elem_type == FE_POLYHEDRON) { // Count up the faces in the block and write the block information. int tot_num_elem_faces = 0; int faces_per_elem[num_e]; for (int i = 0; i < num_e; ++i) { faces_per_elem[i] = fe_block_num_element_faces(block, i); tot_num_elem_faces += faces_per_elem[i]; } ex_put_block(file->ex_id, EX_ELEM_BLOCK, elem_block, "nfaced", num_e, 0, 0, tot_num_elem_faces, 0); // Write elem->face connectivity information. int elem_faces[tot_num_elem_faces], offset = 0; for (int i = 0; i < num_e; ++i) { fe_block_get_element_faces(block, i, &elem_faces[offset]); offset += faces_per_elem[i]; } for (int i = 0; i < tot_num_elem_faces; ++i) elem_faces[i] += 1; ex_put_conn(file->ex_id, EX_ELEM_BLOCK, elem_block, NULL, NULL, elem_faces); ex_put_entity_count_per_polyhedra(file->ex_id, EX_ELEM_BLOCK, elem_block, faces_per_elem); } else if (elem_type != FE_INVALID) { // Get element information. char elem_type_name[MAX_NAME_LENGTH+1]; get_elem_name(elem_type, elem_type_name); int num_nodes_per_elem = fe_block_num_element_nodes(block, 0); // Write the block. ex_put_block(file->ex_id, EX_ELEM_BLOCK, elem_block, elem_type_name, num_e, num_nodes_per_elem, 0, 0, 0); // Write the elem->node connectivity. int elem_nodes[num_e* num_nodes_per_elem], offset = 0; for (int i = 0; i < num_e; ++i) { fe_block_get_element_nodes(block, i, &elem_nodes[offset]); offset += num_nodes_per_elem; } for (int i = 0; i < num_e* num_nodes_per_elem; ++i) elem_nodes[i] += 1; ex_put_conn(file->ex_id, EX_ELEM_BLOCK, elem_block, elem_nodes, NULL, NULL); } // Set the element block name. ex_put_name(file->ex_id, EX_ELEM_BLOCK, elem_block, block_name); } // Set node positions. real_t x[file->num_nodes], y[file->num_nodes], z[file->num_nodes]; point_t* X = fe_mesh_node_positions(mesh); for (int n = 0; n < file->num_nodes; ++n) { x[n] = X[n].x; y[n] = X[n].y; z[n] = X[n].z; } ex_put_coord(file->ex_id, x, y, z); char* coord_names[3] = {"x", "y", "z"}; ex_put_coord_names(file->ex_id, coord_names); // Write sets of entities. int *set, set_id = 0; size_t set_size; char* set_name; pos = set_id = 0; while (fe_mesh_next_element_set(mesh, &pos, &set_name, &set, &set_size)) write_set(file, EX_ELEM_SET, ++set_id, set_name, set, set_size); pos = set_id = 0; while (fe_mesh_next_face_set(mesh, &pos, &set_name, &set, &set_size)) write_set(file, EX_FACE_SET, ++set_id, set_name, set, set_size); pos = set_id = 0; while (fe_mesh_next_edge_set(mesh, &pos, &set_name, &set, &set_size)) write_set(file, EX_EDGE_SET, ++set_id, set_name, set, set_size); pos = set_id = 0; while (fe_mesh_next_node_set(mesh, &pos, &set_name, &set, &set_size)) write_set(file, EX_NODE_SET, ++set_id, set_name, set, set_size); pos = set_id = 0; while (fe_mesh_next_side_set(mesh, &pos, &set_name, &set, &set_size)) write_set(file, EX_SIDE_SET, ++set_id, set_name, set, set_size); }
void ExodusWriter::writeItem( xdm::RefPtr< xdm::Item > item, const xdm::FileSystemPath& path ) { WritableExodusFile file( path ); std::size_t timeStep = 0; ex_init_params meshParams; std::strcpy( meshParams.title, item->name().substr( 0, MAX_LINE_LENGTH + 1 ).c_str() ); // First make up collections of pointers to everything that we know about. For now, // that is just Blocks. GatherExodusObjectsVisitor< EdgeBlock > edgeBlockGatherVisitor; GatherExodusObjectsVisitor< FaceBlock > faceBlockGatherVisitor; GatherExodusObjectsVisitor< ElementBlock > elementBlockGatherVisitor; item->traverse( edgeBlockGatherVisitor ); item->traverse( faceBlockGatherVisitor ); item->traverse( elementBlockGatherVisitor ); meshParams.num_edge_blk = edgeBlockGatherVisitor.pointers().size(); meshParams.num_face_blk = faceBlockGatherVisitor.pointers().size(); meshParams.num_elem_blk = elementBlockGatherVisitor.pointers().size(); if ( meshParams.num_edge_blk + meshParams.num_face_blk + meshParams.num_elem_blk < 1 ) { // There is nothing to write. return; } // There is only one Geometry (one unique set of nodes). To find it, we just need to find // the first one. xdmGrid::Geometry* geom; if ( meshParams.num_edge_blk > 0 ) { geom = dynamic_cast< Block* >( edgeBlockGatherVisitor.pointers().front() )->geometry().get(); } else if ( meshParams.num_face_blk > 0 ) { geom = dynamic_cast< Block* >( faceBlockGatherVisitor.pointers().front() )->geometry().get(); } else { geom = dynamic_cast< Block* >( elementBlockGatherVisitor.pointers().front() )->geometry().get(); } meshParams.num_dim = geom->dimension(); meshParams.num_nodes = geom->numberOfNodes(); std::vector< void* > geomPtrs( 3, NULL ); for ( std::size_t dim = 0; dim < meshParams.num_dim; ++dim ) { geomPtrs[ dim ] = geom->child( dim )->data()->array()->data(); } EXODUS_CALL( ex_put_coord( file.id(), geomPtrs[0], geomPtrs[1], geomPtrs[2] ), "Unable to write coordinates." ); std::vector< ExodusString > coordNames; coordNames.push_back( "X" ); coordNames.push_back( "Y" ); coordNames.push_back( "Z" ); char* coordNamesCharArray[ 3 ]; vectorToCharStarArray( coordNames, coordNamesCharArray ); EXODUS_CALL( ex_put_coord_names( file.id(), coordNamesCharArray ), "Unable to write coordinate names." ); // Count the entries in the blocks. meshParams.num_edge = edgeBlockGatherVisitor.totalNumberOfEntries(); meshParams.num_face = faceBlockGatherVisitor.totalNumberOfEntries(); meshParams.num_elem = elementBlockGatherVisitor.totalNumberOfEntries(); // Not doing sets and maps at the moment... meshParams.num_node_sets = 0; meshParams.num_edge_sets = 0; meshParams.num_face_sets = 0; meshParams.num_side_sets = 0; meshParams.num_elem_sets = 0; meshParams.num_node_maps = 0; meshParams.num_edge_maps = 0; meshParams.num_face_maps = 0; meshParams.num_elem_maps = 0; EXODUS_CALL( ex_put_init_ext( file.id(), &meshParams ), "Unable to initialize database.\n" ); // Write the time step info, if there is any. FindTimeVisitor timeVisit; item->traverse( timeVisit ); if ( timeVisit.time() ) { double timeVal = timeVisit.time()->value(); EXODUS_CALL( ex_put_time( file.id(), (int)( timeStep + 1 ), (void*)&timeVal ), "Unable to write time value." ); } // Write the blocks. writeBlockData( file.id(), EX_EDGE_BLOCK, edgeBlockGatherVisitor.names(), edgeBlockGatherVisitor.pointers() ); writeBlockData( file.id(), EX_FACE_BLOCK, faceBlockGatherVisitor.names(), faceBlockGatherVisitor.pointers() ); writeBlockData( file.id(), EX_ELEM_BLOCK, elementBlockGatherVisitor.names(), elementBlockGatherVisitor.pointers() ); // Write the variable data for this time step. for ( std::size_t blockIndex = 0; blockIndex < meshParams.num_edge_blk; ++blockIndex ) { edgeBlockGatherVisitor.pointers()[ blockIndex ]->writeTimeStep( file.id(), timeStep ); } for ( std::size_t blockIndex = 0; blockIndex < meshParams.num_face_blk; ++blockIndex ) { faceBlockGatherVisitor.pointers()[ blockIndex ]->writeTimeStep( file.id(), timeStep ); } for ( std::size_t blockIndex = 0; blockIndex < meshParams.num_elem_blk; ++blockIndex ) { elementBlockGatherVisitor.pointers()[ blockIndex ]->writeTimeStep( file.id(), timeStep ); } }