29#define new(type, size) (type*)calloc(size, sizeof(type))
30#define delete(ptr) if (ptr) free(ptr)
54static int is_fortran_permutation(
62 for(i=0; i<perm_vector_size; i++)
64 if (perm_vector[i] != -1)
74 const hsize_t*source_dims,
84 for(i=0; i< rank; i++)
86 F5printf(10,
"F5B_permute_dimensions(): No source dimensions provided!");
93 F5printf(50,
"F5B_permute_dimensions(): C order permutation vector!");
94 if (target_dims == source_dims)
97 for(i=0; i< rank; i++)
98 target_dims[i] = source_dims[i];
103 if (target_dims == source_dims)
107 F5printf(40,
"F5B_permute_dimensions(): no permutation for 1D!");
117 if (is_fortran_permutation(perm_vector, perm_vector_size) )
120 F5printf(40,
"F5B_permute_dimensions(): FORTRAN order permutation vector!");
121 for(i=0; i< rank; i++)
122 dst[i] = source_dims[rank-1-i];
127 int cdims = perm_vector_size,
131 F5printf(50,
"F5B_permute_dimensions(): generic order permutation vector of size %d, data are size %d", cdims, rank);
147 F5printf(50,
"F5B_permute_dimensions(): permutation on %d-higher dimensional subspace!", cd);
148 assert( cd == 1 &&
"higher dimensional subspaces not supported yet!");
162 dst[i] = source_dims[ pv ];
166 int pv = perm_vector[i-cd];
169 dst[i] = source_dims[ pv ];
180 else for(i=0; i< rank; i++)
182 int pv = perm_vector[i-cd];
187 dst[i] = source_dims[ pv ];
192 target_dims[0] = source_dims[0];
193 F5printf(50,
"~F5B_permute_dimensions() 1D");
197 if (dst != target_dims)
200 F5printf(50,
"F5B_permute_dimensions(): Copy back permutation vector!");
201 for(i=0; i< rank; i++)
202 target_dims[i] = dst[i];
204 F5printf(50,
"~F5B_permute_dimensions()");
215 const int perm_vector[],
216 int cell_dimensionality,
217 hid_t SinglePrecisionType,
218 hid_t DoublePrecisionType)
229 F5printf(40,
"F5B_new_global_domain(,dims=%d,,name=%s,perm_vector=%p,cell_dims=%d)\n",
230 dimension,
name, perm_vector, cell_dimensionality);
234 for(i = 0; i<cell_dimensionality; i++)
241 for(i = 0; i<cell_dimensionality; i++)
248 for(i = 0; i<cell_dimensionality; i++)
266 SinglePrecisionType);
271 DoublePrecisionType);
291 const char*coordnames[],
295size_t Tsize = H5Tget_size(coord_type);
298 IDs->
Point_hid_t = H5Tcreate(H5T_COMPOUND, dimension*Tsize );
300 for(i=0; i<dimension; i++)
302 H5Tinsert(IDs->
Point_hid_t, coordnames[i], i*Tsize, coord_type);
327 const char*coordnames[],
331size_t Tsize = H5Tget_size(coord_type);
332 IDs->
Vector_hid_t = H5Tcreate(H5T_COMPOUND, dimension*Tsize );
335 for(i=0; i<dimension; i++)
338 strcat(buf, coordnames[i]);
345 for(i=0; i<dimension; i++)
348 strcat(buf, coordnames[i]);
355 IDs->
Bivector_hid_t = H5Tcreate(H5T_COMPOUND, dimension*dimension*Tsize );
357 for(i=0; i<dimension; i++)
358 for(j=i; j<dimension; j++)
360 int L = i*dimension + j;
362 strcat(buf, coordnames[i]);
363 strcat(buf, coordnames[j]);
375 strcat(buf, coordnames[1]);
377 strcat(buf, coordnames[2]);
384 strcat(buf, coordnames[2]);
386 strcat(buf, coordnames[0]);
393 strcat(buf, coordnames[0]);
395 strcat(buf, coordnames[1]);
401 IDs->
Bicovector_hid_t = H5Tcreate(H5T_COMPOUND, dimension*dimension*Tsize );
403 for(i=0; i<dimension; i++)
404 for(j=i; j<dimension; j++)
406 int L = i*dimension + j;
408 strcat(buf, coordnames[i]);
409 strcat(buf, coordnames[j]);
415 IDs->
Metric_hid_t = H5Tcreate(H5T_COMPOUND, dimension*(dimension+1)/2*Tsize );
420 for(ni=0, i=0; i<dimension; i++ )
422 for(nj=0, j=0; j<i; j++ )
424 indices[ni+j] = indices[nj+i] = I++;
432 for(i=0; i<dimension; i++)
433 for(j=i; j<dimension; j++)
435 int L = i*dimension + j,
438 strcat(buf, coordnames[i]);
439 strcat(buf, coordnames[j]);
441 H5Tinsert(IDs->
Metric_hid_t, buf, idx*Tsize, coord_type);
445 IDs->
Cometric_hid_t = H5Tcreate(H5T_COMPOUND, dimension*(dimension+1)/2*Tsize );
450 for(ni=0, i=0; i<dimension; i++ )
452 for(nj=0, j=0; j<i; j++ )
454 indices[ni+j] = indices[nj+i] = I++;
462 for(i=0; i<dimension; i++)
463 for(j=i; j<dimension; j++)
465 int L = i*dimension + j,
468 strcat(buf, coordnames[i]);
469 strcat(buf, coordnames[j]);
506 H5T_NATIVE_FLOAT, H5T_NATIVE_DOUBLE);
521 H5T_NATIVE_INT32, H5T_NATIVE_INT64);
533 int cell_dimensionality)
554 const int perm_vector[],
555 int cell_dimensionality)
574 const int perm_vector[],
575 int cell_dimensionality)
634 if (ID && --ID->
refs == 0)
647hid_t F5Tmake(hid_t location,
const char*
name, hid_t type,
int*committed)
649herr_t (*old_func)(
void*);
650void *old_client_data;
653 H5Eget_auto(&old_func, &old_client_data);
654 H5Eset_auto(NULL, NULL);
656 t = H5Topen2(location,
name, H5P_DEFAULT);
657 H5Eset_auto(old_func, old_client_data);
671#define SAVE_MEMORDER_WITH_TYPE
703 location = H5Gopen2(ChartsID,
name, H5P_DEFAULT);
706 F5printf(0,
"F5B_read_global_chart(,%s) FAILED\n",
name);
723hid_t perm_id, precision_group;
732 if (precision_group>0)
750 F5printf(0,
"F5B_read_chart_domain() Invalid single precision point type!\n");
754 char*buf = (
char*)malloc(256);
764 Tdims = H5Tget_nmembers( Point_hid_t );
786 for(i=0; i<Tdims; i++)
790 F5printf(200,
"~F5B_read_chart_domain(,%s) DONE\n", DefaultChartName);
819 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
828 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
860 const char**cn = coordnames;
862 for(i=0; i<dimension; i++)
871 for(i=0; i<dimension; i++)
872 H5free_memory( (
char*)(coordnames[i]) );
883 puts(
"F5T_save_perm_vector()");
890 hsize_t Tdims = rank;
891 hid_t index_ds = H5Screate_simple(1, &Tdims, &Tdims ) ;
893 H5Awrite(Rank_id, H5T_NATIVE_INT, perm_vector );
908static int F5Tequal(hid_t A, hid_t B)
913 return H5Tequal(A,B)>0;
933hid_t FirstCompoundType = H5Tget_member_type( type_id, 0);
934int CompoundSize = H5Tget_size( FirstCompoundType );
945 F5printf(20,
"F5file_type: No chart given, returning memory type.");
949 F5printf(40,
"F5file_type(%p, %d): chart=%p", fpath, (
int) fieldtype, fpath->
myChart );
951 switch( H5Tget_class( fieldtype) )
954 F5printf(20,
"F5file_type query for unknown type (could be a native one).");
960 F5printf(20,
"F5file_type query for integer/float/string type (could be a native one).");
969 F5printf(20,
"F5file_type query for unsupported type (could be a native one).");
981 hid_t FirstCompoundType = H5Tget_member_type( fieldtype, 0);
982 int CompoundPrecision = H5Tget_size( FirstCompoundType );
989 F5printf(20,
"F5file_type query for compound type, precision %d.\n", CompoundPrecision);
998 F5printf(20,
"F5file_type query for point type.\n");
999 if (OUT->Point_hid_t<1)
1001 F5printf(0,
"F5file_type(): Possible internal error, point type not found in file!");
1007 printf(
"CELL Dimensionality: %d\n", cd);
1011#ifdef SAVE_MEMORDER_WITH_TYPE
1013 H5Tget_nmembers( OUT->Point_hid_t ),
1017 return OUT->Point_hid_t;
1022 if (OUT->Vector_hid_t<1)
1024 int covariance[] = {1};
1029 return OUT->Vector_hid_t;
1033 F5printf(20,
"F5file_type query for covector type.\n");
1034 if (OUT->Covector_hid_t<1)
1036 int covariance[] = {-1};
1037 OUT->Covector_hid_t =
1041 return OUT->Covector_hid_t;
1045 F5printf(20,
"F5file_type query for bivector type.\n");
1046 if (OUT->Bivector_hid_t<1)
1048 int covariance[] = {1,1};
1049 OUT->Bivector_hid_t =
1053 return OUT->Bivector_hid_t;
1057 F5printf(20,
"F5file_type query for bicovector type.\n");
1058 if (OUT->Bivector_hid_t<1)
1060 int covariance[] = {-1,-1};
1061 OUT->Bicovector_hid_t =
1065 return OUT->Bicovector_hid_t;
1070 F5printf(20,
"F5file_type query for metric type.\n");
1071 if (OUT->Metric_hid_t<1)
1074 int covariance[] = {-1, -1};
1079 return OUT->Metric_hid_t;
1083 F5printf(20,
"F5file_type query for cometric type.\n");
1084 if (OUT->Cometric_hid_t<1)
1087 int covariance[] = {1, 1};
1088 OUT->Cometric_hid_t =
1092 return OUT->Cometric_hid_t;
1096 F5printf(2, __FILE__
": Warning: F5file_type() query could not identify file type.\n");
1098 int TypeMembers = H5Tget_nmembers( fieldtype );
1099 const char*MultiplicityCategory;
1100 hid_t MultiplicityCategory_id;
1103 case 1: MultiplicityCategory =
"Chart-free compound types with one member";
break;
1104 case 2: MultiplicityCategory =
"Chart-free compound types with two members";
break;
1105 case 3: MultiplicityCategory =
"Chart-free compound types with three members";
break;
1106 case 4: MultiplicityCategory =
"Chart-free compound types with four members";
break;
1107 default:MultiplicityCategory =
"Chart-free compound types with many members";
break;
1112#define FIBER_HDF5_ANONYMOUS_TYPENAME "F5::TypeName%04u"
1113 char type_name[1024];
1114 unsigned nthType = 0;
1115 for(;nthType<10000;nthType++)
1119 type_id =
F5Tappend(MultiplicityCategory_id, type_name, fieldtype);
1134 puts(
"F5file_type: Creating anonymous type name failed!");
char * F5Aget_string(hid_t loc_id, const char *name, char *buf, size_t buflen)
hid_t F5Atry_to_open(hid_t location, const char *name)
int F5Asave_ints(hid_t loc_id, const char *name, const int data[], hsize_t n)
void F5Bchart_read_tangential_types(F5_ChartPrecisionTypes *H5Types, hid_t location)
void F5T_save_perm_vector(hid_t location, int rank, int perm_vector[])
ChartDomain_IDs * F5B_new_global_domain(const char *coordnames[], int dimension, const char *name, const int perm_vector[], int cell_dimensionality, hid_t SinglePrecisionType, hid_t DoublePrecisionType)
void F5B_delete_tangential_types(F5_ChartPrecisionTypes *ID)
F5_ChartPrecisionTypes * F5Bget_precision_by_size(ChartDomain_IDs *CD, int TypeSize)
void F5B_init_tangential_types(F5_ChartPrecisionTypes *IDs, const char *coordnames[], int dimension, hid_t coord_type)
ChartDomain_IDs * F5Bcopy_chart_domain(const ChartDomain_IDs *srcIDs)
void F5B_delete_global_chart(ChartDomain_IDs *ID)
F5_ChartPrecisionTypes * F5Bget_precision_by_type(ChartDomain_IDs *CD, hid_t type_id)
ChartDomain_IDs * F5B_new_global_float_chart(const char *coordnames[], int dimension, const char *name, const int perm_vector[FIBER_MAX_RANK])
ChartDomain_IDs * F5B_new_global_fractional_domain(const char *coordnames[], int dimension, const char *name, const int perm_vector[], int cell_dimensionality)
const int * F5B_fortran_permute_vector()
int F5B_inject_precision_type(F5_ChartPrecisionTypes *IDs, hid_t type_id)
int F5Bget_chart_dims(const ChartDomain_IDs *IDs)
hsize_t * F5B_permute_dimensions(hsize_t *target_dims, int rank, const hsize_t *source_dims, int perm_vector[FIBER_MAX_RANK], int perm_vector_size)
ChartDomain_IDs * F5B_new_global_int_chart(const char *coordnames[], int dimension, const char *name, const int perm_vector[FIBER_MAX_RANK])
ChartDomain_IDs * F5B_new_global_int_domain(const char *coordnames[], int dimension, const char *name, const int perm_vector[FIBER_MAX_RANK], int cell_dimensionality)
ChartDomain_IDs * F5B_save_global_chart(const ChartDomain_IDs *MemoryIDs, hid_t Domain_hid)
ChartDomain_IDs * F5B_read_chart_domain(hid_t ChartDomainLocationID, const char *DefaultChartName)
void F5Binsert_tensor_type(ChartDomain_IDs *This, F5Ttensor_t *T)
#define FIBER_HDF5_ANONYMOUS_TYPENAME
ChartDomain_IDs * F5B_read_global_chart(hid_t ChartsID, const char *name)
ChartDomain_IDs * F5B_new_global_fragment_neighbour_domain(const char *coordnames[], int dimension, const char *name, const int perm_vector[], int cell_dimensionality)
hid_t F5file_type(F5Path *fpath, hid_t fieldtype)
void F5Bchart_add_tangential_types(F5_ChartPrecisionTypes *IDs, const char *coordnames[], int dimension, hid_t coord_type)
struct _F5_ChartPrecisionTypes F5_ChartPrecisionTypes
@ F5ChartPrecisionMaxNumberOfFileTypes
void F5Tclose(hid_t type_id)
hid_t F5Tcommit(hid_t save_location, const char *name, hid_t TransientTypeID)
hid_t F5Tsave_tensor(hid_t Domain_hid, const char *domain_name, const char *type_name, hid_t transient_type, int rank, int indices[], int grade)
hid_t F5Tappend(hid_t loc_id, const char *name, hid_t type_id)
hid_t F5Tmake_precise_tensor(F5Path *fpath, const char *type_name, int TypeBytePrecision, hid_t transient_type, int rank, int indices[], int grade)
#define FIBER_HDF5_CHART_DOUBLE_PRECISION
#define FIBER_HDF5_CHART_SINGLE_PRECISION
#define F5T_INT_FRACTION32
#define F5T_INT_FRACTION64
#define FIBER_HDF5_CHART_METRIC_TYPE
#define FIBER_HDF5_CHART_MEMLAYOUT
#define FIBER_HDF5_CELLDIMENSIONALITY
#define _FIBER_MAX_COORDNAME_LENGTH
#define FIBER_HDF5_CHART_POINT_TYPE
#define FIBER_HDF5_CHART_DOMAIN
#define FIBER_HDF5_CHART_PSEUDOCOSCALAR_TYPE
#define FIBER_HDF5_CHART_VECTOR_TYPE
#define FIBER_HDF5_CHART_COMETRIC_TYPE
#define FIBER_HDF5_CHART_BIVECTOR_TYPE
#define FIBER_HDF5_CHART_BICOVECTOR_TYPE
#define FIBER_HDF5_CHART_COVECTOR_TYPE
#define FIBER_HDF5_CHART_PSEUDOSCALAR_TYPE
herr_t F_H5Aread(hid_t attr_id, hid_t mem_type_id, void *buf, const char *name)
hid_t F5Acreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist)
#define F5printf(verbosity,...)
hid_t F5Gtry_to_open(hid_t location, const char *name)
hid_t F5Gappend(hid_t loc_id, const char *name)
F5_ChartPrecisionTypes DoublePrecision
F5_ChartPrecisionTypes HalfPrecision
int perm_vector[FIBER_MAX_RANK]
F5_ChartPrecisionTypes SinglePrecision
F5_ChartPrecisionTypes OneBytePrecision
F5_ChartPrecisionTypes ExtendedPrecision
F5Ttensor_t ** TensorTypes
ChartDomain_IDs * FileIDs
ChartDomain_IDs * myChart
hid_t Pseudocoscalar_hid_t
hid_t AdditionalFileTypes[F5ChartPrecisionMaxNumberOfFileTypes]