inline void writeExodusFileUsingBoxes(const std::vector<FloatBox>& boxes, const std::string &filename) { if ( boxes.size() == 0 ) { std::cerr << "Skipping writing of file. No boxes to write.\n"; return; } const int num_nodes_per_elem = 8; const int num_attr = 0; const unsigned num_elements = boxes.size(); std::vector<int> numElementsPerBlock; fillNumElementsPerBlock(num_elements, numElementsPerBlock); const int num_blocks = numElementsPerBlock.size(); const int exoid = openFileAndGetId(boxes.size(), num_blocks, filename); putCoordinatesInFile(exoid, boxes); std::vector<int> connect(numElementsPerBlock[0]*num_nodes_per_elem); int ordering[8] = { 4, 3, 2, 1, 8, 7, 6, 5 }; // one based! unsigned offset = 0; for (int blockId=1;blockId<=num_blocks;blockId++) { const int num_elements_this_block = numElementsPerBlock[blockId-1]; ex_put_elem_block(exoid, blockId, "HEX", num_elements_this_block, num_nodes_per_elem, num_attr); for (int j=0;j<num_nodes_per_elem*num_elements_this_block;j++) { connect[j] = ordering[j%num_nodes_per_elem]+offset+num_nodes_per_elem*(j/num_nodes_per_elem); } offset += num_elements_this_block*num_nodes_per_elem; ex_put_elem_conn(exoid, blockId, &connect[0]); } ex_close(exoid); }
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_nodes_per_elem[10]; int num_node_sets, num_sides, num_side_sets, error; int i, j, k, m, *elem_map, *connect; int node_list[100],elem_list[100],side_list[100]; int ebids[10], ids[10]; int num_sides_per_set[10], num_nodes_per_set[10], num_elem_per_set[10]; int num_df_per_set[10]; int df_ind[10], node_ind[10], elem_ind[10], side_ind[10]; int num_qa_rec, num_info; int num_glo_vars, num_nod_vars, num_ele_vars; int *truth_tab; int whole_time_step, num_time_steps; int ndims, nvars, ngatts, recdim; int CPU_word_size,IO_word_size; int prop_array[2]; float *glob_var_vals, *nodal_var_vals, *elem_var_vals; float time_value; float *x, *y, *z, *dummy; float attrib[1], dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3]; char tmpstr[80]; char *prop_names[2]; ex_opts (EX_VERBOSE | EX_ABORT); dummy = 0; /* assign this so the Cray compiler doesn't complain */ /* 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.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 */ num_dim = 3; num_nodes = BIG; num_elem = BIG; num_elem_blk = 5; num_node_sets = 2; num_side_sets = 5; error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); /* write nodal coordinates values and names to database */ if (!(x = (float *) calloc(BIG, sizeof(float)))) { printf ("couldn't allocate memory for x node array%d\n"); exit(1); } if (!(y = (float *) calloc(BIG, sizeof(float)))) { printf ("couldn't allocate memory for y node array%d\n"); exit(1); } if (!(z = (float *) calloc(BIG, sizeof(float)))) { printf ("couldn't allocate memory for z node array%d\n"); exit(1); } for (i=0; i<num_nodes; i++) { /* dummy up the coordinate space */ x[i]=i; y[i]=i+.1; z[i]=i+.2; } error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); coord_names[0] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; error = ex_put_coord_names (exoid, coord_names); printf ("after ex_put_coord_names, error = %d\n", error); /* write element order map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i; } error = ex_put_map (exoid, elem_map); printf ("after ex_put_map, error = %d\n", error); free (elem_map); /* write element block parameters */ num_elem_in_block[0] = 1; num_elem_in_block[1] = 1; num_elem_in_block[2] = 1; num_elem_in_block[3] = 1; num_elem_in_block[4] = 1; num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */ num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2], num_nodes_per_elem[2], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3], num_nodes_per_elem[3], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4], num_nodes_per_elem[4], 1); printf ("after ex_put_elem_block, error = %d\n", error); /* write element block properties */ prop_names[0] = "MATL"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50); printf ("after ex_put_prop, error = %d\n", error); /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 21; connect[1] = 22; connect[2] = 23; connect[3] = 24; connect[4] = 25; connect[5] = 26; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); free (connect); /* write element block attributes */ attrib[0] = 3.14159; error = ex_put_elem_attr (exoid, ebids[0], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); attrib[0] = 6.14159; error = ex_put_elem_attr (exoid, ebids[1], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[2], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[3], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[4], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); /* write individual node sets */ error = ex_put_node_set_param (exoid, 20, 5, 5); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; node_list[3] = 13; node_list[4] = 14; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; error = ex_put_node_set (exoid, 20, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 20, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); error = ex_put_node_set_param (exoid, 21, 3, 3); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1; error = ex_put_node_set (exoid, 21, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 21, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); /* write concatenated node sets; this produces the same information as * the above code which writes individual node sets */ /* THIS SECTION IS COMMENTED OUT ids[0] = 20; ids[1] = 21; num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3; node_ind[0] = 0; node_ind[1] = 5; node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; node_list[3] = 13; node_list[4] = 14; node_list[5] = 20; node_list[6] = 21; node_list[7] = 22; num_df_per_set[0] = 5; num_df_per_set[1] = 3; df_ind[0] = 0; df_ind[1] = 5; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1; error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set, num_df_per_set, node_ind, df_ind, node_list, dist_fact); printf ("after ex_put_concat_node_sets, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); END COMMENTED OUT SECTION */ /* write individual side sets */ /* side set #1 - quad */ error = ex_put_side_set_param (exoid, 30, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 2; elem_list[1] = 2; side_list[0] = 4; side_list[1] = 2; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); /* side set #2 - quad, spanning 2 elements */ error = ex_put_side_set_param (exoid, 31, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 1; elem_list[1] = 2; side_list[0] = 2; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); /* side set #3 - hex */ error = ex_put_side_set_param (exoid, 32, 7, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 3; elem_list[1] = 3; elem_list[2] = 3; elem_list[3] = 3; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; side_list[0] = 5; side_list[1] = 3; side_list[2] = 3; side_list[3] = 2; side_list[4] = 4; side_list[5] = 1; side_list[6] = 6; error = ex_put_side_set (exoid, 32, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); /* side set #4 - tetras */ error = ex_put_side_set_param (exoid, 33, 4, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 4; elem_list[1] = 4; elem_list[2] = 4; elem_list[3] = 4; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; error = ex_put_side_set (exoid, 33, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); /* side set #5 - wedges */ error = ex_put_side_set_param (exoid, 34, 5, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 5; elem_list[1] = 5; elem_list[2] = 5; elem_list[3] = 5; elem_list[4] = 5; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 5; error = ex_put_side_set (exoid, 34, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); /* END COMMENTED OUT SECTION */ /* write concatenated side sets; this produces the same information as * the above code which writes individual side sets */ /* THIS SECTION IS COMMENTED OUT ids[0] = 30; ids[1] = 31; ids[2] = 32; ids[3] = 33; ids[4] = 34; node_list[0] = 8; node_list[1] = 5; node_list[2] = 6; node_list[3] = 7; node_list[4] = 2; node_list[5] = 3; node_list[6] = 7; node_list[7] = 8; node_list[8] = 9; node_list[9] = 12; node_list[10] = 11; node_list[11] = 10; node_list[12] = 11; node_list[13] = 12; node_list[14] = 16; node_list[15] = 15; node_list[16] = 16; node_list[17] = 15; node_list[18] = 11; node_list[19] = 12; node_list[20] = 10; node_list[21] = 11; node_list[22] = 15; node_list[23] = 14; node_list[24] = 13; node_list[25] = 16; node_list[26] = 12; node_list[27] = 9; node_list[28] = 14; node_list[29] = 13; node_list[30] = 9; node_list[31] = 10; node_list[32] = 16; node_list[33] = 13; node_list[34] = 14; node_list[35] = 15; node_list[36] = 17; node_list[37] = 18; node_list[38] = 20; node_list[39] = 18; node_list[40] = 19; node_list[41] = 20; node_list[42] = 20; node_list[43] = 19; node_list[44] = 17; node_list[45] = 19; node_list[46] = 18; node_list[47] = 17; node_list[48] = 25; node_list[49] = 24; node_list[50] = 21; node_list[51] = 22; node_list[52] = 26; node_list[53] = 25; node_list[54] = 22; node_list[55] = 23; node_list[56] = 26; node_list[57] = 23; node_list[58] = 21; node_list[59] = 24; node_list[60] = 23; node_list[61] = 22; node_list[62] = 21; node_list[63] = 24; node_list[64] = 25; node_list[65] = 26; node_ind[0] = 0; node_ind[1] = 4; node_ind[2] = 8; node_ind[3] = 36; node_ind[4] = 47; num_elem_per_set[0] = 2; num_elem_per_set[1] = 2; num_elem_per_set[2] = 7; num_elem_per_set[3] = 4; num_elem_per_set[4] = 5; num_nodes_per_set[0] = 4; num_nodes_per_set[1] = 4; num_nodes_per_set[2] = 28; num_nodes_per_set[3] = 12; num_nodes_per_set[4] = 18; elem_ind[0] = 0; elem_ind[1] = 2; elem_ind[2] = 4; elem_ind[3] = 11; elem_ind[4] = 15; elem_list[0] = 2; elem_list[1] = 2; elem_list[2] = 1; elem_list[3] = 2; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; elem_list[7] = 3; elem_list[8] = 3; elem_list[9] = 3; elem_list[10] = 3; elem_list[11] = 4; elem_list[12] = 4; elem_list[13] = 4; elem_list[14] = 4; elem_list[15] = 5; elem_list[16] = 5; elem_list[17] = 5; elem_list[18] = 5; elem_list[19] = 5; error = ex_cvt_nodes_to_sides(exoid, num_elem_per_set, num_nodes_per_set, elem_ind, node_ind, elem_list, node_list, side_list); printf ("after ex_cvt_nodes_to_sides, error = %d\n", error); num_df_per_set[0] = 4; num_df_per_set[1] = 4; num_df_per_set[2] = 0; num_df_per_set[3] = 0; num_df_per_set[4] = 0; df_ind[0] = 0; df_ind[1] = 4; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; dist_fact[4] = 31.0; dist_fact[5] = 31.1; dist_fact[6] = 31.2; dist_fact[7] = 31.3; error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set, num_df_per_set, elem_ind, df_ind, elem_list, side_list, dist_fact); printf ("after ex_put_concat_side_sets, error = %d\n", error); /* END COMMENTED OUT SECTION */ error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, error = %d\n", error); /* write QA records */ num_qa_rec = 2; qa_record[0][0] = "TESTWT"; qa_record[0][1] = "testwt"; qa_record[0][2] = "07/07/93"; qa_record[0][3] = "15:41:33"; qa_record[1][0] = "FASTQ"; qa_record[1][1] = "fastq"; qa_record[1][2] = "07/07/93"; qa_record[1][3] = "16:41:33"; error = ex_put_qa (exoid, num_qa_rec, qa_record); printf ("after ex_put_qa, error = %d\n", error); /* write information records */ num_info = 3; info[0] = "This is the first information record."; info[1] = "This is the second information record."; info[2] = "This is the third information record."; error = ex_put_info (exoid, num_info, info); printf ("after ex_put_info, error = %d\n", error); /* 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); error = ex_put_var_names (exoid, "g", num_glo_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); num_nod_vars = 2; var_names[0] = "nod_var0"; var_names[1] = "nod_var1"; error = ex_put_var_param (exoid, "n", num_nod_vars); printf ("after ex_put_var_param, error = %d\n", error); error = ex_put_var_names (exoid, "n", num_nod_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); 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); error = ex_put_var_names (exoid, "e", num_ele_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); /* 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); 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 (4, 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); /* 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); /* 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); } /* 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, ebids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var, error = %d\n", error); } } 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); } 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); 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_nodes_per_elem[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 ebids[10], ssids[10], nsids[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 attrib[1], dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3], *variable_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.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); ex_set_option(exoid, EX_OPT_MAX_NAME_LENGTH, 127); /* Using long names */ /* initialize file with parameters */ num_dim = 3; num_nodes = 33; num_elem = 7; num_elem_blk = 7; num_node_sets = 2; num_side_sets = 5; error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 0.0; y[0] = 0.0; z[0] = 0.0; x[1] = 1.0; y[1] = 0.0; z[1] = 0.0; x[2] = 1.0; y[2] = 1.0; z[2] = 0.0; x[3] = 0.0; y[3] = 1.0; z[3] = 0.0; /* Quad #2 */ x[4] = 1.0; y[4] = 0.0; z[4] = 0.0; x[5] = 2.0; y[5] = 0.0; z[5] = 0.0; x[6] = 2.0; y[6] = 1.0; z[6] = 0.0; x[7] = 1.0; y[7] = 1.0; z[7] = 0.0; /* Hex #1 */ x[8] = 0.0; y[8] = 0.0; z[8] = 0.0; x[9] = 10.0; y[9] = 0.0; z[9] = 0.0; x[10] = 10.0; y[10] = 0.0; z[10] =-10.0; x[11] = 1.0; y[11] = 0.0; z[11] =-10.0; x[12] = 1.0; y[12] = 10.0; z[12] = 0.0; x[13] = 10.0; y[13] = 10.0; z[13] = 0.0; x[14] = 10.0; y[14] = 10.0; z[14] =-10.0; x[15] = 1.0; y[15] = 10.0; z[15] =-10.0; /* Tetra #1 */ x[16] = 0.0; y[16] = 0.0; z[16] = 0.0; x[17] = 1.0; y[17] = 0.0; z[17] = 5.0; x[18] = 10.0; y[18] = 0.0; z[18] = 2.0; x[19] = 7.0; y[19] = 5.0; z[19] = 3.0; /* Wedge #1 */ x[20] = 3.0; y[20] = 0.0; z[20] = 6.0; x[21] = 6.0; y[21] = 0.0; z[21] = 0.0; x[22] = 0.0; y[22] = 0.0; z[22] = 0.0; x[23] = 3.0; y[23] = 2.0; z[23] = 6.0; x[24] = 6.0; y[24] = 2.0; z[24] = 2.0; x[25] = 0.0; y[25] = 2.0; z[25] = 0.0; /* Tetra #2 */ x[26] = 2.7; y[26] = 1.7; z[26] = 2.7; x[27] = 6.0; y[27] = 1.7; z[27] = 3.3; x[28] = 5.7; y[28] = 1.7; z[28] = 1.7; x[29] = 3.7; y[29] = 0.0; z[29] = 2.3; /* 3d Tri */ x[30] = 0.0; y[30] = 0.0; z[30] = 0.0; x[31] = 10.0; y[31] = 0.0; z[31] = 0.0; x[32] = 10.0; y[32] = 10.0; z[32] = 10.0; error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ coord_names[0] = "X coordinate name that is padded to be longer than 32 characters"; coord_names[1] = "Y coordinate name that is padded to be longer than 32 characters"; coord_names[2] = "Z coordinate name that is padded to be longer than 32 characters"; 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); } /* Add nodal attributes */ error = ex_put_attr_param(exoid, EX_NODAL, 0, 2); printf ("after ex_put_attr_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x); if (error) { ex_close (exoid); exit(-1); } error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y); if (error) { ex_close (exoid); exit(-1); } { attrib_names[0] = "Node_attr_1"; attrib_names[1] = "Node_attr_2"; error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names); if (error) { ex_close (exoid); exit(-1); } } /* write element order map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i; } error = ex_put_map (exoid, elem_map); printf ("after ex_put_map, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (elem_map); /* write element block parameters */ /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ block_names[0] = "Very long name for block_1 that exceeds 32 characters"; block_names[1] = "Very long name for block_2 that exceeds 32 characters"; block_names[2] = "Very long name for block_3 that exceeds 32 characters"; block_names[3] = "Very long name for block_4 that exceeds 32 characters"; block_names[4] = "Very long name for block_5 that exceeds 32 characters"; block_names[5] = "Very long name for block_6 that exceeds 32 characters"; block_names[6] = "Very long name for block_7 that exceeds 32 characters"; num_elem_in_block[0] = 1; num_elem_in_block[1] = 1; num_elem_in_block[2] = 1; num_elem_in_block[3] = 1; num_elem_in_block[4] = 1; num_elem_in_block[5] = 1; num_elem_in_block[6] = 1; num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */ num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */ num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */ num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; ebids[5] = 15; ebids[6] = 16; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2], num_nodes_per_elem[2], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3], num_nodes_per_elem[3], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4], num_nodes_per_elem[4], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5], num_nodes_per_elem[5], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[6], "tri", num_elem_in_block[6], num_nodes_per_elem[6], 1); printf ("after ex_put_elem_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 block properties */ /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 10); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 20); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 30); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], prop_names[0], 40); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], prop_names[0], 50); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], prop_names[0], 60); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], prop_names[0], 70); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 21; connect[1] = 22; connect[2] = 23; connect[3] = 24; connect[4] = 25; connect[5] = 26; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29; error = ex_put_elem_conn (exoid, ebids[5], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 31; connect[1] = 32; connect[2] = 33; error = ex_put_elem_conn (exoid, ebids[6], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); /* write element block attributes */ attrib[0] = 3.14159; error = ex_put_elem_attr (exoid, ebids[0], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[0], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } attrib[0] = 6.14159; error = ex_put_elem_attr (exoid, ebids[1], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[2], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[3], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[4], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[5], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[6], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ attrib_names[0] = "The name for the attribute representing the shell thickness"; for (i=0; i < 7; i++) { error = ex_put_elem_attr_names (exoid, ebids[i], attrib_names); printf ("after ex_put_elem_attr_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } /* write individual node sets */ num_nodes_in_nset[0] = 5; num_nodes_in_nset[1] = 3; nsids[0] = 20; nsids[1] = 21; error = ex_put_node_set_param (exoid, nsids[0], 5, 5); printf ("after ex_put_node_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; node_list[3] = 13; node_list[4] = 14; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; error = ex_put_node_set (exoid, nsids[0], node_list); printf ("after ex_put_node_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_node_set_param (exoid, nsids[1], 3, 3); printf ("after ex_put_node_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1; error = ex_put_node_set (exoid, nsids[1], node_list); printf ("after ex_put_node_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write node set names */ nset_names[0] = "nset_1"; nset_names[1] = "nset_2"; error = ex_put_names(exoid, EX_NODE_SET, nset_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Add nodeset attributes */ error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1); printf ("after ex_put_attr_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x); if (error) { ex_close (exoid); exit(-1); } { attrib_names[0] = "Nodeset_attribute"; error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names); if (error) { ex_close (exoid); exit(-1); } } /* write individual side sets */ num_face_in_sset[0] = 2; num_face_in_sset[1] = 2; num_face_in_sset[2] = 7; num_face_in_sset[3] = 8; num_face_in_sset[4] = 10; ssids[0] = 30; ssids[1] = 31; ssids[2] = 32; ssids[3] = 33; ssids[4] = 34; /* side set #1 - quad */ error = ex_put_side_set_param (exoid, ssids[0], 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 2; elem_list[1] = 2; side_list[0] = 4; side_list[1] = 2; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #2 - quad, spanning 2 elements */ error = ex_put_side_set_param (exoid, 31, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 1; elem_list[1] = 2; side_list[0] = 2; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #3 - hex */ error = ex_put_side_set_param (exoid, 32, 7, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 3; elem_list[1] = 3; elem_list[2] = 3; elem_list[3] = 3; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; side_list[0] = 5; side_list[1] = 3; side_list[2] = 3; side_list[3] = 2; side_list[4] = 4; side_list[5] = 1; side_list[6] = 6; error = ex_put_side_set (exoid, 32, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #4 - tetras */ error = ex_put_side_set_param (exoid, 33, 8, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 4; elem_list[1] = 4; elem_list[2] = 4; elem_list[3] = 4; elem_list[4] = 6; elem_list[5] = 6; elem_list[6] = 6; elem_list[7] = 6; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 1; side_list[5] = 2; side_list[6] = 3; side_list[7] = 4; error = ex_put_side_set (exoid, 33, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #5 - wedges and tris */ error = ex_put_side_set_param (exoid, 34, 10, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 5; elem_list[1] = 5; elem_list[2] = 5; elem_list[3] = 5; elem_list[4] = 5; elem_list[5] = 7; elem_list[6] = 7; elem_list[7] = 7; elem_list[8] = 7; elem_list[9] = 7; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 5; side_list[5] = 1; side_list[6] = 2; side_list[7] = 3; side_list[8] = 4; side_list[9] = 5; error = ex_put_side_set (exoid, 34, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Write side set names */ sset_names[0] = "sset_1"; sset_names[1] = "sset_2"; sset_names[2] = "sset_3"; sset_names[3] = "sset_4"; sset_names[4] = "sset_5"; error = ex_put_names(exoid, EX_SIDE_SET, sset_names); printf ("after ex_put_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, 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"; qa_record[0][1] = "testwt"; qa_record[0][2] = "07/07/93"; qa_record[0][3] = "15:41:33"; 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; variable_names[0] = "glo_vars"; error = ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars); printf ("after ex_put_variable_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, variable_names); printf ("after ex_put_variable_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } num_nod_vars = 2; /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ variable_names[0] = "node_variable_a_somewhat_long_name_0"; variable_names[1] = "node_variable_a_much_longer_name_that_is_not_too_long_name"; error = ex_put_variable_param (exoid, EX_NODAL, num_nod_vars); printf ("after ex_put_variable_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, variable_names); printf ("after ex_put_variable_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } num_ele_vars = 3; /* 0 1 2 3 4 5 6 */ /* 1234567890123456789012345678901234567890123456789012345678901234 */ variable_names[0] = "the_stress_on_the_elements_in_this_block_that_are_active_now"; variable_names[1] = "ele_var1"; variable_names[2] = "ele_var2"; error = ex_put_variable_param (exoid, EX_ELEM_BLOCK, num_ele_vars); printf ("after ex_put_variable_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_variable_names (exoid, EX_ELEM_BLOCK, num_ele_vars, variable_names); printf ("after ex_put_variable_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } { num_nset_vars = 3; variable_names[0] = "ns_var0"; variable_names[1] = "ns_var1"; variable_names[2] = "ns_var2"; error = ex_put_variable_param (exoid, EX_NODE_SET, num_nset_vars); printf ("after ex_put_variable_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_variable_names (exoid, EX_NODE_SET, num_nset_vars, variable_names); printf ("after ex_put_variable_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } { num_sset_vars = 3; variable_names[0] = "ss_var0"; variable_names[1] = "ss_var1"; variable_names[2] = "ss_var2"; error = ex_put_variable_param (exoid, EX_SIDE_SET, num_sset_vars); printf ("after ex_put_variable_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_variable_names (exoid, EX_SIDE_SET, num_sset_vars, variable_names); printf ("after ex_put_variable_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 (4, CPU_word_size); sset_var_vals = (float *) calloc (10, CPU_word_size); nset_var_vals = (float *) calloc (10, 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, ebids[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); } } } /* write sideset variables */ for (k=1; k<=num_sset_vars; k++) { for (j=0; j<num_side_sets; j++) { for (m=0; m<num_face_in_sset[j]; m++) { sset_var_vals[m] = (float)(k+2) + (float)(j+3) + ((float)(m+1)*time_value); /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */ } error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j], num_face_in_sset[j], sset_var_vals); printf ("after ex_put_sset_var, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } /* write nodeset variables */ for (k=1; k<=num_nset_vars; k++) { for (j=0; j<num_node_sets; j++) { for (m=0; m<num_nodes_in_nset[j]; m++) { nset_var_vals[m] = (float)(k+3) + (float)(j+4) + ((float)(m+1)*time_value); /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */ } error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j], num_nodes_in_nset[j], nset_var_vals); printf ("after ex_put_nset_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); free(sset_var_vals); free(nset_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 write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_Description* machine, Problem_Description* prob, Mesh_Description<INT>* mesh, LB_Description<INT>* lb) { int exid_vis, exid_inp; char title[MAX_LINE_LENGTH+1]; const char *coord_names[] = {"X", "Y", "Z"}; /*-----------------------------Execution Begins------------------------------*/ /* Generate the file name for the visualization file */ std::string vis_file_name = remove_extension(nemI_out_file); vis_file_name += "-vis.exoII"; /* Generate the title for the file */ strcpy(title, UTIL_NAME); strcat(title, " "); strcat(title, ELB_VERSION); strcat(title, " load balance visualization file"); /* * If the vis technique is to be by element block then calculate the * number of element blocks. */ int vis_nelem_blks; if(prob->type == ELEMENTAL) vis_nelem_blks = machine->num_procs; else vis_nelem_blks = machine->num_procs + 1; /* Create the ExodusII file */ std::cout << "Outputting load balance visualization file " << vis_file_name.c_str() << "\n"; int cpu_ws = 0; int io_ws = 0; int mode = EX_CLOBBER; if (prob->int64db|prob->int64api) { mode |= EX_NETCDF4|EX_NOCLASSIC|prob->int64db|prob->int64api; } if((exid_vis=ex_create(vis_file_name.c_str(), mode, &cpu_ws, &io_ws)) < 0) { Gen_Error(0, "fatal: unable to create visualization output file"); return 0; } ON_BLOCK_EXIT(ex_close, exid_vis); /* * Open the original input ExodusII file, read the values for the * element blocks and output them to the visualization file. */ int icpu_ws=0; int iio_ws=0; float vers=0.0; mode = EX_READ | prob->int64api; if((exid_inp=ex_open(exoII_inp_file.c_str(), mode, &icpu_ws, &iio_ws, &vers)) < 0) { Gen_Error(0, "fatal: unable to open input ExodusII file"); return 0; } ON_BLOCK_EXIT(ex_close, exid_inp); char **elem_type = (char**)array_alloc(2, mesh->num_el_blks, MAX_STR_LENGTH+1, sizeof(char)); if(!elem_type) { Gen_Error(0, "fatal: insufficient memory"); return 0; } ON_BLOCK_EXIT(free, elem_type); std::vector<INT> el_blk_ids(mesh->num_el_blks); std::vector<INT> el_cnt_blk(mesh->num_el_blks); std::vector<INT> node_pel_blk(mesh->num_el_blks); std::vector<INT> nattr_el_blk(mesh->num_el_blks); if(ex_get_elem_blk_ids(exid_inp, TOPTR(el_blk_ids)) < 0) { Gen_Error(0, "fatal: unable to get element block IDs"); return 0; } int acc_vis = ELB_TRUE; // Output a different element block per processor if (prob->vis_out == 2) acc_vis = ELB_FALSE; // Output a nodal/element variable showing processor size_t nsize = 0; /* * Find out if the mesh consists of mixed elements. If not then * element blocks will be used to visualize the partitioning. Otherwise * nodal/element results will be used. */ for(size_t ecnt=0; ecnt < mesh->num_el_blks; ecnt++) { if(ex_get_elem_block(exid_inp, el_blk_ids[ecnt], elem_type[ecnt], &el_cnt_blk[ecnt], &node_pel_blk[ecnt], &nattr_el_blk[ecnt]) < 0) { Gen_Error(0, "fatal: unable to get element block parameters"); return 0; } nsize += el_cnt_blk[ecnt]*node_pel_blk[ecnt]; if(strcmp(elem_type[0], elem_type[ecnt]) == 0) { if(node_pel_blk[0] != node_pel_blk[ecnt]) acc_vis = ELB_FALSE; } else acc_vis = ELB_FALSE; } if(acc_vis == ELB_TRUE) { /* Output the initial information */ if(ex_put_init(exid_vis, title, mesh->num_dims, mesh->num_nodes, mesh->num_elems, vis_nelem_blks, 0, 0) < 0) { Gen_Error(0, "fatal: unable to output initial params to vis file"); return 0; } /* Output the nodal coordinates */ float *xptr = nullptr; float *yptr = nullptr; float *zptr = nullptr; switch(mesh->num_dims) { case 3: zptr = (mesh->coords) + 2*mesh->num_nodes; /* FALLTHRU */ case 2: yptr = (mesh->coords) + mesh->num_nodes; /* FALLTHRU */ case 1: xptr = mesh->coords; } if(ex_put_coord(exid_vis, xptr, yptr, zptr) < 0) { Gen_Error(0, "fatal: unable to output coords to vis file"); return 0; } if(ex_put_coord_names(exid_vis, (char**)coord_names) < 0) { Gen_Error(0, "fatal: unable to output coordinate names"); return 0; } std::vector<INT> elem_block(mesh->num_elems); std::vector<INT> elem_map(mesh->num_elems); std::vector<INT> tmp_connect(nsize); for(size_t ecnt=0; ecnt < mesh->num_elems; ecnt++) { elem_map[ecnt] = ecnt+1; if(prob->type == ELEMENTAL) elem_block[ecnt] = lb->vertex2proc[ecnt]; else { int proc = lb->vertex2proc[mesh->connect[ecnt][0]]; int nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); elem_block[ecnt] = proc; for(int ncnt=1; ncnt < nnodes; ncnt++) { if(lb->vertex2proc[mesh->connect[ecnt][ncnt]] != proc) { elem_block[ecnt] = machine->num_procs; break; } } } } int ccnt = 0; std::vector<INT> vis_el_blk_ptr(vis_nelem_blks+1); for(INT bcnt=0; bcnt < vis_nelem_blks; bcnt++) { vis_el_blk_ptr[bcnt] = ccnt; int pos = 0; int old_pos = 0; INT* el_ptr = TOPTR(elem_block); size_t ecnt = mesh->num_elems; while(pos != -1) { pos = in_list(bcnt, ecnt, el_ptr); if(pos != -1) { old_pos += pos + 1; ecnt = mesh->num_elems - old_pos; el_ptr = TOPTR(elem_block) + old_pos; int nnodes = get_elem_info(NNODES, mesh->elem_type[old_pos-1]); for(int ncnt=0; ncnt < nnodes; ncnt++) tmp_connect[ccnt++] = mesh->connect[old_pos-1][ncnt] + 1; } } } vis_el_blk_ptr[vis_nelem_blks] = ccnt; /* Output the element map */ if(ex_put_map(exid_vis, TOPTR(elem_map)) < 0) { Gen_Error(0, "fatal: unable to output element number map"); return 0; } /* Output the visualization element blocks */ for(int bcnt=0; bcnt < vis_nelem_blks; bcnt++) { /* * Note this assumes all the blocks contain the same type * element. */ int ecnt = (vis_el_blk_ptr[bcnt+1]-vis_el_blk_ptr[bcnt])/node_pel_blk[0]; if(ex_put_elem_block(exid_vis, bcnt+1, elem_type[0], ecnt, node_pel_blk[0], 0) < 0) { Gen_Error(0, "fatal: unable to output element block params"); return 0; } /* Output the connectivity */ if(ex_put_elem_conn(exid_vis, bcnt+1, &tmp_connect[vis_el_blk_ptr[bcnt]]) < 0) { Gen_Error(0, "fatal: unable to output element connectivity"); return 0; } } } else { /* For nodal/element results visualization of the partioning. */ // Copy the mesh portion to the vis file. ex_copy(exid_inp, exid_vis); /* Set up the file for nodal/element results */ float time_val = 0.0; if(ex_put_time(exid_vis, 1, &time_val) < 0) { Gen_Error(0, "fatal: unable to output time to vis file"); return 0; } const char *var_names[] = {"proc"}; if(prob->type == NODAL) { /* Allocate memory for the nodal values */ std::vector<float> proc_vals(mesh->num_nodes); if(ex_put_variable_param(exid_vis, EX_NODAL, 1) < 0) { Gen_Error(0, "fatal: unable to output var params to vis file"); return 0; } if(ex_put_variable_names(exid_vis, EX_NODAL, 1, (char**)var_names) < 0) { Gen_Error(0, "fatal: unable to output variable name"); return 0; } /* Do some problem specific assignment */ for(size_t ncnt=0; ncnt < mesh->num_nodes; ncnt++) proc_vals[ncnt] = lb->vertex2proc[ncnt]; for(int pcnt=0; pcnt < machine->num_procs; pcnt++) { for(auto & elem : lb->bor_nodes[pcnt]) proc_vals[elem] = machine->num_procs + 1; } /* Output the nodal variables */ if(ex_put_nodal_var(exid_vis, 1, 1, mesh->num_nodes, TOPTR(proc_vals)) < 0) { Gen_Error(0, "fatal: unable to output nodal variables"); return 0; } } else if(prob->type == ELEMENTAL) { /* Allocate memory for the element values */ std::vector<float> proc_vals(mesh->num_elems); if(ex_put_variable_param(exid_vis, EX_ELEM_BLOCK, 1) < 0) { Gen_Error(0, "fatal: unable to output var params to vis file"); return 0; } if(ex_put_variable_names(exid_vis, EX_ELEM_BLOCK, 1, (char**)var_names) < 0) { Gen_Error(0, "fatal: unable to output variable name"); return 0; } /* Do some problem specific assignment */ for(int proc=0; proc < machine->num_procs; proc++) { for (size_t e = 0; e < lb->int_elems[proc].size(); e++) { size_t ecnt = lb->int_elems[proc][e]; proc_vals[ecnt] = proc; } for (size_t e = 0; e < lb->bor_elems[proc].size(); e++) { size_t ecnt = lb->bor_elems[proc][e]; proc_vals[ecnt] = proc; } } /* Output the element variables */ size_t offset = 0; for (size_t i=0; i < mesh->num_el_blks; i++) { if(ex_put_var(exid_vis, 1, EX_ELEM_BLOCK, 1, el_blk_ids[i], el_cnt_blk[i], &proc_vals[offset]) < 0) { Gen_Error(0, "fatal: unable to output nodal variables"); return 0; } offset += el_cnt_blk[i]; } } } return 1; } /*---------------------------End write_vis()-------------------------------*/
int main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block[10], num_nodes_per_elem[10]; int num_node_sets, num_side_sets, error; int *connect; int node_list[100],elem_list[100],side_list[100]; int ebids[10], ids[10]; int num_nodes_per_set[10], num_elem_per_set[10]; int num_df_per_set[10]; int df_ind[10], node_ind[10], elem_ind[10]; int num_qa_rec, num_info; int CPU_word_size,IO_word_size; float x[100], y[100], z[100]; float dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3]; 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.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 */ num_dim = 3; num_nodes = 33; num_elem = 8; num_elem_blk = 8; num_node_sets = 2; num_side_sets = 9; error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 0.0; y[0] = 0.0; z[0] = 0.0; x[1] = 1.0; y[1] = 0.0; z[1] = 0.0; x[2] = 1.0; y[2] = 1.0; z[2] = 0.0; x[3] = 0.0; y[3] = 1.0; z[3] = 0.0; /* Quad #2 */ x[4] = 1.0; y[4] = 0.0; z[4] = 0.0; x[5] = 2.0; y[5] = 0.0; z[5] = 0.0; x[6] = 2.0; y[6] = 1.0; z[6] = 0.0; x[7] = 1.0; y[7] = 1.0; z[7] = 0.0; /* Hex #1 */ x[8] = 0.0; y[8] = 0.0; z[8] = 0.0; x[9] = 10.0; y[9] = 0.0; z[9] = 0.0; x[10] = 10.0; y[10] = 0.0; z[10] =-10.0; x[11] = 1.0; y[11] = 0.0; z[11] =-10.0; x[12] = 1.0; y[12] = 10.0; z[12] = 0.0; x[13] = 10.0; y[13] = 10.0; z[13] = 0.0; x[14] = 10.0; y[14] = 10.0; z[14] =-10.0; x[15] = 1.0; y[15] = 10.0; z[15] =-10.0; /* Tetra #1 */ x[16] = 0.0; y[16] = 0.0; z[16] = 0.0; x[17] = 1.0; y[17] = 0.0; z[17] = 5.0; x[18] = 10.0; y[18] = 0.0; z[18] = 2.0; x[19] = 7.0; y[19] = 5.0; z[19] = 3.0; /* Wedge #1 */ x[20] = 3.0; y[20] = 0.0; z[20] = 6.0; x[21] = 6.0; y[21] = 0.0; z[21] = 0.0; x[22] = 0.0; y[22] = 0.0; z[22] = 0.0; x[23] = 3.0; y[23] = 2.0; z[23] = 6.0; x[24] = 6.0; y[24] = 2.0; z[24] = 2.0; x[25] = 0.0; y[25] = 2.0; z[25] = 0.0; /* Tetra #2 */ x[26] = 2.7; y[26] = 1.7; z[26] = 2.7; x[27] = 6.0; y[27] = 1.7; z[27] = 3.3; x[28] = 5.7; y[28] = 1.7; z[28] = 1.7; x[29] = 3.7; y[29] = 0.0; z[29] = 2.3; /* TriShell #1 */ x[30] = 2.7; y[30] = 1.7; z[30] = 2.7; x[31] = 6.0; y[31] = 1.7; z[31] = 3.3; x[32] = 5.7; y[32] = 1.7; z[32] = 1.7; 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] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; 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 element block parameters */ num_elem_in_block[0] = 1; num_elem_in_block[1] = 1; num_elem_in_block[2] = 1; num_elem_in_block[3] = 1; num_elem_in_block[4] = 1; num_elem_in_block[5] = 1; num_elem_in_block[6] = 1; num_elem_in_block[7] = 1; num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */ num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */ num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */ num_nodes_per_elem[6] = 4; /* elements in block #7 are 4-node shells */ num_nodes_per_elem[7] = 3; /* elements in block #8 are 3-node shells */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; ebids[5] = 15; ebids[6] = 16; ebids[7] = 17; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2], num_nodes_per_elem[2], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3], num_nodes_per_elem[3], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4], num_nodes_per_elem[4], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5], num_nodes_per_elem[5], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[6], "shell", num_elem_in_block[6], num_nodes_per_elem[6], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_block (exoid, ebids[7], "triangle", num_elem_in_block[7], num_nodes_per_elem[7], 1); printf ("after ex_put_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 21; connect[1] = 22; connect[2] = 23; connect[3] = 24; connect[4] = 25; connect[5] = 26; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29; error = ex_put_elem_conn (exoid, ebids[5], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[6], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 30; connect[1] = 31; connect[2] = 32; error = ex_put_elem_conn (exoid, ebids[7], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); /* write individual side sets */ /* side set #1 - quad */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 30, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 2; elem_list[1] = 2; side_list[0] = 4; side_list[1] = 2; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* side set #2 - quad, spanning 2 elements */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 31, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 1; elem_list[1] = 2; side_list[0] = 2; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* side set #3 - hex */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 32, 7, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 3; elem_list[1] = 3; elem_list[2] = 3; elem_list[3] = 3; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; side_list[0] = 5; side_list[1] = 3; side_list[2] = 3; side_list[3] = 2; side_list[4] = 4; side_list[5] = 1; side_list[6] = 6; error = ex_put_side_set (exoid, 32, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* side set #4 - 4-node tetras */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 33, 4, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 4; elem_list[1] = 4; elem_list[2] = 4; elem_list[3] = 4; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; error = ex_put_side_set (exoid, 33, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* side set #5 - shells; front and back faces */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 34, 2, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 7; elem_list[1] = 7; side_list[0] = 1; side_list[1] = 2; error = ex_put_side_set (exoid, 34, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* side set #6 - shells; edges */ /* THIS SECTION IS COMMENTED OUT error = ex_put_side_set_param (exoid, 35, 4, 0); printf ("after ex_put_side_set_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } elem_list[0] = 7; elem_list[1] = 7; elem_list[2] = 7; elem_list[3] = 7; side_list[0] = 3; side_list[1] = 4; side_list[2] = 5; side_list[3] = 6; error = ex_put_side_set (exoid, 35, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } END COMMENTED OUT SECTION */ /* write concatenated side sets; this produces the same information as * the above code which writes individual side sets */ ids[0] = 30; ids[1] = 31; ids[2] = 32; ids[3] = 33; ids[4] = 34; ids[5] = 35; ids[6] = 36; ids[7] = 37; ids[8] = 38; /* side set #1 - NULL side set */ /* do nothing except set num_elem_per_set to 0 */ /* side set #2 - NULL side set */ /* do nothing except set num_elem_per_set to 0 */ /* side set #3 - quad; 2 sides */ node_list[0] = 8; node_list[1] = 5; elem_list[0] = 2; node_list[2] = 6; node_list[3] = 7; elem_list[1] = 2; /* side set #4 - quad; 2 sides spanning 2 elements */ node_list[4] = 2; node_list[5] = 3; elem_list[2] = 1; node_list[6] = 7; node_list[7] = 8; elem_list[3] = 2; /* side set #5 - hex; 7 sides */ node_list[8] = 9; node_list[9] = 12; node_list[10] = 11; node_list[11] = 10; elem_list[4] = 3; node_list[12] = 11; node_list[13] = 12; node_list[14] = 16; node_list[15] = 15; elem_list[5] = 3; node_list[16] = 16; node_list[17] = 15; node_list[18] = 11; node_list[19] = 12; elem_list[6] = 3; node_list[20] = 10; node_list[21] = 11; node_list[22] = 15; node_list[23] = 14; elem_list[7] = 3; node_list[24] = 13; node_list[25] = 16; node_list[26] = 12; node_list[27] = 9; elem_list[8] = 3; node_list[28] = 14; node_list[29] = 13; node_list[30] = 9; node_list[31] = 10; elem_list[9] = 3; node_list[32] = 16; node_list[33] = 13; node_list[34] = 14; node_list[35] = 15; elem_list[10] = 3; /* side set #6 - 4-node tetras; 4 sides */ node_list[36] = 17; node_list[37] = 18; node_list[38] = 20; elem_list[11] = 4; node_list[39] = 18; node_list[40] = 19; node_list[41] = 20; elem_list[12] = 4; node_list[42] = 17; node_list[43] = 20; node_list[44] = 19; elem_list[13] = 4; node_list[45] = 17; node_list[46] = 19; node_list[47] = 18; elem_list[14] = 4; /* side set #7 - shells; front and back faces */ node_list[48] = 1; node_list[49] = 2; node_list[50] = 3; node_list[51] = 4; elem_list[15] = 7; node_list[52] = 4; node_list[53] = 3; node_list[54] = 2; node_list[55] = 1; elem_list[16] = 7; /* side set #8 - shells; 4 edges */ node_list[56] = 1; node_list[57] = 2; elem_list[17] = 7; node_list[58] = 2; node_list[59] = 3; elem_list[18] = 7; node_list[60] = 3; node_list[61] = 4; elem_list[19] = 7; node_list[62] = 4; node_list[63] = 1; elem_list[20] = 7; /* side set #9 -- 3-node shells -- front and back */ node_list[64] = 30; node_list[65] = 31; node_list[66] = 32; elem_list[21] = 8; node_list[67] = 32; node_list[68] = 31; node_list[69] = 30; elem_list[22] = 8; /* set up indices */ node_ind[0] = 0; node_ind[1] = 0; node_ind[2] = 0; node_ind[3] = 4; node_ind[4] = 8; node_ind[5] = 36; node_ind[6] = 48; node_ind[7] = 56; node_ind[8] = 64; num_elem_per_set[0] = 0; num_elem_per_set[1] = 0; num_elem_per_set[2] = 2; num_elem_per_set[3] = 2; num_elem_per_set[4] = 7; num_elem_per_set[5] = 4; num_elem_per_set[6] = 2; num_elem_per_set[7] = 4; num_elem_per_set[8] = 2; num_nodes_per_set[0] = 0; num_nodes_per_set[1] = 0; num_nodes_per_set[2] = 4; num_nodes_per_set[3] = 4; num_nodes_per_set[4] = 28; num_nodes_per_set[5] = 12; num_nodes_per_set[6] = 8; num_nodes_per_set[7] = 8; num_nodes_per_set[8] = 6; elem_ind[0] = 0; elem_ind[1] = 0; elem_ind[2] = 0; elem_ind[3] = 2; elem_ind[4] = 4; elem_ind[5] = 11; elem_ind[6] = 15; elem_ind[7] = 17; elem_ind[8] = 21; error = ex_cvt_nodes_to_sides(exoid, num_elem_per_set, num_nodes_per_set, elem_ind, node_ind, elem_list, node_list, side_list); printf ("after ex_cvt_nodes_to_sides, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } num_df_per_set[0] = 0; num_df_per_set[1] = 0; num_df_per_set[2] = 4; num_df_per_set[3] = 4; num_df_per_set[4] = 0; num_df_per_set[5] = 0; num_df_per_set[6] = 0; num_df_per_set[7] = 0; num_df_per_set[8] = 0; df_ind[0] = 0; df_ind[1] = 0; df_ind[2] = 0; df_ind[3] = 4; df_ind[4] = 0; df_ind[5] = 0; df_ind[6] = 0; df_ind[7] = 0; df_ind[8] = 0; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; dist_fact[4] = 31.0; dist_fact[5] = 31.1; dist_fact[6] = 31.2; dist_fact[7] = 31.3; error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set, num_df_per_set, elem_ind, df_ind, elem_list, side_list, dist_fact); printf ("after ex_put_concat_side_sets, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* THIS SECTION IS COMMENTED OUT END COMMENTED OUT SECTION */ /* write QA records; test empty and just blank-filled records */ num_qa_rec = 2; qa_record[0][0] = "TESTWT"; qa_record[0][1] = "testwt"; qa_record[0][2] = "07/07/93"; qa_record[0][3] = "15:41:33"; 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, exoid2, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block, num_node_sets, num_nodes_per_elem, num_attr; int num_side_sets, error; int i, j; int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list; int *ids; int num_nodes_in_set, num_elem_in_set; int num_sides_in_set, num_df_in_set; int num_qa_rec, num_info; int CPU_word_size, IO_word_size; int num_props, prop_value, *prop_values; float *x, *y, *z; float *dist_fact; float version, fdum; float attrib[1]; char *coord_names[3], *qa_record[2][4], *info[3]; char title[MAX_LINE_LENGTH + 1], elem_type[MAX_STR_LENGTH + 1]; char *prop_names[3]; char *cdum = 0; /* Specify compute and i/o word size */ CPU_word_size = 0; /* sizeof(float) */ IO_word_size = 4; /* float */ /* open EXODUS II file for reading */ ex_opts(EX_VERBOSE | EX_ABORT); exoid = ex_open("test.exo", /* filename path */ EX_READ, /* access mode */ &CPU_word_size, /* CPU float word size in bytes */ &IO_word_size, /* I/O float word size in bytes */ &version); /* returned version number */ printf("after ex_open for test.exo\n"); printf(" cpu word size: %d io word size: %d\n", CPU_word_size, IO_word_size); /* create EXODUS II file for writing */ exoid2 = ex_create("test2.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 test2.exo, exoid = %d\n", exoid2); /* read initialization parameters */ error = ex_get_init(exoid, title, &num_dim, &num_nodes, &num_elem, &num_elem_blk, &num_node_sets, &num_side_sets); printf("after ex_get_init, error = %d\n", error); /* write initialization parameters */ error = ex_put_init(exoid2, title, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf("after ex_put_init, error = %d\n", error); /* read nodal coordinate values */ x = (float *)calloc(num_nodes, sizeof(float)); y = (float *)calloc(num_nodes, sizeof(float)); if (num_dim >= 3) z = (float *)calloc(num_nodes, sizeof(float)); else z = 0; error = ex_get_coord(exoid, x, y, z); printf("\nafter ex_get_coord, error = %3d\n", error); /* write nodal coordinate values */ error = ex_put_coord(exoid2, x, y, z); printf("after ex_put_coord, error = %d\n", error); free(x); free(y); if (num_dim >= 3) free(z); /* read nodal coordinate names */ for (i = 0; i < num_dim; i++) { coord_names[i] = (char *)calloc((MAX_STR_LENGTH + 1), sizeof(char)); } error = ex_get_coord_names(exoid, coord_names); printf("\nafter ex_get_coord_names, error = %3d\n", error); /* write nodal coordinate names */ error = ex_put_coord_names(exoid2, coord_names); printf("after ex_put_coord_names, error = %d\n", error); for (i = 0; i < num_dim; i++) { free(coord_names[i]); } /* read element order map */ elem_map = (int *)calloc(num_elem, sizeof(int)); error = ex_get_map(exoid, elem_map); printf("\nafter ex_get_map, error = %3d\n", error); /* write element order map */ error = ex_put_map(exoid2, elem_map); printf("after ex_put_map, error = %d\n", error); free(elem_map); /* read and write element block parameters and element connectivity */ ids = (int *)calloc(num_elem_blk, sizeof(int)); error = ex_get_elem_blk_ids(exoid, ids); printf("\nafter ex_get_elem_blk_ids, error = %3d\n", error); attrib[0] = 3.14159; for (i = 0; i < num_elem_blk; i++) { error = ex_get_elem_block(exoid, ids[i], elem_type, &num_elem_in_block, &num_nodes_per_elem, &num_attr); printf("\nafter ex_get_elem_block, error = %d\n", error); error = ex_put_elem_block(exoid2, ids[i], elem_type, num_elem_in_block, num_nodes_per_elem, num_attr); printf("after ex_put_elem_block, error = %d\n", error); connect = (int *)calloc((num_nodes_per_elem * num_elem_in_block), sizeof(int)); error = ex_get_elem_conn(exoid, ids[i], connect); printf("\nafter ex_get_elem_conn, error = %d\n", error); error = ex_put_elem_conn(exoid2, ids[i], connect); printf("after ex_put_elem_conn, error = %d\n", error); /* write element block attributes */ error = ex_put_attr(exoid2, EX_ELEM_BLOCK, ids[i], attrib); printf("after ex_put_elem_attr, error = %d\n", error); free(connect); } /* read and write element block properties */ error = ex_inquire(exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum); printf("\nafter ex_inquire, error = %d\n", error); for (i = 0; i < num_props; i++) { prop_names[i] = (char *)calloc((MAX_STR_LENGTH + 1), sizeof(char)); } error = ex_get_prop_names(exoid, EX_ELEM_BLOCK, prop_names); printf("after ex_get_prop_names, error = %d\n", error); error = ex_put_prop_names(exoid2, EX_ELEM_BLOCK, num_props, prop_names); printf("after ex_put_prop_names, error = %d\n", error); for (i = 0; i < num_props; i++) { for (j = 0; j < num_elem_blk; j++) { error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i], &prop_value); printf("after ex_get_prop, error = %d\n", error); if (i > 0) { /* first property is the ID which is already stored */ error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ids[j], prop_names[i], prop_value); printf("after ex_put_prop, error = %d\n", error); } } } for (i = 0; i < num_props; i++) free(prop_names[i]); free(ids); /* read and write individual node sets */ ids = (int *)calloc(num_node_sets, sizeof(int)); error = ex_get_node_set_ids(exoid, ids); printf("\nafter ex_get_node_set_ids, error = %3d\n", error); for (i = 0; i < num_node_sets; i++) { error = ex_get_node_set_param(exoid, ids[i], &num_nodes_in_set, &num_df_in_set); printf("\nafter ex_get_node_set_param, error = %3d\n", error); error = ex_put_node_set_param(exoid2, ids[i], num_nodes_in_set, num_df_in_set); printf("after ex_put_node_set_param, error = %d\n", error); node_list = (int *)calloc(num_nodes_in_set, sizeof(int)); dist_fact = (float *)calloc(num_nodes_in_set, sizeof(float)); error = ex_get_node_set(exoid, ids[i], node_list); printf("\nafter ex_get_node_set, error = %3d\n", error); error = ex_put_node_set(exoid2, ids[i], node_list); printf("after ex_put_node_set, error = %d\n", error); if (num_df_in_set > 0) { error = ex_get_node_set_dist_fact(exoid, ids[i], dist_fact); printf("\nafter ex_get_node_set_dist_fact, error = %3d\n", error); error = ex_put_node_set_dist_fact(exoid2, ids[i], dist_fact); printf("after ex_put_node_set, error = %d\n", error); } free(node_list); free(dist_fact); } free(ids); /* read node set properties */ error = ex_inquire(exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum); printf("\nafter ex_inquire, error = %d\n", error); for (i = 0; i < num_props; i++) { prop_names[i] = (char *)calloc((MAX_STR_LENGTH + 1), sizeof(char)); } prop_values = (int *)calloc(num_node_sets, sizeof(int)); error = ex_get_prop_names(exoid, EX_NODE_SET, prop_names); printf("after ex_get_prop_names, error = %d\n", error); error = ex_put_prop_names(exoid2, EX_NODE_SET, num_props, prop_names); printf("after ex_put_prop_names, error = %d\n", error); for (i = 0; i < num_props; i++) { error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i], prop_values); printf("after ex_get_prop_array, error = %d\n", error); error = ex_put_prop_array(exoid2, EX_NODE_SET, prop_names[i], prop_values); printf("after ex_put_prop_array, error = %d\n", error); } for (i = 0; i < num_props; i++) free(prop_names[i]); free(prop_values); /* read and write individual side sets */ ids = (int *)calloc(num_side_sets, sizeof(int)); error = ex_get_side_set_ids(exoid, ids); printf("\nafter ex_get_side_set_ids, error = %3d\n", error); for (i = 0; i < num_side_sets; i++) { error = ex_get_side_set_param(exoid, ids[i], &num_sides_in_set, &num_df_in_set); printf("\nafter ex_get_side_set_param, error = %3d\n", error); error = ex_put_side_set_param(exoid2, ids[i], num_sides_in_set, num_df_in_set); printf("after ex_put_side_set_param, error = %d\n", error); /* Note: The # of elements is same as # of sides! */ num_elem_in_set = num_sides_in_set; elem_list = (int *)calloc(num_elem_in_set, sizeof(int)); side_list = (int *)calloc(num_sides_in_set, sizeof(int)); node_ctr_list = (int *)calloc(num_elem_in_set, sizeof(int)); node_list = (int *)calloc(num_elem_in_set * 21, sizeof(int)); dist_fact = (float *)calloc(num_df_in_set, sizeof(float)); error = ex_get_side_set(exoid, ids[i], elem_list, side_list); printf("\nafter ex_get_side_set, error = %3d\n", error); error = ex_put_side_set(exoid2, ids[i], elem_list, side_list); printf("after ex_put_side_set, error = %d\n", error); error = ex_get_side_set_node_list(exoid, ids[i], node_ctr_list, node_list); printf("\nafter ex_get_side_set_node_list, error = %3d\n", error); if (num_df_in_set > 0) { error = ex_get_side_set_dist_fact(exoid, ids[i], dist_fact); printf("\nafter ex_get_side_set_dist_fact, error = %3d\n", error); error = ex_put_side_set_dist_fact(exoid2, ids[i], dist_fact); printf("after ex_put_side_set_dist_fact, error = %d\n", error); } free(elem_list); free(side_list); free(node_ctr_list); free(node_list); free(dist_fact); } /* read side set properties */ error = ex_inquire(exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum); printf("\nafter ex_inquire, error = %d\n", error); for (i = 0; i < num_props; i++) { prop_names[i] = (char *)calloc((MAX_STR_LENGTH + 1), sizeof(char)); } error = ex_get_prop_names(exoid, EX_SIDE_SET, prop_names); printf("after ex_get_prop_names, error = %d\n", error); for (i = 0; i < num_props; i++) { for (j = 0; j < num_side_sets; j++) { error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i], &prop_value); printf("after ex_get_prop, error = %d\n", error); if (i > 0) { /* first property is ID so it is already stored */ error = ex_put_prop(exoid2, EX_SIDE_SET, ids[j], prop_names[i], prop_value); printf("after ex_put_prop, error = %d\n", error); } } } for (i = 0; i < num_props; i++) free(prop_names[i]); free(ids); /* read and write QA records */ ex_inquire(exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum); for (i = 0; i < num_qa_rec; i++) { for (j = 0; j < 4; j++) { qa_record[i][j] = (char *)calloc((MAX_STR_LENGTH + 1), sizeof(char)); } } error = ex_get_qa(exoid, qa_record); printf("\nafter ex_get_qa, error = %3d\n", error); error = ex_put_qa(exoid2, num_qa_rec, qa_record); printf("after ex_put_qa, error = %d\n", error); for (i = 0; i < num_qa_rec; i++) { for (j = 0; j < 4; j++) { free(qa_record[i][j]); } } /* read and write information records */ error = ex_inquire(exoid, EX_INQ_INFO, &num_info, &fdum, cdum); printf("\nafter ex_inquire, error = %3d\n", error); for (i = 0; i < num_info; i++) { info[i] = (char *)calloc((MAX_LINE_LENGTH + 1), sizeof(char)); } error = ex_get_info(exoid, info); printf("\nafter ex_get_info, error = %3d\n", error); error = ex_put_info(exoid2, num_info, info); printf("after ex_put_info, error = %d\n", error); for (i = 0; i < num_info; i++) { free(info[i]); } /* close the EXODUS files */ error = ex_close(exoid); printf("after ex_close, error = %d\n", error); error = ex_close(exoid2); printf("after ex_close (2), error = %d\n", error); return 0; }
void write_exo_mesh(int debug, char *file_name, INT map_origin, INT num_nodes, INT num_elements, INT num_domains, INT num_nodal_fields, INT num_global_fields, INT num_element_fields, INT num_timesteps, realtyp *x, realtyp *y, realtyp *z, INT *connect, int compression_level, int shuffle, int int64bit) { int CPU_word_size = sizeof(realtyp); int IO_word_size = sizeof(realtyp); int exoid, err, num_dim, num_elem_blk, num_node_sets, num_side_sets; INT i, j, t, index, loc_num_elements, loc_num_nodes, len_connect; INT *elem_map = NULL, *node_map = NULL, *domain_connect = NULL, *loc_connect = NULL; int *elem_var_tab; INT accum_num_elements = 0; INT loc_node_size = -1; realtyp *loc_xcoords = NULL; realtyp *loc_ycoords = NULL; realtyp *loc_zcoords = NULL; realtyp *globals = NULL; char temporary_name[MAX_STRING_LEN]; char **var_name; accum_num_elements = 0; for (i = 0; i < num_domains; i++) { int mymode = EX_MAPS_INT64_API | EX_BULK_INT64_API | EX_IDS_INT64_API; if (int64bit) { mymode |= EX_MAPS_INT64_DB | EX_BULK_INT64_DB | EX_IDS_INT64_DB; } /* create the EXODUSII file */ get_file_name(file_name, "e", i, num_domains, NULL, temporary_name); exoid = ex_create(temporary_name, EX_CLOBBER | mymode, &CPU_word_size, &IO_word_size); if (exoid < 0) { fprintf(stderr, "after ex_create, error = %d\n", exoid); exit(-1); } ex_set_option(exoid, EX_OPT_COMPRESSION_LEVEL, compression_level); ex_set_option(exoid, EX_OPT_COMPRESSION_SHUFFLE, shuffle); if (num_domains > 1) { /* Determine local number of elements */ if (num_elements < num_domains) { fprintf(stderr, "number of elements is less than number of domains.\n"); if (i < num_elements) loc_num_elements = 1; else loc_num_elements = 0; } else { loc_num_elements = num_elements / num_domains; if (i < (num_elements % num_domains)) loc_num_elements++; } len_connect = NUM_NODES_PER_ELEM * loc_num_elements; /* malloc things we need */ if (i == 0) { /* first time through; max size arrays occur on first iteration */ elem_map = malloc(loc_num_elements * sizeof(INT)); domain_connect = malloc(len_connect * sizeof(INT)); loc_connect = malloc(len_connect * sizeof(INT)); node_map = malloc(num_nodes * sizeof(INT)); } /* Create element local/global map */ create_elem_map(loc_num_elements, accum_num_elements, elem_map, map_origin); /* Extract current domain's connectivity, referencing global node ids */ extract_connect(accum_num_elements, loc_num_elements, elem_map, connect, domain_connect, map_origin); accum_num_elements += loc_num_elements; /* The local/global node map is just the current domain's connectivity, sorted with duplicate entries removed */ create_node_map(num_nodes, len_connect, domain_connect, node_map, &loc_num_nodes, map_origin); /* Using local/global node map, convert the domain connectivity (referencing global node ids) to local connectivity (referencing local node ids) */ create_local_connect(node_map, loc_num_nodes, len_connect, domain_connect, loc_connect, map_origin); } else { loc_num_elements = num_elements; loc_num_nodes = num_nodes; } if (debug) { fprintf(stderr, "\n\n\n"); fprintf(stderr, "\n domain: %" PRId64 "\n", i); fprintf(stderr, "\n loc_num_elements: %" PRId64 "\n", loc_num_elements); fprintf(stderr, "\n loc_num_nodes: %" PRId64 "\n", loc_num_nodes); } num_dim = 3; num_elem_blk = 1; num_node_sets = 0; num_side_sets = 0; err = ex_put_init(exoid, "This is an EXODUSII performance test.", num_dim, loc_num_nodes, loc_num_elements, num_elem_blk, num_node_sets, num_side_sets); if (err) { fprintf(stderr, "after ex_put_init, error = %d\n", err); ex_close(exoid); exit(-1); } /* Extract the local x and y coordinates */ if (num_domains > 1) { if (loc_num_nodes > loc_node_size) { loc_xcoords = realloc(loc_xcoords, loc_num_nodes * sizeof(realtyp)); loc_ycoords = realloc(loc_ycoords, loc_num_nodes * sizeof(realtyp)); loc_zcoords = realloc(loc_zcoords, loc_num_nodes * sizeof(realtyp)); loc_node_size = loc_num_nodes; } for (j = 0; j < loc_num_nodes; j++) { index = node_map[j] - map_origin; loc_xcoords[j] = x[index]; loc_ycoords[j] = y[index]; loc_zcoords[j] = z[index]; } err = ex_put_coord(exoid, loc_xcoords, loc_ycoords, loc_zcoords); } else { err = ex_put_coord(exoid, x, y, z); } if (err) { fprintf(stderr, "after ex_put_coord, error = %d\n", err); ex_close(exoid); exit(-1); } if (debug) { fprintf(stderr, "\tCoordinates output.\n"); } #if 1 { INT ids[1] = {EBLK_ID}; INT num_elem_per_block[1]; char *names[1] = {"hex"}; INT num_node_per_elem[1]; INT num_attr_per_block[1]; int write_map = num_domains > 1 ? EX_TRUE : EX_FALSE; num_elem_per_block[0] = loc_num_elements; num_node_per_elem[0] = NUM_NODES_PER_ELEM; num_attr_per_block[0] = 0; err = ex_put_concat_elem_block(exoid, ids, names, num_elem_per_block, num_node_per_elem, num_attr_per_block, write_map); } #else err = ex_put_elem_block(exoid, 10000000000, "hex", loc_num_elements, NUM_NODES_PER_ELEM, 0); #endif if (err) { fprintf(stderr, "after ex_put_elem_block, error = %d\n", err); ex_close(exoid); exit(-1); } if (num_domains > 1) { err = ex_put_elem_conn(exoid, EBLK_ID, loc_connect); } else { err = ex_put_elem_conn(exoid, EBLK_ID, connect); } if (err) { fprintf(stderr, "after ex_put_elem_conn, error = %d\n", err); ex_close(exoid); exit(-1); } if (debug) { fprintf(stderr, "\tConnectivity output.\n"); } /* write out element and node maps */ if (num_domains > 1) { err = ex_put_id_map(exoid, EX_NODE_MAP, node_map); if (err) { fprintf(stderr, "after ex_put_id_map, error = %d\n", err); ex_close(exoid); exit(-1); } err = ex_put_id_map(exoid, EX_ELEM_MAP, elem_map); if (err) { fprintf(stderr, "after ex_put_id_map, error = %d\n", err); ex_close(exoid); exit(-1); } if (debug) { fprintf(stderr, "\tMaps output.\n"); } } /* write out simulated results fields; we'll just write out the x coordinate field 'num_nodal_fields' times */ if (loc_num_nodes < loc_num_elements) { fprintf(stderr, "INTERNAL ERROR: Programmer assumed number of nodes > number of elements, " "but that is not true.\n"); ex_close(exoid); exit(-1); } if (num_element_fields > 0) { elem_var_tab = malloc(num_element_fields * sizeof(int)); for (j = 0; j < num_element_fields; j++) elem_var_tab[j] = 1; } else { elem_var_tab = 0; } err = ex_put_all_var_param(exoid, num_global_fields, num_nodal_fields, num_element_fields, elem_var_tab, 0, 0, 0, 0); if (err) { fprintf(stderr, "after ex_put_all_var_param, error = %d\n", err); ex_close(exoid); exit(-1); } if (num_nodal_fields > 0) { var_name = malloc(num_nodal_fields * sizeof(char *)); for (j = 0; j < num_nodal_fields; j++) { var_name[j] = malloc((MAX_STRING_LEN + 1) * sizeof(char)); sprintf(var_name[j], "node_field_%" PRId64, j + 1); } err = ex_put_variable_names(exoid, EX_NODAL, num_nodal_fields, var_name); for (j = 0; j < num_nodal_fields; j++) { free(var_name[j]); } free(var_name); } if (num_global_fields > 0) { globals = malloc(num_global_fields * sizeof(realtyp)); var_name = malloc(num_global_fields * sizeof(char *)); for (j = 0; j < num_global_fields; j++) { var_name[j] = malloc((MAX_STRING_LEN + 1) * sizeof(char)); sprintf(var_name[j], "global_field_%" PRId64, j + 1); globals[j] = j; } err = ex_put_variable_names(exoid, EX_GLOBAL, num_global_fields, var_name); for (j = 0; j < num_global_fields; j++) { free(var_name[j]); } free(var_name); } if (num_element_fields > 0) { free(elem_var_tab); var_name = malloc(num_element_fields * sizeof(char *)); for (j = 0; j < num_element_fields; j++) { var_name[j] = malloc((MAX_STRING_LEN + 1) * sizeof(char)); sprintf(var_name[j], "element_field_%" PRId64, j + 1); } err = ex_put_variable_names(exoid, EX_ELEM_BLOCK, num_element_fields, var_name); for (j = 0; j < num_element_fields; j++) { free(var_name[j]); } free(var_name); } if (num_nodal_fields + num_global_fields + num_element_fields > 0) { fprintf(stderr, "Domain %" PRId64 "/%" PRId64 ", Writing Timestep: ", i + 1, num_domains); for (t = 0; t < num_timesteps; t++) { realtyp time = t; ex_put_time(exoid, t + 1, &time); fprintf(stderr, "%" PRId64 ", ", t + 1); if (num_global_fields > 0) { err = ex_put_var(exoid, t + 1, EX_GLOBAL, 1, 0, num_global_fields, globals); if (err) { fprintf(stderr, "after ex_put_global_var, error = %d\n", err); ex_close(exoid); exit(-1); } } for (j = 0; j < num_nodal_fields; j++) { err = ex_put_var(exoid, t + 1, EX_NODAL, j + 1, 0, loc_num_nodes, x); if (err) { fprintf(stderr, "after ex_put_nodal_var, error = %d\n", err); ex_close(exoid); exit(-1); } } for (j = 0; j < num_element_fields; j++) { err = ex_put_var(exoid, t + 1, EX_ELEM_BLOCK, j + 1, EBLK_ID, loc_num_elements, x); if (err) { fprintf(stderr, "after ex_put_element_var, error = %d\n", err); ex_close(exoid); exit(-1); } } } fprintf(stderr, "\n"); } err = ex_close(exoid); if (err) { fprintf(stderr, "after ex_close, error = %d\n", err); exit(-1); } if (debug) { fprintf(stderr, "\tFile written.\n"); } } /* * Free Memory */ if (num_domains > 1) { free(domain_connect); free(elem_map); free(loc_connect); free(loc_xcoords); free(loc_ycoords); free(loc_zcoords); free(node_map); } if (num_global_fields > 0) free(globals); }
int main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block[10], num_nodes_per_elem[10]; int num_node_sets, num_side_sets, error; int i, j, k, kk, m, *elem_map, *connect; int node_list[100],elem_list[100],side_list[100]; int ebids[10], ssids[10], nsids[10], nattr[10]; int num_nodes_per_set[10], num_elem_per_set[10]; int num_df_per_set[10]; int num_qa_rec, num_info; int num_glo_vars, num_nod_vars, num_ele_vars, num_nset_vars, num_sset_vars; int *truth_tab, *nset_tab, *sset_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, *nset_var_vals, *sset_var_vals; float time_value; float x[100], y[100], z[100]; float attrib[1], dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3], *var_names[7]; char *prop_names[2]; char *eb_type[10]; 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.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 */ num_dim = 3; num_nodes = 33; num_elem = 7; num_elem_blk = 7; num_node_sets = 2; num_side_sets = 5; error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 0.0; y[0] = 0.0; z[0] = 0.0; x[1] = 1.0; y[1] = 0.0; z[1] = 0.0; x[2] = 1.0; y[2] = 1.0; z[2] = 0.0; x[3] = 0.0; y[3] = 1.0; z[3] = 0.0; /* Quad #2 */ x[4] = 1.0; y[4] = 0.0; z[4] = 0.0; x[5] = 2.0; y[5] = 0.0; z[5] = 0.0; x[6] = 2.0; y[6] = 1.0; z[6] = 0.0; x[7] = 1.0; y[7] = 1.0; z[7] = 0.0; /* Hex #1 */ x[8] = 0.0; y[8] = 0.0; z[8] = 0.0; x[9] = 10.0; y[9] = 0.0; z[9] = 0.0; x[10] = 10.0; y[10] = 0.0; z[10] =-10.0; x[11] = 1.0; y[11] = 0.0; z[11] =-10.0; x[12] = 1.0; y[12] = 10.0; z[12] = 0.0; x[13] = 10.0; y[13] = 10.0; z[13] = 0.0; x[14] = 10.0; y[14] = 10.0; z[14] =-10.0; x[15] = 1.0; y[15] = 10.0; z[15] =-10.0; /* Tetra #1 */ x[16] = 0.0; y[16] = 0.0; z[16] = 0.0; x[17] = 1.0; y[17] = 0.0; z[17] = 5.0; x[18] = 10.0; y[18] = 0.0; z[18] = 2.0; x[19] = 7.0; y[19] = 5.0; z[19] = 3.0; /* Wedge #1 */ x[20] = 3.0; y[20] = 0.0; z[20] = 6.0; x[21] = 6.0; y[21] = 0.0; z[21] = 0.0; x[22] = 0.0; y[22] = 0.0; z[22] = 0.0; x[23] = 3.0; y[23] = 2.0; z[23] = 6.0; x[24] = 6.0; y[24] = 2.0; z[24] = 2.0; x[25] = 0.0; y[25] = 2.0; z[25] = 0.0; /* Tetra #2 */ x[26] = 2.7; y[26] = 1.7; z[26] = 2.7; x[27] = 6.0; y[27] = 1.7; z[27] = 3.3; x[28] = 5.7; y[28] = 1.7; z[28] = 1.7; x[29] = 3.7; y[29] = 0.0; z[29] = 2.3; /* 3d Tri */ x[30] = 0.0; y[30] = 0.0; z[30] = 0.0; x[31] = 10.0; y[31] = 0.0; z[31] = 0.0; x[32] = 10.0; y[32] = 10.0; z[32] = 10.0; 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] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; 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 element order map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i; } error = ex_put_map (exoid, elem_map); printf ("after ex_put_map, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (elem_map); /* write element block parameters */ num_elem_in_block[0] = 1; num_elem_in_block[1] = 1; num_elem_in_block[2] = 1; num_elem_in_block[3] = 1; num_elem_in_block[4] = 1; num_elem_in_block[5] = 1; num_elem_in_block[6] = 1; num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */ num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */ num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */ num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; ebids[5] = 15; ebids[6] = 16; nattr[0] = nattr[1] = nattr[2] = nattr[3] = 1; nattr[4] = nattr[5] = nattr[6] = 1; eb_type[0] = "quad"; eb_type[1] = "quad"; eb_type[2] = "hex"; eb_type[3] = "tetra"; eb_type[4] = "wedge"; eb_type[5] = "tetra"; eb_type[6] = "tri"; error = ex_put_concat_elem_block (exoid, ebids, eb_type, num_elem_in_block, num_nodes_per_elem, nattr, 0); printf ("after ex_put_concat_elem_block, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element block properties */ prop_names[0] = "MATL"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], "MATL", 60); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], "MATL", 70); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 21; connect[1] = 22; connect[2] = 23; connect[3] = 24; connect[4] = 25; connect[5] = 26; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29; error = ex_put_elem_conn (exoid, ebids[5], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } connect[0] = 31; connect[1] = 32; connect[2] = 33; error = ex_put_elem_conn (exoid, ebids[6], connect); printf ("after ex_put_elem_conn, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (connect); /* write element block attributes */ attrib[0] = 3.14159; error = ex_put_elem_attr (exoid, ebids[0], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } attrib[0] = 6.14159; error = ex_put_elem_attr (exoid, ebids[1], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[2], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[3], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[4], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[5], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_elem_attr (exoid, ebids[6], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* write individual node sets */ nsids[0] = 20; nsids[1] = 21; num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3; num_df_per_set[0] = 5; num_df_per_set[1] = 3; error = ex_put_concat_node_sets (exoid, nsids, num_nodes_per_set, num_df_per_set, 0, 0, 0, 0); printf ("after ex_put_concat_node_sets, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; node_list[3] = 13; node_list[4] = 14; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; error = ex_put_node_set (exoid, 20, node_list); printf ("after ex_put_node_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_node_set_dist_fact (exoid, 20, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1; error = ex_put_node_set (exoid, 21, node_list); printf ("after ex_put_node_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_node_set_dist_fact (exoid, 21, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* Define the sideset params at one time, then write individually */ ssids[0] = 30; ssids[1] = 31; ssids[2] = 32; ssids[3] = 33; ssids[4] = 34; num_elem_per_set[0] = 2; num_elem_per_set[1] = 2; num_elem_per_set[2] = 7; num_elem_per_set[3] = 8; num_elem_per_set[4] = 10; num_df_per_set[0] = 4; num_df_per_set[1] = 4; num_df_per_set[2] = 0; num_df_per_set[3] = 0; num_df_per_set[4] = 0; error = ex_put_concat_side_sets (exoid, ssids, num_elem_per_set, num_df_per_set, 0, 0, 0, 0, 0); printf ("after ex_put_concat_side_sets, error = %d\n", error); /* write individual side sets */ /* side set #1 - quad */ elem_list[0] = 2; elem_list[1] = 2; side_list[0] = 4; side_list[1] = 2; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #2 - quad, spanning 2 elements */ elem_list[0] = 1; elem_list[1] = 2; side_list[0] = 2; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #3 - hex */ elem_list[0] = 3; elem_list[1] = 3; elem_list[2] = 3; elem_list[3] = 3; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; side_list[0] = 5; side_list[1] = 3; side_list[2] = 3; side_list[3] = 2; side_list[4] = 4; side_list[5] = 1; side_list[6] = 6; error = ex_put_side_set (exoid, 32, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #4 - tetras */ elem_list[0] = 4; elem_list[1] = 4; elem_list[2] = 4; elem_list[3] = 4; elem_list[4] = 6; elem_list[5] = 6; elem_list[6] = 6; elem_list[7] = 6; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 1; side_list[5] = 2; side_list[6] = 3; side_list[7] = 4; error = ex_put_side_set (exoid, 33, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* side set #5 - wedges and tris */ elem_list[0] = 5; elem_list[1] = 5; elem_list[2] = 5; elem_list[3] = 5; elem_list[4] = 5; elem_list[5] = 7; elem_list[6] = 7; elem_list[7] = 7; elem_list[8] = 7; elem_list[9] = 7; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 5; side_list[5] = 1; side_list[6] = 2; side_list[7] = 3; side_list[8] = 4; side_list[9] = 5; error = ex_put_side_set (exoid, 34, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, 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"; qa_record[0][1] = "testwt"; qa_record[0][2] = "07/07/93"; qa_record[0][3] = "15:41:33"; 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; num_nod_vars = 2; num_ele_vars = 3; num_nset_vars = 4; num_sset_vars = 7; truth_tab = (int *) calloc ((num_elem_blk * num_ele_vars), sizeof(int)); nset_tab = (int *) calloc ((num_node_sets * num_nset_vars), sizeof(int)); sset_tab = (int *) calloc ((num_side_sets * num_sset_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; } } k = 0; for (i=0; i<num_node_sets; i++) { for (j=0; j<num_nset_vars; j++) { if (k%2 == 0) nset_tab[k++] = 1; else nset_tab[k++] = 0; } } k = 0; for (i=0; i<num_side_sets; i++) { for (j=0; j<num_sset_vars; j++) { if (k%2 == 0) sset_tab[k++] = 0; else sset_tab[k++] = 1; } } ex_put_all_var_param(exoid, num_glo_vars, num_nod_vars, num_ele_vars, truth_tab, num_nset_vars, nset_tab, num_sset_vars, sset_tab); printf ("after ex_put_all_var_param, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } free (truth_tab); free (nset_tab); free (sset_tab); var_names[0] = "glo_vars"; 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); } /* 12345678901234567890123456789012 */ var_names[0] = "node_variable_a_very_long_name_0"; var_names[1] = "nod_var1"; 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); } var_names[0] = "ele_var0"; var_names[1] = "ele_var1"; var_names[2] = "ele_var2"; 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); } var_names[0] = "nset_var0"; var_names[1] = "nset_var1"; var_names[2] = "nset_var2"; var_names[3] = "nset_var3"; error = ex_put_var_names (exoid, "m", num_nset_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } var_names[0] = "sset_var0"; var_names[1] = "sset_var1"; var_names[2] = "sset_var2"; var_names[3] = "sset_var3"; var_names[4] = "sset_var4"; var_names[5] = "sset_var5"; var_names[6] = "sset_var6"; error = ex_put_var_names (exoid, "s", num_sset_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } /* 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 (4, CPU_word_size); nset_var_vals = (float *) calloc (5, CPU_word_size); sset_var_vals = (float *) calloc (10, 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); } error = ex_put_elem_var (exoid, whole_time_step, k, ebids[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); } } } /* write nodeset variables */ kk = 0; for (j=0; j<num_node_sets; j++) { for (k=0; k<num_nset_vars; k++) { if (kk++ % 2 == 0) { for (m=0; m<num_nodes_per_set[j]; m++) { nset_var_vals[m] = (float)(k+1) + (float)(j+2) + ((float)(m+1)*time_value); } error = ex_put_nset_var (exoid, whole_time_step, k+1, nsids[j], num_nodes_per_set[j], nset_var_vals); printf ("after ex_put_nset_var, error = %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } } /* write sideset variables */ kk = 0; for (j=0; j<num_side_sets; j++) { for (k=0; k<num_sset_vars; k++) { if (kk++ % 2 != 0) { for (m=0; m<num_elem_per_set[j]; m++) { sset_var_vals[m] = (float)(k+1) + (float)(j+2) + ((float)(m+1)*time_value); } error = ex_put_sset_var (exoid, whole_time_step, k+1, ssids[j], num_elem_per_set[j], sset_var_vals); printf ("after ex_put_sset_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); free(nset_var_vals); free(sset_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 main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int exoidm[10], num_dim2, num_nodes2, num_elem2,num_elem_blk2; int num_elem_in_block[10], num_node_sets, num_nodes_per_elem[10]; int num_elem_in_block2[10], num_node_sets2, num_nodes_per_elem2[10]; int num_side_sets, error; int num_side_sets2, nexofiles = 5; int i, j, k, m, n; int *elem_map, *connect, node_list[100],elem_list[100],side_list[100]; int *elem_map2, *connect2, node_list2[100],elem_list2[100],side_list2[100]; int ebids[10], ids[10]; int ebids2[10], ids2[10]; int num_nodes_per_set[10], num_elem_per_set[10]; int num_nodes_per_set2[10], num_elem_per_set2[10]; int num_df_per_set[10], num_df_per_set2[10]; int df_ind[10], node_ind[10], elem_ind[10]; int df_ind2[10],node_ind2[10],elem_ind2[10]; int num_qa_rec, num_info; int num_qa_rec2,num_info2; int num_glo_vars, num_nod_vars, num_ele_vars; int num_glo_vars2, num_nod_vars2, num_ele_vars2; 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 time_value; float time_value2; float x[100], y[100], z[100]; float attrib[1], dist_fact[1008]; float attrib2[1], dist_fact2[100]; char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3]; char *coord_names2[3], *qa_record2[2][4], *info2[3], *var_names2[3]; char tmpstr[80]; char *prop_names[2]; char exofname[256]; 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 files */ exoid = ex_create ("test.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); for (n=0; n<nexofiles; n++) { sprintf(exofname,"test%d.exo",n); printf("test file name: %s\n",exofname); exoidm[n]= ex_create (exofname, /* 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 %s, exoid = %d\n", exofname,exoidm[n]); } /* ncopts = NC_VERBOSE; */ /* initialize file with parameters */ num_dim = 3; num_nodes = 26; num_elem = 5; num_elem_blk = 5; num_node_sets = 2; num_side_sets = 5; error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); /* initialize file n with parameters */ num_dim2 = 3; num_nodes2 = 26; num_elem2 = 5; num_elem_blk2 = 5; num_node_sets2 = 2; num_side_sets2 = 5; for (n=0; n<nexofiles; n++) { sprintf(tmpstr,"This is test %d",n); error=ex_put_init (exoidm[n],tmpstr,num_dim2,num_nodes2,num_elem2, num_elem_blk2, num_node_sets2, num_side_sets2); printf ("after ex_put_init (%d), error = %d\n", n, error); } /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 0.0; y[0] = 0.0; z[0] = 0.0; x[1] = 1.0; y[1] = 0.0; z[1] = 0.0; x[2] = 1.0; y[2] = 1.0; z[2] = 0.0; x[3] = 0.0; y[3] = 1.0; z[3] = 0.0; /* Quad #2 */ x[4] = 1.0; y[4] = 0.0; z[4] = 0.0; x[5] = 2.0; y[5] = 0.0; z[5] = 0.0; x[6] = 2.0; y[6] = 1.0; z[6] = 0.0; x[7] = 1.0; y[7] = 1.0; z[7] = 0.0; /* Hex #1 */ x[8] = 0.0; y[8] = 0.0; z[8] = 0.0; x[9] = 10.0; y[9] = 0.0; z[9] = 0.0; x[10] = 10.0; y[10] = 0.0; z[10] =-10.0; x[11] = 1.0; y[11] = 0.0; z[11] =-10.0; x[12] = 1.0; y[12] = 10.0; z[12] = 0.0; x[13] = 10.0; y[13] = 10.0; z[13] = 0.0; x[14] = 10.0; y[14] = 10.0; z[14] =-10.0; x[15] = 1.0; y[15] = 10.0; z[15] =-10.0; /* Tetra #1 */ x[16] = 0.0; y[16] = 0.0; z[16] = 0.0; x[17] = 1.0; y[17] = 0.0; z[17] = 5.0; x[18] = 10.0; y[18] = 0.0; z[18] = 2.0; x[19] = 7.0; y[19] = 5.0; z[19] = 3.0; /* Wedge #1 */ x[20] = 3.0; y[20] = 0.0; z[20] = 6.0; x[21] = 6.0; y[21] = 0.0; z[21] = 0.0; x[22] = 0.0; y[22] = 0.0; z[22] = 0.0; x[23] = 3.0; y[23] = 2.0; z[23] = 6.0; x[24] = 6.0; y[24] = 2.0; z[24] = 2.0; x[25] = 0.0; y[25] = 2.0; z[25] = 0.0; error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); /* write nodal coordinates values and names to database */ for (n=0; n<nexofiles; n++) { error = ex_put_coord (exoidm[n], x, y, z); printf ("after ex_put_coord (%d), error = %d\n", n,error); } coord_names[0] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; error = ex_put_coord_names (exoid, coord_names); printf ("after ex_put_coord_names, error = %d\n", error); coord_names2[0] = "xcoor"; coord_names2[1] = "ycoor"; coord_names2[2] = "zcoor"; for (n=0; n<nexofiles; n++) { error = ex_put_coord_names (exoidm[n], coord_names2); printf ("after ex_put_coord_names (%d), error = %d\n", n, error); } /* write element order map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i; } error = ex_put_map (exoid, elem_map); printf ("after ex_put_map, error = %d\n", error); free (elem_map); elem_map2= (int *) calloc(num_elem2, sizeof(int)); for (i=1; i<=num_elem2; i++) { elem_map2[i-1] = i; } for (n=0; n<nexofiles; n++) { error = ex_put_map (exoidm[n], elem_map2); printf ("after ex_put_map (%d), error = %d\n", n, error); } free (elem_map2); /* write element block parameters */ num_elem_in_block[0] = 1; num_elem_in_block[1] = 1; num_elem_in_block[2] = 1; num_elem_in_block[3] = 1; num_elem_in_block[4] = 1; num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */ num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2], num_nodes_per_elem[2], 1); error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3], num_nodes_per_elem[3], 1); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4], num_nodes_per_elem[4], 1); printf ("after ex_put_elem_block, error = %d\n", error); /* write element block properties */ prop_names[0] = "MATL"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50); printf ("after ex_put_prop, error = %d\n", error); /* files n */ num_elem_in_block2[0] = 1; num_elem_in_block2[1] = 1; num_elem_in_block2[2] = 1; num_elem_in_block2[3] = 1; num_elem_in_block2[4] = 1; num_nodes_per_elem2[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem2[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem2[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem2[3] = 4; /* elements in block #3 are 4-node tetras */ num_nodes_per_elem2[4] = 6; /* elements in block #3 are 6-node wedges */ ebids2[0] = 10; ebids2[1] = 11; ebids2[2] = 12; ebids2[3] = 13; ebids2[4] = 14; for (n=0; n<nexofiles; n++) { error=ex_put_elem_block(exoidm[n],ebids2[0], "quad", num_elem_in_block2[0], num_nodes_per_elem2[0], 1); printf ("after ex_put_elem_block (%d), error = %d\n", n, error); error=ex_put_elem_block(exoidm[n],ebids2[1], "quad", num_elem_in_block2[1], num_nodes_per_elem2[1], 1); printf ("after ex_put_elem_block (%d), error = %d\n", n, error); error=ex_put_elem_block(exoidm[n],ebids2[2], "hex", num_elem_in_block2[2], num_nodes_per_elem2[2], 1); printf ("after ex_put_elem_block (%d), error = %d\n", n, error); error=ex_put_elem_block(exoidm[n],ebids2[3], "tetra",num_elem_in_block2[3], num_nodes_per_elem2[3], 1); printf ("after ex_put_elem_block (%d), error = %d\n", n, error); error=ex_put_elem_block(exoidm[n],ebids2[4], "wedge",num_elem_in_block2[4], num_nodes_per_elem2[4], 1); printf ("after ex_put_elem_block (%d), error = %d\n", n, error); /* write element block properties */ prop_names[0] = "MATL"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoidm[n],EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[0], "MATL", 100); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[1], "MATL", 200); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[2], "MATL", 300); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[3], "MATL", 400); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[4], "MATL", 500); printf ("after ex_put_prop (%d), error = %d\n", n, error); } /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 21; connect[1] = 22; connect[2] = 23; connect[3] = 24; connect[4] = 25; connect[5] = 26; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); free (connect); for (n=0; n<nexofiles; n++) { connect2 = (int *) calloc(8, sizeof(int)); connect2[0] = 1; connect2[1] = 2; connect2[2] = 3; connect2[3] = 4; error = ex_put_elem_conn (exoidm[n], ebids[0], connect2); printf ("after ex_put_elem_conn (%d), error = %d\n", n, error); connect2[0] = 5; connect2[1] = 6; connect2[2] = 7; connect2[3] = 8; error = ex_put_elem_conn (exoidm[n], ebids[1], connect2); printf ("after ex_put_elem_conn (%d), error = %d\n", n, error); connect2[0] = 9; connect2[1] = 10; connect2[2] = 11; connect2[3] = 12; connect2[4] = 13; connect2[5] = 14; connect2[6] = 15; connect2[7] = 16; error = ex_put_elem_conn (exoidm[n], ebids2[2], connect2); printf ("after ex_put_elem_conn (%d), error = %d\n", n, error); connect2[0] = 17; connect2[1] = 18; connect2[2] = 19; connect2[3] = 20; error = ex_put_elem_conn (exoidm[n], ebids2[3], connect2); printf ("after ex_put_elem_conn (%d), error = %d\n", n, error); connect2[0] = 21; connect2[1] = 22; connect2[2] = 23; connect2[3] = 24; connect2[4] = 25; connect2[5] = 26; error = ex_put_elem_conn (exoidm[n], ebids2[4], connect2); printf ("after ex_put_elem_conn (%d), error = %d\n", n, error); free (connect2); } /* write element block attributes */ attrib[0] = 3.14159; error = ex_put_elem_attr (exoid, ebids[0], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); attrib[0] = 6.14159; error = ex_put_elem_attr (exoid, ebids[1], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[2], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[3], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[4], attrib); printf ("after ex_put_elem_attr, error = %d\n", error); for (n=0; n<nexofiles; n++) { attrib2[0] = 3.; error = ex_put_elem_attr (exoidm[n], ebids[0], attrib2); printf ("after ex_put_elem_attr (%d), error = %d\n", n, error); attrib2[0] = 6.; error = ex_put_elem_attr (exoidm[n], ebids[1], attrib2); printf ("after ex_put_elem_attr (%d), error = %d\n", n, error); error = ex_put_elem_attr (exoidm[n], ebids[2], attrib2); printf ("after ex_put_elem_attr (%d), error = %d\n", n, error); error = ex_put_elem_attr (exoidm[n], ebids[3], attrib2); printf ("after ex_put_elem_attr (%d), error = %d\n", n, error); error = ex_put_elem_attr (exoidm[n], ebids[4], attrib2); printf ("after ex_put_elem_attr (%d), error = %d\n", n, error); } #ifdef EX_TEST_INDIV_NODESET /* write individual node sets */ error = ex_put_node_set_param (exoid, 20, 5, 5); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 100; node_list[1] = 101; node_list[2] = 102; node_list[3] = 103; node_list[4] = 104; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; error = ex_put_node_set (exoid, 20, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 20, dist_fact); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_param (exoid, 21, 3, 3); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 200; node_list[1] = 201; node_list[2] = 202; dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1; error = ex_put_node_set (exoid, 21, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 21, dist_fact); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); /* file 2 */ for (n=0; n<nexofiles; n++) { error = ex_put_node_set_param (exoidm[n], 20, 5, 5); printf ("after ex_put_node_set_param (%d), error = %d\n", n, error); node_list2[0] = 100; node_list2[1] = 101; node_list2[2] = 102; node_list2[3] = 103; node_list2[4] = 104; dist_fact2[0] = 1.0; dist_fact2[1] = 2.0; dist_fact2[2] = 3.0; dist_fact2[3] = 4.0; dist_fact2[4] = 5.0; error = ex_put_node_set (exoidm[n], 20, node_list2); printf ("after ex_put_node_set (%d), error = %d\n", n, error); error = ex_put_node_set_dist_fact (exoidm[n], 20, dist_fact2); printf ("after ex_put_node_set (%d), error = %d\n", n, error); error = ex_put_node_set_param (exoidm[n], 21, 3, 3); printf ("after ex_put_node_set_param (%d), error = %d\n", n, error); node_list2[0] = 200; node_list2[1] = 201; node_list2[2] = 202; dist_fact2[0] = 1.1; dist_fact2[1] = 2.1; dist_fact2[2] = 3.1; error = ex_put_node_set (exoidm[n], 21, node_list2); printf ("after ex_put_node_set (%d), error = %d\n", n, error); error = ex_put_node_set_dist_fact (exoidm[n], 21, dist_fact2); printf ("after ex_put_node_set (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop (%d), error = %d\n", n, error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoidm[n], EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop (%d), error = %d\n", n, error); } #else /* EX_TEST_INDIV_NODESET */ /* write concatenated node sets; this produces the same information as * the above code which writes individual node sets */ ids[0] = 20; ids[1] = 21; num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3; node_ind[0] = 0; node_ind[1] = 5; node_list[0] = 100; node_list[1] = 101; node_list[2] = 102; node_list[3] = 103; node_list[4] = 104; node_list[5] = 200; node_list[6] = 201; node_list[7] = 202; num_df_per_set[0] = 5; num_df_per_set[1] = 3; df_ind[0] = 0; df_ind[1] = 5; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1; error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set, node_ind, node_list, dist_fact); printf ("after ex_put_concat_node_sets, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); ids2[0] = 20; ids2[1] = 21; num_nodes_per_set2[0] = 5; num_nodes_per_set2[1] = 3; node_ind2[0] = 0; node_ind2[1] = 5; node_list2[0] = 100; node_list2[1] = 101; node_list2[2] = 102; node_list2[3] = 103; node_list2[4] = 104; node_list2[5] = 200; node_list2[6] = 201; node_list2[7] = 202; num_df_per_set2[0] = 5; num_df_per_set2[1] = 3; df_ind2[0] = 0; df_ind2[1] = 5; dist_fact2[0] = 1.0; dist_fact2[1] = 2.0; dist_fact2[2] = 3.0; dist_fact2[3] = 4.0; dist_fact2[4] = 5.0; dist_fact2[5] = 1.1; dist_fact2[6] = 2.1; dist_fact2[7] = 3.1; prop_array2[0] = 1000; prop_array2[1] = 2000; for (n=0; n<nexofiles; n++) { error = ex_put_concat_node_sets (exoidm[n], ids2, num_nodes_per_set2, num_df_per_set2, node_ind2, df_ind2, node_list2, dist_fact2); printf ("after ex_put_concat_node_sets, error = %d\n", error); error = ex_put_prop(exoidm[n], EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoidm[n], EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop_array(exoidm[n], EX_NODE_SET, "VELOCITY", prop_array2); printf ("after ex_put_prop_array, error = %d\n", error); } #endif /* EX_TEST_INDIV_NODESET */ #ifdef TEST_INDIV_SIDESET /* write individual side sets */ /* side set #1 - quad */ error = ex_put_side_set_param (exoid, 30, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 2; elem_list[1] = 2; side_list[0] = 4; side_list[1] = 2; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); /* side set #2 - quad spanning elements */ error = ex_put_side_set_param (exoid, 31, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 1; elem_list[1] = 2; side_list[0] = 2; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); /* side set #3 - hex */ error = ex_put_side_set_param (exoid, 32, 7, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 3; elem_list[1] = 3; elem_list[2] = 3; elem_list[3] = 3; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; side_list[0] = 5; side_list[1] = 3; side_list[2] = 3; side_list[3] = 2; side_list[4] = 4; side_list[5] = 1; side_list[6] = 6; error = ex_put_side_set (exoid, 32, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); /* side set #4 - tetras */ error = ex_put_side_set_param (exoid, 33, 4, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 4; elem_list[1] = 4; elem_list[2] = 4; elem_list[3] = 4; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; error = ex_put_side_set (exoid, 33, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); /* side set #5 - wedges */ error = ex_put_side_set_param (exoid, 34, 5, 0); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 5; elem_list[1] = 5; elem_list[2] = 5; elem_list[3] = 5; elem_list[4] = 5; side_list[0] = 1; side_list[1] = 2; side_list[2] = 3; side_list[3] = 4; side_list[4] = 5; error = ex_put_side_set (exoid, 34, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, error = %d\n", error); /* file 2 */ for (n=0; n<nexofiles; n++) { /* side set 1 */ error = ex_put_side_set_param (exoidm[n], 30, 2, 4); printf ("after ex_put_side_set_param (%d), error = %d\n", n, error); elem_list2[0] = 2; elem_list2[1] = 2; side_list2[0] = 4; side_list2[1] = 2; dist_fact2[0] = 30.0; dist_fact2[1] = 30.1; dist_fact2[2] = 30.2; dist_fact2[3] = 30.3; error = ex_put_side_set (exoidm[n], 30, elem_list2, side_list2); printf ("after ex_put_side_set (%d), error = %d\n", n, error); error = ex_put_side_set_dist_fact (exoidm[n], 30, dist_fact2); printf ("after ex_put_side_set_dist_fact (%d), error = %d\n", n, error); /* side set 2 */ error = ex_put_side_set_param (exoidm[n], 31, 2, 4); printf ("after ex_put_side_set_param (%d), error = %d\n", n, error); elem_list2[0] = 1; elem_list2[1] = 2; side_list2[0] = 2; side_list2[1] = 3; dist_fact2[0] = 31.0; dist_fact2[1] = 31.1; dist_fact2[2] = 31.2; dist_fact2[3] = 31.3; error = ex_put_side_set (exoidm[n], 31, elem_list2, side_list2); printf ("after ex_put_side_set (%d), error = %d\n", n, error); error = ex_put_side_set_dist_fact (exoidm[n], 31, dist_fact2); printf ("after ex_put_side_set_dist_fact (%d), error = %d\n", n, error); /* side set #3 - hex */ error = ex_put_side_set_param (exoidm[n], 32, 7, 0); printf ("after ex_put_side_set_param (%d), error = %d\n", n, error); elem_list2[0] = 3; elem_list2[1] = 3; elem_list2[2] = 3; elem_list2[3] = 3; elem_list2[4] = 3; elem_list2[5] = 3; elem_list2[6] = 3; side_list2[0] = 5; side_list2[1] = 3; side_list2[2] = 3; side_list2[3] = 2; side_list2[4] = 4; side_list2[5] = 1; side_list2[6] = 6; error = ex_put_side_set (exoidm[n], 32, elem_list2, side_list2); printf ("after ex_put_side_set (%d), error = %d\n", n, error); /* side set #4 - tetras */ error = ex_put_side_set_param (exoidm[n], 33, 4, 0); printf ("after ex_put_side_set_param (%d), error = %d\n", n, error); elem_list2[0] = 4; elem_list2[1] = 4; elem_list2[2] = 4; elem_list2[3] = 4; side_list2[0] = 1; side_list2[1] = 2; side_list2[2] = 3; side_list2[3] = 4; error = ex_put_side_set (exoidm[n], 33, elem_list2, side_list2); printf ("after ex_put_side_set (%d), error = %d\n", n, error); /* side set #5 - wedges */ error = ex_put_side_set_param (exoidm[n], 34, 5, 0); printf ("after ex_put_side_set_param (%d), error = %d\n", n, error); elem_list2[0] = 5; elem_list2[1] = 5; elem_list2[2] = 5; elem_list2[3] = 5; elem_list2[4] = 5; side_list2[0] = 1; side_list2[1] = 2; side_list2[2] = 3; side_list2[3] = 4; side_list2[4] = 5; error = ex_put_side_set (exoidm[n], 34, elem_list2, side_list2); printf ("after ex_put_side_set (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop (%d), error = %d\n", n, error); } #else /* TEST_INDIV_SIDESET */ /* write concatenated side sets; this produces the same information as * the above code which writes individual side sets */ ids[0] = 30; ids[1] = 31; ids[2] = 32; ids[3] = 33; ids[4] = 34; node_list[0] = 8; node_list[1] = 5; node_list[2] = 6; node_list[3] = 7; node_list[4] = 2; node_list[5] = 3; node_list[6] = 7; node_list[7] = 8; node_list[8] = 9; node_list[9] = 12; node_list[10] = 11; node_list[11] = 10; node_list[12] = 11; node_list[13] = 12; node_list[14] = 16; node_list[15] = 15; node_list[16] = 16; node_list[17] = 15; node_list[18] = 11; node_list[19] = 12; node_list[20] = 10; node_list[21] = 11; node_list[22] = 15; node_list[23] = 14; node_list[24] = 13; node_list[25] = 16; node_list[26] = 12; node_list[27] = 9; node_list[28] = 14; node_list[29] = 13; node_list[30] = 9; node_list[31] = 10; node_list[32] = 16; node_list[33] = 13; node_list[34] = 14; node_list[35] = 15; node_list[36] = 17; node_list[37] = 18; node_list[38] = 20; node_list[39] = 18; node_list[40] = 19; node_list[41] = 20; node_list[42] = 20; node_list[43] = 19; node_list[44] = 17; node_list[45] = 19; node_list[46] = 18; node_list[47] = 17; node_list[48] = 25; node_list[49] = 24; node_list[50] = 21; node_list[51] = 22; node_list[52] = 26; node_list[53] = 25; node_list[54] = 22; node_list[55] = 23; node_list[56] = 26; node_list[57] = 23; node_list[58] = 21; node_list[59] = 24; node_list[60] = 23; node_list[61] = 22; node_list[62] = 21; node_list[63] = 24; node_list[64] = 25; node_list[65] = 26; node_ind[0] = 0; node_ind[1] = 4; node_ind[2] = 8; node_ind[3] = 36; node_ind[4] = 47; num_elem_per_set[0] = 2; num_elem_per_set[1] = 2; num_elem_per_set[2] = 7; num_elem_per_set[3] = 4; num_elem_per_set[4] = 5; num_nodes_per_set[0] = 4; num_nodes_per_set[1] = 4; num_nodes_per_set[2] = 28; num_nodes_per_set[3] = 12; num_nodes_per_set[4] = 18; elem_ind[0] = 0; elem_ind[1] = 2; elem_ind[2] = 4; elem_ind[3] = 11; elem_ind[4] = 15; elem_list[0] = 2; elem_list[1] = 2; elem_list[2] = 1; elem_list[3] = 2; elem_list[4] = 3; elem_list[5] = 3; elem_list[6] = 3; elem_list[7] = 3; elem_list[8] = 3; elem_list[9] = 3; elem_list[10] = 3; elem_list[11] = 4; elem_list[12] = 4; elem_list[13] = 4; elem_list[14] = 4; elem_list[15] = 5; elem_list[16] = 5; elem_list[17] = 5; elem_list[18] = 5; elem_list[19] = 5; error = ex_cvt_nodes_to_sides(exoid, num_elem_per_set, num_nodes_per_set, elem_ind, node_ind, elem_list, node_list, side_list); printf ("after ex_cvt_nodes_to_sides, error = %d\n", error); num_df_per_set[0] = 4; num_df_per_set[1] = 4; num_df_per_set[2] = 0; num_df_per_set[3] = 0; num_df_per_set[4] = 0; df_ind[0] = 0; df_ind[1] = 4; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; dist_fact[4] = 31.0; dist_fact[5] = 31.1; dist_fact[6] = 31.2; dist_fact[7] = 31.3; error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set, num_df_per_set, elem_ind, df_ind, elem_list, side_list, dist_fact); printf ("after ex_put_concat_side_sets, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, error = %d\n", error); /* file 2 */ ids2[0] = 30; ids2[1] = 31; ids2[2] = 32; ids2[3] = 33; ids2[4] = 34; node_list2[0] = 8; node_list2[1] = 5; node_list2[2] = 6; node_list2[3] = 7; node_list2[4] = 2; node_list2[5] = 3; node_list2[6] = 7; node_list2[7] = 8; node_list2[8] = 9; node_list2[9] = 12; node_list2[10] = 11; node_list2[11] = 10; node_list2[12] = 11; node_list2[13] = 12; node_list2[14] = 16; node_list2[15] = 15; node_list2[16] = 16; node_list2[17] = 15; node_list2[18] = 11; node_list2[19] = 12; node_list2[20] = 10; node_list2[21] = 11; node_list2[22] = 15; node_list2[23] = 14; node_list2[24] = 13; node_list2[25] = 16; node_list2[26] = 12; node_list2[27] = 9; node_list2[28] = 14; node_list2[29] = 13; node_list2[30] = 9; node_list2[31] = 10; node_list2[32] = 16; node_list2[33] = 13; node_list2[34] = 14; node_list2[35] = 15; node_list2[36] = 17; node_list2[37] = 18; node_list2[38] = 20; node_list2[39] = 18; node_list2[40] = 19; node_list2[41] = 20; node_list2[42] = 20; node_list2[43] = 19; node_list2[44] = 17; node_list2[45] = 19; node_list2[46] = 18; node_list2[47] = 17; node_list2[48] = 25; node_list2[49] = 24; node_list2[50] = 21; node_list2[51] = 22; node_list2[52] = 26; node_list2[53] = 25; node_list2[54] = 22; node_list2[55] = 23; node_list2[56] = 26; node_list2[57] = 23; node_list2[58] = 21; node_list2[59] = 24; node_list2[60] = 23; node_list2[61] = 22; node_list2[62] = 21; node_list2[63] = 24; node_list2[64] = 25; node_list2[65] = 26; node_ind2[0] = 0; node_ind2[1] = 4; node_ind2[2] = 8; node_ind2[3] = 36; node_ind2[4] = 47; num_elem_per_set2[0] = 2; num_elem_per_set2[1] = 2; num_elem_per_set2[2] = 7; num_elem_per_set2[3] = 4; num_elem_per_set2[4] = 5; num_nodes_per_set2[0] = 4; num_nodes_per_set2[1] = 4; num_nodes_per_set2[2] = 28; num_nodes_per_set2[3] = 12; num_nodes_per_set2[4] = 18; elem_ind2[0] = 0; elem_ind2[1] = 2; elem_ind2[2] = 4; elem_ind2[3] = 11; elem_ind2[4] = 15; elem_list2[0] = 2; elem_list2[1] = 2; elem_list2[2] = 1; elem_list2[3] = 2; elem_list2[4] = 3; elem_list2[5] = 3; elem_list2[6] = 3; elem_list2[7] = 3; elem_list2[8] = 3; elem_list2[9] = 3; elem_list2[10] = 3; elem_list2[11] = 4; elem_list2[12] = 4; elem_list2[13] = 4; elem_list2[14] = 4; elem_list2[15] = 5; elem_list2[16] = 5; elem_list2[17] = 5; elem_list2[18] = 5; elem_list2[19] = 5; num_df_per_set2[0] = 4; num_df_per_set2[1] = 4; num_df_per_set2[2] = 0; num_df_per_set2[3] = 0; num_df_per_set2[4] = 0; df_ind2[0] = 0; df_ind2[1] = 4; dist_fact2[0] = 30.0; dist_fact2[1] = 30.1; dist_fact2[2] = 30.2; dist_fact2[3] = 30.3; dist_fact2[4] = 31.0; dist_fact2[5] = 31.1; dist_fact2[6] = 31.2; dist_fact2[7] = 31.3; for (n=0; n<nexofiles; n++) { error = ex_cvt_nodes_to_sides(exoidm[n], num_elem_per_set2, num_nodes_per_set2, elem_ind2, node_ind2, elem_list2, node_list2, side_list2); printf ("after ex_cvt_nodes_to_sides (%d), error = %d\n", n, error); error = ex_put_concat_side_sets (exoidm[n], ids2, num_elem_per_set2, num_df_per_set2, elem_ind2, df_ind2, elem_list2, side_list2, dist_fact2); printf ("after ex_put_concat_side_sets (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop (%d), error = %d\n", n, error); error = ex_put_prop(exoidm[n], EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop (%d), error = %d\n", n, error); } /* END COMMENTED OUT SECTION */ #endif /* TEST_INDIV_SIDESET */ /* write QA records */ num_qa_rec = 2; qa_record[0][0] = "TESTWTM"; qa_record[0][1] = "testwtm"; qa_record[0][2] = "07/07/93"; qa_record[0][3] = "15:41:33"; qa_record[1][0] = "FASTQ"; qa_record[1][1] = "fastq"; qa_record[1][2] = "07/07/93"; qa_record[1][3] = "16:41:33"; error = ex_put_qa (exoid, num_qa_rec, qa_record); printf ("after ex_put_qa, error = %d\n", error); num_qa_rec2 = 2; qa_record2[0][0] = "TESTWTM"; qa_record2[0][1] = "testwtm"; qa_record2[0][2] = "07/07/93"; qa_record2[0][3] = "15:41:33"; qa_record2[1][0] = "FASTQ"; qa_record2[1][1] = "fastq"; qa_record2[1][2] = "07/07/93"; qa_record2[1][3] = "16:41:33"; for (n=0; n<nexofiles; n++) { error = ex_put_qa (exoidm[n], num_qa_rec2, qa_record2); printf ("after ex_put_qa (%d), error = %d\n", n, error); } /* write information records */ num_info = 3; info[0] = "This is the first information record."; info[1] = "This is the second information record."; info[2] = "This is the third information record."; error = ex_put_info (exoid, num_info, info); printf ("after ex_put_info, error = %d\n", error); num_info2 = 3; info2[0] = "This is the first information record."; info2[1] = "This is the second information record."; info2[2] = "This is the third information record."; for (n=0; n<nexofiles; n++) { error = ex_put_info (exoidm[n], num_info2, info2); printf ("after ex_put_info (%d), error = %d\n", n, error); } /* 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); error = ex_put_var_names (exoid, "g", num_glo_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); num_glo_vars2 = 1; var_names2[0] = "glo_vars"; for (n=0; n<nexofiles; n++) { error = ex_put_var_param (exoidm[n], "g", num_glo_vars2); printf ("after ex_put_var_param (%d), error = %d\n", n, error); error = ex_put_var_names (exoidm[n], "g", num_glo_vars2, var_names2); printf ("after ex_put_var_names (%d), error = %d\n", n, error); } num_nod_vars = 2; var_names[0] = "nod_var0"; var_names[1] = "nod_var1"; error = ex_put_var_param (exoid, "n", num_nod_vars); printf ("after ex_put_var_param, error = %d\n", error); error = ex_put_var_names (exoid, "n", num_nod_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); num_nod_vars2 = 2; var_names2[0] = "nod_var0"; var_names2[1] = "nod_var1"; for (n=0; n<nexofiles; n++) { error = ex_put_var_param (exoidm[n], "n", num_nod_vars2); printf ("after ex_put_var_param (%d), error = %d\n", n, error); error = ex_put_var_names (exoidm[n], "n", num_nod_vars2, var_names2); printf ("after ex_put_var_names (%d), error = %d\n", n, error); } 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); error = ex_put_var_names (exoid, "e", num_ele_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); num_ele_vars2 = 3; var_names2[0] = "ele_var20"; var_names2[1] = "ele_var21"; var_names2[2] = "ele_var22"; for (n=0; n<nexofiles; n++) { error = ex_put_var_param (exoidm[n], "e", num_ele_vars2); printf ("after ex_put_var_param (%d), error = %d\n", n, error); error = ex_put_var_names (exoidm[n], "e", num_ele_vars, var_names); printf ("after ex_put_var_names (%d), error = %d\n", n, error); } /* 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); for (n=0; n<nexofiles; n++) { error=ex_put_elem_var_tab(exoidm[n],num_elem_blk,num_ele_vars,truth_tab); printf ("after ex_put_elem_var_tab (%d), error = %d\n", n, error); } 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, sizeof(CPU_word_size)); nodal_var_vals = (float *) calloc (num_nodes, sizeof(CPU_word_size)); elem_var_vals = (float *) calloc (4, sizeof(CPU_word_size)); for (i=0; i<num_time_steps; i++) { time_value = (float)(i+1)/100.; time_value2 = (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); for (n=0; n<nexofiles; n++) { error = ex_put_time (exoidm[n], whole_time_step, &time_value2); printf ("after ex_put_time (%d), error = %d\n", n, error); } /* 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); for (n=0; n<nexofiles; n++) { error = ex_put_glob_vars (exoidm[n], whole_time_step, num_glo_vars, glob_var_vals); printf ("after ex_put_glob_vars (%d), error = %d\n", n, error); } /* 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); for (n=0; n<nexofiles; n++) { error = ex_put_nodal_var (exoidm[n], whole_time_step, k, num_nodes, nodal_var_vals); printf ("after ex_put_nodal_var (%d), error = %d\n", n, error); } } /* 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, ebids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var, error = %d\n", error); for (n=0; n<nexofiles; n++) { error = ex_put_elem_var (exoidm[n], whole_time_step, k, ebids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var (%d), error = %d\n", n, error); } } } 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); for (n=0; n<nexofiles; n++) { error = ex_update (exoidm[n]); printf ("after ex_update (%d), error = %d\n", n, error); } } 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); for (n=0; n<nexofiles; n++) { error = ex_close (exoidm[n]); printf ("after ex_close (%d), error = %d\n", n, error); } 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_nodes_per_elem[10], num_attr[10]; int num_node_sets, num_side_sets, error; int i, j, k, m, *elem_map, *connect, *node_map; int node_list[100],elem_list[100],side_list[100]; int ebids[10], ids[10]; int num_nodes_per_set[10], num_elem_per_set[10]; int num_df_per_set[10]; int df_ind[10], node_ind[10], elem_ind[10]; int num_qa_rec, num_info; int num_glo_vars, num_nod_vars, num_ele_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 time_value; float x[100], y[100], z[100], *dummy; float attrib[100], dist_fact[100]; char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3]; char *prop_names[2]; ex_opts (EX_VERBOSE | EX_ABORT); dummy = 0; /* assign this so the Cray compiler doesn't complain */ /* Specify compute and i/o word size */ CPU_word_size = 0; /* float or double */ IO_word_size = 0; /* use system default (4 bytes) */ /* create EXODUS II file */ exoid = ex_create ("test.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 */ num_dim = 3; num_nodes = 28; num_elem = 8; num_elem_blk = 7; num_node_sets = 2; num_side_sets = 5; /* num_side_sets = 6; Uncomment to test NULL side sets */ error = ex_put_init (exoid, "This is testwt1", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); printf ("after ex_put_init, error = %d\n", error); /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 0.0; y[0] = 0.0; z[0] = 0.0; x[1] = 1.0; y[1] = 0.0; z[1] = 0.0; x[2] = 1.0; y[2] = 1.0; z[2] = 0.0; x[3] = 0.0; y[3] = 1.0; z[3] = 0.0; /* Quad #2 */ x[4] = 1.0; y[4] = 0.0; z[4] = 0.0; x[5] = 2.0; y[5] = 0.0; z[5] = 0.0; x[6] = 2.0; y[6] = 1.0; z[6] = 0.0; x[7] = 1.0; y[7] = 1.0; z[7] = 0.0; /* Hex #1 */ x[8] = 0.0; y[8] = 0.0; z[8] = 0.0; x[9] = 10.0; y[9] = 0.0; z[9] = 0.0; x[10] = 10.0; y[10] = 0.0; z[10] =-10.0; x[11] = 1.0; y[11] = 0.0; z[11] =-10.0; x[12] = 1.0; y[12] = 10.0; z[12] = 0.0; x[13] = 10.0; y[13] = 10.0; z[13] = 0.0; x[14] = 10.0; y[14] = 10.0; z[14] =-10.0; x[15] = 1.0; y[15] = 10.0; z[15] =-10.0; /* Tetra #1 */ x[16] = 0.0; y[16] = 0.0; z[16] = 0.0; x[17] = 1.0; y[17] = 0.0; z[17] = 5.0; x[18] = 10.0; y[18] = 0.0; z[18] = 2.0; x[19] = 7.0; y[19] = 5.0; z[19] = 3.0; /* Circle #1 */ x[20] = 100.0; y[20] = 100.0; z[20] = 0.0; /* Sphere #1 */ x[21] = 50.0; y[21] = 50.0; z[21] = 20.0; /* Wedge #1 */ x[22] = 3.0; y[22] = 0.0; z[22] = 6.0; x[23] = 6.0; y[23] = 0.0; z[23] = 0.0; x[24] = 0.0; y[24] = 0.0; z[24] = 0.0; x[25] = 3.0; y[25] = 2.0; z[25] = 6.0; x[26] = 6.0; y[26] = 2.0; z[26] = 2.0; x[27] = 0.0; y[27] = 2.0; z[27] = 0.0; error = ex_put_coord (exoid, x, y, z); printf ("after ex_put_coord, error = %d\n", error); coord_names[0] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; error = ex_put_coord_names (exoid, coord_names); printf ("after ex_put_coord_names, error = %d\n", error); /* write element order map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i; } error = ex_put_map (exoid, elem_map); printf ("after ex_put_map, error = %d\n", error); free (elem_map); /* write element numbering map */ elem_map = (int *) calloc(num_elem, sizeof(int)); for (i=1; i<=num_elem; i++) { elem_map[i-1] = i*2; } error = ex_put_elem_num_map (exoid, elem_map); printf ("after ex_put_elem_num_map, error = %d\n", error); free (elem_map); /* write node numbering map */ node_map = (int *) calloc(num_nodes, sizeof(int)); for (i=1; i<=num_nodes; i++) { node_map[i-1] = i*3; } error = ex_put_node_num_map (exoid, node_map); printf ("after ex_put_node_num_map, error = %d\n", error); free (node_map); /* write element block parameters */ num_elem_in_block[0] = 1; /* element 1: Quad 1 */ num_elem_in_block[1] = 2; /* elements 2, 3: Quad 1 & 2 */ num_elem_in_block[2] = 1; /* element 4: Hex */ num_elem_in_block[3] = 1; /* element 5: Tetra */ num_elem_in_block[4] = 1; /* element 6: Circle */ num_elem_in_block[5] = 1; /* element 7: Sphere */ num_elem_in_block[6] = 1; /* element 8: Wedge */ num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads */ num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads */ num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes */ num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */ num_nodes_per_elem[4] = 1; /* elements in block #4 are 1-node circles */ num_nodes_per_elem[5] = 1; /* elements in block #5 are 1-node spheres */ num_nodes_per_elem[6] = 6; /* elements in block #6 are 6-node wedges */ ebids[0] = 10; ebids[1] = 11; ebids[2] = 12; ebids[3] = 13; ebids[4] = 14; ebids[5] = 15; ebids[6] = 16; num_attr[0] = 3; num_attr[1] = 3; num_attr[2] = 3; num_attr[3] = 3; num_attr[4] = 3; num_attr[5] = 3; num_attr[6] = 3; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], num_attr[0]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], num_attr[1]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2], num_nodes_per_elem[2], num_attr[2]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3], num_nodes_per_elem[3], num_attr[3]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[4], "circle", num_elem_in_block[4], num_nodes_per_elem[4], num_attr[4]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[5], "sphere", num_elem_in_block[5], num_nodes_per_elem[5], num_attr[5]); printf ("after ex_put_elem_block, error = %d\n", error); error = ex_put_elem_block (exoid, ebids[6], "wedge", num_elem_in_block[6], num_nodes_per_elem[6], num_attr[6]); printf ("after ex_put_elem_block, error = %d\n", error); /* write element block properties */ prop_names[0] = "MATL"; prop_names[1] = "DENSITY"; error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names); printf ("after ex_put_prop_names, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], "MATL", 60); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], "MATL", 70); printf ("after ex_put_prop, error = %d\n", error); /* write element connectivity */ connect = (int *) calloc(8, sizeof(int)); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; error = ex_put_elem_conn (exoid, ebids[0], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4; connect[4] = 5; connect[5] = 6; connect[6] = 7; connect[7] = 8; error = ex_put_elem_conn (exoid, ebids[1], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12; connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16; error = ex_put_elem_conn (exoid, ebids[2], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20; error = ex_put_elem_conn (exoid, ebids[3], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 21; error = ex_put_elem_conn (exoid, ebids[4], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 22; error = ex_put_elem_conn (exoid, ebids[5], connect); printf ("after ex_put_elem_conn, error = %d\n", error); connect[0] = 23; connect[1] = 24; connect[2] = 25; connect[3] = 26; connect[4] = 27; connect[5] = 28; error = ex_put_elem_conn (exoid, ebids[6], connect); printf ("after ex_put_elem_conn, error = %d\n", error); free (connect); /* write element block attributes (3 per block) */ attrib[0] = 1.0; attrib[1] = 2.0; attrib[2] = 3.0; attrib[3] = 1.11; attrib[4] = 2.11; attrib[5] = 3.11; attrib[6] = 1.12; attrib[7] = 2.12; attrib[8] = 3.12; attrib[9] = 1.2; attrib[10] = 2.2; attrib[11] = 3.2; attrib[12] = 1.3; attrib[13] = 2.3; attrib[14] = 3.3; attrib[15] = 1.4; attrib[16] = 2.4; attrib[17] = 3.4; attrib[18] = 1.5; attrib[19] = 2.5; attrib[20] = 3.5; attrib[21] = 1.6; attrib[22] = 2.6; attrib[23] = 3.6; error = ex_put_elem_attr (exoid, ebids[0], &attrib[0]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[1], &attrib[3]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[2], &attrib[9]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[3], &attrib[12]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[4], &attrib[15]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[5], &attrib[18]); printf ("after ex_put_elem_attr, error = %d\n", error); error = ex_put_elem_attr (exoid, ebids[6], &attrib[21]); printf ("after ex_put_elem_attr, error = %d\n", error); /* write individual node sets */ /* COMMENTED OUT ... error = ex_put_node_set_param (exoid, 20, 5, 5); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 100; node_list[1] = 101; node_list[2] = 102; node_list[3] = 103; node_list[4] = 104; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; error = ex_put_node_set (exoid, 20, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 20, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); error = ex_put_node_set_param (exoid, 21, 3, 3); printf ("after ex_put_node_set_param, error = %d\n", error); node_list[0] = 200; node_list[1] = 201; node_list[2] = 202; dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1; error = ex_put_node_set (exoid, 21, node_list); printf ("after ex_put_node_set, error = %d\n", error); error = ex_put_node_set_dist_fact (exoid, 21, dist_fact); printf ("after ex_put_node_set_dist_fact, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); END COMMENTED OUT SECTION */ /* write concatenated node sets; this produces the same information as * the above code which writes individual node sets */ /* THIS SECTION IS NOT COMMENTED OUT */ ids[0] = 20; ids[1] = 21; num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3; /* num_nodes_per_set[1] = 0; Uncomment to test NULL node sets */ node_ind[0] = 0; node_ind[1] = 5; node_list[0] = 100; node_list[1] = 101; node_list[2] = 102; node_list[3] = 103; node_list[4] = 104; node_list[5] = 200; node_list[6] = 201; node_list[7] = 202; num_df_per_set[0] = 5; num_df_per_set[1] = 3; df_ind[0] = 0; df_ind[1] = 5; dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; dist_fact[3] = 4.0; dist_fact[4] = 5.0; dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1; error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set, num_df_per_set, node_ind, df_ind, node_list, dist_fact); printf ("after ex_put_concat_node_sets, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5); printf ("after ex_put_prop, error = %d\n", error); prop_array[0] = 1000; prop_array[1] = 2000; error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array); printf ("after ex_put_prop_array, error = %d\n", error); /* END NOT COMMENTED OUT SECTION */ /* write individual side sets */ /* COMMENTED OUT SECTION ... error = ex_put_side_set_param (exoid, 30, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 1; elem_list[1] = 1; node_list[0] = 1; node_list[1] = 2; node_list[2] = 5; node_list[3] = 6; side_list[0] = 1; side_list[1] = 1; dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; error = ex_put_side_set (exoid, 30, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 30, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); error = ex_put_side_set_param (exoid, 31, 2, 4); printf ("after ex_put_side_set_param, error = %d\n", error); elem_list[0] = 2; elem_list[1] = 2; node_list[0] = 6; node_list[1] = 7; node_list[2] = 7; node_list[3] = 8; side_list[0] = 3; side_list[1] = 3; dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2; dist_fact[3] = 31.3; error = ex_put_side_set (exoid, 31, elem_list, side_list); printf ("after ex_put_side_set, error = %d\n", error); error = ex_put_side_set_dist_fact (exoid, 31, dist_fact); printf ("after ex_put_side_set_dist_fact, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, error = %d\n", error); END COMMENTED OUT SECTION */ /* write concatenated side sets; this produces the same information as * the above code which writes individual side sets */ /* THIS SECTION IS NOT COMMENTED OUT */ ids[0] = 30; ids[1] = 31; ids[2] = 32; ids[3] = 33; ids[4] = 34; ids[5] = 35; /* side set #1 - quad */ node_list[0] = 8; node_list[1] = 5; node_list[2] = 6; node_list[3] = 7; /* side set #2 - quad/hex, spanning 2 element types */ node_list[4] = 2; node_list[5] = 3; node_list[6] = 7; node_list[7] = 8; /* side set #3 - hex */ node_list[8] = 9; node_list[9] = 12; node_list[10] = 11; node_list[11] = 10; node_list[12] = 11; node_list[13] = 12; node_list[14] = 16; node_list[15] = 15; node_list[16] = 16; node_list[17] = 15; node_list[18] = 11; node_list[19] = 12; node_list[20] = 10; node_list[21] = 11; node_list[22] = 15; node_list[23] = 14; node_list[24] = 13; node_list[25] = 16; node_list[26] = 12; node_list[27] = 9; node_list[28] = 14; node_list[29] = 13; node_list[30] = 9; node_list[31] = 10; node_list[32] = 16; node_list[33] = 13; node_list[34] = 14; node_list[35] = 15; /* side set #4 - tetras */ node_list[36] = 17; node_list[37] = 18; node_list[38] = 20; node_list[39] = 18; node_list[40] = 19; node_list[41] = 20; node_list[42] = 20; node_list[43] = 19; node_list[44] = 17; node_list[45] = 19; node_list[46] = 18; node_list[47] = 17; /* side set #5 - circle and sphere */ node_list[48] = 21; node_list[49] = 22; /* side set #6 - wedges */ node_list[50] = 27; node_list[51] = 26; node_list[52] = 23; node_list[53] = 24; node_list[54] = 28; node_list[55] = 27; node_list[56] = 24; node_list[57] = 25; node_list[58] = 28; node_list[59] = 25; node_list[60] = 23; node_list[61] = 26; node_list[62] = 25; node_list[63] = 24; node_list[64] = 23; node_list[65] = 26; node_list[66] = 27; node_list[67] = 28; node_ind[0] = 0; node_ind[1] = 4; node_ind[2] = 8; node_ind[3] = 36; node_ind[4] = 47; node_ind[5] = 49; num_elem_per_set[0] = 2; /* two sides uses 2 elements */ num_elem_per_set[1] = 2; num_elem_per_set[2] = 7; num_elem_per_set[3] = 4; num_elem_per_set[4] = 2; num_elem_per_set[5] = 5; /* num_elem_per_set[5] = 0; Uncomment to test NULL side sets */ num_nodes_per_set[0] = 4; num_nodes_per_set[1] = 4; num_nodes_per_set[2] = 28; num_nodes_per_set[3] = 12; num_nodes_per_set[4] = 2; num_nodes_per_set[5] = 18; elem_ind[0] = 0; elem_ind[1] = 2; elem_ind[2] = 4; elem_ind[3] = 11; elem_ind[4] = 15; elem_ind[5] = 17; elem_list[0] = 3; elem_list[1] = 3; /* side set 1: Quad #2 */ elem_list[2] = 1; elem_list[3] = 3; /* side set 2: Quad #1 & #2 */ elem_list[4] = 4; elem_list[5] = 4; /* side set 3: Hex */ elem_list[6] = 4; elem_list[7] = 4; elem_list[8] = 4; elem_list[9] = 4; elem_list[10] = 4; elem_list[11] = 5; elem_list[12] = 5; /* side set 4: Tetra */ elem_list[13] = 5; elem_list[14] = 5; elem_list[15] = 6; elem_list[16] = 7; /* side set 5: Circle & Sphere */ elem_list[17] = 8; elem_list[18] = 8; /* side set 6: Wedge */ elem_list[19] = 8; elem_list[20] = 8; elem_list[21] = 8; #if 0 /* side set 0 */ side_list[0]= 4; side_list[1]= 2; /* side set 1 */ side_list[2]= 2; side_list[3]= 3; /* side set 2 */ side_list[4]= 5; side_list[5]= 3; side_list[6]= 3; side_list[7]= 2; side_list[8]= 4; side_list[9]= 1; side_list[10]= 6; /* side set 3 */ side_list[11]= 1; side_list[12]= 2; side_list[13]= 3; side_list[14]= 4; /* side set 4 */ side_list[15] = 1; side_list[16] = 1; /* side set 5 */ side_list[17]= 1; side_list[18]= 2; side_list[19]= 3; side_list[20]= 4; side_list[21]= 5; #endif error = ex_cvt_nodes_to_sides(exoid, num_elem_per_set, num_nodes_per_set, elem_ind, node_ind, elem_list, node_list, side_list); printf ("after ex_cvt_nodes_to_sides, error = %d\n", error); #if 0 for (i=0;i<num_side_sets;i++) { printf("side set %d\n",i); for (j=0;j<num_elem_per_set[i];j++) printf(" side_list[%d]: %d\n",j,side_list[j+elem_ind[i]]); } #endif num_df_per_set[0] = 4; num_df_per_set[1] = 4; num_df_per_set[2] = 0; num_df_per_set[3] = 0; num_df_per_set[4] = 0; num_df_per_set[5] = 0; df_ind[0] = 0; df_ind[1] = 4; /* side set #1 df */ dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2; dist_fact[3] = 30.3; /* side set #2 df */ dist_fact[4] = 31.0; dist_fact[5] = 31.1; dist_fact[6] = 31.2; dist_fact[7] = 31.3; error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set, num_df_per_set, elem_ind, df_ind, elem_list, side_list, dist_fact); printf ("after ex_put_concat_side_sets, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100); printf ("after ex_put_prop, error = %d\n", error); error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101); printf ("after ex_put_prop, error = %d\n", error); /* END COMMENTED OUT SECTION */ /* write QA records */ num_qa_rec = 2; qa_record[0][0] = "TESTWT1"; qa_record[0][1] = "testwt1"; qa_record[0][2] = "03/16/94"; qa_record[0][3] = "15:41:33"; qa_record[1][0] = "FASTQ"; qa_record[1][1] = "fastq"; qa_record[1][2] = "07/07/93"; qa_record[1][3] = "16:41:33"; error = ex_put_qa (exoid, num_qa_rec, qa_record); printf ("after ex_put_qa, error = %d\n", error); /* write information records */ num_info = 3; info[0] = "This is the first information record."; info[1] = "This is the second information record."; info[2] = "This is the third information record."; error = ex_put_info (exoid, num_info, info); printf ("after ex_put_info, error = %d\n", error); /* 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); error = ex_put_var_name(exoid, "g", 1, var_names[0]); printf ("after ex_put_var_name, error = %d\n", error); num_nod_vars = 2; var_names[0] = "nod_var0"; var_names[1] = "nod_var1"; error = ex_put_var_param (exoid, "n", num_nod_vars); printf ("after ex_put_var_param, error = %d\n", error); error = ex_put_var_names (exoid, "n", num_nod_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); 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); error = ex_put_var_names (exoid, "e", num_ele_vars, var_names); printf ("after ex_put_var_names, error = %d\n", error); /* 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] = k+1; k++; } } truth_tab[6] = 0; /* commented out to test ex_get_elem_var_tab in testrd1 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); */ 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 (4, 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); /* 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); /* 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); } /* 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]); */ } if (k == 1 && j == 2) continue; /* skip element block 3, variable 1 */ else { error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var, error = %d\n", error); } } } 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); } 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); return 0; }
int main (int argc, char **argv) { int num_glo_vars = 10; int num_nod_vars = 2; int CPU_word_size = 8; int IO_word_size = 8; const char* title = "This is a 2D mesh example with tri, quad, beam, truss, circle"; int ebids[] = {100, 200, 300, 400, 500}; int num_dim = 2; int num_nodes = 13; int num_elem = 20; int num_elem_blk = 5; int num_node_sets = 2; int num_side_sets = 2; /* create EXODUS II file */ int exoid = ex_create ("twod.e", /* 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 */ ex_opts(EX_VERBOSE); /* initialize file with parameters */ ex_put_init (exoid, title, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); /* write nodal coordinates values and names to database */ { double x[13], y[13]; x[0] = 0.0; y[0] = 0.0; x[1] = -0.5; y[1] = -0.5; x[2] = 0.5; y[2] = -0.5; x[3] = 0.5; y[3] = 0.5; x[4] = -0.5; y[4] = 0.5; x[5] = -1.0; y[5] = -1.0; x[6] = 1.0; y[6] = -1.0; x[7] = 1.0; y[7] = 1.0; x[8] = -1.0; y[8] = 1.0; x[9] = -2.0; y[9] = 0.0; x[10] = 0.0; y[10] = -2.0; x[11] = 2.0; y[11] = 0.0; x[12] = 0.0; y[12] = 2.0; ex_put_coord (exoid, x, y, 0); } { const char* coord_names[] = {"xcoor", "ycoor"}; ex_put_coord_names (exoid, (char**)coord_names); } { int node_map[] = {10,20,30,40,50,60,70,80,90,100,110,120,130}; ex_put_node_num_map(exoid, node_map); } /* write element order map */ { int elem_map[] = {11,21,31,41, 52, 62, 72, 82, 93,103,113,123,133,143,153,163, 174,184,194,204}; ex_put_elem_num_map (exoid, elem_map); } /* write element block parameters */ { const char* block_names[] = {"Triangles", "Quadrilaterals", "", "Trusses", "Circles"}; int num_elem_in_block[] = {4, 4, 4, 4, 4}; int num_nodes_per_elem[] = {3, 4, 2, 2, 1}; ex_put_elem_block (exoid, ebids[0], "triangle", num_elem_in_block[0], num_nodes_per_elem[0], 0); ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1], num_nodes_per_elem[1], 0); ex_put_elem_block (exoid, ebids[2], "beam", num_elem_in_block[2], num_nodes_per_elem[2], 3); ex_put_elem_block (exoid, ebids[3], "truss", num_elem_in_block[3], num_nodes_per_elem[3], 1); ex_put_elem_block (exoid, ebids[4], "circle", num_elem_in_block[4], num_nodes_per_elem[4], 2); /* Write element block names */ ex_put_names(exoid, EX_ELEM_BLOCK, (char**)block_names); } /* write element connectivity */ { int conn_t[] = {2,3,1, 3,4,1, 4,5,1, 5,2,1}; int conn_q[] = {6,7,3,2, 7,8,4,3, 8,9,5,4, 9,6,2,5}; int conn_B[] = {11,7, 8,13, 13,9, 6,11}; int conn_T[] = {10,6, 9,10, 7,12, 12,8}; int conn_c[] = {6,7,8,9}; ex_put_elem_conn (exoid, ebids[0], conn_t); ex_put_elem_conn (exoid, ebids[1], conn_q); ex_put_elem_conn (exoid, ebids[2], conn_B); ex_put_elem_conn (exoid, ebids[3], conn_T); ex_put_elem_conn (exoid, ebids[4], conn_c); } /* write element block attributes */ { const char* attn_T[] = {"Area"}; double attr_T[] = {1.0, 1.1, 1.2, 1.3}; const char* attn_B[] = {"A", "I", "J"}; double attr_B[] = {1.0, 100.0, 200.0, 1.1, 100.1, 200.1, 1.2, 100.2, 200.2, 1.3, 100.3, 200.3}; const char* attn_c[] = {"Radius", "A"}; double attr_c[] = {1.0, 3.14, 1.1, 4.14, 1.2, 5.14, 1.3, 6.14}; ex_put_elem_attr (exoid, ebids[2], attr_B); ex_put_elem_attr (exoid, ebids[3], attr_T); ex_put_elem_attr (exoid, ebids[4], attr_c); ex_put_elem_attr_names (exoid, ebids[2], (char**)attn_B); ex_put_elem_attr_names (exoid, ebids[3], (char**)attn_T); ex_put_elem_attr_names (exoid, ebids[4], (char**)attn_c); } /* write individual node sets */ { int num_nodes_in_nset[] = {5, 8}; int nsids[] = {20, 22}; int nod1[] = {5,4,3,2,1}; int nod2[] = {6,7,8,9,2,3,4,5}; const char* nset_names[] = {"Triangle_Nodes", "Quadrilateral_Nodes"}; ex_put_set_param (exoid, EX_NODE_SET, nsids[0], num_nodes_in_nset[0], 0); ex_put_set_param (exoid, EX_NODE_SET, nsids[1], num_nodes_in_nset[1], 0); ex_put_set (exoid, EX_NODE_SET, nsids[0], nod1, 0); ex_put_set (exoid, EX_NODE_SET, nsids[1], nod2, 0); ex_put_names(exoid, EX_NODE_SET, (char**)nset_names); } { /* write individual side sets */ int num_face_in_sset[] = {4,4}; int ssids[] = {100,200}; int ss1el[] = {1,2,3,4}; int ss1si[] = {1,1,1,1}; int ss2el[] = {5,7,6,8}; int ss2si[] = {1,1,1,1}; const char* sset_names[] = {"A", "B"}; ex_put_set_param (exoid, EX_SIDE_SET, ssids[0], num_face_in_sset[0], 0); ex_put_set_param (exoid, EX_SIDE_SET, ssids[1], num_face_in_sset[1], 0); ex_put_set (exoid, EX_SIDE_SET, ssids[0], ss1el, ss1si); ex_put_set (exoid, EX_SIDE_SET, ssids[1], ss2el, ss2si); ex_put_names(exoid, EX_SIDE_SET, (char**)sset_names); } /* write results variables parameters and names */ { const char* gvarn[] = {"g_01", "g_02", "g_03", "g_04", "g_05", "g_06", "g_07", "g_08", "g_09", "g_10"}; ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars); ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, (char**)gvarn); } { const char* nvarn[] = {"disp_x", "disp_y"}; ex_put_variable_param (exoid, EX_NODAL, num_nod_vars); ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, (char**)nvarn); } #if 0 num_ele_vars = 3; /* 0 1 2 3 */ /* 12345678901234567890123456789012 */ var_names[0] = "this_variable_name_is_short"; var_names[1] = "this_variable_name_is_just_right"; var_names[2] = "this_variable_name_is_tooooo_long"; ex_put_var_param (exoid, "e", num_ele_vars); printf ("after ex_put_var_param, %d\n", error); if (error) { ex_close (exoid); exit(-1); } ex_put_var_names (exoid, "e", num_ele_vars, var_names); printf ("after ex_put_var_names, %d\n", error); if (error) { ex_close (exoid); exit(-1); } { num_nset_vars = 3; var_names[0] = "ns_var0"; var_names[1] = "ns_var1"; var_names[2] = "ns_var2"; ex_put_var_param (exoid, "m", num_nset_vars); printf ("after ex_put_var_param, %d\n", error); if (error) { ex_close (exoid); exit(-1); } ex_put_var_names (exoid, "m", num_nset_vars, var_names); printf ("after ex_put_var_names, %d\n", error); if (error) { ex_close (exoid); exit(-1); } } { num_sset_vars = 3; var_names[0] = "ss_var0"; var_names[1] = "ss_var1"; var_names[2] = "ss_var2"; ex_put_var_param (exoid, "s", num_sset_vars); printf ("after ex_put_var_param, %d\n", error); if (error) { ex_close (exoid); exit(-1); } ex_put_var_names (exoid, "s", num_sset_vars, var_names); printf ("after ex_put_var_names, %d\n", error); if (error) { ex_close (exoid); exit(-1); } } #endif /* 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 */ { int i, j, k; int whole_time_step = 1; int num_time_steps = 10; double gvar[10]; double nvar[20]; for (i=0; i<num_time_steps; i++) { double time_value = (double)(i)/100.; ex_put_time (exoid, whole_time_step, &time_value); for (j=0; j<num_glo_vars; j++) { gvar[j] = (double)(j+2) * time_value; } ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, gvar); /* write nodal variables */ for (k=0; k < num_nod_vars; k++) { for (j=0; j<num_nodes; j++) { nvar[j] = (double)k + ((double)(j+1) * time_value); } ex_put_nodal_var (exoid, whole_time_step, k+1, num_nodes, nvar); } #if 0 /* 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]); */ } ex_put_elem_var (exoid, whole_time_step, k, ebids[j], num_elem_in_block[j], elem_var_vals); printf ("after ex_put_elem_var, %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } /* write sideset variables */ for (k=1; k<=num_sset_vars; k++) { for (j=0; j<num_side_sets; j++) { for (m=0; m<num_face_in_sset[j]; m++) { sset_var_vals[m] = (float)(k+2) + (float)(j+3) + ((float)(m+1)*time_value); /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */ } ex_put_sset_var (exoid, whole_time_step, k, ssids[j], num_face_in_sset[j], sset_var_vals); printf ("after ex_put_sset_var, %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } /* write nodeset variables */ for (k=1; k<=num_nset_vars; k++) { for (j=0; j<num_node_sets; j++) { for (m=0; m<num_nodes_in_nset[j]; m++) { nset_var_vals[m] = (float)(k+3) + (float)(j+4) + ((float)(m+1)*time_value); /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */ } ex_put_nset_var (exoid, whole_time_step, k, nsids[j], num_nodes_in_nset[j], nset_var_vals); printf ("after ex_put_nset_var, %d\n", error); if (error) { ex_close (exoid); exit(-1); } } } #endif whole_time_step++; } } ex_close (exoid); return 0; }
void PeridigmNS::InterfaceData::InitializeExodusOutput(Teuchos::RCP<Epetra_Vector> exodusMeshElementConnectivity, Teuchos::RCP<Epetra_Vector> exodusMeshNodePositions){ if(comm->NumProc()>1){ filename << "Interfaces.e." << comm->NumProc() << "." << comm->MyPID(); } else{ filename << "Interfaces.e"; } std::string outputFileNameStr = filename.str(); std::vector<char> writable(outputFileNameStr.size() + 1); std::copy(outputFileNameStr.begin(), outputFileNameStr.end(), writable.begin()); int spaDim = 3; // force three dimensional output const int numShells = numOwnedPoints; const int numNodes = exodusMeshNodePositions->Map().NumMyElements(); int error_int; int CPU_word_size = 0; int IO_word_size = 0; /* create EXODUS II file */ const int output_exoid = ex_create (&writable[0],EX_CLOBBER,&CPU_word_size, &IO_word_size); exoid = output_exoid; // scan the connectivity to see if there are quads and tets: numQuads = 0; numTris = 0; for(int i=0;i<numOwnedPoints;++i){ if(interfaceNodesMap->ElementSize(i)==4) numQuads++; if(interfaceNodesMap->ElementSize(i)==3) numTris++; } TEUCHOS_TEST_FOR_EXCEPTION(numQuads+numTris!=numShells,std::logic_error,"numQuads " << numQuads << " + numTris " << numTris << " should sum up to numShells " << numShells); const int numBlocks = 2; error_int = ex_put_init(exoid, &writable[0], spaDim, numNodes, numShells, numBlocks, 0, 0); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_init(): Failure"); // write initial coordinates and node/element maps float * x = new float[numNodes]; float * y = new float[numNodes]; float * z = new float[numNodes]; int * shellMap = new int[numShells]; int * nodeMap = new int[numNodes]; for(int i=0;i<numNodes;++i){ int nodeIndex = exodusMeshNodePositions->Map().FirstPointInElement(i); x[i] = (*exodusMeshNodePositions)[nodeIndex+0]; y[i] = (*exodusMeshNodePositions)[nodeIndex+1]; z[i] = (*exodusMeshNodePositions)[nodeIndex+2]; nodeMap[i] = exodusMeshNodePositions->Map().GID(i) + 1; // numbering is one based in exodus } for(int i=0;i<numShells;++i){ shellMap[i] = interfaceNodesMap->GID(i) +1; // numbering is one based in exodus } error_int = ex_put_coord(exoid, x, y, z); char * coord_names[3]; coord_names[0] = (char*) "coordinates_x"; coord_names[1] = (char*) "coordinates_y"; coord_names[2] = (char*) "coordinates_x"; error_int = ex_put_coord_names(exoid, coord_names); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_coord_names(): Failure"); error_int = ex_put_elem_num_map(exoid, shellMap); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_elem_num_map(): Failure"); error_int = ex_put_node_num_map(exoid, nodeMap); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_node_num_map(): Failure"); delete[] shellMap; delete[] nodeMap; delete[] x; delete[] y; delete[] z; // write quad blocks: int blockIndex = 0; blockIndex ++; int num_nodes_per_elem_q4 = 4; const std::string elem_type_str_q4 = numQuads > 0 ? "QUAD4" : "NULL"; char * elem_type_q4 = const_cast<char *>(elem_type_str_q4.c_str()); const int numElemInBlock_q4 = numQuads; error_int = ex_put_elem_block(exoid, blockIndex, elem_type_q4, numElemInBlock_q4, num_nodes_per_elem_q4, 0); // no attributes put in output file TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_elem_block(): Failure"); blockIndex ++; int num_nodes_per_elem_t3 = 3; const std::string elem_type_str_t3 = numTris > 0 ? "TRI3": "NULL"; char * elem_type_t3 = const_cast<char *>(elem_type_str_t3.c_str()); const int numElemInBlock_t3 = numTris; error_int = ex_put_elem_block(exoid, blockIndex, elem_type_t3, numElemInBlock_t3, num_nodes_per_elem_t3, 0); // no attributes put in output file TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"ex_put_elem_block(): Failure"); // write elem connectivities // HEADS UP: the connectivities will not write to file until ex_close is called // also note that the nodes must be the local node ids const int connLength = interfaceNodes->Map().NumMyElements(); blockIndex = 0; blockIndex ++; int conn_index = 0; int * block_connect_q4 = new int[numQuads*num_nodes_per_elem_q4]; for(int it=0;it<connLength;++it) { if(interfaceNodes->Map().ElementSize(it)!=4) continue; int elemIndex = interfaceNodes->Map().FirstPointInElement(it); for(int nn=0;nn<4;++nn){ int node = static_cast<int>( (*interfaceNodes)[elemIndex+nn] ); block_connect_q4[conn_index*num_nodes_per_elem_q4+nn] = exodusMeshNodePositions->Map().LID(node) + 1;// nodes are 1 based in exodus } conn_index++; } error_int = ex_put_elem_conn(exoid, blockIndex, block_connect_q4); delete[] block_connect_q4; blockIndex ++; conn_index = 0; int * block_connect_t3 = new int[numTris*num_nodes_per_elem_t3]; for(int it=0;it<connLength;++it) { if(interfaceNodes->Map().ElementSize(it)!=3) continue; int elemIndex = interfaceNodes->Map().FirstPointInElement(it); for(int nn=0;nn<3;++nn){ int node = static_cast<int>( (*interfaceNodes)[elemIndex+nn] ); block_connect_t3[conn_index*num_nodes_per_elem_t3+nn] = exodusMeshNodePositions->Map().LID(node) + 1;// nodes are 1 based in exodus } conn_index++; } error_int = ex_put_elem_conn(exoid, blockIndex, block_connect_t3); delete[] block_connect_t3; int numVariables = 1; // TODO careful with this, if more fields are added to the interface data this must be updated char** eleVarNames = new char*[numVariables]; std::vector<std::string> strNames; strNames.push_back("interface_aperture"); for (int i=0;i<numVariables;++i) eleVarNames[i] = (char*) (strNames[i].c_str()); error_int = ex_put_var_param(exoid, (char*) "e", numVariables); error_int = ex_put_var_names(exoid, (char*) "e", numVariables, &eleVarNames[0]); delete [] eleVarNames; // write the truth table int * truth_tab = new int[numVariables*numBlocks]; for(int i=0;i<numVariables*numBlocks;++i) truth_tab[i] = 1; error_int = ex_put_elem_var_tab (exoid, numBlocks, numVariables, truth_tab); delete [] truth_tab; error_int = ex_update(exoid); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"Exodus file close failed."); error_int = ex_close(exoid); TEUCHOS_TEST_FOR_EXCEPTION(error_int,std::logic_error,"Exodus file close failed."); }
int main (int argc, char **argv) { int exoid, num_dim, num_nodes, num_elem, num_elem_blk; int num_elem_in_block[10], num_nodes_per_elem[10], num_attr[10]; int num_node_sets, num_side_sets, error; int i, j, *connect; int ebids[10], ids[10]; int CPU_word_size,IO_word_size; char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1]; float version; float *attrib; float x[100], y[100], z[100]; char *coord_names[3]; 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.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 */ /* initialize file with parameters */ num_dim = 3; num_nodes = 19; num_elem = 12;; num_elem_blk = 1; num_node_sets = 0; num_side_sets = 0; error = ex_put_init (exoid, "This is testwt1", num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets); assert(error == 0); /* write nodal coordinates values and names to database */ /* Quad #1 */ x[0] = 1.0000000E+00; x[1] = 5.0000000E-01; x[2] = 1.0000000E+00; x[3] = 1.0000000E+00; x[4] = 7.5000000E-01; x[5] = 5.0000000E-01; x[6] = 1.0000000E+00; x[7] = 7.5000000E-01; x[8] = 1.0000000E+00; x[9] = 5.0000000E-01; x[10] = 5.0000000E-01; x[11] = 5.0000000E-01; x[12] = 1.0000000E+00; x[13] = 1.0000000E+00; x[14] = 7.5000000E-01; x[15] = 7.5000000E-01; x[16] = 1.0000000E+00; x[17] = 7.5000000E-01; x[18] = 1.0000000E+00; y[0] = 5.0000000E-01; y[1] = 1.0000000E+00; y[2] = 1.0000000E+00; y[3] = 7.5000000E-01; y[4] = 1.0000000E+00; y[5] = 5.0000000E-01; y[6] = 5.0000000E-01; y[7] = 5.0000000E-01; y[8] = 5.0000000E-01; y[9] = 1.0000000E+00; y[10] = 7.5000000E-01; y[11] = 1.0000000E+00; y[12] = 1.0000000E+00; y[13] = 7.5000000E-01; y[14] = 1.0000000E+00; y[15] = 7.5000000E-01; y[16] = 1.0000000E+00; y[17] = 1.0000000E+00; y[18] = 7.5000000E-01; z[0] = 5.0000000E-01; z[1] = 5.0000000E-01; z[2] = 5.0000000E-01; z[3] = 5.0000000E-01; z[4] = 5.0000000E-01; z[5] = 1.0000000E+00; z[6] = 1.0000000E+00; z[7] = 1.0000000E+00; z[8] = 7.5000000E-01; z[9] = 1.0000000E+00; z[10] = 1.0000000E+00; z[11] = 7.5000000E-01; z[12] = 1.0000000E+00; z[13] = 1.0000000E+00; z[14] = 1.0000000E+00; z[15] = 1.0000000E+00; z[16] = 7.5000000E-01; z[17] = 7.5000000E-01; z[18] = 7.5000000E-01; error = ex_put_coord (exoid, x, y, z); assert(error == 0); coord_names[0] = "xcoor"; coord_names[1] = "ycoor"; coord_names[2] = "zcoor"; error = ex_put_coord_names (exoid, coord_names); assert(error == 0); /* write element block parameters */ num_elem_in_block[0] = 12; num_nodes_per_elem[0] = 4; ebids[0] = 10; num_attr[0] = 3; error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0], num_nodes_per_elem[0], num_attr[0]); assert(error == 0); /* write element connectivity */ connect = (int *) calloc(num_elem_in_block[0] * num_nodes_per_elem[0], sizeof(int)); connect[ 0] = 1; connect[ 1] = 4; connect[ 2] = 19; connect[ 3] = 9; connect[ 4] = 4; connect[ 5] = 3; connect[ 6] = 17; connect[ 7] = 19; connect[ 8] = 3; connect[ 9] = 5; connect[10] = 18; connect[11] = 17; connect[12] = 5; connect[13] = 2; connect[14] = 12; connect[15] = 18; connect[16] = 9; connect[17] = 19; connect[18] = 14; connect[19] = 7; connect[20] = 7; connect[21] = 14; connect[22] = 16; connect[23] = 8; connect[24] = 19; connect[25] = 17; connect[26] = 13; connect[27] = 14; connect[28] = 17; connect[29] = 18; connect[30] = 15; connect[31] = 13; connect[32] = 14; connect[33] = 13; connect[34] = 15; connect[35] = 16; connect[36] = 8; connect[37] = 16; connect[38] = 11; connect[39] = 6; connect[40] = 18; connect[41] = 12; connect[42] = 10; connect[43] = 15; connect[44] = 16; connect[45] = 15; connect[46] = 10; connect[47] = 11; error = ex_put_elem_conn (exoid, ebids[0], connect); assert(error == 0); free (connect); /* write element block attributes (3 per block) */ attrib = (float *) calloc(num_elem_in_block[0] * num_attr[0], sizeof(float)); #if 0 { k = 0; for (i=0; i < num_elem_in_block[0]; i++) { for (j = 0; j < num_attr[0]; j++) { attrib[k++] = 10*(i+1) + j+1; } } } error = ex_put_elem_attr (exoid, ebids[0], &attrib[0]); assert(error == 0); #else { for (j = 0; j < num_attr[0]; j++) { for (i=0; i < num_elem_in_block[0]; i++) { attrib[i] = 10*(i+1) + j+1; } error = ex_put_one_elem_attr (exoid, ebids[0], j+1, &attrib[0]); assert(error == 0); } } #endif free(attrib); /* close the EXODUS files */ error = ex_close (exoid); assert(error == 0); /* Reopen the file and read the attributes to see if they were written correctly */ CPU_word_size = 0; /* sizeof(float) */ IO_word_size = 0; /* use what is stored in file */ /* open EXODUS II files */ exoid = ex_open ("test.exo", /* filename path */ EX_READ, /* access mode = READ */ &CPU_word_size, /* CPU word size */ &IO_word_size, /* IO word size */ &version); /* ExodusII library version */ assert(exoid >= 0); if (exoid < 0) exit(1); error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem, &num_elem_blk, &num_node_sets, &num_side_sets); assert(error == 0); if (num_elem_blk > 0) { error = ex_get_elem_blk_ids (exoid, ids); assert(error == 0); for (i=0; i<num_elem_blk; i++) { error = ex_get_elem_block (exoid, ids[i], elem_type, &(num_elem_in_block[i]), &(num_nodes_per_elem[i]), &(num_attr[i])); assert(error == 0); } /* read element block attributes */ attrib = (float *) calloc(num_elem_in_block[0],sizeof(float)); for (j = 0; j < num_attr[0]; j++) { error = ex_get_one_elem_attr (exoid, ids[0], j+1, &attrib[0]); assert(error == 0); if (error == 0) { for (i=0; i < num_elem_in_block[0]; i++) { assert(attrib[i] == 10*(i+1) + j+1); } } } free (attrib); } error = ex_close (exoid); assert(error == 0); return 0; }