diff --git a/README.md b/README.md index cc1d5b9b..ffe95eab 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ of HDF5 and HDF4. Previous releases of HDFView that were based on HDF5 1.8, | 3.3.0 | 1.14.0 | 4.2.16 | HDF5 1.12 (new-style) references, Single-Writer/Multiple-Readers (SWMR) reads, bug fixes | | 3.3.1 | 1.14.2 | 4.2.16-2 | Fixes a critical HDF4 + HDFView bug | | 3.3.2 | 1.14.4 | 4.3.0 | Float16 support | -| 3.3.3 | 1.16.0 | 4.4.0 | Complex number support | +| 3.4.0 | 2.0.0 | 4.4.0 | Complex number support | PREVIOUS RELEASES AND SOURCE CODE diff --git a/src/org.hdfgroup.hdfview/hdf/view/TableView/DataDisplayConverterFactory.java b/src/org.hdfgroup.hdfview/hdf/view/TableView/DataDisplayConverterFactory.java index 39bcc84f..2a0b69b3 100644 --- a/src/org.hdfgroup.hdfview/hdf/view/TableView/DataDisplayConverterFactory.java +++ b/src/org.hdfgroup.hdfview/hdf/view/TableView/DataDisplayConverterFactory.java @@ -102,6 +102,8 @@ else if (dtype.isOpaque() || dtype.isBitField()) converter = new BitfieldDataDisplayConverter(dtype); else if (dtype.isRef()) converter = new RefDataDisplayConverter(dtype); + else if (dtype.isComplex()) + converter = new ComplexDataDisplayConverter(dtype); } catch (Exception ex) { log.debug( @@ -963,4 +965,137 @@ public Object canonicalToDisplayValue(Object value) return buffer; } } + + private static class ComplexDataDisplayConverter extends HDFDisplayConverter { + private static final Logger log = LoggerFactory.getLogger(ComplexDataDisplayConverter.class); + + private final HDFDisplayConverter baseTypeConverter; + private final StringBuilder buffer; + + ComplexDataDisplayConverter(final Datatype dtype) throws Exception { + super(dtype); + + if (!dtype.isComplex()) { + log.debug("exit: datatype is not a complex type"); + throw new Exception("ComplexDataDisplayConverter: datatype is not a complex type"); + } + + Datatype baseType = dtype.getDatatypeBase(); + + if (baseType == null) { + log.debug("exit: base datatype is null"); + throw new Exception("ComplexDataDisplayConverter: base datatype is null"); + } + + try { + baseTypeConverter = getDataDisplayConverter(baseType); + + /* + * Make base datatype converter inherit the data conversion settings. + */ + baseTypeConverter.setShowAsHex(this.showAsHex); + baseTypeConverter.setShowAsBin(this.showAsBin); + baseTypeConverter.setNumberFormat(this.numberFormat); + baseTypeConverter.setConvertEnum(this.isEnumConverted); + } + catch (Exception ex) { + log.debug("exit: couldn't get DataDisplayConverter for base datatype: ", ex); + throw new Exception("ComplexDataDisplayConverter: couldn't get DataDisplayConverter for base datatype: " + + ex.getMessage()); + } + + buffer = new StringBuilder(); + } + + @Override + public Object canonicalToDisplayValue(ILayerCell cell, IConfigRegistry configRegistry, Object value) + { + cellRowIdx = cell.getRowIndex(); + cellColIdx = cell.getColumnIndex(); + return canonicalToDisplayValue(value); + } + + @Override + public Object canonicalToDisplayValue(Object value) + { + log.trace("canonicalToDisplayValue({}): start", value); + + if (value instanceof String) + return value; + + if (value == null) { + log.debug("canonicalToDisplayValue({}): value is null", value); + return DataFactoryUtils.nullStr; + } + + buffer.setLength(0); // clear the old string + + /* + * Pass the cell's row and column index down in case there is a CompoundDataDisplayConverter at the bottom + * of the chain. + */ + baseTypeConverter.cellRowIdx = cellRowIdx; + baseTypeConverter.cellColIdx = cellColIdx; + + try { + Object obj; + Object convertedValue; + int arrLen = Array.getLength(value); + + log.trace("canonicalToDisplayValue({}): array length={}", value, arrLen); + + for (int i = 0; i < arrLen; i++) { + if (i > 0) + buffer.append("+"); + + obj = Array.get(value, i); + + convertedValue = baseTypeConverter.canonicalToDisplayValue(obj); + + buffer.append(convertedValue); + } + + buffer.append("i"); + } + catch (Exception ex) { + log.debug("canonicalToDisplayValue({}): failure: ", value, ex); + buffer.setLength(0); + buffer.append(DataFactoryUtils.errStr); + } + + return buffer; + } + + @Override + public void setNumberFormat(NumberFormat format) + { + super.setNumberFormat(format); + + baseTypeConverter.setNumberFormat(format); + } + + @Override + public void setShowAsHex(boolean asHex) + { + super.setShowAsHex(asHex); + + baseTypeConverter.setShowAsHex(asHex); + } + + @Override + public void setShowAsBin(boolean asBin) + { + super.setShowAsBin(asBin); + + baseTypeConverter.setShowAsBin(asBin); + } + + @Override + public void setConvertEnum(boolean convert) + { + super.setConvertEnum(convert); + + baseTypeConverter.setConvertEnum(convert); + } + } } diff --git a/src/org.hdfgroup.hdfview/hdf/view/TableView/DataProviderFactory.java b/src/org.hdfgroup.hdfview/hdf/view/TableView/DataProviderFactory.java index 6edbd7bf..9e1f7071 100644 --- a/src/org.hdfgroup.hdfview/hdf/view/TableView/DataProviderFactory.java +++ b/src/org.hdfgroup.hdfview/hdf/view/TableView/DataProviderFactory.java @@ -115,6 +115,8 @@ else if (dtype.isOpaque() || dtype.isBitField()) dataProvider = new BitfieldDataProvider(dtype, dataBuf, dataTransposed); else if (dtype.isRef()) dataProvider = new RefDataProvider(dtype, dataBuf, dataTransposed); + else if (dtype.isComplex()) + dataProvider = new ComplexDataProvider(dtype, dataBuf, dataTransposed); } catch (Exception ex) { log.debug("getDataProvider(): error occurred in retrieving a DataProvider: ", ex); @@ -1438,6 +1440,7 @@ private void updateArrayOfArrayElements(Object newValue, Object curBuf, int colu case Datatype.CLASS_ARRAY: case Datatype.CLASS_COMPOUND: case Datatype.CLASS_VLEN: + case Datatype.CLASS_COMPLEX: default: buffer = new Object[newcnt]; break; @@ -1480,6 +1483,7 @@ private void updateArrayOfAtomicElements(Object newValue, Object curBuf, int row case Datatype.CLASS_ARRAY: case Datatype.CLASS_COMPOUND: case Datatype.CLASS_VLEN: + case Datatype.CLASS_COMPLEX: default: buffer = new Object[newcnt]; break; @@ -1949,4 +1953,116 @@ private String populateReferenceObject(Object byteBuf, int startIndex) return objectStr; } } + + private static class ComplexDataProvider extends HDFDataProvider { + private static final Logger log = LoggerFactory.getLogger(ComplexDataProvider.class); + + private final HDFDataProvider baseTypeDataProvider; + + private final StringBuilder buffer; + + private final long typeSize; + + ComplexDataProvider(final Datatype dtype, final Object dataBuf, final boolean dataTransposed) throws Exception { + super(dtype, dataBuf, dataTransposed); + + Datatype baseType = dtype.getDatatypeBase(); + + baseTypeDataProvider = getDataProvider(baseType, dataBuf, dataTransposed); + + typeSize = baseType.getDatatypeSize(); + + buffer = new StringBuilder(); + } + + @Override + public Object getDataValue(int columnIndex, int rowIndex) + { + buffer.setLength(0); + + log.trace("getDataValue(rowIndex={}, columnIndex={}): start", rowIndex, columnIndex); + + try { + int bufIndex = physicalLocationToBufIndex(rowIndex, columnIndex); + theValue = retrieveArrayOfAtomicElements(dataBuf, bufIndex * 2); + log.trace("getDataValue(bufIndex={}, dataBuf={})=({})", bufIndex, dataBuf, theValue); + } + catch (Exception ex) { + log.debug("getDataValue(rowIndex={}, columnIndex={}): failure: ", rowIndex, columnIndex, ex); + theValue = DataFactoryUtils.errStr; + } + + log.trace("getDataValue(rowIndex={}, columnIndex={})=({}): finish", rowIndex, columnIndex, theValue); + + return theValue; + } + + private Object[] retrieveArrayOfAtomicElements(Object objBuf, int rowStartIdx) + { + log.debug("retrieveArrayOfAtomicElements(): objBuf={}", objBuf); + Object[] tempArray = new Object[(int) 2]; + Object realElement = Array.get(objBuf, rowStartIdx); + Object imgElement = Array.get(objBuf, rowStartIdx + 1); + log.debug("retrieveArrayOfAtomicElements(): realElement={} imgElement={}", realElement, imgElement); + + tempArray[0] = baseTypeDataProvider.getDataValue(objBuf, rowStartIdx); + tempArray[1] = baseTypeDataProvider.getDataValue(objBuf, rowStartIdx + 1); + + log.debug("retrieveArrayOfAtomicElements(): tempArray={}", tempArray); + return tempArray; + } + + @Override + public void setDataValue(int columnIndex, int rowIndex, Object newValue) + { + try { + int bufIndex = physicalLocationToBufIndex(rowIndex, columnIndex); + + updateArrayElements(dataBuf, newValue, columnIndex, rowIndex); + } + catch (Exception ex) { + log.debug("setDataValue(rowIndex={}, columnIndex={}, {}): cell value update failure: ", rowIndex, + columnIndex, newValue, ex); + } + log.trace("setDataValue(rowIndex={}, columnIndex={})=({}): finish", rowIndex, columnIndex, newValue); + } + + @Override + public void setDataValue(int columnIndex, int rowIndex, Object bufObject, Object newValue) + { + try { + updateArrayElements(bufObject, newValue, columnIndex, rowIndex); + } + catch (Exception ex) { + log.debug("setDataValue(rowIndex={}, columnIndex={}, bufObject={}, {}): cell value update failure: ", + rowIndex, columnIndex, bufObject, newValue, ex); + } + log.trace("setDataValue(rowIndex={}, columnIndex={}, bufObject={})=({}): finish", rowIndex, columnIndex, + bufObject, newValue); + } + + private void updateArrayElements(Object curBuf, Object newValue, int columnIndex, int rowStartIndex) + { + updateArrayOfAtomicElements(newValue, curBuf, rowStartIndex); + } + + private void updateArrayOfAtomicElements(Object newValue, Object curBuf, int rowStartIdx) + { + ArrayList vlElements = ((ArrayList[]) curBuf)[rowStartIdx]; + + StringTokenizer st = new StringTokenizer((String) newValue, "+i"); + int newcnt = st.countTokens(); + Object[] buffer = new Double[newcnt]; + for (int i = 0; i < newcnt; i++) { + baseTypeDataProvider.setDataValue(i, buffer, st.nextToken().trim()); + isValueChanged = isValueChanged || baseTypeDataProvider.getIsValueChanged(); + } + String bname = buffer.getClass().getName(); + String cname = curBuf.getClass().getName(); + log.trace("updateArrayOfAtomicElements(): buffer cname={} of data cname={}", bname, cname); + vlElements = new ArrayList<>(Arrays.asList(buffer)); + log.debug("updateArrayOfAtomicElements(): new vlSize={}", vlElements.size()); + ((ArrayList[]) curBuf)[rowStartIdx] = vlElements; + } + } } diff --git a/src/org.hdfgroup.hdfview/hdf/view/dialog/UserOptionsHDFPage.java b/src/org.hdfgroup.hdfview/hdf/view/dialog/UserOptionsHDFPage.java index cae29b7d..20e298b5 100644 --- a/src/org.hdfgroup.hdfview/hdf/view/dialog/UserOptionsHDFPage.java +++ b/src/org.hdfgroup.hdfview/hdf/view/dialog/UserOptionsHDFPage.java @@ -55,9 +55,9 @@ public class UserOptionsHDFPage extends UserOptionsDefaultPage { private Button checkNativeOrder, checkDecOrder, checkIncOrder; private Button checkIndexName, checkIndexCreateOrder; private Button earlyLibVersion, early18LibVersion, early110LibVersion, early112LibVersion, - early114LibVersion, earlyLateLibVersion; + early114LibVersion, early200LibVersion, earlyLateLibVersion; private Button lateLibVersion, late18LibVersion, late110LibVersion, late112LibVersion, late114LibVersion, - lateLateLibVersion; + late200LibVersion, lateLateLibVersion; private Button pluginDirButton; /** Default early libversion for files */ @@ -130,6 +130,8 @@ else if (early112LibVersion.getSelection()) ViewProperties.setEarlyLib("v112"); else if (early114LibVersion.getSelection()) ViewProperties.setEarlyLib("v114"); + else if (early200LibVersion.getSelection()) + ViewProperties.setEarlyLib("v200"); else if (earlyLateLibVersion.getSelection()) ViewProperties.setEarlyLib("Latest"); else @@ -148,6 +150,8 @@ else if (late112LibVersion.getSelection()) ViewProperties.setLateLib("v112"); else if (late114LibVersion.getSelection()) ViewProperties.setLateLib("v114"); + else if (late200LibVersion.getSelection()) + ViewProperties.setLateLib("v200"); else if (lateLateLibVersion.getSelection()) ViewProperties.setLateLib("Latest"); else @@ -211,6 +215,7 @@ protected void load() early110LibVersion.setSelection(earlyLibVers.compareTo("v110") == 0); early112LibVersion.setSelection(earlyLibVers.compareTo("v112") == 0); early114LibVersion.setSelection(earlyLibVers.compareTo("v114") == 0); + early200LibVersion.setSelection(earlyLibVers.compareTo("v200") == 0); earlyLateLibVersion.setSelection(earlyLibVers.compareTo("Latest") == 0); lateLibVers = ViewProperties.getLateLib(); @@ -220,6 +225,7 @@ protected void load() late110LibVersion.setSelection(lateLibVers.compareTo("v110") == 0); late112LibVersion.setSelection(lateLibVers.compareTo("v112") == 0); late114LibVersion.setSelection(lateLibVers.compareTo("v114") == 0); + late200LibVersion.setSelection(lateLibVers.compareTo("v200") == 0); lateLateLibVersion.setSelection(lateLibVers.compareTo("Latest") == 0); checkConvertEnum.setSelection(ViewProperties.isConvertEnum()); @@ -311,6 +317,11 @@ protected Control createContents(Composite parent) early114LibVersion.setText("v114"); early114LibVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + early200LibVersion = new Button(earlyLibVersionGroup, SWT.RADIO); + early200LibVersion.setFont(curFont); + early200LibVersion.setText("v200"); + early200LibVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + earlyLateLibVersion = new Button(earlyLibVersionGroup, SWT.RADIO); earlyLateLibVersion.setFont(curFont); earlyLateLibVersion.setText("Latest"); @@ -348,6 +359,11 @@ protected Control createContents(Composite parent) late114LibVersion.setText("v114"); late114LibVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + late200LibVersion = new Button(lateLibVersionGroup, SWT.RADIO); + late200LibVersion.setFont(curFont); + late200LibVersion.setText("v200"); + late200LibVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + lateLateLibVersion = new Button(lateLibVersionGroup, SWT.RADIO); lateLateLibVersion.setFont(curFont); lateLateLibVersion.setText("Latest"); diff --git a/src/org.hdfgroup.object/hdf/object/CompoundDS.java b/src/org.hdfgroup.object/hdf/object/CompoundDS.java index 5aa0b3ba..03e1f3e7 100644 --- a/src/org.hdfgroup.object/hdf/object/CompoundDS.java +++ b/src/org.hdfgroup.object/hdf/object/CompoundDS.java @@ -593,6 +593,7 @@ else if (dtype.isArray()) { case Datatype.CLASS_ENUM: case Datatype.CLASS_VLEN: case Datatype.CLASS_TIME: + case Datatype.CLASS_COMPLEX: theObj = convertByteMember(baseType, byteData); break; diff --git a/src/org.hdfgroup.object/hdf/object/Datatype.java b/src/org.hdfgroup.object/hdf/object/Datatype.java index 9c84cd0a..f5ad65ff 100644 --- a/src/org.hdfgroup.object/hdf/object/Datatype.java +++ b/src/org.hdfgroup.object/hdf/object/Datatype.java @@ -151,6 +151,13 @@ public abstract class Datatype extends HObject implements MetaDataContainer { * href="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_5/documentation/doxygen/_h5_t__u_g.html#sec_datatype">HDF5 * Datatypes in HDF5 User Guide */ + public static final int CLASS_COMPLEX = 12; + + /** + * See HDF5 + * Datatypes in HDF5 User Guide + */ public static final int ORDER_LE = 0; /** @@ -246,6 +253,11 @@ public abstract class Datatype extends HObject implements MetaDataContainer { */ protected boolean isVLEN = false; + /** + * Determines whether this datatype is a complex type. + */ + protected boolean isComplex = false; + /** * Determines whether this datatype is a variable-length string type. */ @@ -570,6 +582,7 @@ public long open() *
  • CLASS_ENUM *
  • CLASS_VLEN *
  • CLASS_ARRAY + *
  • CLASS_COMPLEX * * * @return the class of the datatype. @@ -848,6 +861,13 @@ public String getDescription() case CLASS_VLEN: description.append("Variable-length"); break; + case CLASS_COMPLEX: + log.trace("getDescription(): Complex [{}]", datatypeNATIVE); + if (datatypeNATIVE) + description.append("native Complex"); + else + description.append(String.valueOf(datatypeSize * 8)).append("-bit Complex"); + break; default: description.append("Unknown"); break; @@ -992,6 +1012,16 @@ public boolean isUnsigned() */ public boolean isBitField() { return (datatypeClass == Datatype.CLASS_BITFIELD); } + /** + * Checks if this datatype is a complex type. + * + * @return true if the datatype is complex; false otherwise + */ + public boolean isComplex() + { + return (datatypeClass == Datatype.CLASS_COMPLEX); + } + /* Implement interface MetaDataContainer */ /** diff --git a/src/org.hdfgroup.object/hdf/object/h5/H5CompoundAttr.java b/src/org.hdfgroup.object/hdf/object/h5/H5CompoundAttr.java index 324dd8bd..33b9ccae 100644 --- a/src/org.hdfgroup.object/hdf/object/h5/H5CompoundAttr.java +++ b/src/org.hdfgroup.object/hdf/object/h5/H5CompoundAttr.java @@ -1258,6 +1258,7 @@ else if (dtype.isArray()) { case Datatype.CLASS_ENUM: case Datatype.CLASS_VLEN: case Datatype.CLASS_TIME: + case Datatype.CLASS_COMPLEX: byteData = convertMemberByte(baseType, theObj); break; diff --git a/src/org.hdfgroup.object/hdf/object/h5/H5Datatype.java b/src/org.hdfgroup.object/hdf/object/h5/H5Datatype.java index 42255ad2..e2943c5d 100644 --- a/src/org.hdfgroup.object/hdf/object/h5/H5Datatype.java +++ b/src/org.hdfgroup.object/hdf/object/h5/H5Datatype.java @@ -818,6 +818,7 @@ public void fromNative(long tid) tsize = H5.H5Tget_size(tid); isVariableStr = H5.H5Tis_variable_str(tid); isVLEN = false; + isComplex = false; log.trace("fromNative(): tclass={}, tsize={}, torder={}, isVLEN={}", nativeClass, tsize, torder, isVLEN); if (H5.H5Tcommitted(tid)) { @@ -1152,6 +1153,30 @@ else if (nativeClass == HDF5Constants.H5T_OPAQUE) { opaqueTag = null; } } + else if (nativeClass == HDF5Constants.H5T_COMPLEX) { + log.debug("fromNative(): datatypeClass is complex"); + long tmptid = HDF5Constants.H5I_INVALID_HID; + datatypeClass = CLASS_COMPLEX; + isComplex = true; + try { + log.trace("fromNative(): complex type"); + tmptid = H5.H5Tget_super(tid); + int nativeBaseClass = H5.H5Tget_class(tmptid); + baseType = new H5Datatype(this.fileFormat, tmptid, this); + if (baseType == null) { + log.debug("fromNative(): Complex datatype has null base type"); + throw new Exception("Datatype (Complex) has no base datatype"); + } + + datatypeSign = baseType.getDatatypeSign(); + } + catch (Exception ex) { + log.debug("fromNative(): Complex type failure: ", ex); + } + finally { + close(tmptid); + } + } else { log.debug("fromNative(): datatypeClass is unknown"); } @@ -1625,6 +1650,38 @@ else if (datatypeOrder == Datatype.ORDER_LE) { tid = HDF5Constants.H5I_INVALID_HID; } + break; + case CLASS_COMPLEX: + log.trace("createNative(): CLASS_COMPLEX is {}-byte H5T_COMPLEX", datatypeSize); + try { + if (baseType != null) { + if ((tmptid = baseType.createNative()) < 0) { + log.debug("createNative(): failed to create native type for COMPLEX base datatype"); + break; + } + + tid = H5.H5Tcomplex_create(tmptid); + } + else { + if (datatypeSize == NATIVE) { + datatypeNATIVE = true; + datatypeSize = H5.H5Tget_size(HDF5Constants.H5T_NATIVE_FLOAT); + } + else + datatypeNATIVE = false; + + tid = H5.H5Tcreate(HDF5Constants.H5T_COMPLEX, datatypeSize); + } + } + catch (Exception ex) { + log.debug("createNative(): native complex datatype creation failed: ", ex); + if (tid >= 0) + close(tid); + tid = HDF5Constants.H5I_INVALID_HID; + } + finally { + close(tmptid); + } break; default: log.debug("createNative(): Unknown class"); @@ -1738,8 +1795,8 @@ public static final Object allocateArray(final H5Datatype dtype, int numPoints) for (int i = 0; i < numPoints; i++) ((String[])data)[i] = ""; } - else if (typeClass == HDF5Constants.H5T_INTEGER) { - log.trace("allocateArray(): class H5T_INTEGER"); + else if (typeClass == CLASS_INTEGER) { + log.trace("allocateArray(): class CLASS_INTEGER"); if (typeSize == NATIVE) typeSize = H5.H5Tget_size(HDF5Constants.H5T_NATIVE_INT); @@ -1760,8 +1817,8 @@ else if (typeClass == HDF5Constants.H5T_INTEGER) { break; } } - else if (typeClass == HDF5Constants.H5T_ENUM) { - log.trace("allocateArray(): class H5T_ENUM"); + else if (typeClass == CLASS_ENUM) { + log.trace("allocateArray(): class CLASS_ENUM"); if (baseType != null) data = H5Datatype.allocateArray(baseType, numPoints); @@ -1771,13 +1828,13 @@ else if (typeClass == HDF5Constants.H5T_ENUM) { data = new byte[(int)(numPoints * typeSize)]; } } - else if (typeClass == HDF5Constants.H5T_COMPOUND) { - log.trace("allocateArray(): class H5T_COMPOUND"); + else if (typeClass == CLASS_COMPOUND) { + log.trace("allocateArray(): class CLASS_COMPOUND"); data = new ArrayList<>(dtype.getCompoundMemberTypes().size()); } - else if (typeClass == HDF5Constants.H5T_FLOAT) { - log.trace("allocateArray(): class H5T_FLOAT"); + else if (typeClass == CLASS_FLOAT) { + log.trace("allocateArray(): class CLASS_FLOAT"); if (typeSize == NATIVE) typeSize = H5.H5Tget_size(HDF5Constants.H5T_NATIVE_FLOAT); @@ -1798,8 +1855,8 @@ else if (typeClass == HDF5Constants.H5T_FLOAT) { break; } } - else if ((typeClass == HDF5Constants.H5T_STRING) || (typeClass == HDF5Constants.H5T_REFERENCE)) { - log.trace("allocateArray(): class H5T_STRING || H5T_REFERENCE"); + else if ((typeClass == CLASS_STRING) || (typeClass == CLASS_REFERENCE)) { + log.trace("allocateArray(): class CLASS_STRING || CLASS_REFERENCE"); data = new byte[(int)(numPoints * typeSize)]; } @@ -1812,8 +1869,8 @@ else if (dtype.isVLEN()) { // if (baseType != null) // ((ArrayList<>)data).add(H5Datatype.allocateArray(baseType, numPoints)); } - else if (typeClass == HDF5Constants.H5T_ARRAY) { - log.trace("allocateArray(): class H5T_ARRAY"); + else if (typeClass == CLASS_ARRAY) { + log.trace("allocateArray(): class CLASS_ARRAY"); try { log.trace("allocateArray(): ArrayRank={}", dtype.getArrayDims().length); @@ -1831,11 +1888,21 @@ else if (typeClass == HDF5Constants.H5T_ARRAY) { data = H5Datatype.allocateArray(baseType, asize); } catch (Exception ex) { - log.debug("allocateArray(): H5T_ARRAY class failure: ", ex); + log.debug("allocateArray(): CLASS_ARRAY class failure: ", ex); } } - else if ((typeClass == HDF5Constants.H5T_OPAQUE) || (typeClass == HDF5Constants.H5T_BITFIELD)) { - log.trace("allocateArray(): class H5T_OPAQUE || H5T_BITFIELD"); + else if (typeClass == CLASS_COMPLEX) { + log.trace("allocateArray(): class CLASS_COMPLEX"); + if (baseType != null) + data = H5Datatype.allocateArray(baseType, numPoints * 2); + else { + if (typeSize == NATIVE) + typeSize = H5.H5Tget_size(HDF5Constants.H5T_NATIVE_FLOAT); + data = new byte[(int) (numPoints * 2 * typeSize)]; + } + } + else if ((typeClass == CLASS_OPAQUE) || (typeClass == CLASS_BITFIELD)) { + log.trace("allocateArray(): class CLASS_OPAQUE || CLASS_BITFIELD"); if (typeSize == NATIVE) typeSize = H5.H5Tget_size(typeClass); @@ -2070,6 +2137,13 @@ else if (strCSET == HDF5Constants.H5T_CSET_UTF8) description.append(" of ").append(baseType.getDescription()); break; + case CLASS_COMPLEX: + log.trace("getDescription(): Complex"); + description.append("Complex"); + + if (baseType != null) + description.append(" of ").append(baseType.getDescription()); + break; default: description.append("Unknown"); break; @@ -2744,16 +2818,16 @@ else if (this.isCompound()) { return topTID; } - private boolean datatypeIsComplex(long tid) + private boolean datatypeIsComplicated(long tid) { long tclass = HDF5Constants.H5T_NO_CLASS; try { tclass = H5.H5Tget_class(tid); - log.trace("datatypeIsComplex():{}", tclass); + log.trace("datatypeIsComplicated():{}", tclass); } catch (Exception ex) { - log.debug("datatypeIsComplex():", ex); + log.debug("datatypeIsComplicated():", ex); } boolean retVal = (tclass == HDF5Constants.H5T_COMPOUND); @@ -2781,19 +2855,20 @@ private boolean datatypeIsReference(long tid) private boolean datatypeIsAtomic(long tid) { - boolean retVal = !(datatypeIsComplex(tid) | datatypeIsReference(tid) | isRef()); + boolean retVal = !(datatypeIsComplicated(tid) | datatypeIsReference(tid) | isRef()); retVal |= isOpaque(); retVal |= isBitField(); return retVal; } - private boolean datatypeClassIsComplex(long tclass) + private boolean datatypeClassIsComplicated(long tclass) { boolean retVal = (tclass == HDF5Constants.H5T_COMPOUND); retVal |= (tclass == HDF5Constants.H5T_ENUM); retVal |= (tclass == HDF5Constants.H5T_VLEN); retVal |= (tclass == HDF5Constants.H5T_ARRAY); + retVal |= (tclass == HDF5Constants.H5T_COMPLEX); return retVal; } @@ -2804,7 +2879,7 @@ private boolean datatypeClassIsComplex(long tclass) private boolean datatypeClassIsAtomic(long tclass) { - boolean retVal = !(datatypeClassIsComplex(tclass) | datatypeClassIsReference(tclass)); + boolean retVal = !(datatypeClassIsComplicated(tclass) | datatypeClassIsReference(tclass)); retVal |= (tclass == Datatype.CLASS_OPAQUE); retVal |= (tclass == Datatype.CLASS_BITFIELD); diff --git a/src/org.hdfgroup.object/hdf/object/h5/H5File.java b/src/org.hdfgroup.object/hdf/object/h5/H5File.java index abfdb8e5..4a0da5b2 100644 --- a/src/org.hdfgroup.object/hdf/object/h5/H5File.java +++ b/src/org.hdfgroup.object/hdf/object/h5/H5File.java @@ -139,8 +139,8 @@ public class H5File extends FileFormat { public static final int LIBVER_V112 = HDF5Constants.H5F_LIBVER_V112; /** The library v1.14 version value */ public static final int LIBVER_V114 = HDF5Constants.H5F_LIBVER_V114; - /** The library v1.16 version value */ - public static final int LIBVER_V116 = HDF5Constants.H5F_LIBVER_V116; + /** The library v2.0 version value */ + public static final int LIBVER_V200 = HDF5Constants.H5F_LIBVER_V200; /** * Indicate that this file is open for reading in a @@ -1099,8 +1099,8 @@ else if (lowStr.equals("V112")) low = HDF5Constants.H5F_LIBVER_V112; else if (lowStr.equals("V114")) low = HDF5Constants.H5F_LIBVER_V114; - else if (lowStr.equals("V116")) - low = HDF5Constants.H5F_LIBVER_V116; + else if (lowStr.equals("V200")) + low = HDF5Constants.H5F_LIBVER_V200; else if (lowStr.equals("Latest")) low = HDF5Constants.H5F_LIBVER_LATEST; else @@ -1116,8 +1116,8 @@ else if (highStr.equals("V112")) high = HDF5Constants.H5F_LIBVER_V112; else if (highStr.equals("V114")) high = HDF5Constants.H5F_LIBVER_V114; - else if (highStr.equals("V116")) - high = HDF5Constants.H5F_LIBVER_V116; + else if (highStr.equals("V200")) + high = HDF5Constants.H5F_LIBVER_V200; else if (highStr.equals("Latest")) high = HDF5Constants.H5F_LIBVER_LATEST; else @@ -1163,8 +1163,8 @@ else if (lowStr.equals("V112")) low = HDF5Constants.H5F_LIBVER_V112; else if (lowStr.equals("V114")) low = HDF5Constants.H5F_LIBVER_V114; - else if (lowStr.equals("V116")) - low = HDF5Constants.H5F_LIBVER_V116; + else if (lowStr.equals("V200")) + low = HDF5Constants.H5F_LIBVER_V200; else if (lowStr.equals("Latest")) low = HDF5Constants.H5F_LIBVER_LATEST; else @@ -1180,8 +1180,8 @@ else if (highStr.equals("V112")) high = HDF5Constants.H5F_LIBVER_V112; else if (highStr.equals("V114")) high = HDF5Constants.H5F_LIBVER_V114; - else if (highStr.equals("V116")) - high = HDF5Constants.H5F_LIBVER_V116; + else if (highStr.equals("V200")) + high = HDF5Constants.H5F_LIBVER_V200; else if (highStr.equals("Latest")) high = HDF5Constants.H5F_LIBVER_LATEST; else @@ -1255,8 +1255,8 @@ else if (libver[0] == HDF5Constants.H5F_LIBVER_V112) libversion = "V112 and "; else if (libver[0] == HDF5Constants.H5F_LIBVER_V114) libversion = "V114 and "; - else if (libver[0] == HDF5Constants.H5F_LIBVER_V116) - libversion = "V116 and "; + else if (libver[0] == HDF5Constants.H5F_LIBVER_V200) + libversion = "V200 and "; else if (libver[0] == HDF5Constants.H5F_LIBVER_LATEST) libversion = "Latest and "; @@ -1270,8 +1270,8 @@ else if (libver[1] == HDF5Constants.H5F_LIBVER_V112) libversion += "V112"; else if (libver[1] == HDF5Constants.H5F_LIBVER_V114) libversion += "V114"; - else if (libver[1] == HDF5Constants.H5F_LIBVER_V116) - libversion += "V116"; + else if (libver[1] == HDF5Constants.H5F_LIBVER_V200) + libversion += "V200"; else if (libver[1] == HDF5Constants.H5F_LIBVER_LATEST) libversion += "Latest"; return libversion; diff --git a/src/org.hdfgroup.object/hdf/object/h5/H5ScalarAttr.java b/src/org.hdfgroup.object/hdf/object/h5/H5ScalarAttr.java index 0fb912a6..f467ffe7 100644 --- a/src/org.hdfgroup.object/hdf/object/h5/H5ScalarAttr.java +++ b/src/org.hdfgroup.object/hdf/object/h5/H5ScalarAttr.java @@ -1225,7 +1225,7 @@ else if (dsDatatype.isCompound()) { for (int j = 0; j < lsize; j++) strs[j] = ""; try { - log.trace("AttributeCommonIO():read ioType H5AreadComplex"); + log.trace("AttributeCommonIO():read ioType H5AreadComplicated"); H5.H5AreadComplex(attr_id, tid, strs); } catch (Exception ex) { diff --git a/src/org.hdfgroup.object/hdf/object/h5/H5ScalarDS.java b/src/org.hdfgroup.object/hdf/object/h5/H5ScalarDS.java index 7f85c7b9..c10bbd83 100644 --- a/src/org.hdfgroup.object/hdf/object/h5/H5ScalarDS.java +++ b/src/org.hdfgroup.object/hdf/object/h5/H5ScalarDS.java @@ -375,10 +375,14 @@ public void init() datatype = new H5Datatype(getFileFormat(), tid); log.trace( - "init(): tid={} is tclass={} has isText={} : isNamed={} : isVLEN={} : isEnum={} : isUnsigned={} : isStdRef={} : isRegRef={}", + "init(): tid={} is tclass={} has isText={} : isNamed={} : isUnsigned={} ", tid, datatype.getDatatypeClass(), ((H5Datatype)datatype).isText(), datatype.isNamed(), - datatype.isVLEN(), datatype.isEnum(), datatype.isUnsigned(), - ((H5Datatype)datatype).isStdRef(), ((H5Datatype)datatype).isRegRef()); + datatype.isUnsigned()); + log.trace( + "init(): tid={} is tclass={} has isVLEN={} : isEnum={} : isStdRef={} : isRegRef={} : isComplex={}", + tid, datatype.getDatatypeClass(), datatype.isVLEN(), datatype.isEnum(), + ((H5Datatype) datatype).isStdRef(), ((H5Datatype) datatype).isRegRef(), + ((H5Datatype) datatype).isComplex()); } catch (Exception ex) { log.debug("init(): failed to create datatype for dataset: ", ex); @@ -495,6 +499,7 @@ public void init() startDims = new long[rank]; selectedDims = new long[rank]; + log.trace("init(): resetSelection"); resetSelection(); } else { @@ -2400,8 +2405,19 @@ else if (datatypeSize == 4) log.trace("parseFillValue(): class CLASS_REFERENCE"); data = HDFNativeData.longToByte((long)valDbl); break; + case Datatype.CLASS_COMPLEX: + log.trace("parseFillValue(): class CLASS_COMPLEX"); + break; default: log.debug("parseFillValue(): datatypeClass unknown"); + if (datatypeSize > 8) + data = valStr.getBytes(); + else if (datatypeSize == 8) + data = HDFNativeData.doubleToByte(valDbl); + else if (datatypeSize == 4) + data = HDFNativeData.floatToByte((float) valDbl); + else + data = HDFNativeData.shortToByte((short) Float.floatToFloat16((float) valDbl)); break; } // (datatypeClass) }