/* * 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. * */ /***************************************************************************** * * exinq - ex_inquire * * author - Sandia National Laboratories * Larry A. Schoof - Original * James A. Schutt - 8 byte float and standard C definitions * Vic Yarberry - Added headers and error logging * * * environment - UNIX * * entry conditions - * input parameters: * int exoid exodus file id * int req_info info request code * * exit conditions - * int* ret_int returned integer value * float* ret_float returned float value * char* ret_char returned character value * * revision history - * * $Id: exinq.c,v 1.2 2005/07/19 12:31:28 andy Exp $ * *****************************************************************************/ #include #include "exodusII.h" #include "exodusII_int.h" static void flt_cvt(float *xptr,double x) { *xptr = (float)x; } /* * returns information about the database */ int ex_inquire (int exoid, int req_info, int *ret_int, void *ret_float, char *ret_char) { int dimid, varid, i, tmp_num, *ids; long ldum, num_sets, start[2], count[2]; nclong *stat_vals; char errmsg[MAX_ERR_LENGTH]; exerrval = 0; /* clear error code */ switch (req_info) { case EX_INQ_FILE_TYPE: /* obsolete call */ /*returns "r" for regular EXODUS II file or "h" for history EXODUS file*/ *ret_char = '\0'; exerrval = EX_BADPARAM; sprintf(errmsg, "Warning: file type inquire is obsolete"); ex_err("ex_inquire",errmsg,exerrval); return (EX_WARN); case EX_INQ_API_VERS: /* returns the EXODUS II API version number */ if (ncattget (exoid, NC_GLOBAL, ATT_API_VERSION, ret_float) == -1) { /* try old (prior to db version 2.02) attribute name */ if (ncattget (exoid, NC_GLOBAL, ATT_API_VERSION_BLANK,ret_float) == -1) { exerrval = ncerr; sprintf(errmsg, "Error: failed to get EXODUS API version for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } } break; case EX_INQ_DB_VERS: /* returns the EXODUS II database version number */ if (ncattget (exoid, NC_GLOBAL, ATT_VERSION, ret_float) == -1) { exerrval = ncerr; sprintf(errmsg, "Error: failed to get EXODUS database version for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } break; case EX_INQ_LIB_VERS: /* returns the EXODUS II Library version number */ flt_cvt((float *)ret_float, EX_API_VERS); break; case EX_INQ_TITLE: /* returns the title of the database */ if (ncattget (exoid, NC_GLOBAL, ATT_TITLE, ret_char) == -1) { *ret_char = '\0'; exerrval = ncerr; sprintf(errmsg, "Error: failed to get database title for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } break; case EX_INQ_DIM: /* returns the dimensionality (2 or 3, for 2-d or 3-d) of the database */ if ((dimid = ncdimid (exoid, DIM_NUM_DIM)) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to locate database dimensionality in file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } if (ncdiminq (exoid, dimid, (char *) 0, &ldum) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to get database dimensionality for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } *ret_int = ldum; break; case EX_INQ_NODES: /* returns the number of nodes */ if ((dimid = ncdimid (exoid, DIM_NUM_NODES)) == -1) { *ret_int = 0; } else { if (ncdiminq (exoid, dimid, (char *) 0, &ldum) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to get number of nodes for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } *ret_int = ldum; } break; case EX_INQ_ELEM: /* returns the number of elements */ if ((dimid = ncdimid (exoid, DIM_NUM_ELEM)) == -1) { *ret_int = 0; } else { if (ncdiminq (exoid, dimid, (char *) 0, &ldum) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to get number of elements for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } *ret_int = ldum; } break; case EX_INQ_ELEM_BLK: /* returns the number of element blocks */ if ((dimid = ncdimid (exoid, DIM_NUM_EL_BLK)) == -1) { *ret_int = 0; } else { if (ncdiminq (exoid, dimid, (char *) 0, &ldum) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to get number of element blocks for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } *ret_int = ldum; } break; case EX_INQ_NODE_SETS: /* returns the number of node sets */ if ((dimid = ncdimid (exoid, DIM_NUM_NS)) < 0) *ret_int = 0; /* no node sets defined */ else { if (ncdiminq (exoid, dimid, (char *) 0, &ldum) == -1) { *ret_int = 0; exerrval = ncerr; sprintf(errmsg, "Error: failed to get number of node sets in file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } *ret_int = ldum; } break; case EX_INQ_NS_NODE_LEN: /* returns the length of the concatenated node sets node list */ *ret_int = 0; /* default value if no node sets are defined */ if ((dimid = ncdimid (exoid, DIM_NUM_NS)) != -1 ) { if (ncdiminq (exoid, dimid, (char *) 0, &num_sets) == -1) { exerrval = ncerr; sprintf(errmsg, "Error: failed to get number of node sets in file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } if (!(ids = malloc(num_sets*sizeof(int)))) { exerrval = EX_MEMFAIL; sprintf(errmsg, "Error: failed to allocate memory for node set ids for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } if (ex_get_node_set_ids (exoid, ids) == EX_FATAL) { sprintf(errmsg, "Error: failed to get node sets in file id %d", exoid); /* pass back error code from ex_get_node_set_ids (in exerrval) */ ex_err("ex_inquire",errmsg,exerrval); free (ids); return (EX_FATAL); } /* allocate space for stat array */ if (!(stat_vals = malloc((int)num_sets*sizeof(nclong)))) { exerrval = EX_MEMFAIL; free (ids); sprintf(errmsg, "Error: failed to allocate memory for node set status array for file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } /* get variable id of status array */ if ((varid = ncvarid (exoid, VAR_NS_STAT)) != -1) { /* if status array exists, use it, otherwise assume, object exists to be backward compatible */ start[0] = 0; start[1] = 0; count[0] = num_sets; count[1] = 0; if (ncvarget (exoid, varid, start, count, (void *)stat_vals) == -1) { exerrval = ncerr; free (ids); free(stat_vals); sprintf(errmsg, "Error: failed to get node set status array from file id %d", exoid); ex_err("ex_inquire",errmsg,exerrval); return (EX_FATAL); } } else /* default: status is true */ for(i=0;i