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

📄 ne_pevs.c

📁 一个用来实现偏微分方程中网格的计算库
💻 C
字号:
/* * Copyright (c) 1998 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. *  *//*****************************************************************************//*****************************************************************************//*****************************************************************************//* Function(s) contained in this file: * *      ne_put_elem_var_slab() * ***************************************************************************** * *  Variable Index: * *      neid               - The NetCDF ID of an already open NemesisI file. *      time_step          - The time step to write this data to. *      elem_var_index     - The index of this elemental variable. *      elem_blk_id        - The ID of the element block being written to. *      start_pos          - The start point for outputting data. The *                           first value is 0. *      num_vals           - The number of values to be output. *      elem_var_vals      - Pointer to the vector of values to be output. *//*****************************************************************************//*****************************************************************************//*****************************************************************************/#include <stdlib.h>#include "exodusII.h"#include "exodusII_int.h"#include "ne_nemesisI_int.h"#include "ne_nemesisI.h"/* * writes the values of a single element variable for one element block, * starting at start_pos, at one time step to the database; assume the * first time step and element variable index are 1 */int ne_put_elem_var_slab (int   neid,		          int   time_step,		          int   elem_var_index,		          int   elem_blk_id,                          int   start_pos,		          int   num_vals,		          void *elem_var_vals){  int status;  int varid, dimid,time_dim, numelbdim, dims[2], elem_blk_id_ndx;  size_t num_elem_blk, num_elem_var, start[2], count[2];  int *elem_var_tab;  char errmsg[MAX_ERR_LENGTH];  exerrval = 0; /* clear error code */  /* Determine index of elem_blk_id in VAR_ID_EL_BLK array */  if ((elem_blk_id_ndx = ex_id_lkup(neid, EX_ELEM_BLOCK, elem_blk_id)) < 0) {    if (exerrval == EX_NULLENTITY) {      sprintf(errmsg,	      "Warning: no variables allowed for NULL block %d in file id %d",	      elem_blk_id, neid);      ex_err("ne_put_elem_var_slab", errmsg, EX_MSG);      return (EX_WARN);    } else {      sprintf(errmsg,	      "Error: failed to locate element block id %d in %s array in file id %d",	      elem_blk_id, VAR_ID_EL_BLK, neid);      ex_err("ne_put_elem_var_slab", errmsg, exerrval);      return (EX_FATAL);    }  }  if ((status = nc_inq_varid (neid,			      VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx), &varid)) != NC_NOERR) {    if (status == NC_ENOTVAR) { /* variable doesn't exist, create it! */      /*    inquire previously defined dimensions */      /* check for the existance of an element variable truth table */      if ((status = nc_inq_varid (neid, VAR_ELEM_TAB, &varid)) == NC_NOERR) {	/* find out number of element blocks and element variables */	if ((status = nc_inq_dimid (neid, DIM_NUM_EL_BLK, &dimid)) != NC_NOERR) {	  exerrval = status;	  sprintf(errmsg,		  "Error: failed to locate number of element blocks in file id %d",		  neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	if ((status = nc_inq_dimlen(neid, dimid, &num_elem_blk)) != NC_NOERR) {	  exerrval = status;	  sprintf(errmsg,		  "Error: failed to get number of element blocks in file id %d",		  neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	if ((status = nc_inq_dimid (neid, DIM_NUM_ELE_VAR, &dimid)) != NC_NOERR) {	  exerrval = EX_BADPARAM;	  sprintf(errmsg,		  "Error: no element variables stored in file id %d",		  neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	if ((status = nc_inq_dimlen(neid, dimid, &num_elem_var)) != NC_NOERR) {	  exerrval = status;	  sprintf(errmsg,		  "Error: failed to get number of element variables in file id %d",		  neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	if (!(elem_var_tab =	      (int *)malloc(num_elem_blk*num_elem_var*sizeof(int)))) {	  exerrval = EX_MEMFAIL;	  sprintf(errmsg,		  "Error: failed to allocate memory for element variable truth table in file id %d",		  neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	/*   read in the element variable truth table */	if ((status = nc_get_var_int(neid, varid, elem_var_tab)) != NC_NOERR) {	  exerrval = status;	  sprintf(errmsg,		  "Error: failed to get truth table from file id %d", neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	if (elem_var_tab[num_elem_var*(elem_blk_id_ndx-1)+elem_var_index-1] == 0L) {	  free(elem_var_tab);	  exerrval = EX_BADPARAM;	  sprintf(errmsg,		  "Error: Invalid element variable %d, block %d in file id %d",		  elem_var_index, elem_blk_id, neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	  return (EX_FATAL);	}	free(elem_var_tab);      }      if ((status = nc_inq_dimid (neid, DIM_TIME, &time_dim)) != NC_NOERR) {	exerrval = status;	sprintf(errmsg,		"Error: failed to locate time dimension in file id %d", neid);	ex_err("ne_put_elem_var_slab", errmsg, exerrval);	goto error_ret;		/* exit define mode and return */      }      if ((status = nc_inq_dimid(neid, DIM_NUM_EL_IN_BLK(elem_blk_id_ndx), &numelbdim)) != NC_NOERR) {	if (status == NC_EBADDIM) {	  exerrval = status;	  sprintf(errmsg,		  "Error: number of elements in element block %d not defined in file id %d",		  elem_blk_id, neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	} else {	  exerrval = status;	  sprintf(errmsg,		  "Error: failed to locate number of elements in element block %d in file id %d",		  elem_blk_id, neid);	  ex_err("ne_put_elem_var_slab", errmsg, exerrval);	}	goto error_ret;      }      /*    variable doesn't exist so put file into define mode  */      if ((status = nc_redef (neid)) != NC_NOERR) {	exerrval = status;	sprintf(errmsg,		"Error: failed to put file id %d into define mode", neid);	ex_err("ne_put_elem_var_slab", errmsg, exerrval);	return (EX_FATAL);      }      /*    define netCDF variable to store element variable values */      dims[0] = time_dim;      dims[1] = numelbdim;      if ((status = nc_def_var(neid, VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx),			       nc_flt_code(neid), 2, dims, &varid)) != NC_NOERR) {	exerrval = status;	sprintf(errmsg,		"Error: failed to define element variable %d in file id %d",		elem_var_index, neid);	ex_err("ne_put_elem_var_slab", errmsg, exerrval);	goto error_ret;      }      /*    leave define mode  */      if ((status = nc_enddef(neid)) != NC_NOERR) {	exerrval = status;	sprintf(errmsg,		"Error: failed to complete element variable %s definition to file id %d",		VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx), neid);	ex_err("ne_put_elem_var_slab", errmsg, exerrval);	return (EX_FATAL);      }    } else {      exerrval = status;      sprintf(errmsg,	      "Error: failed to locate element variable %s in file id %d",	      VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx),neid);      ex_err("ne_put_elem_var_slab", errmsg, exerrval);      return (EX_FATAL);    }  }  /* store element variable values */  start[0] = --time_step;  start[1] = --start_pos;  count[0] = 1;  count[1] = num_vals;  if (ex_comp_ws(neid) == 4) {    status = nc_put_vara_float(neid, varid, start, count, elem_var_vals);  } else {    status = nc_put_vara_double(neid, varid, start, count, elem_var_vals);  }  if (status != NC_NOERR) {    exerrval = status;    sprintf(errmsg,	    "Error: failed to store element variable %d in file id %d", 	    elem_var_index, neid);    ex_err("ne_put_elem_var_slab", errmsg, exerrval);    return (EX_FATAL);  }  return (EX_NOERR);  /* Fatal error: exit definition mode and return */ error_ret:  if (nc_enddef (neid) != NC_NOERR)     /* exit define mode */    {      sprintf(errmsg,	      "Error: failed to complete definition for file id %d", neid);      ex_err("ne_put_elem_var_slab", errmsg, exerrval);    }  return (EX_FATAL);}

⌨️ 快捷键说明

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