1 /*
2  * Copyright(C) 1999-2020 National Technology & Engineering Solutions
3  * of Sandia, LLC (NTESS).  Under the terms of Contract DE-NA0003525 with
4  * NTESS, the U.S. Government retains certain rights in this software.
5  *
6  * See packages/seacas/LICENSE for details
7  */
8 /*****************************************************************************
9  *
10  * exgvnm - ex_get_variable_name
11  *
12  * entry conditions -
13  *   input parameters:
14  *       int   exoid                   exodus file id
15  *       int   obj_type                variable type
16  *       int   var_num                 variable index to read 1..num_var
17  *
18  * exit conditions -
19  *       char*   var_name                ptr to variable name
20  *
21  * revision history -
22  *
23  *
24  *****************************************************************************/
25 
26 #include "exodusII.h"     // for ex_err, etc
27 #include "exodusII_int.h" // for EX_FATAL, etc
28 
29 /*!
30  * \ingroup ResultsData
31  *
32  * reads the name of a particular results variable from the database
33  */
34 
ex_get_variable_name(int exoid,ex_entity_type obj_type,int var_num,char * var_name)35 int ex_get_variable_name(int exoid, ex_entity_type obj_type, int var_num, char *var_name)
36 {
37   int         status;
38   int         varid;
39   char        errmsg[MAX_ERR_LENGTH];
40   const char *vname = NULL;
41 
42   EX_FUNC_ENTER();
43   if (ex__check_valid_file_id(exoid, __func__) == EX_FATAL) {
44     EX_FUNC_LEAVE(EX_FATAL);
45   }
46 
47   /* inquire previously defined variables  */
48 
49   switch (obj_type) {
50   case EX_GLOBAL: vname = VAR_NAME_GLO_VAR; break;
51   case EX_NODAL: vname = VAR_NAME_NOD_VAR; break;
52   case EX_ASSEMBLY: vname = VAR_NAME_ASSEMBLY_VAR; break;
53   case EX_BLOB: vname = VAR_NAME_BLOB_VAR; break;
54   case EX_EDGE_BLOCK: vname = VAR_NAME_EDG_VAR; break;
55   case EX_FACE_BLOCK: vname = VAR_NAME_FAC_VAR; break;
56   case EX_ELEM_BLOCK: vname = VAR_NAME_ELE_VAR; break;
57   case EX_NODE_SET: vname = VAR_NAME_NSET_VAR; break;
58   case EX_EDGE_SET: vname = VAR_NAME_ESET_VAR; break;
59   case EX_FACE_SET: vname = VAR_NAME_FSET_VAR; break;
60   case EX_SIDE_SET: vname = VAR_NAME_SSET_VAR; break;
61   case EX_ELEM_SET: vname = VAR_NAME_ELSET_VAR; break;
62   default:
63     snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Invalid variable type (%d) given for file id %d",
64              obj_type, exoid);
65     ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM);
66     EX_FUNC_LEAVE(EX_FATAL);
67   }
68 
69   if ((status = nc_inq_varid(exoid, vname, &varid)) != NC_NOERR) {
70     snprintf(errmsg, MAX_ERR_LENGTH, "Warning: no %s variable names stored in file id %d",
71              ex_name_of_object(obj_type), exoid);
72     ex_err_fn(exoid, __func__, errmsg, status);
73     EX_FUNC_LEAVE(EX_WARN);
74   }
75 
76   /* read the variable name */
77   {
78     int db_name_size  = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);
79     int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
80     int name_size     = db_name_size < api_name_size ? db_name_size : api_name_size;
81 
82     status = ex__get_name(exoid, varid, var_num - 1, var_name, name_size, obj_type, __func__);
83     if (status != NC_NOERR) {
84       EX_FUNC_LEAVE(EX_FATAL);
85     }
86   }
87   EX_FUNC_LEAVE(EX_NOERR);
88 }
89