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  * expmp - ex_put_attr_param
11  *
12  * entry conditions -
13  *   input parameters:
14  *       int     exoid           exodus file id
15  *       int     obj_type        block/set type (node, edge, face, elem)
16  *       int     obj_id          block/set id (ignored for NODAL)
17  *       int     num_attrs       number of attributes
18  *
19  * exit conditions -
20  *
21  *
22  *****************************************************************************/
23 
24 #include "exodusII.h"     // for ex_err, etc
25 #include "exodusII_int.h" // for EX_FATAL, EX_WARN, etc
26 
27 /*!
28  * defines the number of attributes.
29  * \param   exoid           exodus file id
30  * \param   obj_type        block/set type (node, edge, face, elem)
31  * \param   obj_id          block/set id (ignored for NODAL)
32  * \param   num_attrs       number of attributes
33  */
34 
ex_put_attr_param(int exoid,ex_entity_type obj_type,ex_entity_id obj_id,int num_attrs)35 int ex_put_attr_param(int exoid, ex_entity_type obj_type, ex_entity_id obj_id, int num_attrs)
36 {
37   int status;
38   int dims[2];
39   int strdim, varid;
40 
41   char        errmsg[MAX_ERR_LENGTH];
42   const char *dnumobjent;
43   const char *dnumobjatt;
44   const char *vobjatt;
45   const char *vattnam;
46   int         numobjentdim;
47   int         obj_id_ndx;
48   int         numattrdim;
49 #if NC_HAS_HDF5
50   int fill = NC_FILL_CHAR;
51 #endif
52 
53   EX_FUNC_ENTER();
54   if (ex__check_valid_file_id(exoid, __func__) == EX_FATAL) {
55     EX_FUNC_LEAVE(EX_FATAL);
56   }
57 
58   /* Determine index of obj_id in obj_type id array */
59   if (obj_type == EX_NODAL) {
60     obj_id_ndx = 0;
61   }
62   else {
63     obj_id_ndx = ex__id_lkup(exoid, obj_type, obj_id);
64     if (obj_id_ndx <= 0) {
65       ex_get_err(NULL, NULL, &status);
66 
67       if (status != 0) {
68         if (status == EX_NULLENTITY) {
69           snprintf(errmsg, MAX_ERR_LENGTH,
70                    "Warning: no attributes found for NULL %s %" PRId64 " in file id %d",
71                    ex_name_of_object(obj_type), obj_id, exoid);
72           ex_err_fn(exoid, __func__, errmsg, EX_NULLENTITY);
73           EX_FUNC_LEAVE(EX_WARN); /* no attributes for this object */
74         }
75         snprintf(errmsg, MAX_ERR_LENGTH,
76                  "Warning: failed to locate %s id %" PRId64 " in id array in file id %d",
77                  ex_name_of_object(obj_type), obj_id, exoid);
78         ex_err_fn(exoid, __func__, errmsg, status);
79         EX_FUNC_LEAVE(EX_WARN);
80       }
81     }
82   }
83 
84   switch (obj_type) {
85   case EX_SIDE_SET:
86     dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
87     dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
88     vobjatt    = VAR_SSATTRIB(obj_id_ndx);
89     vattnam    = VAR_NAME_SSATTRIB(obj_id_ndx);
90     break;
91   case EX_NODE_SET:
92     dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
93     dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
94     vobjatt    = VAR_NSATTRIB(obj_id_ndx);
95     vattnam    = VAR_NAME_NSATTRIB(obj_id_ndx);
96     break;
97   case EX_EDGE_SET:
98     dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
99     dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
100     vobjatt    = VAR_ESATTRIB(obj_id_ndx);
101     vattnam    = VAR_NAME_ESATTRIB(obj_id_ndx);
102     break;
103   case EX_FACE_SET:
104     dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
105     dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
106     vobjatt    = VAR_FSATTRIB(obj_id_ndx);
107     vattnam    = VAR_NAME_FSATTRIB(obj_id_ndx);
108     break;
109   case EX_ELEM_SET:
110     dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
111     dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
112     vobjatt    = VAR_ELSATTRIB(obj_id_ndx);
113     vattnam    = VAR_NAME_ELSATTRIB(obj_id_ndx);
114     break;
115   case EX_NODAL:
116     dnumobjent = DIM_NUM_NODES;
117     dnumobjatt = DIM_NUM_ATT_IN_NBLK;
118     vobjatt    = VAR_NATTRIB;
119     vattnam    = VAR_NAME_NATTRIB;
120     break;
121   case EX_EDGE_BLOCK:
122     dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
123     dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
124     vobjatt    = VAR_EATTRIB(obj_id_ndx);
125     vattnam    = VAR_NAME_EATTRIB(obj_id_ndx);
126     break;
127   case EX_FACE_BLOCK:
128     dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
129     dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
130     vobjatt    = VAR_FATTRIB(obj_id_ndx);
131     vattnam    = VAR_NAME_FATTRIB(obj_id_ndx);
132     break;
133   case EX_ELEM_BLOCK:
134     dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
135     dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
136     vobjatt    = VAR_ATTRIB(obj_id_ndx);
137     vattnam    = VAR_NAME_ATTRIB(obj_id_ndx);
138     break;
139   default:
140     snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Bad block type (%d) specified for file id %d",
141              obj_type, exoid);
142     ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM);
143     EX_FUNC_LEAVE(EX_FATAL);
144   }
145 
146   if ((status = nc_inq_dimid(exoid, dnumobjent, &numobjentdim)) != NC_NOERR) {
147     snprintf(errmsg, MAX_ERR_LENGTH,
148              "ERROR: failed to locate number of entries for %s %" PRId64 " in file id %d",
149              ex_name_of_object(obj_type), obj_id, exoid);
150     ex_err_fn(exoid, __func__, errmsg, status);
151     EX_FUNC_LEAVE(EX_FATAL);
152   }
153 
154   /* put netcdf file into define mode  */
155   if ((status = nc_redef(exoid)) != NC_NOERR) {
156     snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to place file id %d into define mode", exoid);
157     ex_err_fn(exoid, __func__, errmsg, status);
158     EX_FUNC_LEAVE(EX_FATAL);
159   }
160 
161   if ((status = nc_def_dim(exoid, dnumobjatt, num_attrs, &numattrdim)) != NC_NOERR) {
162     snprintf(errmsg, MAX_ERR_LENGTH,
163              "ERROR: failed to define number of attributes in %s %" PRId64 " in file id %d",
164              ex_name_of_object(obj_type), obj_id, exoid);
165     ex_err_fn(exoid, __func__, errmsg, status);
166     goto error_ret; /* exit define mode and return */
167   }
168 
169   dims[0] = numobjentdim;
170   dims[1] = numattrdim;
171 
172   if ((status = nc_def_var(exoid, vobjatt, nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
173     snprintf(errmsg, MAX_ERR_LENGTH,
174              "ERROR:  failed to define attributes for %s %" PRId64 " in file id %d",
175              ex_name_of_object(obj_type), obj_id, exoid);
176     ex_err_fn(exoid, __func__, errmsg, status);
177     goto error_ret; /* exit define mode and return */
178   }
179   ex__compress_variable(exoid, varid, 2);
180 
181   /* inquire previously defined dimensions  */
182   if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
183     snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get string length in file id %d", exoid);
184     ex_err_fn(exoid, __func__, errmsg, status);
185     EX_FUNC_LEAVE(EX_FATAL);
186   }
187 
188   /* Attribute names... */
189   dims[0] = numattrdim;
190   dims[1] = strdim;
191 
192   if ((status = nc_def_var(exoid, vattnam, NC_CHAR, 2, dims, &varid)) != NC_NOERR) {
193     snprintf(errmsg, MAX_ERR_LENGTH,
194              "ERROR: failed to define %s attribute name array in file id %d",
195              ex_name_of_object(obj_type), exoid);
196     ex_err_fn(exoid, __func__, errmsg, status);
197     goto error_ret; /* exit define mode and return */
198   }
199 #if NC_HAS_HDF5
200   nc_def_var_fill(exoid, varid, 0, &fill);
201 #endif
202 
203   /* leave define mode  */
204   if ((status = ex__leavedef(exoid, __func__)) != NC_NOERR) {
205     EX_FUNC_LEAVE(EX_FATAL);
206   }
207 
208   EX_FUNC_LEAVE(EX_NOERR);
209 
210 /* Fatal error: exit definition mode and return */
211 error_ret:
212   ex__leavedef(exoid, __func__);
213   EX_FUNC_LEAVE(EX_FATAL);
214 }
215