⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expvartab.c

📁 一个用来实现偏微分方程中网格的计算库
💻 C
字号:
/* * Copyright (c) 2005 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. *  *//******************************************************************************* expvtt - ex_put_truth_table** entry conditions - *   input parameters:*       int     exoid              exodus file id*       int     obj_type           object type*       int     num_blk            number of blocks*       int     num_var            number of variables*       int*    variable_table            variable truth table array** exit conditions - ** revision history - **  $Id: expvartab.c,v 1.1 2008/02/20 19:49:29 gdsjaar Exp $******************************************************************************/#include <stdlib.h>#include "exodusII.h"#include "exodusII_int.h"/*! * writes the EXODUS II variable truth table to the database; also, * creates netCDF variables in which to store EXODUS II variable * values; although this table isn't required (because the netCDF * variables can also be created in ex_put_var), this call will save * tremendous time because all of the variables are defined at once * while the file is in define mode, rather than going in and out of * define mode (causing the entire file to be copied over and over) * which is what occurs when the variables are defined in ex_put_var * \param       exoid              exodus file id * \param       obj_type           object type * \param       num_blk            number of blocks * \param       num_var            number of variables * \param      *var_tab            variable truth table array */int ex_put_truth_table (int  exoid,			ex_entity_type obj_type,			int  num_blk,			int  num_var,			int *var_tab){  int numelblkdim, numelvardim, timedim, dims[2], varid;  char *sta_type, *tab_type;  size_t num_entity = 0;  size_t num_var_db = 0;  int *stat_vals;  int i, j, k, id, *ids;  int status;  char errmsg[MAX_ERR_LENGTH];  const char* routine = "ex_put_truth_table";    /*   * The ent_type and the var_name are used to build the netcdf   * variables name.  Normally this is done via a macro defined in   * exodusII_int.h   */  const char* ent_type = NULL;  const char* var_name = NULL;  const char* ent_size = NULL;  exerrval = 0; /* clear error code */     ex_get_dimension(exoid, ex_dim_num_objects(obj_type),		   ex_name_of_object(obj_type), &num_entity, &numelblkdim, routine);  if (obj_type == EX_ELEM_BLOCK) {    ex_get_dimension(exoid, DIM_NUM_ELE_VAR,  "element variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_ELEM_TAB, &varid);    var_name = "vals_elem_var";    ent_type = "eb";    ent_size = "num_el_in_blk";    sta_type = VAR_STAT_EL_BLK;    tab_type = VAR_ELEM_TAB;  }  else if (obj_type == EX_EDGE_BLOCK) {    ex_get_dimension(exoid, DIM_NUM_EDG_VAR, "edge block variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_EBLK_TAB, &varid);    var_name = "vals_edge_var";    ent_type = "eb";    ent_size = "num_ed_in_blk";    sta_type = VAR_STAT_ED_BLK;    tab_type = VAR_EBLK_TAB;  }  else if (obj_type  == EX_FACE_BLOCK) {    ex_get_dimension(exoid, DIM_NUM_FAC_VAR, "face block variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_FBLK_TAB, &varid);    var_name = "vals_face_var";    ent_type = "fb";    ent_size = "num_fa_in_blk";    sta_type = VAR_STAT_FA_BLK;    tab_type = VAR_FBLK_TAB;  }  else if (obj_type == EX_SIDE_SET) {    ex_get_dimension(exoid, DIM_NUM_SSET_VAR, "sideset variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_SSET_TAB, &varid);    var_name = "vals_sset_var";    ent_type = "ss";    ent_size = "num_side_ss";    sta_type = VAR_SS_STAT;    tab_type = VAR_SSET_TAB;  }  else if (obj_type == EX_NODE_SET) {    ex_get_dimension(exoid, DIM_NUM_NSET_VAR, "nodeset variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_NSET_TAB, &varid);    var_name = "vals_nset_var";    ent_type = "ns";    ent_size = "num_nod_ns";    sta_type = VAR_NS_STAT;    tab_type = VAR_NSET_TAB;  }  else if (obj_type == EX_EDGE_SET) {    ex_get_dimension(exoid, DIM_NUM_ESET_VAR, "edge set variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_ESET_TAB, &varid);    var_name = "vals_eset_var";    ent_type = "es";    ent_size = "num_edge_es";    sta_type = VAR_ES_STAT;    tab_type = VAR_ESET_TAB;  }  else if (obj_type == EX_FACE_SET) {    ex_get_dimension(exoid, DIM_NUM_FSET_VAR, "face set variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_FSET_TAB, &varid);    var_name = "vals_fset_var";    ent_type = "fs";    ent_size = "num_face_fs";    sta_type = VAR_FS_STAT;    tab_type = VAR_FSET_TAB;  }  else if (obj_type == EX_ELEM_SET) {    ex_get_dimension(exoid, DIM_NUM_ELSET_VAR, "element set variables",		     &num_var_db, &numelvardim, routine);    status = nc_inq_varid (exoid, VAR_ELSET_TAB, &varid);    var_name = "vals_elset_var";    ent_type = "els";    ent_size = "num_ele_els";    sta_type = VAR_ELS_STAT;    tab_type = VAR_ELSET_TAB;  }  else {       /* invalid variable type */    exerrval = EX_BADPARAM;    sprintf(errmsg,	    "Error: Invalid variable type %d specified in file id %d",	    obj_type, exoid);    ex_err("ex_get_varid",errmsg,exerrval);    return (EX_WARN);  }     if (num_entity == -1 || num_var_db == -1)    return (EX_FATAL);  if (num_entity != num_blk) {    exerrval = EX_FATAL;    sprintf(errmsg,	    "Error: # of %s doesn't match those defined in file id %d",	    ex_name_of_object(obj_type), exoid);    ex_err("ex_get_var_tab",errmsg,exerrval);    return (EX_FATAL);  }  if (num_var_db != num_var) {    exerrval = EX_FATAL;    sprintf(errmsg,	    "Error: # of %s variables doesn't match those defined in file id %d",	    ex_name_of_object(obj_type), exoid);    ex_err("ex_get_var_tab",errmsg,exerrval);    return (EX_FATAL);  }  /* get block IDs */  if (!(ids = malloc(num_blk*sizeof(int)))) {    exerrval = EX_MEMFAIL;    sprintf(errmsg,	    "Error: failed to allocate memory for %s id array for file id %d",	    ex_name_of_object(obj_type), exoid);    ex_err(routine,errmsg,exerrval);    return (EX_FATAL);  }  /* Get status array for later use */  if (!(stat_vals = malloc(num_blk*sizeof(int)))) {    exerrval = EX_MEMFAIL;    free(ids);    sprintf(errmsg,	    "Error: failed to allocate memory for %s status array for file id %d",            ex_name_of_object(obj_type), exoid);    ex_err(routine,errmsg,exerrval);    return (EX_FATAL);  }  ex_get_ids (exoid, obj_type, ids);  status = nc_inq_varid (exoid, sta_type, &varid);  /* get variable id of status array */  if (status == NC_NOERR) {    /* if status array exists (V 2.01+), use it, otherwise assume       object exists to be backward compatible */    if ((status = nc_get_var_int (exoid, varid, stat_vals)) != NC_NOERR) {      exerrval = status;      free(stat_vals);      sprintf(errmsg,	      "Error: failed to get %s status array from file id %d",              ex_name_of_object(obj_type), exoid);      ex_err("put_var_tab",errmsg,exerrval);      return (EX_FATAL);    }  } else {    /* status array doesn't exist (V2.00), dummy one up for later checking */    for(i=0;i<num_blk;i++)      stat_vals[i] = 1;  }  /* put netcdf file into define mode  */  if ((status = nc_redef (exoid)) != NC_NOERR) {    free(stat_vals);    free (ids);    exerrval = status;    sprintf(errmsg,            "Error: failed to put file id %d into define mode",	    exoid);    ex_err(routine,errmsg,exerrval);    return (EX_FATAL);  }  /* inquire previously defined dimensions */  if ((status = nc_inq_dimid (exoid, DIM_TIME, &timedim)) != NC_NOERR) {    exerrval = status;    free(stat_vals);    free (ids);    sprintf(errmsg,	    "Error: failed to locate time variable in file id %d",	    exoid);    ex_err(routine,errmsg,exerrval);    goto error_ret;          /* exit define mode and return */  }    /* define netCDF variables in which to store EXODUS II element   * variable values   */  k = 0;  for (i=0; i<num_blk; i++) {    for (j=1; j<=num_var; j++) {      /* check if variables are to be put out for this entity */      if (var_tab[k] != 0) {	if (stat_vals[i] != 0) {/* check for NULL entity */	  /* NOTE: This code used to zero out the var_tab entry	     if the stat_vals[i] value was zero. However, in some	     cases it is good to know that a variable was assigned to	     an entity even if that entity is empty. The code was	     changed to not modify the truth table.	  */	  dims[0] = timedim;	  	  /* Determine number of entities in block */	  if ((status = nc_inq_dimid(exoid, ex_catstr(ent_size, (i+1)), &dims[1])) != NC_NOERR) {	    exerrval = status;	    id=ids[i];	    free(stat_vals);	    free (ids);	    sprintf(errmsg,		    "Error: failed to locate number of entities in %s %d in file id %d",		    ex_name_of_object(obj_type), id,exoid);	    ex_err(routine,errmsg,exerrval);	    goto error_ret;          /* exit define mode and return */	    }	  /* define netCDF variable to store variable values; the j	   * index cycles from 1 through the number of variables so	   * that the index of the EXODUS II variable (which is part	   * of the name of the netCDF variable) will begin at 1	   * instead of 0	   */	  if ((status = nc_def_var(exoid, ex_catstr2(var_name, j, ent_type, i+1),				  nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {	    if (status != NC_ENAMEINUSE) {	      exerrval = status;	      id=ids[i];	      free(stat_vals);	      free (ids);	      sprintf(errmsg,		      "Error: failed to define variable for %s %d in file id %d",		      ex_name_of_object(obj_type), id,exoid);	      ex_err(routine,errmsg,exerrval);	      goto error_ret;  /* exit define mode and return */	    }	  }	}      }  /* if */      k++; /* increment element truth table pointer */    }  /* for j */  }  /* for i */  free (stat_vals);  free (ids);  /* create a variable array in which to store the truth table   */  dims[0] = numelblkdim;  dims[1] = numelvardim;  status = nc_def_var (exoid, tab_type, NC_INT, 2, dims, &varid);    if (status != NC_NOERR) {    exerrval = status;    sprintf(errmsg,	    "Error: failed to define %s variable truth table in file id %d",	    ex_name_of_object(obj_type), exoid);    ex_err(routine,errmsg,exerrval);    goto error_ret;          /* exit define mode and return */  }  /* leave define mode  */  if ((status = nc_enddef (exoid)) != NC_NOERR) {    exerrval = status;    sprintf(errmsg,	    "Error: failed to complete definitions in file id %d",	    exoid);    ex_err(routine,errmsg,exerrval);    return (EX_FATAL);  }  /* write out the element variable truth table */  status = nc_put_var_int(exoid, varid, var_tab);  if (status != NC_NOERR) {    exerrval = status;    sprintf(errmsg,	    "Error: failed to store variable truth table in file id %d",	    exoid);    ex_err(routine,errmsg,exerrval);    return (EX_FATAL);  }  return (EX_NOERR);  /* Fatal error: exit definition mode and return */ error_ret:  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */    {      sprintf(errmsg,	      "Error: failed to complete definition for file id %d",	      exoid);      ex_err(routine,errmsg,exerrval);    }  return (EX_FATAL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -