/* * Copyright (c) 1994 Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement * retains certain rights in this software. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * * Neither the name of Sandia Corporation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /***************************************************************************** * * excopy - ex_copy * * author - Sandia National Laboratories * Larry A. Schoof - Original * * environment - UNIX * * entry conditions - * input parameters: * int in_exoid input exodus file id * * exit conditions - * int out_exoid output exodus file id * * revision history - * * *****************************************************************************/ #include #include #include #include "exodusII.h" #include "exodusII_int.h" struct ncdim { /* dimension */ char name[MAX_STR_LENGTH]; long size; }; struct ncvar { /* variable */ char name[MAX_STR_LENGTH]; nc_type type; int ndims; int dims[MAX_VAR_DIMS]; int natts; }; struct ncatt { /* attribute */ int var; char name[MAX_STR_LENGTH]; nc_type type; int len; void *val; }; /* * copies all information (attributes, dimensions, and variables from * an opened EXODUS file to another opened EXODUS file */ int ex_copy (int in_exoid, int out_exoid) { int ndims; /* number of dimensions */ int nvars; /* number of variables */ int ngatts; /* number of global attributes */ int recdimid; /* id of unlimited dimension */ int dimid; /* dimension id */ int dim_out_id; /* dimension id */ int varid; /* variable id */ int var_out_id; /* variable id */ struct ncvar var; /* variable */ struct ncatt att; /* attribute */ int i, number, temp; long numrec; long dim_sz; float fdum; char *cdum=0; char dim_nm[MAX_NC_NAME]; extern int ncopts; exerrval = 0; /* clear error code */ /* * get number of dimensions, number of variables, number of global * atts, and dimension id of unlimited dimension, if any */ ncinquire(in_exoid, &ndims, &nvars, &ngatts, &recdimid); ncdiminq (in_exoid, recdimid, (char *) 0, &numrec); /* put output file into define mode */ ncredef(out_exoid); /* copy global attributes */ for (i = 0; i < ngatts; i++) { ncattname(in_exoid, NC_GLOBAL, i, att.name); ncattinq(in_exoid, NC_GLOBAL, att.name, &att.type, &att.len); /* if attribute exists in output file, don't overwrite it; compute * word size, I/O word size etc. are global attributes stored when * file is created with ex_create; we don't want to overwrite those */ if (ncattinq (out_exoid, NC_GLOBAL, att.name, &att.type, &att.len) == -1){ /* attribute doesn't exist in new file so OK to create it */ ncattcopy (in_exoid,NC_GLOBAL,att.name,out_exoid,NC_GLOBAL); } } /* copy dimensions */ /* Get the dimension sizes and names */ for(dimid = 0; dimid < ndims; dimid++){ ncdiminq(in_exoid,dimid,dim_nm,&dim_sz); /* See if the dimension has already been defined */ temp = ncopts; ncopts = 0; dim_out_id = ncdimid(out_exoid,dim_nm); ncopts = temp; /* If the dimension isn't one we specifically don't want * to copy (ie, number of QA or INFO records) and it * hasn't been defined, copy it */ if ( ( strcmp(dim_nm,DIM_NUM_QA) != 0) && ( strcmp(dim_nm,DIM_NUM_INFO) != 0) && ( strcmp(dim_nm,DIM_NUM_NOD_VAR) != 0) && ( strcmp(dim_nm,DIM_NUM_ELE_VAR) != 0) && ( strcmp(dim_nm,DIM_NUM_GLO_VAR) != 0) ) { if(dim_out_id == -1){ if(dimid != recdimid){ dim_out_id=ncdimdef(out_exoid,dim_nm,dim_sz); }else{ dim_out_id=ncdimdef(out_exoid,dim_nm,NC_UNLIMITED); } /* end else */ } /* end if */ } /* end if */ } /* end loop over dim */ /* copy variable definitions and variable attributes */ for (varid = 0; varid < nvars; varid++) { ncvarinq(in_exoid, varid, var.name, &var.type, &var.ndims, var.dims, &var.natts); /* we don't want to copy some variables because there is not a * simple way to add to them; * QA records, info records and all results variables (nodal * element, and global results) are examples */ if ( ( strcmp(var.name,VAR_QA_TITLE) != 0) && ( strcmp(var.name,VAR_INFO) != 0) && ( strcmp(var.name,VAR_ELEM_TAB) != 0) && ( strcmp(var.name,VAR_NAME_GLO_VAR) != 0) && ( strcmp(var.name,VAR_GLO_VAR) != 0) && ( strcmp(var.name,VAR_NAME_NOD_VAR) != 0) && ( strcmp(var.name,VAR_NOD_VAR) != 0) && ( strcmp(var.name,VAR_NAME_ELE_VAR) != 0) && ( strncmp(var.name,"vals_nod_var", 12) != 0) && ( strncmp(var.name,"vals_elem_var",13) != 0) ) { var_out_id = cpy_var_def (in_exoid, out_exoid, recdimid, var.name); /* copy the variable's attributes */ (void) cpy_att (in_exoid, out_exoid, varid, var_out_id); } } /* take the output file out of define mode */ ncendef (out_exoid); /* output variable data */ for (varid = 0; varid < nvars; varid++) { ncvarinq(in_exoid, varid, var.name, &var.type, &var.ndims, var.dims, &var.natts); /* we don't want to copy some variable values; * QA records and info records shouldn't be copied because there * isn't an easy way to add to them; * the time value array ("time_whole") and any results variables * (nodal, elemental, or global) shouldn't be copied */ if ( ( strcmp(var.name,VAR_QA_TITLE) != 0) && ( strcmp(var.name,VAR_INFO) != 0) && ( strcmp(var.name,VAR_ELEM_TAB) != 0) && ( strcmp(var.name,VAR_NAME_GLO_VAR) != 0) && ( strcmp(var.name,VAR_GLO_VAR) != 0) && ( strcmp(var.name,VAR_NAME_NOD_VAR) != 0) && ( strcmp(var.name,VAR_NOD_VAR) != 0) && ( strcmp(var.name,VAR_NAME_ELE_VAR) != 0) && ( strncmp(var.name,"vals_nod_var", 12) != 0) && ( strncmp(var.name,"vals_elem_var",13) != 0) && ( strcmp(var.name,VAR_WHOLE_TIME) != 0) ) { (void) cpy_var_val (in_exoid, out_exoid, var.name); } } /* ensure internal data structures are updated */ /* if number of element blocks > 0 */ ex_inquire (out_exoid, EX_INQ_ELEM_BLK, &number, &fdum, cdum); if (number > 0) { for (i=0; i 0 */ ex_inquire (out_exoid, EX_INQ_NODE_SETS, &number, &fdum, cdum); if (number > 0) { for (i=0; i 0 */ ex_inquire (out_exoid, EX_INQ_SIDE_SETS, &number, &fdum, cdum); if (number > 0) { for (i=0; i 0 */ ex_inquire (out_exoid, EX_INQ_ELEM_MAP, &number, &fdum, cdum); if (number > 0) { for (i=0; i 0 */ ex_inquire (out_exoid, EX_INQ_NODE_MAP, &number, &fdum, cdum); if (number > 0) { for (i=0; i