19 #define _XOPEN_SOURCE 600 30 #ifdef FMS_HAVE_CONDUIT 32 #include <conduit_relay.h> 44 #define FMS_ELE_PER_LINE 3u 47 #define FMS_LU "%" PRIu64 50 #if UINT64_MAX == ULLONG_MAX 51 #define StrToFmsInt strtoull 52 #elif UINT64_MAX == ULONG_MAX 53 #define StrToFmsInt strtoul 55 #error "unknown conversion routine for FmsInt" 58 #define FOR_EACH_INT_TYPE(macro) \ 59 macro(FMS_INT8, int8_t, "%" PRId8) \ 60 macro(FMS_INT16, int16_t, "%" PRId16) \ 61 macro(FMS_INT32, int32_t, "%" PRId32) \ 62 macro(FMS_INT64, int64_t, "%" PRId64) \ 63 macro(FMS_UINT8, uint8_t, "%" PRIu8) \ 64 macro(FMS_UINT16, uint16_t, "%" PRIu16) \ 65 macro(FMS_UINT32, uint32_t, "%" PRIu32) \ 66 macro(FMS_UINT64, uint64_t, "%" PRIu64) 68 #define FOR_EACH_SCALAR_TYPE(macro) \ 69 macro(FMS_FLOAT, float, "%f") \ 70 macro(FMS_DOUBLE, double, "%f") \ 71 macro(FMS_COMPLEX_FLOAT, float, "%f") \ 72 macro(FMS_COMPLEX_DOUBLE, double, "%f") 78 #define E_RETURN(code) return (code) 80 static void FmsErrorDebug(
int err_code,
const char *func,
const char *file,
83 "\n\nFMS error encountered!\n" 87 , err_code, func, file, line);
94 #if defined(__clang__) 95 #define FMS_PRETTY_FUNCTION __PRETTY_FUNCTION__ 96 #elif !defined(_MSC_VER) 97 #define FMS_PRETTY_FUNCTION __func__ 98 #else // for Visual Studio C++ 99 #define FMS_PRETTY_FUNCTION __FUNCSIG__ 101 #define E_RETURN(code) \ 104 FmsErrorDebug(code, FMS_PRETTY_FUNCTION, __FILE__, __LINE__); \ 110 static inline int FmsIOCopyString(
const char *str,
char **str_copy_p) {
111 if (str == NULL) { *str_copy_p = NULL;
return 0; }
112 char *str_copy = strdup(str);
113 if (str_copy == NULL) {
return 1; }
114 *str_copy_p = str_copy;
119 #ifdef FMS_HAVE_CONDUIT 120 static inline int FmsIOStringToLower(
const char *src,
const size_t N,
123 if(!src) dst[0] =
'\0';
124 for(
size_t i = 0; i < N; i++)
125 dst[i] = (
char)tolower(src[i]);
135 #ifdef FMS_HAVE_CONDUIT 151 int (*open)(FmsIOContext *ctx,
const char *filename,
const char *mode);
152 int (*close)(FmsIOContext *ctx);
154 int (*add_int)(FmsIOContext *ctx,
const char *path,
FmsInt value);
155 int (*add_int_array)(FmsIOContext *ctx,
const char *path,
const FmsInt *values,
157 int (*add_typed_int_array)(FmsIOContext *ctx,
const char *path,
FmsIntType type,
158 const void *values,
FmsInt n);
159 int (*add_float)(FmsIOContext *ctx,
const char *path,
float value);
161 int (*add_double)(FmsIOContext *ctx,
const char *path,
double value);
162 int (*add_scalar_array)(FmsIOContext *ctx,
const char *path,
FmsScalarType type,
163 const void *data,
FmsInt n);
164 int (*add_string)(FmsIOContext *ctx,
const char *path,
const char *value);
166 int (*has_path)(FmsIOContext *ctx,
const char *path);
167 int (*get_int)(FmsIOContext *ctx,
const char *path,
FmsInt *value);
168 int (*get_typed_int_array)(FmsIOContext *ctx,
const char *path,
170 int (*get_float)(FmsIOContext *ctx,
const char *path,
float *value);
171 int (*get_double)(FmsIOContext *ctx,
const char *path,
double *value);
172 int (*get_scalar_array)(FmsIOContext *ctx,
const char *path,
174 int (*get_string)(FmsIOContext *ctx,
const char *path,
const char **value);
192 const char *component_name;
196 } FmsIOFieldDescriptorInfo;
207 FmsIOMetaDataInfo *md;
223 FmsIOEntityInfo *entities;
230 FmsIODomainInfo *domains;
231 } FmsIODomainNameInfo;
234 const char *domain_name;
239 } FmsIOComponentPartInfo;
246 const char *coordinates_name;
248 FmsIOComponentPartInfo *parts;
252 } FmsIOComponentInfo;
257 const char *comp_name;
263 const char **descriptions;
272 FmsIODomainNameInfo *domain_names;
273 FmsIOComponentInfo *components;
282 FmsIOFieldDescriptorInfo *fds;
284 FmsIOFieldInfo *fields;
285 FmsIOMeshInfo *mesh_info;
286 FmsIOMetaDataInfo *md;
287 } FmsIODataCollectionInfo;
290 join_keys(
const char *k1,
const char *k2) {
294 len = strlen(k1) + 1 + strlen(k2) + 1;
295 str = (
char *)malloc(
sizeof(
char) * len);
297 sprintf(str,
"%s/%s", k1, k2);
305 FmsIOOpen(FmsIOContext *ctx,
const char *filename,
const char *mode) {
309 ctx->fp = fopen(filename, mode);
315 FmsIOClose(FmsIOContext *ctx) {
320 for(
FmsInt i = 0; i < ctx->temp_strings_size; i++) {
321 FREE(ctx->temp_strings[i]);
323 FREE(ctx->temp_strings);
332 FmsIOAddInt(FmsIOContext *ctx,
const char *path,
FmsInt value) {
335 fprintf(ctx->fp,
"%s: " FMS_LU "\n", path, value);
340 FmsIOAddIntArray(FmsIOContext *ctx,
const char *path,
const FmsInt *values,
345 fprintf(ctx->fp,
"%s/Size: " FMS_LU "\n", path, n);
350 fprintf(ctx->fp,
"%s/Values: [", path);
351 for(i = 0; i < n; ++i) {
353 fprintf(ctx->fp,
FMS_LU, values[i]);
355 fprintf(ctx->fp,
", ");
358 fprintf(ctx->fp,
"\n");
360 fprintf(ctx->fp,
"]\n");
378 FmsIOAddTypedIntArray(FmsIOContext *ctx,
const char *path,
FmsIntType type,
379 const void *values,
FmsInt n) {
385 fprintf(ctx->fp,
"%s/Size: " FMS_LU "\n", path, n);
388 #define PRINT_MACRO(typename, T, format) \ 390 const T *v = (const T *)(values); \ 391 fprintf(ctx->fp, "%s/Values: [", path); \ 392 for(i = 0; i < n;) { \ 393 for(j = 0; j < epl && i < n; j++, i++) { \ 394 fprintf(ctx->fp, format, v[i]); \ 396 fprintf(ctx->fp, ", "); \ 399 fprintf(ctx->fp, "\n"); \ 401 fprintf(ctx->fp, "]\n"); \ 405 #define CASES(typename, T, format) \ 407 PRINT_MACRO(typename, T, format); \ 420 FmsIOAddFloat(FmsIOContext *ctx,
const char *path,
float value) {
423 fprintf(ctx->fp,
"%s: %f\n", path, value);
428 FmsIOAddDouble(FmsIOContext *ctx,
const char *path,
double value) {
431 fprintf(ctx->fp,
"%s: %f\n", path, value);
436 FmsIOAddScalarArray(FmsIOContext *ctx,
const char *path,
FmsScalarType type,
437 const void *values,
FmsInt n) {
446 fprintf(ctx->fp,
"%s/Size: " FMS_LU "\n", path, n);
449 #define PRINT_MACRO(typename, T, format) \ 451 const T *v = (const T *)(values); \ 452 fprintf(ctx->fp, "%s/Values: [", path); \ 453 for(i = 0; i < n;) { \ 454 for(j = 0; j < epl && i < n; j++, i++) { \ 455 fprintf(ctx->fp, format, v[i]); \ 457 fprintf(ctx->fp, ", "); \ 460 fprintf(ctx->fp, "\n"); \ 462 fprintf(ctx->fp, "]\n"); \ 466 #define CASES(typename, T, format) \ 468 PRINT_MACRO(typename, T, format); \ 481 FmsIOAddString(FmsIOContext *ctx,
const char *path,
const char *value) {
484 fprintf(ctx->fp,
"%s: %s\n", path, value);
488 #define FMS_BUFFER_SIZE 512 495 FmsIOReadLine(FmsIOContext *ctx,
char *buff) {
510 FmsIOReadKeyValue(FmsIOContext *ctx,
char *key,
char *value) {
513 char *key_end = NULL;
517 if((key_end = strchr(buff,
':')) == NULL)
524 memcpy(key, buff, N);
530 N = strlen(key_end+2);
534 memcpy(value, key_end+2, N);
542 FmsIOHasPath(FmsIOContext *ctx,
const char *path) {
548 long cur_loc = ftell(ctx->fp);
551 err = FmsIOReadKeyValue(ctx, k, NULL);
552 fseek(ctx->fp, cur_loc, SEEK_SET);
562 if(strcmp(k, path) == 0) {
566 char *ptr = strrchr(k,
'/');
576 FmsIOGetInt(FmsIOContext *ctx,
const char *path,
FmsInt *value) {
583 if(FmsIOReadKeyValue(ctx, k, v))
593 if (errno == ERANGE) {
E_RETURN(6); }
594 if (errno == EINVAL) {
E_RETURN(7); }
601 FmsIOGetTypedIntArray(FmsIOContext *ctx,
const char *path,
FmsIntType *type,
602 void **values,
FmsInt *n) {
621 if(FmsIOReadKeyValue(ctx, k, v))
624 char *ksize = join_keys(path,
"Size");
625 err = strcmp(k, ksize);
633 if (errno == ERANGE) {
E_RETURN(8); }
634 if (errno == EINVAL) {
E_RETURN(9); }
639 if(FmsIOReadKeyValue(ctx, k, v))
642 char *ktype= join_keys(path,
"Type");
643 err = strcmp(k, ktype);
657 if(FmsIOReadKeyValue(ctx, k, v))
660 char *kvalues = join_keys(path,
"Values");
661 err = strcmp(k, kvalues);
666 #define READ_ARRAY_DATA(DEST_T, FUNC) \ 668 DEST_T *data = malloc(sizeof(DEST_T) * *n); \ 671 size_t len = strlen(v); \ 672 char *off = v, *newoff = NULL; \ 675 while(len && i < *n) { \ 676 data[i++] = (DEST_T)FUNC(off, &newoff, 10); \ 678 if(*newoff == ' ') newoff++; \ 679 if(newoff >= v + len) break; \ 682 if(strchr(v, ']')) break; \ 683 if(FmsIOReadLine(ctx, v)) break; \ 685 *values = (void*)data; \ 717 #undef READ_ARRAY_DATA 724 FmsIOGetScalarArray(FmsIOContext *ctx,
const char *path,
FmsScalarType *type,
725 void **values,
FmsInt *n) {
744 if(FmsIOReadKeyValue(ctx, k, v))
747 char *ksize = join_keys(path,
"Size");
748 err = strcmp(k, ksize);
756 if (errno == ERANGE) {
E_RETURN(8); }
757 if (errno == EINVAL) {
E_RETURN(9); }
762 if(FmsIOReadKeyValue(ctx, k, v))
765 char *ktype= join_keys(path,
"Type");
766 err = strcmp(k, ktype);
780 if(FmsIOReadKeyValue(ctx, k, v))
783 char *kvalues = join_keys(path,
"Values");
784 err = strcmp(k, kvalues);
790 #define READ_ARRAY_DATA(DEST_T, FUNC, SIZE) \ 792 DEST_T *data = malloc(sizeof(DEST_T) * SIZE); \ 795 size_t len = strlen(v); \ 796 char *off = v, *newoff = NULL; \ 799 while(len && i < SIZE) { \ 800 data[i++] = (DEST_T)FUNC(off, &newoff); \ 802 if(*newoff == ' ') newoff++; \ 803 if(newoff >= v + len) break; \ 806 if(strchr(v, ']')) break; \ 807 if(FmsIOReadLine(ctx, v)) break; \ 809 *values = (void*)data; \ 829 #undef READ_ARRAY_DATA 835 FmsIOGetString(FmsIOContext *ctx,
const char *path,
const char **value) {
842 if(FmsIOReadKeyValue(ctx, k, v))
851 FmsInt idx = ctx->temp_strings_size++;
852 if(ctx->temp_strings_size >= ctx->temp_strings_cap) {
853 ctx->temp_strings_cap *= 2;
854 ctx->temp_strings = realloc(ctx->temp_strings,
855 sizeof(
char*) * ctx->temp_strings_cap);
857 ctx->temp_strings[idx] = malloc(
sizeof(
char) * len+1);
858 memcpy(ctx->temp_strings[idx], v, len);
859 ctx->temp_strings[idx][len] =
'\0';
860 *value = (
const char *)ctx->temp_strings[idx];
867 FmsIOGetStringArray(FmsIOContext *ctx,
const char *path,
const char ***values,
878 FmsIOContextInitialize(FmsIOContext *ctx) {
880 ctx->temp_strings_size = 0;
881 ctx->temp_strings_cap = 64;
882 ctx->temp_strings = calloc(
sizeof(
char*), ctx->temp_strings_cap);
891 FmsIOFunctionsInitialize(FmsIOFunctions *obj) {
893 obj->open = FmsIOOpen;
894 obj->close = FmsIOClose;
895 obj->add_int = FmsIOAddInt;
896 obj->add_int_array = FmsIOAddIntArray;
897 obj->add_typed_int_array = FmsIOAddTypedIntArray;
898 obj->add_float = FmsIOAddFloat;
899 obj->add_double = FmsIOAddDouble;
900 obj->add_scalar_array = FmsIOAddScalarArray;
901 obj->add_string = FmsIOAddString;
903 obj->has_path = FmsIOHasPath;
904 obj->get_int = FmsIOGetInt;
905 obj->get_typed_int_array = FmsIOGetTypedIntArray;
906 obj->get_scalar_array = FmsIOGetScalarArray;
907 obj->get_string = FmsIOGetString;
914 #ifdef FMS_HAVE_CONDUIT 916 FmsIOOpenConduit(FmsIOContext *ctx,
const char *filename,
const char *mode) {
920 ctx->filename = strdup(filename);
921 ctx->root = conduit_node_create();
922 ctx->writing = (strstr(mode,
"w") != NULL) ? 1 : 0;
926 conduit_relay_io_load(filename, ctx->protocol, NULL, ctx->root);
933 FmsIOCloseConduit(FmsIOContext *ctx) {
938 conduit_relay_io_save(ctx->root, ctx->filename, ctx->protocol, NULL);
942 ctx->filename = NULL;
944 ctx->protocol = NULL;
945 conduit_node_destroy(ctx->root);
951 FmsIOHasPathConduit(FmsIOContext *ctx,
const char *path) {
954 return conduit_node_has_path(ctx->root, path);
958 FmsIOAddIntConduit(FmsIOContext *ctx,
const char *path,
FmsInt value) {
962 conduit_node_set_path_uint64(ctx->root, path, value);
967 FmsIOAddIntArrayConduit(FmsIOContext *ctx,
const char *path,
972 char *ksize = join_keys(path,
"Size");
973 conduit_node_set_path_uint64(ctx->root, ksize, n);
976 char *ktype = join_keys(path,
"Type");
980 if(!values || n == 0)
983 char *kvalues = join_keys(path,
"Values");
984 conduit_node_set_path_uint64_ptr(ctx->root, kvalues, (
FmsInt *)values, n);
990 FmsIOAddTypedIntArrayConduit(FmsIOContext *ctx,
const char *path,
996 char *ksize = join_keys(path,
"Size");
997 conduit_node_set_path_uint64(ctx->root, ksize, n);
1000 char *ktype = join_keys(path,
"Type");
1001 conduit_node_set_path_char8_str(ctx->root, ktype,
FmsIntTypeNames[type]);
1004 if(!values || n == 0)
1007 char *kvalues = join_keys(path,
"Values");
1010 conduit_node_set_path_int8_ptr(ctx->root, kvalues, (conduit_int8 *)values, n);
1013 conduit_node_set_path_int16_ptr(ctx->root, kvalues, (conduit_int16 *)values, n);
1016 conduit_node_set_path_int32_ptr(ctx->root, kvalues, (conduit_int32 *)values, n);
1019 conduit_node_set_path_int64_ptr(ctx->root, kvalues, (conduit_int64 *)values, n);
1022 conduit_node_set_path_uint8_ptr(ctx->root, kvalues, (conduit_uint8 *)values, n);
1025 conduit_node_set_path_uint16_ptr(ctx->root, kvalues, (conduit_uint16 *)values,
1029 conduit_node_set_path_uint32_ptr(ctx->root, kvalues, (conduit_uint32 *)values,
1033 conduit_node_set_path_uint64_ptr(ctx->root, kvalues, (conduit_uint64 *)values,
1046 FmsIOAddFloatConduit(FmsIOContext *ctx,
const char *path,
float value) {
1049 conduit_node_set_path_float(ctx->root, path, value);
1054 FmsIOAddDoubleConduit(FmsIOContext *ctx,
const char *path,
double value) {
1057 conduit_node_set_path_double(ctx->root, path, value);
1062 FmsIOAddScalarArrayConduit(FmsIOContext *ctx,
const char *path,
1067 char *ksize = join_keys(path,
"Size");
1068 conduit_node_set_path_uint64(ctx->root, ksize, size);
1071 char *ktype = join_keys(path,
"Type");
1075 if(!data || size == 0)
1078 char *kvalues = join_keys(path,
"Values");
1081 conduit_node_set_path_float32_ptr(ctx->root, kvalues, (conduit_float32 *)data,
1085 conduit_node_set_path_float64_ptr(ctx->root, kvalues, (conduit_float64 *)data,
1089 conduit_node_set_path_float32_ptr(ctx->root, kvalues, (conduit_float32 *)data,
1093 conduit_node_set_path_float64_ptr(ctx->root, kvalues, (conduit_float64 *)data,
1106 FmsIOAddStringConduit(FmsIOContext *ctx,
const char *path,
const char *value) {
1109 conduit_node_set_path_char8_str(ctx->root, path, value);
1122 FmsIOConduitNode2FmsInt(conduit_node *node,
FmsInt *value) {
1124 const conduit_datatype *dt = conduit_node_dtype(node);
1126 if(conduit_datatype_is_number(dt)) {
1127 if(conduit_datatype_is_char(dt))
1128 *value = (
FmsInt)conduit_node_as_char(node);
1129 else if(conduit_datatype_is_short(dt))
1130 *value = (
FmsInt)conduit_node_as_short(node);
1131 else if(conduit_datatype_is_int(dt))
1132 *value = (
FmsInt)conduit_node_as_int(node);
1133 else if(conduit_datatype_is_long(dt))
1134 *value = (
FmsInt)conduit_node_as_long(node);
1136 else if(conduit_datatype_is_unsigned_char(dt))
1137 *value = (
FmsInt)conduit_node_as_unsigned_char(node);
1138 else if(conduit_datatype_is_unsigned_short(dt))
1139 *value = (
FmsInt)conduit_node_as_unsigned_short(node);
1140 else if(conduit_datatype_is_unsigned_int(dt))
1141 *value = (
FmsInt)conduit_node_as_unsigned_int(node);
1142 else if(conduit_datatype_is_unsigned_long(dt))
1143 *value = (
FmsInt)conduit_node_as_unsigned_long(node);
1145 else if(conduit_datatype_is_int8(dt))
1146 *value = (
FmsInt)conduit_node_as_int8(node);
1147 else if(conduit_datatype_is_int16(dt))
1148 *value = (
FmsInt)conduit_node_as_int16(node);
1149 else if(conduit_datatype_is_int32(dt))
1150 *value = (
FmsInt)conduit_node_as_int32(node);
1151 else if(conduit_datatype_is_int64(dt))
1152 *value = (
FmsInt)conduit_node_as_int64(node);
1154 else if(conduit_datatype_is_uint8(dt))
1155 *value = (
FmsInt)conduit_node_as_uint8(node);
1156 else if(conduit_datatype_is_uint16(dt))
1157 *value = (
FmsInt)conduit_node_as_uint16(node);
1158 else if(conduit_datatype_is_uint32(dt))
1159 *value = (
FmsInt)conduit_node_as_uint32(node);
1160 else if(conduit_datatype_is_uint64(dt))
1161 *value = (
FmsInt)conduit_node_as_uint64(node);
1164 else if(conduit_datatype_is_float(dt))
1165 *value = (
FmsInt)conduit_node_as_float(node);
1166 else if(conduit_datatype_is_double(dt))
1167 *value = (
FmsInt)conduit_node_as_double(node);
1168 else if(conduit_datatype_is_float32(dt))
1169 *value = (
FmsInt)conduit_node_as_float32(node);
1170 else if(conduit_datatype_is_float64(dt))
1171 *value = (
FmsInt)conduit_node_as_float64(node);
1173 else if(conduit_datatype_is_empty(dt)) {
1175 }
else if(conduit_datatype_is_object(dt)) {
1177 }
else if(conduit_datatype_is_list(dt)) {
1192 FmsIOGetIntConduit(FmsIOContext *ctx,
const char *path,
FmsInt *value) {
1193 conduit_node *node = NULL;
1198 if(!conduit_node_has_path(ctx->root, path))
1201 if((node = conduit_node_fetch(ctx->root, path)) != NULL) {
1202 retval = FmsIOConduitNode2FmsInt(node, value);
1209 FmsIOGetTypedIntArrayConduit(FmsIOContext *ctx,
const char *path,
1211 const conduit_datatype *dt = NULL;
1212 conduit_node *node = NULL, *size_node = NULL, *vnode = NULL;
1213 char *type_str = NULL;
1214 void *conduit_data_ptr = NULL;
1221 if(!conduit_node_has_path(ctx->root, path))
1224 if((node = conduit_node_fetch(ctx->root, path)) == NULL)
1228 if((size_node = conduit_node_fetch(node,
"Size")) == NULL)
1230 if(FmsIOConduitNode2FmsInt(size_node, n) != 0)
1233 if(!conduit_node_has_child(node,
"Type"))
1236 if((type_str = conduit_node_fetch_path_as_char8_str(node,
"Type")) == NULL)
1247 if(!conduit_node_has_child(node,
"Values"))
1250 if((vnode = conduit_node_fetch(node,
"Values")) == NULL)
1253 dt = conduit_node_dtype(vnode);
1254 conduit_data_ptr = conduit_node_element_ptr(vnode, 0);
1256 #define CASES(typename, T, format) \ 1258 CT *src = (CT*)conduit_data_ptr; \ 1259 T *dest = (T*)malloc(sizeof(T) * *n); \ 1260 for(FmsInt i = 0; i < *n; i++) { \ 1261 dest[i] = (T)src[i]; \ 1263 *values = (void*)dest; \ 1267 #define COPY_AND_CAST \ 1270 FOR_EACH_INT_TYPE(CASES) \ 1278 if(conduit_datatype_is_int8(dt)) {
1281 }
else if(conduit_datatype_is_int16(dt)) {
1284 }
else if(conduit_datatype_is_int32(dt)) {
1287 }
else if(conduit_datatype_is_int64(dt)) {
1290 }
else if(conduit_datatype_is_uint8(dt)) {
1293 }
else if(conduit_datatype_is_uint16(dt)) {
1294 typedef uint16_t CT;
1296 }
else if(conduit_datatype_is_uint32(dt)) {
1297 typedef uint32_t CT;
1299 }
else if(conduit_datatype_is_uint64(dt)) {
1300 typedef uint64_t CT;
1305 #undef COPY_AND_CAST 1312 FmsIOGetScalarArrayConduit(FmsIOContext *ctx,
const char *path,
1314 conduit_node *node = NULL, *values_node = NULL, *size_node = NULL;
1315 char *type_str = NULL;
1316 void *conduit_data_ptr = NULL;
1317 const conduit_datatype *dt = NULL;
1326 if((node = conduit_node_fetch(ctx->root, path)) == NULL)
1329 if((type_str = conduit_node_fetch_path_as_char8_str(node,
"Type")) == NULL)
1336 if((size_node = conduit_node_fetch(node,
"Size")) == NULL)
1338 if(FmsIOConduitNode2FmsInt(size_node, n))
1346 if(!conduit_node_has_child(node,
"Values"))
1349 values_node = conduit_node_fetch(node,
"Values");
1350 if(values_node == NULL)
1353 dt = conduit_node_dtype(values_node);
1362 if(conduit_datatype_is_double(dt) || conduit_datatype_is_float64(dt)) {
1367 if(conduit_datatype_is_float(dt) || conduit_datatype_is_float32(dt)) {
1373 conduit_data_ptr = conduit_node_element_ptr(values_node, 0);
1377 #define COPY_DATA(typename, T, format) \ 1380 void *dest = malloc(sizeof(T) * *n); \ 1381 memcpy(dest, conduit_data_ptr, sizeof(T) * *n); \ 1396 FmsIOGetStringConduit(FmsIOContext *ctx,
const char *path,
const char **value) {
1397 conduit_node *node = NULL;
1398 const conduit_datatype *dt = NULL;
1403 if(!conduit_node_has_path(ctx->root, path))
1406 if((node = conduit_node_fetch(ctx->root, path)) == NULL)
1409 dt = conduit_node_dtype(node);
1411 if(!conduit_datatype_is_char8_str(dt))
1414 *value = conduit_node_fetch_path_as_char8_str(ctx->root, path);
1420 FmsIOConduitInformation(
const char *msg,
const char *srcfile,
int line) {
1421 printf(
"Information: %s: %s: %d\n", msg, srcfile, line);
1425 FmsIOConduitWarning(
const char *msg,
const char *srcfile,
int line) {
1426 printf(
"Warning: %s: %s: %d\n", msg, srcfile, line);
1430 FmsIOConduitError(
const char *msg,
const char *srcfile,
int line) {
1431 printf(
"ERROR: \"%s\": \"%s\": %d\n", msg, srcfile, line);
1440 FmsIOContextInitializeConduit(FmsIOContext *ctx,
const char *protocol) {
1442 ctx->filename = NULL;
1446 size_t plen = strlen(protocol);
1447 char *plower = malloc(
sizeof(
char)*plen+1);
1448 FmsIOStringToLower(protocol, plen, plower);
1449 ctx->protocol = plower;
1452 conduit_utils_set_info_handler(FmsIOConduitInformation);
1453 conduit_utils_set_warning_handler(FmsIOConduitWarning);
1454 conduit_utils_set_error_handler(FmsIOConduitError);
1464 FmsIOFunctionsInitializeConduit(FmsIOFunctions *obj) {
1466 obj->open = FmsIOOpenConduit;
1467 obj->close = FmsIOCloseConduit;
1468 obj->add_int = FmsIOAddIntConduit;
1469 obj->add_int_array = FmsIOAddIntArrayConduit;
1470 obj->add_typed_int_array = FmsIOAddTypedIntArrayConduit;
1471 obj->add_float = FmsIOAddFloatConduit;
1472 obj->add_double = FmsIOAddDoubleConduit;
1473 obj->add_string = FmsIOAddStringConduit;
1474 obj->add_scalar_array = FmsIOAddScalarArrayConduit;
1476 obj->has_path = FmsIOHasPathConduit;
1477 obj->get_int = FmsIOGetIntConduit;
1478 obj->get_typed_int_array = FmsIOGetTypedIntArrayConduit;
1479 obj->get_scalar_array = FmsIOGetScalarArrayConduit;
1480 obj->get_string = FmsIOGetStringConduit;
1488 static int CheckProtocolSupportConduit(
const char *protocol) {
1489 if(!protocol)
return -1;
1491 size_t plen = strlen(protocol);
1497 FmsIOStringToLower(protocol, plen, plower);
1499 if(strcmp(
"ascii", plower) == 0)
1502 conduit_node *details = conduit_node_create();
1503 conduit_relay_io_about(details);
1505 if(conduit_node_has_child(details,
"protocols")) {
1506 conduit_node *protocols = conduit_node_fetch(details,
"protocols");
1507 conduit_index_t nchild = conduit_node_number_of_children(protocols);
1508 for(conduit_index_t i = 0; i < nchild; i++) {
1509 conduit_node *child = conduit_node_child(protocols, i);
1510 char *key = conduit_node_name(child);
1511 const char *value = conduit_node_as_char8_str(child);
1512 if(strcmp(
"enabled", value) == 0) {
1513 if(strcmp(plower, key) == 0) {
1523 conduit_node_destroy(details);
1543 FmsIOWriteFmsMetaData(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1556 char *kmdtype = join_keys(key,
"MetaDataType");
1562 char *kname = NULL, *kdata = NULL;
1563 const char *mdata_name = NULL;
1566 const void *data = NULL;
1571 kname = join_keys(key,
"Name");
1572 err = (*io->add_string)(ctx, kname, mdata_name);
1576 kdata = join_keys(key,
"Data");
1577 err = (*io->add_typed_int_array)(ctx, kdata, int_type, data, size);
1583 char *kname = NULL, *kdata = NULL;
1584 const char *mdata_name = NULL;
1587 const void *data = NULL;
1592 kname = join_keys(key,
"Name");
1593 err = (*io->add_string)(ctx, kname, mdata_name);
1597 kdata = join_keys(key,
"Data");
1598 err = (*io->add_scalar_array)(ctx, kdata, scalar_type, data, size);
1604 char *kname = NULL, *kdata = NULL;
1605 const char *mdata_name = NULL;
1606 const char *data = NULL;
1611 kname = join_keys(key,
"Name");
1612 err = (*io->add_string)(ctx, kname, mdata_name);
1616 kdata = join_keys(key,
"Data");
1617 err = (*io->add_string)(ctx, kdata, data);
1623 char *kname = NULL, *kdata = NULL, *ksize = NULL;
1624 const char *mdata_name = NULL;
1633 kname = join_keys(key,
"Name");
1634 err = (*io->add_string)(ctx, kname, mdata_name);
1638 ksize = join_keys(key,
"Size");
1639 err = (*io->add_int)(ctx, ksize, size);
1643 kdata = join_keys(key,
"Data");
1645 for(i = 0; i < size; i++) {
1646 char temp[20], *tk = NULL;
1647 sprintf(temp,
"%d", (
int)i);
1648 tk = join_keys(kdata, temp);
1649 err = FmsIOWriteFmsMetaData(ctx, io, tk, data[i]);
1667 FmsIOReadFmsMetaData(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1668 FmsIOMetaDataInfo *mdinfo) {
1673 char *kmdtype = join_keys(key,
"MetaDataType");
1674 const char *str = NULL;
1675 err = (*io->get_string)(ctx, kmdtype, &str);
1685 char *kname = join_keys(key,
"Name");
1686 err = (*io->get_string)(ctx, kname, &mdinfo->name);
1692 switch (mdinfo->mdtype) {
1695 char *kdata = join_keys(key,
"Data");
1696 err = (*io->get_typed_int_array)(ctx, kdata, &mdinfo->subtype.i_type,
1697 &mdinfo->data, &mdinfo->size);
1705 char *kdata = join_keys(key,
"Data");
1706 err = (*io->get_scalar_array)(ctx, kdata, &mdinfo->subtype.s_type,
1707 &mdinfo->data, &mdinfo->size);
1715 char *kdata = join_keys(key,
"Data");
1716 const char *md_str = NULL;
1717 err = (*io->get_string)(ctx, kdata, &md_str);
1720 if(err || FmsIOCopyString(md_str, (
char **)&mdinfo->data))
1727 FmsIOMetaDataInfo *mds = NULL;
1728 char *ksize = join_keys(key,
"Size"), *kdata = NULL;
1729 err = (*io->get_int)(ctx, ksize, &mdinfo->size);
1733 mdinfo->data = calloc(mdinfo->size,
sizeof(FmsIOMetaDataInfo));
1734 mds = (FmsIOMetaDataInfo *)mdinfo->data;
1735 kdata = join_keys(key,
"Data");
1736 for(i = 0; i < mdinfo->size; i++) {
1737 char temp[21], *ki = NULL;
1738 sprintf(temp,
FMS_LU, i);
1739 ki = join_keys(kdata, temp);
1740 err |= FmsIOReadFmsMetaData(ctx, io, ki, &mds[i]);
1754 FmsIOWriteFmsDomain(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1759 char *kdim = join_keys(key,
"Dimension");
1760 (io->add_int)(ctx, kdim, dim);
1766 char *knverts = join_keys(key,
"NumVertices");
1767 (io->add_int)(ctx, knverts, nverts);
1771 char *kentities = join_keys(key,
"Entities");
1778 sprintf(temp,
"%d", (
int)entries++);
1779 char *kentry = join_keys(kentities, temp);
1781 char *kenttype = join_keys(kentry,
"EntityType");
1782 (*io->add_string)(ctx, kenttype, enttype);
1785 char *kne = join_keys(kentry,
"NumEntities");
1786 (*io->add_int)(ctx, kne, nents);
1790 const void *ents = NULL;
1793 &idtype, &ents, &ne)) {
1807 (*io->add_typed_int_array)(ctx, kentry, idtype, ents, N);
1817 FmsIOReadFmsDomain(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1818 FmsIODomainInfo *dinfo) {
1825 char *kdom = join_keys(key,
"Dimension");
1826 err = (*io->get_int)(ctx, kdom, &dinfo->dim);
1834 char *knverts = join_keys(key,
"NumVertices");
1835 err = (*io->get_int)(ctx, knverts, &dinfo->nverts);
1842 char *kentities = join_keys(key,
"Entities");
1844 dinfo->entities = calloc(
sizeof(FmsIOEntityInfo), dinfo->dim);
1845 for(i = 0; i < dinfo->dim; i++) {
1846 char temp[21], *ke = NULL;
1847 sprintf(temp,
FMS_LU, i);
1848 ke = join_keys(kentities, temp);
1852 char *kent_type = join_keys(ke,
"EntityType");
1853 const char *ent_name = NULL;
1854 err = (*io->get_string)(ctx, kent_type, &ent_name);
1864 char *knents = join_keys(ke,
"NumEntities");
1865 err = (*io->get_int)(ctx, knents, &dinfo->entities[i].nents);
1872 err = (*io->get_typed_int_array)(ctx, ke, &dinfo->entities[i].type,
1873 &dinfo->entities[i].values, &dinfo->entities[i].size);
1884 FmsIOWriteDomains(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1886 const char *domname = NULL;
1894 char *kdname = join_keys(key,
"Name");
1895 (*io->add_string)(ctx, kdname, domname);
1898 char *knd = join_keys(key,
"NumDomains");
1899 (*io->add_int)(ctx, knd, ndoms);
1902 char *kdoms = join_keys(key,
"Domains");
1904 for(i = 0; i < ndoms; i++) {
1905 char tmp[20], *kd = NULL;
1906 sprintf(tmp,
"%d", (
int)i);
1907 kd = join_keys(kdoms, tmp);
1908 FmsIOWriteFmsDomain(ctx, io, kd, doms[i]);
1916 FmsIOReadFmsDomainName(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1917 FmsIODomainNameInfo *dinfo) {
1924 char *kdname = join_keys(key,
"Name");
1925 err = (*io->get_string)(ctx, kdname, &dinfo->name);
1933 char *kndoms = join_keys(key,
"NumDomains");
1934 err = (*io->get_int)(ctx, kndoms, &dinfo->ndomains);
1941 if(dinfo->ndomains) {
1942 char *kdoms = join_keys(key,
"Domains");
1944 dinfo->domains = calloc(
sizeof(FmsIODomainInfo), dinfo->ndomains);
1945 for(i = 0; i < dinfo->ndomains; i++) {
1946 char temp[21], *kd = NULL;
1947 sprintf(temp,
FMS_LU, i);
1948 kd = join_keys(kdoms, temp);
1949 err |= FmsIOReadFmsDomain(ctx, io, kd, &dinfo->domains[i]);
1968 FmsIOWriteComponent(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
1970 const char *comp_name = NULL;
1973 char *kcomp_name = join_keys(key,
"Name");
1974 (*io->add_string)(ctx, kcomp_name, comp_name);
1980 char *kdim = join_keys(key,
"Dimension");
1981 (*io->add_int)(ctx, kdim, dim);
1987 char *knents = join_keys(key,
"NumEntities");
1988 (*io->add_int)(ctx, knents, nents);
1996 const char *coords_name = NULL;
1998 char *kcoords_name = join_keys(key,
"Coordinates");
1999 (*io->add_string)(ctx, kcoords_name, coords_name);
2006 char *knparts = join_keys(key,
"NumParts");
2007 (*io->add_int)(ctx, knparts, nparts);
2010 char *kparts = join_keys(key,
"Parts");
2012 for(i = 0; i < nparts; i++) {
2013 char temp[20], *kpart;
2014 sprintf(temp,
"%d", (
int)i);
2015 kpart = join_keys(kparts, temp);
2021 const char *domain_name = NULL;
2026 char *kdomain_name = join_keys(kpart,
"DomainName");
2027 (*io->add_string)(ctx, kdomain_name, domain_name);
2030 char *kdid = join_keys(kpart,
"DomainID");
2031 (*io->add_int)(ctx, kdid, did);
2044 NULL, &ent_id_type, &ents, NULL, &nents))
2051 char *kenttype = join_keys(kpart,
"PartEntityType");
2052 (*io->add_string)(ctx, kenttype, enttype);
2055 char *k = join_keys(kpart, enttype);
2057 char *knents = join_keys(k,
"NumEntities");
2058 (*io->add_int)(ctx, knents, nents);
2061 (*io->add_typed_int_array)(ctx, k, ent_id_type, ents, nents);
2067 char *kfull_domain = join_keys(kpart,
"FullDomain");
2068 (*io->add_string)(ctx, kfull_domain,
"Yes");
2075 const FmsInt *rel_comps = NULL;
2081 char *krelations = join_keys(key,
"Relations");
2082 (*io->add_int_array)(ctx, krelations, rel_comps, nrelcomps);
2089 FmsIOReadFmsComponent(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2090 FmsIOComponentInfo *comp_info) {
2096 char *kcomp_name = join_keys(key,
"Name");
2097 err = (*io->get_string)(ctx, kcomp_name, &comp_info->name);
2105 char *kcomp_dim = join_keys(key,
"Dimension");
2106 err = (*io->get_int)(ctx, kcomp_dim, &comp_info->dim);
2113 char *knents = join_keys(key,
"NumEntities");
2114 err = (*io->get_int)(ctx, knents, &comp_info->nents);
2122 char *kcoords = join_keys(key,
"Coordinates");
2123 if((*io->has_path)(ctx, kcoords))
2124 err = (*io->get_string)(ctx, kcoords, &comp_info->coordinates_name);
2131 char *knparts = join_keys(key,
"NumParts");
2132 err = (*io->get_int)(ctx, knparts, &comp_info->nparts);
2139 if(comp_info->nparts) {
2140 char *kparts = join_keys(key,
"Parts");
2142 comp_info->parts = calloc(
sizeof(FmsIOComponentPartInfo), comp_info->nparts);
2143 for(i = 0; i < comp_info->nparts; i++) {
2144 char temp[21], *kpart = NULL;
2145 sprintf(temp,
FMS_LU, i);
2146 kpart = join_keys(kparts, temp);
2150 char *kdom_name = join_keys(kpart,
"DomainName");
2151 err = (*io->get_string)(ctx, kdom_name, &comp_info->parts[i].domain_name);
2159 char *kdid = join_keys(kpart,
"DomainID");
2160 err = (*io->get_int)(ctx, kdid, &comp_info->parts[i].domain_id);
2168 char *kfulldomain = join_keys(kpart,
"FullDomain");
2169 if((*io->has_path)(ctx, kfulldomain)) {
2170 const char *isfulldomain = NULL;
2171 err = (*io->get_string)(ctx, kfulldomain, &isfulldomain);
2175 if(strcmp(
"Yes", isfulldomain) == 0) {
2176 comp_info->parts[i].full_domain = 1;
2181 comp_info->parts[i].full_domain = 0;
2187 char *kentity = join_keys(kpart,
"PartEntityType");
2188 const char *str = NULL;
2189 err = (io->get_string)(ctx, kentity, &str);
2200 if((*io->has_path)(ctx, k)) {
2202 comp_info->parts[i].entities[et].ent_type = (
FmsEntityType)et;
2206 char *knents = join_keys(k,
"NumEntities");
2207 err = (*io->get_int)(ctx, knents, &comp_info->parts[i].entities[et].nents);
2211 err |= (*io->get_typed_int_array)(ctx, k,
2212 &comp_info->parts[i].entities[et].type,
2213 &comp_info->parts[i].entities[et].values,
2214 &comp_info->parts[i].entities[et].size);
2227 char *krelcomps = join_keys(key,
"Relations");
2228 if((*io->has_path)(ctx, krelcomps)) {
2229 err = (*io->get_typed_int_array)(ctx, krelcomps, &comp_info->relation_type,
2230 (
void*)&comp_info->relation_values, &comp_info->relation_size);
2252 FmsIOWriteTag(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2254 const char *tag_name = NULL;
2257 char *ktag_name = join_keys(key,
"TagName");
2258 (*io->add_string)(ctx, ktag_name, tag_name);
2264 const char *comp_name = NULL;
2267 char *kcomp = join_keys(key,
"Component");
2268 (*io->add_string)(ctx, kcomp, comp_name);
2272 const void *ent_tags = NULL;
2274 if(
FmsTagGet(tag, &tag_type, &ent_tags, &ntags))
2277 (*io->add_typed_int_array)(ctx, key, tag_type, ent_tags, ntags);
2279 const void *tagvalues = NULL;
2280 const char *
const *descriptions = NULL;
2284 char *kdescriptions = join_keys(key,
"Descriptions");
2286 char *kdescriptions_size = join_keys(kdescriptions,
"Size");
2287 (*io->add_int)(ctx, kdescriptions_size, ntags);
2288 FREE(kdescriptions_size);
2291 for(i = 0; i < ntags; i++) {
2293 sprintf(temp,
FMS_LU, i);
2294 kd = join_keys(kdescriptions, temp);
2297 char *kv = join_keys(kd,
"Value");
2300 #define CASES(typename, T, format) \ 2303 T *vs = (T*)tagvalues; \ 2304 (*io->add_int)(ctx, kv, (FmsInt)vs[i]); \ 2317 char *kdstring = join_keys(kd,
"Description");
2318 (*io->add_string)(ctx, kdstring, descriptions[i]);
2323 FREE(kdescriptions);
2328 FmsIOReadFmsTag(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2329 FmsIOTagInfo *tinfo) {
2335 char *ktag_name = join_keys(key,
"TagName");
2336 err = (*io->get_string)(ctx, ktag_name, &tinfo->name);
2343 char *kcomp_name = join_keys(key,
"Component");
2344 err = (*io->get_string)(ctx, kcomp_name, &tinfo->comp_name);
2350 err = (*io->get_typed_int_array)(ctx, key, &tinfo->type, &tinfo->values,
2355 char *kdescriptions = join_keys(key,
"Descriptions");
2356 if((*io->has_path)(ctx, kdescriptions)) {
2360 char *kdesc_size = join_keys(kdescriptions,
"Size");
2361 err = (*io->get_int)(ctx, kdesc_size, &tinfo->descr_size);
2365 tinfo->tag_values = calloc(
sizeof(
FmsInt), tinfo->descr_size);
2366 tinfo->descriptions = calloc(
sizeof(
char*), tinfo->descr_size);
2367 for(i = 0; i < tinfo->descr_size; i++) {
2368 char temp[21], *ki = NULL, *kv = NULL, *kd = NULL;
2369 sprintf(temp,
FMS_LU, i);
2370 ki = join_keys(kdescriptions, temp);
2373 kv = join_keys(ki,
"Value");
2374 err |= (*io->get_int)(ctx, kv, &tinfo->tag_values[i]);
2377 kd = join_keys(ki,
"Description");
2378 err |= (*io->get_string)(ctx, kd, &tinfo->descriptions[i]);
2383 FREE(kdescriptions);
2400 FmsIOWriteFmsMesh(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2407 char *kpinfo = join_keys(key,
"PartitionInfo");
2408 (*io->add_int_array)(ctx, kpinfo, pinfo, 2);
2415 char *kndnames = join_keys(key,
"NumDomainNames");
2416 (*io->add_int)(ctx, kndnames, ndnames);
2422 char *kncomps = join_keys(key,
"NumComponents");
2423 (*io->add_int)(ctx, kncomps, ncomps);
2429 char *kntags = join_keys(key,
"NumTags");
2430 (*io->add_int)(ctx, kntags, ntags);
2433 char *kdom_names = join_keys(key,
"DomainNames");
2435 for(i = 0; i < ndnames; i++) {
2436 char tmp[20], *dk = NULL;
2437 sprintf(tmp,
"%d", (
int)i);
2438 dk = join_keys(kdom_names, tmp);
2439 FmsIOWriteDomains(ctx, io, dk, mesh, i);
2444 char *kcomps = join_keys(key,
"Components");
2445 for(i = 0; i < ncomps; i++) {
2446 char tmp[20], *kc = NULL;
2454 sprintf(tmp,
"%d", (
int)i);
2455 kc = join_keys(kcomps, tmp);
2456 FmsIOWriteComponent(ctx, io, kc, comp);
2461 char *ktags = join_keys(key,
"Tags");
2462 for(i = 0; i < ntags; i++) {
2468 sprintf(tmp,
"%d", (
int)i);
2469 kt = join_keys(ktags, tmp);
2470 FmsIOWriteTag(ctx, io, kt, t);
2479 FmsIOReadFmsMesh(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2480 FmsIOMeshInfo *mesh_info) {
2487 char *kpinfo = join_keys(key,
"PartitionInfo");
2490 err = (*io->get_typed_int_array)(ctx, kpinfo, &type,
2491 (
void*)&mesh_info->partition_info, &n);
2499 char *kndnames = join_keys(key,
"NumDomainNames");
2500 err = (*io->get_int)(ctx, kndnames, &mesh_info->ndomain_names);
2508 char *kncomps = join_keys(key,
"NumComponents");
2509 err = (*io->get_int)(ctx, kncomps, &mesh_info->ncomponents);
2517 char *kntags = join_keys(key,
"NumTags");
2518 err = (*io->get_int)(ctx, kntags, &mesh_info->ntags);
2525 if(mesh_info->ndomain_names) {
2526 char *kdom_names = join_keys(key,
"DomainNames");
2527 mesh_info->domain_names = calloc(
sizeof(FmsIODomainNameInfo),
2528 mesh_info->ndomain_names);
2529 for(i = 0; i < mesh_info->ndomain_names; i++) {
2530 char temp[21], *dk = NULL;
2531 sprintf(temp,
FMS_LU, i);
2532 dk = join_keys(kdom_names, temp);
2533 err |= FmsIOReadFmsDomainName(ctx, io, dk, &mesh_info->domain_names[i]);
2542 if(mesh_info->ncomponents) {
2543 char *kcomps = join_keys(key,
"Components");
2544 mesh_info->components = calloc(
sizeof(FmsIOComponentInfo),
2545 mesh_info->ncomponents);
2546 for(i = 0; i < mesh_info->ncomponents; i++) {
2547 char temp[21], *kc = NULL;
2548 sprintf(temp,
FMS_LU, i);
2549 kc = join_keys(kcomps, temp);
2550 err |= FmsIOReadFmsComponent(ctx, io, kc, &mesh_info->components[i]);
2559 if(mesh_info->ntags) {
2560 char *ktags = join_keys(key,
"Tags");
2561 mesh_info->tags = calloc(
sizeof(FmsIOTagInfo), mesh_info->ntags);
2562 for(i = 0; i < mesh_info->ntags; i++) {
2563 char temp[21], *kt = NULL;
2564 sprintf(temp,
FMS_LU, i);
2565 kt = join_keys(ktags, temp);
2566 err |= FmsIOReadFmsTag(ctx, io, kt, &mesh_info->tags[i]);
2585 FmsIOWriteFmsFieldDescriptor(FmsIOContext *ctx, FmsIOFunctions *io,
2589 const char *fd_name = NULL;
2593 char *key_name = join_keys(key,
"Name");
2594 (*io->add_string)(ctx, key_name, fd_name);
2606 const char *fc_name = NULL;
2610 char *key_fc_name = join_keys(key,
"ComponentName");
2611 (*io->add_string)(ctx, key_fc_name, fc_name);
2620 char *kfd_type = join_keys(key,
"Type");
2621 (*io->add_int)(ctx, kfd_type, (
int)fd_type);
2630 fo[0] = (
FmsInt)field_type; fo[1] = (
FmsInt)basis_type;
2632 char *kfield_type = join_keys(key,
"FixedOrder");
2633 (*io->add_int_array)(ctx, kfield_type, fo, 3);
2641 char *kndofs = join_keys(key,
"NumDofs");
2642 (*io->add_int)(ctx, kndofs, ndofs);
2648 FmsIOReadFmsFieldDescriptor(FmsIOContext *ctx, FmsIOFunctions *io,
2649 const char *key, FmsIOFieldDescriptorInfo *fd_info) {
2654 char *kfd_name = join_keys(key,
"Name");
2655 err = (*io->get_string)(ctx, kfd_name, &fd_info->name);
2663 char *kcomp_name = join_keys(key,
"ComponentName");
2664 err = (*io->get_string)(ctx, kcomp_name, &fd_info->component_name);
2672 char *kfd_type = join_keys(key,
"Type");
2674 err = (*io->get_int)(ctx, kfd_type, &fdt);
2684 char *kfo = join_keys(key,
"FixedOrder");
2687 err = (*io->get_typed_int_array)(ctx, kfo, &type, (
void*)&fd_info->fixed_order,
2697 char *kndofs = join_keys(key,
"NumDofs");
2698 err = (*io->get_int)(ctx, kndofs, &fd_info->num_dofs);
2716 FmsIOWriteFmsField(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2718 const char *field_name;
2722 char *kfield_name = join_keys(key,
"Name");
2723 (*io->add_string)(ctx, kfield_name, field_name);
2730 if(
FmsFieldGet(field, &fd, &num_vec_comp, <, &dt, &data))
2733 char *klt = join_keys(key,
"LayoutType");
2734 (*io->add_int)(ctx, klt, (
FmsInt)lt);
2737 char *knc = join_keys(key,
"NumberOfVectorComponents");
2738 (*io->add_int)(ctx, knc, num_vec_comp);
2744 const char *fdname = NULL;
2747 char *kfdname = join_keys(key,
"FieldDescriptorName");
2748 (*io->add_string)(ctx, kfdname, fdname);
2755 char *kdata = join_keys(key,
"Data");
2756 (*io->add_scalar_array)(ctx, kdata, dt, data, num_vec_comp * ndofs);
2764 char *kmd = join_keys(key,
"MetaData");
2765 FmsIOWriteFmsMetaData(ctx, io, kmd, md);
2773 FmsIOReadFmsField(FmsIOContext *ctx, FmsIOFunctions *io,
const char *key,
2774 FmsIOFieldInfo *field_info) {
2779 char *kfield_name = join_keys(key,
"Name");
2780 err = (*io->get_string)(ctx, kfield_name, &field_info->name);
2788 char *klt = join_keys(key,
"LayoutType");
2790 err = (*io->get_int)(ctx, klt, <);
2799 char *knum_vec_comps = join_keys(key,
"NumberOfVectorComponents");
2800 err = (*io->get_int)(ctx, knum_vec_comps, &field_info->num_vec_comps);
2801 FREE(knum_vec_comps);
2808 char *kfd_name = join_keys(key,
"FieldDescriptorName");
2809 err = (*io->get_string)(ctx, kfd_name, &field_info->fd_name);
2817 char *kdata = join_keys(key,
"Data");
2818 err = (*io->get_scalar_array)(ctx, kdata, &field_info->data_type,
2819 &field_info->data, &field_info->data_size);
2827 char *kmd = join_keys(key,
"MetaData");
2828 if((*io->has_path)(ctx, kmd)) {
2829 field_info->md = calloc(
sizeof(FmsIOMetaDataInfo), 1);
2830 err = FmsIOReadFmsMetaData(ctx, io, kmd, field_info->md);
2848 FmsIOWriteFmsDataCollection(FmsIOContext *ctx, FmsIOFunctions *io,
2856 FmsInt num_fds = 0, num_fields = 0;
2858 const char *name = NULL;
2862 char *n_key = join_keys(key,
"Name");
2863 err = (*io->add_string)(ctx, n_key, name);
2870 char *fd_key = NULL, *nfds_key = NULL;
2872 nfds_key = join_keys(key,
"NumberOfFieldDescriptors");
2873 if((*io->add_int)(ctx, nfds_key, num_fds) != 0) {
2879 fd_key = join_keys(key,
"FieldDescriptors");
2880 for(i = 0; i < num_fds && err == 0; ++i) {
2881 char tmp[20], *fdi_key = NULL;
2882 sprintf(tmp,
"%d", (
int)i);
2883 fdi_key = join_keys(fd_key, tmp);
2886 err = FmsIOWriteFmsFieldDescriptor(ctx, io, fdi_key, fds[i]);
2899 char *f_key = NULL, *nfs_key = NULL;
2900 nfs_key = join_keys(key,
"NumberOfFields");
2901 if((*io->add_int)(ctx, nfs_key, num_fields) != 0) {
2907 f_key = join_keys(key,
"Fields");
2908 for(i = 0; i < num_fields && err == 0; ++i) {
2909 char tmp[20], *fi_key = NULL;
2910 sprintf(tmp,
"%d", (
int)i);
2911 fi_key = join_keys(f_key, tmp);
2913 err = FmsIOWriteFmsField(ctx, io, fi_key, fields[i]);
2926 char *m_key = join_keys(key,
"Mesh");
2927 err = FmsIOWriteFmsMesh(ctx, io, m_key, mesh);
2937 char *md_key = join_keys(key,
"MetaData");
2938 err = FmsIOWriteFmsMetaData(ctx, io, md_key, md);
2951 FmsIOReadFmsDataCollection(FmsIOContext *ctx, FmsIOFunctions *io,
2953 FmsIODataCollectionInfo *data_collection) {
2962 data_collection->name = NULL;
2964 char *kname = join_keys(key,
"Name");
2965 err = (*io->get_string)(ctx, kname, &data_collection->name);
2971 if(!data_collection->name)
2975 data_collection->nfds = 0;
2976 data_collection->fds = NULL;
2978 char *knfds = join_keys(key,
"NumberOfFieldDescriptors");
2979 err = (*io->get_int)(ctx, knfds, &data_collection->nfds);
2985 if(data_collection->nfds) {
2986 char *kfds = join_keys(key,
"FieldDescriptors");
2987 data_collection->fds = calloc(
sizeof(FmsIOFieldDescriptorInfo),
2988 data_collection->nfds);
2990 for(i = 0; i < data_collection->nfds; i++) {
2991 char tmp[20], *kfdi = NULL;
2992 sprintf(tmp,
"%d", (
int)i);
2993 kfdi = join_keys(kfds, tmp);
2994 err |= FmsIOReadFmsFieldDescriptor(ctx, io, kfdi, &data_collection->fds[i]);
3004 data_collection->nfields = 0;
3005 data_collection->fields = NULL;
3007 char *knfs = join_keys(key,
"NumberOfFields");
3008 err = (*io->get_int)(ctx, knfs, &data_collection->nfields);
3014 if(data_collection->nfields) {
3015 char *kfs = join_keys(key,
"Fields");
3016 data_collection->fields = calloc(
sizeof(FmsIOFieldInfo),
3017 data_collection->nfields);
3019 for(i = 0; i < data_collection->nfields; i++) {
3020 char tmp[20], *kfi = NULL;
3021 sprintf(tmp,
"%d", (
int)i);
3022 kfi = join_keys(kfs, tmp);
3023 err |= FmsIOReadFmsField(ctx, io, kfi, &data_collection->fields[i]);
3033 data_collection->mesh_info = NULL;
3035 char *kmesh = join_keys(key,
"Mesh");
3036 data_collection->mesh_info = calloc(
sizeof(FmsIOMeshInfo), 1);
3037 err = FmsIOReadFmsMesh(ctx, io, kmesh, data_collection->mesh_info);
3045 data_collection->md = NULL;
3047 char *kmd = join_keys(key,
"MetaData");
3048 if((*io->has_path)(ctx, kmd)) {
3049 data_collection->md = calloc(
sizeof(FmsIOMetaDataInfo), 1);
3050 if(data_collection->md)
3051 err = FmsIOReadFmsMetaData(ctx, io, kmd, data_collection->md);
3062 FmsIOBuildFmsMetaData(
FmsMetaData md, FmsIOMetaDataInfo *minfo) {
3065 switch(minfo->mdtype) {
3071 memcpy(data, minfo->data,
3082 memcpy(data, minfo->data,
3095 FmsIOMetaDataInfo *mds = (FmsIOMetaDataInfo*)minfo->data;
3098 for(i = 0; i < minfo->size; ++i)
3099 FmsIOBuildFmsMetaData(child[i], &mds[i]);
3113 FmsIOBuildFmsDataCollection(FmsIODataCollectionInfo *dc_info,
3117 if(!dc_info->mesh_info)
3125 const FmsInt ndomnames = dc_info->mesh_info->ndomain_names;
3128 for(i = 0; i < ndomnames; i++) {
3130 FmsInt ndoms = dc_info->mesh_info->domain_names[i].ndomains;
3132 FmsMeshAddDomains(mesh, dc_info->mesh_info->domain_names[i].name, ndoms, &doms);
3133 for(j = 0; j < ndoms; j++) {
3135 FmsIODomainInfo *dinfo = &dc_info->mesh_info->domain_names[i].domains[j];
3136 const FmsInt dim = dinfo->dim;
3138 for(k = 0; k < dim; k++) {
3139 FmsIOEntityInfo *einfo = &dinfo->entities[k];
3149 const FmsInt ncomponents = dc_info->mesh_info->ncomponents;
3152 for(i = 0; i < ncomponents; i++) {
3154 FmsIOComponentInfo *comp_info = &dc_info->mesh_info->components[i];
3157 const FmsInt nparts = comp_info->nparts;
3159 for(j = 0; j < nparts; j++) {
3160 FmsIOComponentPartInfo *pinfo = &comp_info->parts[j];
3166 if(pinfo->full_domain) {
3172 FmsIOEntityInfo *einfo = &pinfo->entities[pinfo->part_ent_type];
3174 einfo->type, einfo->type,
FMS_INT32, NULL, einfo->values, NULL, einfo->nents);
3176 for(k = 0; k < einfo->ent_type; k++) {
3177 FmsIOEntityInfo *seinfo = &pinfo->entities[k];
3178 if(!seinfo->nents)
continue;
3180 seinfo->type, seinfo->values, seinfo->nents);
3185 const FmsInt nrelations = comp_info->relation_size;
3188 for(j = 0; j < nrelations; j++) {
3196 const FmsInt ntags = dc_info->mesh_info->ntags;
3199 for(i = 0; i < ntags; i++) {
3200 FmsIOTagInfo *tinfo = &dc_info->mesh_info->tags[i];
3205 for(j = 0; j < ncomponents; j++) {
3207 const char *comp_name = NULL;
3210 if(strcmp(comp_name, tinfo->comp_name) == 0) {
3215 FmsTagSet(tag, tinfo->type, tinfo->type, tinfo->values, tinfo->size);
3216 if(tinfo->descr_size) {
3231 const FmsInt nfds = dc_info->nfds;
3234 for(i = 0; i < nfds; i++) {
3235 FmsIOFieldDescriptorInfo *fd_info = &dc_info->fds[i];
3240 for(j = 0; j < ncomponents; j++) {
3241 const char *comp_name = NULL;
3245 if(strcmp(comp_name, fd_info->component_name) == 0) {
3252 fd_info->fixed_order[2]);
3257 const FmsInt nfields = dc_info->nfields;
3260 for(i = 0; i < nfields; i++) {
3261 FmsIOFieldInfo *finfo = &dc_info->fields[i];
3268 for(j = 0; j < nfds; j++) {
3269 const char *fd_name = NULL;
3272 if(strcmp(fd_name, finfo->fd_name) == 0) {
3273 FmsFieldSet(field, fd, finfo->num_vec_comps, finfo->layout, finfo->data_type,
3280 FmsIOBuildFmsMetaData(md, finfo->md);
3288 for(i = 0; i < ncomponents; i++) {
3289 FmsIOComponentInfo *cinfo = &dc_info->mesh_info->components[i];
3291 if(!cinfo->coordinates_name)
3299 for(j = 0; j < nfields; j++) {
3301 const char *field_name = NULL;
3303 if(strcmp(field_name, cinfo->coordinates_name) == 0) {
3315 err = FmsIOBuildFmsMetaData(md, dc_info->md);
3323 FmsIODestroyFmsIOMetaDataInfo(FmsIOMetaDataInfo *minfo) {
3325 switch(minfo->mdtype) {
3336 FmsIOMetaDataInfo *mds = (FmsIOMetaDataInfo*)minfo->data;
3337 for(
FmsInt i = 0; i < minfo->size; i++) {
3338 FmsIODestroyFmsIOMetaDataInfo(&mds[i]);
3353 FmsIOConstructFmsIODataCollectionInfo(FmsIODataCollectionInfo **dc_info) {
3355 *dc_info = calloc(
sizeof(FmsIODataCollectionInfo), 1);
3361 FmsIODestroyFmsIODataCollectionInfo(FmsIODataCollectionInfo *dc_info) {
3365 const FmsInt ndomnames = dc_info->mesh_info->ndomain_names;
3368 for(i = 0; i < ndomnames; i++) {
3370 FmsInt ndoms = dc_info->mesh_info->domain_names[i].ndomains;
3371 for(j = 0; j < ndoms; j++) {
3373 FmsIODomainInfo *dinfo = &dc_info->mesh_info->domain_names[i].domains[j];
3374 const FmsInt dim = dinfo->dim;
3375 for(k = 0; k < dim; k++) {
3376 FmsIOEntityInfo *einfo = &dinfo->entities[k];
3377 FREE(einfo->values);
3380 FREE(dinfo->entities);
3382 FREE(dc_info->mesh_info->domain_names[i].domains);
3384 FREE(dc_info->mesh_info->domain_names);
3388 const FmsInt ncomponents = dc_info->mesh_info->ncomponents;
3391 for(i = 0; i < ncomponents; i++) {
3392 FmsIOComponentInfo *comp_info = &dc_info->mesh_info->components[i];
3393 const FmsInt nparts = comp_info->nparts;
3395 for(j = 0; j < nparts; j++) {
3396 FmsIOComponentPartInfo *pinfo = &comp_info->parts[j];
3399 if(pinfo->entities[k].nents)
3400 FREE(pinfo->entities[k].values);
3403 FREE(comp_info->parts);
3405 const FmsInt nrelations = comp_info->relation_size;
3407 FREE(comp_info->relation_values);
3410 FREE(dc_info->mesh_info->components);
3414 const FmsInt ntags = dc_info->mesh_info->ntags;
3417 for(i = 0; i < ntags; i++) {
3418 FmsIOTagInfo *tinfo = &dc_info->mesh_info->tags[i];
3419 FREE(tinfo->values);
3420 FREE(tinfo->tag_values);
3421 FREE(tinfo->descriptions);
3423 FREE(dc_info->mesh_info->tags);
3426 FREE(dc_info->mesh_info->partition_info);
3427 FREE(dc_info->mesh_info);
3430 const FmsInt nfds = dc_info->nfds;
3433 for(i = 0; i < nfds; i++) {
3434 FmsIOFieldDescriptorInfo *fd_info = &dc_info->fds[i];
3435 FREE(fd_info->fixed_order);
3440 const FmsInt nfields = dc_info->nfields;
3443 for(i = 0; i < nfields; i++) {
3444 FmsIOFieldInfo *finfo = &dc_info->fields[i];
3447 FmsIODestroyFmsIOMetaDataInfo(finfo->md);
3451 FREE(dc_info->fields);
3456 FmsIODestroyFmsIOMetaDataInfo(dc_info->md);
3476 if(protocol == NULL) protocol =
"ascii";
3479 #ifdef FMS_HAVE_CONDUIT 3480 int isSupported = CheckProtocolSupportConduit(protocol);
3481 if(isSupported == 1) {
3482 FmsIOContextInitializeConduit(&ctx, protocol);
3483 FmsIOFunctionsInitializeConduit(&io);
3484 }
else if(isSupported == 2) {
3485 FmsIOContextInitialize(&ctx);
3486 FmsIOFunctionsInitialize(&io);
3487 }
else if(isSupported == 0) {
3494 FmsIOContextInitialize(&ctx);
3495 FmsIOFunctionsInitialize(&io);
3499 if((*io.open)(&ctx, filename,
"wt") == 0) {
3501 const FmsInt fms_format_version = 100;
3502 if((*io.add_int)(&ctx,
"FMS", fms_format_version) != 0) {
3508 if(FmsIOWriteFmsDataCollection(&ctx, &io,
"DataCollection", dc) != 0) {
3514 if((*io.close)(&ctx) != 0)
3531 #ifdef FMS_HAVE_CONDUIT 3535 if(protocol == NULL) {
3536 unsigned char H[4]= {
'\0',
'\0',
'\0',
'\0'};
3537 FILE *f = fopen(filename,
"rb");
3539 if(fread(H,
sizeof(
unsigned char), 4, f) == 4) {
3540 if(H[0] ==
'F' && H[1] ==
'M' && H[2] ==
'S' && H[3] ==
':')
3542 else if(H[0] ==
'\n' && H[1] ==
'{')
3544 else if(H[0] ==
'\n' && H[1] ==
'F' && H[2] ==
'M' && H[3] ==
'S')
3546 else if(H[0] == 137 && H[1] ==
'H' && H[2] ==
'D' && H[3] ==
'F')
3550 const char *ext =
"_json";
3551 const size_t fname_len = strlen(filename);
3552 const size_t json_fname_size = fname_len + strlen(ext) + 1;
3553 char *json_fname = malloc(
sizeof(
char) * json_fname_size);
3554 strncpy(json_fname, filename, fname_len+1);
3555 strcat(json_fname, ext);
3556 FILE *json_f = fopen(json_fname,
"r");
3559 protocol =
"conduit_bin";
3566 if(protocol == NULL) {
3572 int isSupported = CheckProtocolSupportConduit(protocol);
3573 if(isSupported == 1) {
3574 FmsIOContextInitializeConduit(&ctx, protocol);
3575 FmsIOFunctionsInitializeConduit(&io);
3576 }
else if(isSupported == 2) {
3577 FmsIOContextInitialize(&ctx);
3578 FmsIOFunctionsInitialize(&io);
3579 }
else if(isSupported == 0) {
3587 FmsIOContextInitialize(&ctx);
3588 FmsIOFunctionsInitialize(&io);
3592 if((*io.open)(&ctx, filename,
"r") == 0) {
3595 FmsIODataCollectionInfo *dc_info;
3596 FmsIOConstructFmsIODataCollectionInfo(&dc_info);
3598 const FmsInt fms_format_version = 100;
3599 err = (*io.get_int)(&ctx,
"FMS", &version);
3600 if(err != 0 || version != fms_format_version) {
3606 if(FmsIOReadFmsDataCollection(&ctx, &io,
"DataCollection", dc_info) != 0) {
3608 FmsIODestroyFmsIODataCollectionInfo(dc_info);
3613 FmsIOBuildFmsDataCollection(dc_info, dc);
3614 FmsIODestroyFmsIODataCollectionInfo(dc_info);
3616 if((*io.close)(&ctx) != 0) {
int FmsComponentAddPartEntities(FmsComponent comp, FmsInt part_id, FmsEntityType type, FmsIntType id_store_type, FmsIntType ent_id_type, FmsIntType orient_type, const FmsOrientation *inv_orient_map, const void *ents, const void *ent_orients, FmsInt num_ents)
TODO: dox.
int FmsComponentGetNumParts(FmsComponent comp, FmsInt *num_parts)
TODO: dox.
int FmsGetMetaDataTypeFromName(const char *const name, FmsMetaDataType *type)
Convert a meta-data-type string to FmsMetaDataType value.
int FmsIOWrite(const char *filename, const char *protocol, FmsDataCollection dc)
Writes the provided FmsDataCollection to a file.
#define READ_ARRAY_DATA(DEST_T, FUNC)
int FmsDomainGetDimension(FmsDomain domain, FmsInt *dim)
Return the highest dimension of an entry in a mesh domain.
int FmsMeshGetDomainsByName(FmsMesh mesh, const char *domain_name, FmsInt *num_domains, FmsDomain **domains)
TODO: dox.
int FmsComponentGetName(FmsComponent comp, const char **comp_name)
Return the name of a mesh component.
int FmsMeshFinalize(FmsMesh mesh)
TODO: dox.
int FmsTagSetComponent(FmsTag tag, FmsComponent comp)
TODO: dox.
int FmsTagGetName(FmsTag tag, const char **tag_name)
TODO: dox.
int FmsDataCollectionGetMetaData(FmsDataCollection dc, FmsMetaData *mdata)
TODO: dox.
int FmsComponentAddPartSubEntities(FmsComponent comp, FmsInt part_id, FmsEntityType type, FmsIntType id_store_type, FmsIntType ent_id_type, const void *ents, FmsInt num_ents)
TODO: dox Similar to FmsComponentAddPartEntities() but for lower dimensional entities.
int FmsDomainAddEntities(FmsDomain domain, FmsEntityType type, FmsEntityReordering reordering, FmsIntType ent_id_type, const void *ents, FmsInt num_ents)
TODO: dox.
int FmsTagGetComponent(FmsTag tag, FmsComponent *comp)
TODO: dox.
int FmsMeshGetNumTags(FmsMesh mesh, FmsInt *num_tags)
TODO: dox.
int FmsMeshGetComponent(FmsMesh mesh, FmsInt comp_id, FmsComponent *comp)
TODO: dox.
int FmsMeshGetNumDomainNames(FmsMesh mesh, FmsInt *num_domain_names)
TODO: dox.
int FmsIORead(const char *filename, const char *protocol, FmsDataCollection *dc)
Reads an FmsDataCollection from a file.
const char *const FmsEntityTypeNames[FMS_NUM_ENTITY_TYPES]
String representations of each entity type.
int FmsComponentAddRelation(FmsComponent comp, FmsInt other_comp_id)
Describe a relation from one component to another.
FmsMetaDataType
TODO: dox.
int FmsDataCollectionGetFieldDescriptors(FmsDataCollection dc, FmsFieldDescriptor **fds, FmsInt *num_fds)
TODO: dox.
struct FmsFieldDescriptor_private * FmsFieldDescriptor
TODO: dox.
int FmsTagGetDescriptions(FmsTag tag, FmsIntType *tag_type, const void **tags, const char *const **tag_descr, FmsInt *num_tags)
TODO: dox.
int FmsMeshValidate(FmsMesh mesh)
TODO: dox.
int FmsComponentAddPart(FmsComponent comp, FmsDomain domain, FmsInt *part_id)
TODO: dox.
const char *const FmsMetaDataTypeNames[FMS_NUM_METADATA_TYPES]
Added in version: v0.2.
#define FOR_EACH_SCALAR_TYPE(macro)
struct FmsComponent_private * FmsComponent
TODO: dox.
int FmsMetaDataGetIntegers(FmsMetaData mdata, const char **mdata_name, FmsIntType *int_type, FmsInt *size, const void **data)
Get the contents of a meta-data structure that stores an array of integers.
int FmsMetaDataGetScalars(FmsMetaData mdata, const char **mdata_name, FmsScalarType *scal_type, FmsInt *size, const void **data)
Get the contents of a meta-data structure that stores an array of scalars.
int FmsFieldDescriptorGetComponent(FmsFieldDescriptor fd, FmsComponent *comp)
TODO: dox.
int FmsTagSet(FmsTag tag, FmsIntType stored_tag_type, FmsIntType input_tag_type, const void *ent_tags, FmsInt num_ents)
TODO: dox.
const char *const FmsScalarTypeNames[FMS_NUM_SCALAR_TYPES]
Added in version: v0.2.
FmsFieldDescriptorType
Field descriptor types supported by FMS, see FmsFieldDescriptor.
int FmsDataCollectionGetName(FmsDataCollection dc, const char **name)
Get the name of the data collection.
int FmsDataCollectionAddFieldDescriptor(FmsDataCollection dc, const char *fd_name, FmsFieldDescriptor *fd)
TODO: dox.
int FmsDomainGetAllEntities(FmsDomain domain, FmsEntityType type, FmsIntType *ent_id_type, const void **ents, FmsInt *num_ents)
TODO: dox No copy, read only access to all entity definitions.
int FmsFieldAttachMetaData(FmsField field, FmsMetaData *mdata)
Make sure the meta-data structure associated with a field is allocated and return it in mdata...
struct FmsDomain_private * FmsDomain
TODO: dox.
int FmsMeshConstruct(FmsMesh *mesh)
Allocate a mesh structure and initialize it to be empty.
int FmsFieldGet(FmsField field, FmsFieldDescriptor *fd, FmsInt *num_vec_comp, FmsLayoutType *layout_type, FmsScalarType *data_type, const void **data)
TODO: dox.
int FmsDomainSetNumVertices(FmsDomain domain, FmsInt num_verts)
Set the number of vertices in a domain.
int FmsDomainGetNumVertices(FmsDomain domain, FmsInt *num_verts)
Get the number of vertices in a domain.
int FmsFieldDescriptorGetName(FmsFieldDescriptor fd, const char **fd_name)
TODO: dox.
int FmsDataCollectionAddField(FmsDataCollection dc, const char *field_name, FmsField *field)
TODO: dox.
int FmsDataCollectionAttachMetaData(FmsDataCollection dc, FmsMetaData *mdata)
Make sure the meta-data structure associated with a data collection is allocated and return it in mda...
uint64_t FmsInt
Type used by fms for representing and storing sizes and indices.
const char *const FmsIntTypeNames[FMS_NUM_INT_TYPES]
Added in version: v0.2.
int FmsComponentGetRelations(FmsComponent comp, const FmsInt **rel_comps, FmsInt *num_rel_comps)
TODO: dox.
int FmsDomainGetNumEntities(FmsDomain domain, FmsEntityType type, FmsInt *num_ents)
Get the number of entities of a given type in a domain.
int FmsMetaDataGetType(FmsMetaData mdata, FmsMetaDataType *type)
TODO: dox.
int FmsGetIntTypeFromName(const char *const name, FmsIntType *type)
Get the enum representation of an int type from the string name.
int FmsFieldDescriptorGetType(FmsFieldDescriptor fd, FmsFieldDescriptorType *fd_type)
TODO: dox.
int FmsTagAddDescriptions(FmsTag tag, FmsIntType tag_type, const void *tags, const char *const *tag_descr, FmsInt num_tags)
TODO: dox.
int FmsDataCollectionCreate(FmsMesh mesh, const char *dc_name, FmsDataCollection *dc)
TODO: dox The new object, dc, assumes ownership of the mesh.
int FmsFieldSet(FmsField field, FmsFieldDescriptor fd, FmsInt num_vec_comp, FmsLayoutType layout_type, FmsScalarType data_type, const void *data)
TODO: dox The size of the data array is num_vec_comp times the number of DOFs as defined by the field...
int FmsMeshGetTag(FmsMesh mesh, FmsInt tag_id, FmsTag *tag)
TODO: dox.
#define FOR_EACH_INT_TYPE(macro)
int FmsMetaDataSetIntegers(FmsMetaData mdata, const char *mdata_name, FmsIntType int_type, FmsInt size, void **data)
Set the contents of a meta-data structure to store an array of integers.
int FmsMetaDataGetString(FmsMetaData mdata, const char **mdata_name, const char **c_string)
Get the contents of a meta-data structure that stores a c-string.
int FmsMeshGetNumComponents(FmsMesh mesh, FmsInt *num_comp)
TODO: dox.
int FmsMeshGetPartitionId(FmsMesh mesh, FmsInt *partition_id, FmsInt *num_partitions)
TODO: dox.
struct FmsTag_private * FmsTag
TODO: dox.
int FmsComponentSetCoordinates(FmsComponent comp, FmsField coords)
Set the coordinates field of a component.
int FmsFieldDescriptorSetFixedOrder(FmsFieldDescriptor fd, FmsFieldType field_type, FmsBasisType basis_type, FmsInt order)
TODO: dox.
struct FmsField_private * FmsField
Discrete field data type.
int FmsMeshAddTag(FmsMesh mesh, const char *tag_name, FmsTag *tag)
Add a new tag to the mesh with the given name and return the new tag in tag.
int FmsFieldDescriptorGetNumDofs(FmsFieldDescriptor fd, FmsInt *num_dofs)
TODO: dox.
int FmsMetaDataSetString(FmsMetaData mdata, const char *mdata_name, const char *c_string)
Set the contents of a meta-data structure to store a c-string.
int FmsDomainSetNumEntities(FmsDomain domain, FmsEntityType type, FmsIntType id_store_type, FmsInt num_ents)
Allocates memory for the specified entities.
FmsScalarType
Scalar types supported by FMS: floating-point types, real and complex.
int FmsMetaDataGetMetaData(FmsMetaData mdata, const char **mdata_name, FmsInt *size, FmsMetaData **data)
Get the contents of a meta-data structure that stores an array of meta-data structures.
struct FmsDataCollection_private * FmsDataCollection
Data collection type: contains a mesh, discrete fileds, meta-data, etc.
int FmsTagGet(FmsTag tag, FmsIntType *tag_type, const void **ent_tags, FmsInt *num_ents)
TODO: dox No copy, read only access to the entity-tag array.
int FmsFieldDescriptorSetComponent(FmsFieldDescriptor fd, FmsComponent comp)
TODO: dox.
int FmsDataCollectionGetMesh(FmsDataCollection dc, FmsMesh *mesh)
TODO: dox.
const FmsInt FmsEntityNumSides[FMS_NUM_ENTITY_TYPES]
Number of sides of the entity types.
int FmsMeshAddDomains(FmsMesh mesh, const char *domain_name, FmsInt num_domains, FmsDomain **domains)
Allocates an array of domains sharing the same name, initializes them, and returns a pointer to the a...
struct FmsMesh_private * FmsMesh
TODO: dox.
int FmsDomainGetName(FmsDomain domain, const char **domain_name, FmsInt *domain_id)
Return the name and id of a mesh domain.
int FmsMeshAddComponent(FmsMesh mesh, const char *comp_name, FmsComponent *comp)
Add a new empty component to the mesh with the given name and return the new component in comp...
int FmsComponentGetCoordinates(FmsComponent comp, FmsField *coords)
Return the coordinates field of a component.
int FmsComponentGetPart(FmsComponent comp, FmsInt part_id, FmsEntityType type, FmsDomain *domain, FmsIntType *ent_id_type, const void **ents, const FmsOrientation **ent_orients, FmsInt *num_ents)
TODO: dox.
int FmsFieldGetName(FmsField field, const char **field_name)
TODO: dox.
int FmsGetScalarTypeFromName(const char *const name, FmsScalarType *type)
Get the enum representation of an int type from the string name.
int FmsComponentAddDomain(FmsComponent comp, FmsDomain domain)
TODO: dox.
int FmsFieldDescriptorGetFixedOrder(FmsFieldDescriptor fd, FmsFieldType *field_type, FmsBasisType *basis_type, FmsInt *order)
TODO: dox.
struct FmsMetaData_private * FmsMetaData
TODO: dox.
int FmsMeshGetDomains(FmsMesh mesh, FmsInt domain_name_id, const char **domain_name, FmsInt *num_domains, FmsDomain **domains)
TODO: dox.
int FmsDataCollectionGetFields(FmsDataCollection dc, FmsField **fields, FmsInt *num_fields)
TODO: dox.
int FmsMetaDataSetScalars(FmsMetaData mdata, const char *mdata_name, FmsScalarType scal_type, FmsInt size, void **data)
Set the contents of a meta-data structure to store an array of scalars.
int FmsComponentGetDimension(FmsComponent comp, FmsInt *dim)
Return the dimension of a mesh component.
int FmsGetEntityTypeFromName(const char *const name, FmsEntityType *ent_type)
Convert an entity-type string to FmsEntityType value.
int FmsMetaDataSetMetaData(FmsMetaData mdata, const char *mdata_name, FmsInt size, FmsMetaData **data)
Set the contents of a meta-data structure to store an array of meta-data structures.
const size_t FmsScalarTypeSize[FMS_NUM_SCALAR_TYPES]
const size_t FmsIntTypeSize[FMS_NUM_INT_TYPES]
#define CASES(typename, T, format)
int FmsComponentGetNumEntities(FmsComponent comp, FmsInt *num_ents)
Return the total number of main entities across all parts in the component.
int FmsFieldGetMetaData(FmsField field, FmsMetaData *mdata)
TODO: dox.
const FmsInt FmsEntityDim[FMS_NUM_ENTITY_TYPES]
Dimensions of the entity types.