47#ifdef HAVE_EPETRAEXT_HDF5
53# include "Epetra_MpiComm.h"
60#include "Epetra_SerialComm.h"
62#include "Teuchos_ParameterList.hpp"
63#include "Teuchos_RCP.hpp"
64#include "Epetra_Map.h"
65#include "Epetra_BlockMap.h"
66#include "Epetra_CrsGraph.h"
67#include "Epetra_FECrsGraph.h"
68#include "Epetra_RowMatrix.h"
69#include "Epetra_CrsMatrix.h"
70#include "Epetra_FECrsMatrix.h"
71#include "Epetra_IntVector.h"
72#include "Epetra_MultiVector.h"
73#include "Epetra_Import.h"
78#define CHECK_HID(hid_t) \
80 throw(EpetraExt::Exception(__FILE__, __LINE__, \
81 "hid_t is negative")); }
83#define CHECK_STATUS(status) \
85 throw(EpetraExt::Exception(__FILE__, __LINE__, \
86 "function H5Giterater returned a negative value")); }
96static herr_t
FindDataset(hid_t loc_id,
const char *name,
void *opdata)
110 Teuchos::ParameterList::ConstIterator it = params.begin();
111 for (; it != params.end(); ++ it)
113 std::string key(params.name(it));
114 if (params.isSublist(key))
119 hid_t child_group_id = H5Gcreate(group_id, key.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
121 H5Gclose(child_group_id);
132 hid_t dataspace_id, dataset_id;
136 if (params.isType<std::string>(key))
138 std::string value = params.get<std::string>(key);
139 hsize_t len = value.size() + 1;
140 dataspace_id = H5Screate_simple(1, &len, NULL);
141 dataset_id = H5Dcreate(group_id, key.c_str(), H5T_C_S1, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
142 status = H5Dwrite(dataset_id, H5T_C_S1, H5S_ALL, H5S_ALL,
143 H5P_DEFAULT, value.c_str());
145 status = H5Dclose(dataset_id);
147 status = H5Sclose(dataspace_id);
152 if (params.isType<
bool>(key))
155 unsigned short value = params.get<
bool>(key) ? 1 : 0;
156 dataspace_id = H5Screate_simple(1, &one, NULL);
157 dataset_id = H5Dcreate(group_id, key.c_str(), H5T_NATIVE_USHORT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
158 status = H5Dwrite(dataset_id, H5T_NATIVE_USHORT, H5S_ALL, H5S_ALL,
159 H5P_DEFAULT, &value);
161 status = H5Dclose(dataset_id);
163 status = H5Sclose(dataspace_id);
168 if (params.isType<
int>(key))
170 int value = params.get<
int>(key);
171 dataspace_id = H5Screate_simple(1, &one, NULL);
172 dataset_id = H5Dcreate(group_id, key.c_str(), H5T_NATIVE_INT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
173 status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
174 H5P_DEFAULT, &value);
176 status = H5Dclose(dataset_id);
178 status = H5Sclose(dataspace_id);
183 if (params.isType<
double>(key))
185 double value = params.get<
double>(key);
186 dataspace_id = H5Screate_simple(1, &one, NULL);
187 dataset_id = H5Dcreate(group_id, key.c_str(), H5T_NATIVE_DOUBLE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
188 status = H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
189 H5P_DEFAULT, &value);
191 status = H5Dclose(dataset_id);
193 status = H5Sclose(dataspace_id);
201 "type for parameter " + key +
" not supported"));
210static herr_t
f_operator(hid_t loc_id,
const char *name,
void *opdata)
213 hid_t dataset_id, space_id, type_id;
214 Teuchos::ParameterList* sublist;
215 Teuchos::ParameterList* params = (Teuchos::ParameterList*)opdata;
221 H5Gget_objinfo(loc_id, name, 0, &statbuf);
222 if (strcmp(name,
"__type__") == 0)
225 switch (statbuf.type) {
227 sublist = ¶ms->sublist(name);
228 H5Giterate(loc_id, name , NULL,
f_operator, sublist);
232 dataset_id = H5Dopen(loc_id, name, H5P_DEFAULT);
233 space_id = H5Dget_space(dataset_id);
234 if (H5Sget_simple_extent_ndims(space_id) != 1)
236 "dimensionality of parameters must be 1."));
237 H5Sget_simple_extent_dims(space_id, &len, NULL);
238 type_id = H5Dget_type(dataset_id);
239 if (H5Tequal(type_id, H5T_NATIVE_DOUBLE) > 0) {
241 H5Dread(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value);
242 params->set(name, value);
243 }
else if (H5Tequal(type_id, H5T_NATIVE_INT) > 0) {
245 H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value);
246 params->set(name, value);
247 }
else if (H5Tequal(type_id, H5T_C_S1) > 0) {
248 char* buf =
new char[len];
249 H5Dread(dataset_id, H5T_C_S1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
250 params->set(name, std::string(buf));
252 }
else if (H5Tequal(type_id, H5T_NATIVE_USHORT) > 0) {
253 unsigned short value;
254 H5Dread(dataset_id, H5T_NATIVE_USHORT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value);
255 params->set(name, value != 0 ?
true :
false);
258 "unsupported datatype"));
262 H5Dclose(dataset_id);
266 "unsupported datatype"));
282 "an HDF5 is already open, first close the current one",
283 "using method Close(), then open/create a new one"));
285 FileName_ = FileName;
288 plist_id_ = H5Pcreate(H5P_FILE_ACCESS);
298 MPI_Comm mpiComm = MPI_COMM_NULL;
303 if (mpiWrapper != NULL) {
304 mpiComm = mpiWrapper->
Comm();
311 if (serialWrapper != NULL) {
317 mpiComm = MPI_COMM_SELF;
321 const char*
const errMsg =
"EpetraExt::HDF5::Create: This HDF5 object "
322 "was created with an Epetra_Comm instance which is neither an "
323 "Epetra_MpiComm nor a Epetra_SerialComm. As a result, we do not "
324 "know how to get an MPI communicator from it. Our HDF5 class only "
325 "understands Epetra_Comm objects which are instances of one of these "
333 if (mpiComm == MPI_COMM_NULL) {
334 const char*
const errMsg =
"EpetraExt::HDF5::Create: The Epetra_Comm "
335 "object with which this HDF5 instance was created wraps MPI_COMM_NULL, "
336 "which is an invalid MPI communicator. HDF5 requires a valid MPI "
347 H5Pset_fapl_mpio(plist_id_, mpiComm, MPI_INFO_NULL);
352 unsigned int boh = H5Z_FILTER_MAX;
353 H5Pset_filter(plist_id_, H5Z_FILTER_DEFLATE, H5Z_FILTER_MAX, 0, &boh);
357 file_id_ = H5Fcreate(FileName.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT,
369 "an HDF5 is already open, first close the current one",
370 "using method Close(), then open/create a new one"));
372 FileName_ = FileName;
375 plist_id_ = H5Pcreate(H5P_FILE_ACCESS);
382 H5Pset_fapl_mpio(plist_id_, MPI_COMM_WORLD, MPI_INFO_NULL);
384 H5Pset_fapl_mpio(plist_id_, MpiComm->
Comm(), MPI_INFO_NULL);
388 file_id_ = H5Fopen(FileName.c_str(), AccessType, plist_id_);
398 throw(
Exception(__FILE__, __LINE__,
"no file open yet"));
405 size_t pos = Name.find(
"/");
406 if (pos != std::string::npos)
408 std::string NewGroupName = Name.substr(0, pos);
410 NewGroupName = GroupName +
"/" + NewGroupName;
411 std::string NewName = Name.substr(pos + 1);
412 return IsContained(NewName, NewGroupName);
415 GroupName =
"/" + GroupName;
418 H5Giterate(file_id_, GroupName.c_str(), NULL,
FindDataset, (
void*)&data);
437 std::vector<int> NumMyElements_v(Comm_.NumProc());
438 Comm_.GatherAll(&NumMyElements, &NumMyElements_v[0], 1);
440 std::vector<int> NumMyPoints_v(Comm_.NumProc());
441 Comm_.GatherAll(&NumMyPoints, &NumMyPoints_v[0], 1);
443 Write(Name,
"MyGlobalElements", NumMyElements, NumGlobalElements,
444 H5T_NATIVE_INT, MyGlobalElements);
445 Write(Name,
"ElementSizeList", NumMyElements, NumGlobalElements,
446 H5T_NATIVE_INT, ElementSizeList);
447 Write(Name,
"NumMyPoints", H5T_NATIVE_INT, Comm_.NumProc(), &NumMyPoints_v[0]);
450 Write(Name,
"NumProc", Comm_.NumProc());
452 Write(Name,
"NumGlobalPoints", 1, Comm_.NumProc(), H5T_NATIVE_INT, &NumGlobalPoints);
453 Write(Name,
"NumGlobalElements", 1, Comm_.NumProc(), H5T_NATIVE_INT, &NumGlobalElements);
454 Write(Name,
"IndexBase", BlockMap.
IndexBase());
455 Write(Name,
"__type__",
"Epetra_BlockMap");
461 int NumGlobalElements, NumGlobalPoints, IndexBase, NumProc;
463 ReadBlockMapProperties(GroupName, NumGlobalElements, NumGlobalPoints,
466 std::vector<int> NumMyPoints_v(Comm_.NumProc());
467 std::vector<int> NumMyElements_v(Comm_.NumProc());
469 Read(GroupName,
"NumMyElements", H5T_NATIVE_INT, Comm_.NumProc(), &NumMyElements_v[0]);
470 Read(GroupName,
"NumMyPoints", H5T_NATIVE_INT, Comm_.NumProc(), &NumMyPoints_v[0]);
471 int NumMyElements = NumMyElements_v[Comm_.MyPID()];
474 if (NumProc != Comm_.NumProc())
476 "requested map not compatible with current number of",
477 "processors, " +
toString(Comm_.NumProc()) +
480 std::vector<int> MyGlobalElements(NumMyElements);
481 std::vector<int> ElementSizeList(NumMyElements);
483 Read(GroupName,
"MyGlobalElements", NumMyElements, NumGlobalElements,
484 H5T_NATIVE_INT, &MyGlobalElements[0]);
486 Read(GroupName,
"ElementSizeList", NumMyElements, NumGlobalElements,
487 H5T_NATIVE_INT, &ElementSizeList[0]);
490 &MyGlobalElements[0], &ElementSizeList[0],
496 int& NumGlobalElements,
497 int& NumGlobalPoints,
501 if (!IsContained(GroupName))
503 "requested group " + GroupName +
" not found"));
506 Read(GroupName,
"__type__", Label);
508 if (Label !=
"Epetra_BlockMap")
510 "requested group " + GroupName +
" is not an Epetra_BlockMap",
511 "__type__ = " + Label));
513 Read(GroupName,
"NumGlobalElements", NumGlobalElements);
514 Read(GroupName,
"NumGlobalPoints", NumGlobalPoints);
515 Read(GroupName,
"IndexBase", IndexBase);
516 Read(GroupName,
"NumProc", NumProc);
526 std::vector<int> NumMyElements(Comm_.NumProc());
527 Comm_.GatherAll(&MySize, &NumMyElements[0], 1);
529 Write(Name,
"MyGlobalElements", MySize, GlobalSize,
530 H5T_NATIVE_INT, MyGlobalElements);
531 Write(Name,
"NumMyElements", H5T_NATIVE_INT, Comm_.NumProc(), &NumMyElements[0]);
532 Write(Name,
"NumGlobalElements", 1, Comm_.NumProc(), H5T_NATIVE_INT, &GlobalSize);
533 Write(Name,
"NumProc", Comm_.NumProc());
534 Write(Name,
"IndexBase", Map.
IndexBase());
535 Write(Name,
"__type__",
"Epetra_Map");
541 int NumGlobalElements, IndexBase, NumProc;
543 ReadMapProperties(GroupName, NumGlobalElements, IndexBase, NumProc);
545 std::vector<int> NumMyElements_v(Comm_.NumProc());
547 Read(GroupName,
"NumMyElements", H5T_NATIVE_INT, Comm_.NumProc(), &NumMyElements_v[0]);
548 int NumMyElements = NumMyElements_v[Comm_.MyPID()];
550 if (NumProc != Comm_.NumProc())
552 "requested map not compatible with current number of",
553 "processors, " +
toString(Comm_.NumProc()) +
556 std::vector<int> MyGlobalElements(NumMyElements);
558 Read(GroupName,
"MyGlobalElements", NumMyElements, NumGlobalElements,
559 H5T_NATIVE_INT, &MyGlobalElements[0]);
561 Map =
new Epetra_Map(-1, NumMyElements, &MyGlobalElements[0], IndexBase, Comm_);
566 int& NumGlobalElements,
570 if (!IsContained(GroupName))
572 "requested group " + GroupName +
" not found"));
575 Read(GroupName,
"__type__", Label);
577 if (Label !=
"Epetra_Map")
579 "requested group " + GroupName +
" is not an Epetra_Map",
580 "__type__ = " + Label));
582 Read(GroupName,
"NumGlobalElements", NumGlobalElements);
583 Read(GroupName,
"IndexBase", IndexBase);
584 Read(GroupName,
"NumProc", NumProc);
598 H5T_NATIVE_INT, x.
Values());
613 H5T_NATIVE_INT, LinearX.
Values());
615 Write(Name,
"__type__",
"Epetra_IntVector");
623 ReadIntVectorProperties(GroupName, GlobalLength);
639 ReadIntVectorProperties(GroupName, GlobalLength);
646 H5T_NATIVE_INT, X->
Values());
658 H5T_NATIVE_INT, LinearX.
Values());
670 if (!IsContained(GroupName))
672 "requested group " + GroupName +
" not found"));
675 Read(GroupName,
"__type__", Label);
677 if (Label !=
"Epetra_IntVector")
679 "requested group " + GroupName +
" is not an Epetra_IntVector",
680 "__type__ = " + Label));
682 Read(GroupName,
"GlobalLength", GlobalLength);
694 "input Epetra_CrsGraph is not FillComplete()'d"));
699 std::vector<int> ROW(MySize);
700 std::vector<int> COL(MySize);
706 for (
int i = 0; i < Graph.
NumMyRows(); ++i)
709 for (
int j = 0; j < NumEntries; ++j)
711 ROW[count] = Graph.
GRID(i);
712 COL[count] = Graph.
GCID(RowIndices[j]);
717 Write(Name,
"ROW", MySize, GlobalSize, H5T_NATIVE_INT, &ROW[0]);
718 Write(Name,
"COL", MySize, GlobalSize, H5T_NATIVE_INT, &COL[0]);
724 Write(Name,
"__type__",
"Epetra_CrsGraph");
730 int NumGlobalRows, NumGlobalCols;
731 int NumGlobalNonzeros, NumGlobalDiagonals, MaxNumIndices;
733 ReadCrsGraphProperties(GroupName, NumGlobalRows,
734 NumGlobalCols, NumGlobalNonzeros,
735 NumGlobalDiagonals, MaxNumIndices);
738 Epetra_Map DomainMap(NumGlobalCols, 0, Comm_);
740 Read(GroupName, DomainMap, RangeMap, Graph);
747 int& NumGlobalNonzeros,
748 int& NumGlobalDiagonals,
751 if (!IsContained(GroupName))
753 "requested group " + GroupName +
" not found"));
756 Read(GroupName,
"__type__", Label);
758 if (Label !=
"Epetra_CrsGraph")
760 "requested group " + GroupName +
" is not an Epetra_CrsGraph",
761 "__type__ = " + Label));
763 Read(GroupName,
"NumGlobalRows", NumGlobalRows);
764 Read(GroupName,
"NumGlobalCols", NumGlobalCols);
765 Read(GroupName,
"NumGlobalNonzeros", NumGlobalNonzeros);
766 Read(GroupName,
"NumGlobalDiagonals", NumGlobalDiagonals);
767 Read(GroupName,
"MaxNumIndices", MaxNumIndices);
774 if (!IsContained(GroupName))
776 "requested group " + GroupName +
" not found in database"));
779 Read(GroupName,
"__type__", Label);
781 if (Label !=
"Epetra_CrsGraph")
783 "requested group " + GroupName +
" is not an Epetra_CrsGraph",
784 "__type__ = " + Label));
786 int NumGlobalRows, NumGlobalCols, NumGlobalNonzeros;
787 Read(GroupName,
"NumGlobalNonzeros", NumGlobalNonzeros);
788 Read(GroupName,
"NumGlobalRows", NumGlobalRows);
789 Read(GroupName,
"NumGlobalCols", NumGlobalCols);
792 int NumMyNonzeros = NumGlobalNonzeros / Comm_.NumProc();
793 if (Comm_.MyPID() == 0)
794 NumMyNonzeros += NumGlobalNonzeros % Comm_.NumProc();
796 std::vector<int> ROW(NumMyNonzeros);
797 Read(GroupName,
"ROW", NumMyNonzeros, NumGlobalNonzeros, H5T_NATIVE_INT, &ROW[0]);
799 std::vector<int> COL(NumMyNonzeros);
800 Read(GroupName,
"COL", NumMyNonzeros, NumGlobalNonzeros, H5T_NATIVE_INT, &COL[0]);
804 for (
int i = 0; i < NumMyNonzeros; )
807 while (ROW[i + count] == ROW[i])
828 "input Epetra_RowMatrix is not FillComplete()'d"));
832 std::vector<int> ROW(MySize);
833 std::vector<int> COL(MySize);
834 std::vector<double> VAL(MySize);
838 std::vector<int> Indices(Length);
839 std::vector<double> Values(Length);
842 for (
int i = 0; i < Matrix.
NumMyRows(); ++i)
845 for (
int j = 0; j < NumEntries; ++j)
849 VAL[count] = Values[j];
854 Write(Name,
"ROW", MySize, GlobalSize, H5T_NATIVE_INT, &ROW[0]);
855 Write(Name,
"COL", MySize, GlobalSize, H5T_NATIVE_INT, &COL[0]);
856 Write(Name,
"VAL", MySize, GlobalSize, H5T_NATIVE_DOUBLE, &VAL[0]);
862 Write(Name,
"NormOne", Matrix.
NormOne());
863 Write(Name,
"NormInf", Matrix.
NormInf());
864 Write(Name,
"__type__",
"Epetra_RowMatrix");
870 int NumGlobalRows, NumGlobalCols, NumGlobalNonzeros;
871 int NumGlobalDiagonals, MaxNumEntries;
872 double NormOne, NormInf;
874 ReadCrsMatrixProperties(GroupName, NumGlobalRows, NumGlobalCols,
875 NumGlobalNonzeros, NumGlobalDiagonals, MaxNumEntries,
880 Epetra_Map DomainMap(NumGlobalCols, 0, Comm_);
882 Read(GroupName, DomainMap, RangeMap, A);
889 int NumGlobalRows, NumGlobalCols, NumGlobalNonzeros;
890 int NumGlobalDiagonals, MaxNumEntries;
891 double NormOne, NormInf;
893 ReadCrsMatrixProperties(GroupName, NumGlobalRows, NumGlobalCols,
894 NumGlobalNonzeros, NumGlobalDiagonals, MaxNumEntries,
897 int NumMyNonzeros = NumGlobalNonzeros / Comm_.NumProc();
898 if (Comm_.MyPID() == 0)
899 NumMyNonzeros += NumGlobalNonzeros % Comm_.NumProc();
901 std::vector<int> ROW(NumMyNonzeros);
902 Read(GroupName,
"ROW", NumMyNonzeros, NumGlobalNonzeros, H5T_NATIVE_INT, &ROW[0]);
904 std::vector<int> COL(NumMyNonzeros);
905 Read(GroupName,
"COL", NumMyNonzeros, NumGlobalNonzeros, H5T_NATIVE_INT, &COL[0]);
907 std::vector<double> VAL(NumMyNonzeros);
908 Read(GroupName,
"VAL", NumMyNonzeros, NumGlobalNonzeros, H5T_NATIVE_DOUBLE, &VAL[0]);
912 for (
int i = 0; i < NumMyNonzeros; )
915 while (ROW[i + count] == ROW[i])
931 int& NumGlobalNonzeros,
932 int& NumGlobalDiagonals,
937 if (!IsContained(GroupName))
939 "requested group " + GroupName +
" not found"));
942 Read(GroupName,
"__type__", Label);
944 if (Label !=
"Epetra_RowMatrix")
946 "requested group " + GroupName +
" is not an Epetra_RowMatrix",
947 "__type__ = " + Label));
949 Read(GroupName,
"NumGlobalRows", NumGlobalRows);
950 Read(GroupName,
"NumGlobalCols", NumGlobalCols);
951 Read(GroupName,
"NumGlobalNonzeros", NumGlobalNonzeros);
952 Read(GroupName,
"NumGlobalDiagonals", NumGlobalDiagonals);
953 Read(GroupName,
"MaxNumEntries", MaxNumEntries);
954 Read(GroupName,
"NormOne", NormOne);
955 Read(GroupName,
"NormInf", NormInf);
966 throw(
Exception(__FILE__, __LINE__,
"no file open yet"));
968 hid_t group_id = H5Gcreate(file_id_, GroupName.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
974 status = H5Gclose(group_id);
977 Write(GroupName,
"__type__",
"Teuchos::ParameterList");
984 throw(
Exception(__FILE__, __LINE__,
"no file open yet"));
987 Read(GroupName,
"__type__", Label);
989 if (Label !=
"Teuchos::ParameterList")
991 "requested group " + GroupName +
" is not a Teuchos::ParameterList",
992 "__type__ = " + Label));
999 group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1003 std::string xxx =
"/" + GroupName;
1004 status = H5Giterate(group_id, xxx.c_str() , NULL,
f_operator, ¶ms);
1008 status = H5Gclose(group_id);
1021 throw(
Exception(__FILE__, __LINE__,
"no file open yet"));
1023 hid_t group_id, dset_id;
1024 hid_t filespace_id, memspace_id;
1028 Teuchos::RCP<Epetra_MultiVector> LinearX;
1037 LinearX->Import(X, Importer,
Insert);
1047 if (writeTranspose) indexT = 1;
1049 hsize_t q_dimsf[] = {
static_cast<hsize_t
>(GlobalLength),
static_cast<hsize_t
>(GlobalLength)};
1050 q_dimsf[indexT] = NumVectors;
1052 filespace_id = H5Screate_simple(2, q_dimsf, NULL);
1054 if (!IsContained(GroupName))
1055 CreateGroup(GroupName);
1057 group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1060 dset_id = H5Dcreate(group_id,
"Values", H5T_NATIVE_DOUBLE, filespace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1063 plist_id_ = H5Pcreate(H5P_DATASET_XFER);
1065 H5Pset_dxpl_mpio(plist_id_, H5FD_MPIO_COLLECTIVE);
1070 hsize_t offset[] = {
static_cast<hsize_t
>(LinearX->Map().GID(0)-X.
Map().
IndexBase()),
1071 static_cast<hsize_t
>(LinearX->Map().GID(0)-X.
Map().
IndexBase())};
1072 hsize_t stride[] = {1, 1};
1073 hsize_t count[] = {
static_cast<hsize_t
>(LinearX->MyLength()),
1074 static_cast<hsize_t
>(LinearX->MyLength())};
1075 hsize_t block[] = {1, 1};
1078 for (
int n(0); n < NumVectors; ++n)
1084 filespace_id = H5Dget_space(dset_id);
1085 H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, offset, stride,
1089 hsize_t dimsm[] = {
static_cast<hsize_t
>(LinearX->MyLength())};
1090 memspace_id = H5Screate_simple(1, dimsm, NULL);
1093 status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, memspace_id, filespace_id,
1094 plist_id_, LinearX->operator[](n));
1096 H5Sclose(memspace_id);
1099 H5Sclose(filespace_id);
1101 H5Pclose(plist_id_);
1103 Write(GroupName,
"GlobalLength", GlobalLength);
1104 Write(GroupName,
"NumVectors", NumVectors);
1105 Write(GroupName,
"__type__",
"Epetra_MultiVector");
1114 Read(GroupName, LinearX, writeTranspose, Map.
IndexBase());
1127 bool readTranspose,
const int& indexBase)
1129 int GlobalLength, NumVectors;
1131 ReadMultiVectorProperties(GroupName, GlobalLength, NumVectors);
1140 if (readTranspose) indexT = 1;
1142 hsize_t q_dimsf[] = {
static_cast<hsize_t
>(GlobalLength),
static_cast<hsize_t
>(GlobalLength)};
1143 q_dimsf[indexT] = NumVectors;
1145 hid_t filespace_id = H5Screate_simple(2, q_dimsf, NULL);
1147 if (!IsContained(GroupName))
1149 "requested group " + GroupName +
" not found"));
1151 group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1154 hid_t dset_id = H5Dopen(group_id,
"Values", H5P_DEFAULT);
1157 plist_id_ = H5Pcreate(H5P_DATASET_XFER);
1159 H5Pset_dxpl_mpio(plist_id_, H5FD_MPIO_COLLECTIVE);
1161 H5Pclose(plist_id_);
1163 Epetra_Map LinearMap(GlobalLength, indexBase, Comm());
1167 hsize_t offset[] = {
static_cast<hsize_t
>(LinearMap.
GID(0) - indexBase),
static_cast<hsize_t
>(LinearMap.
GID(0) - indexBase)};
1168 hsize_t stride[] = {1, 1};
1175 hsize_t count[] = {1, 1};
1176 hsize_t block[] = {
static_cast<hsize_t
>(LinearX->
MyLength()),
static_cast<hsize_t
>(LinearX->
MyLength())};
1179 count [indexT] = NumVectors;
1182 filespace_id = H5Dget_space(dset_id);
1183 H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, offset, stride,
1187 hsize_t dimsm[] = {NumVectors *
static_cast<hsize_t
>(LinearX->
MyLength())};
1188 memspace_id = H5Screate_simple(1, dimsm, NULL);
1191 CHECK_STATUS(H5Dread(dset_id, H5T_NATIVE_DOUBLE, memspace_id, filespace_id,
1192 H5P_DEFAULT, LinearX->
Values()));
1198 hsize_t count[] = {
static_cast<hsize_t
>(LinearX->
MyLength()),
1199 static_cast<hsize_t
>(LinearX->
MyLength())};
1200 hsize_t block[] = {1, 1};
1203 for (
int n(0); n < NumVectors; ++n)
1209 filespace_id = H5Dget_space(dset_id);
1210 H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, offset, stride,
1214 hsize_t dimsm[] = {
static_cast<hsize_t
>(LinearX->
MyLength())};
1215 memspace_id = H5Screate_simple(1, dimsm, NULL);
1218 CHECK_STATUS(H5Dread(dset_id, H5T_NATIVE_DOUBLE, memspace_id, filespace_id,
1219 H5P_DEFAULT, LinearX->operator[](n)));
1235 if (!IsContained(GroupName))
1237 "requested group " + GroupName +
" not found"));
1240 Read(GroupName,
"__type__", Label);
1242 if (Label !=
"Epetra_MultiVector")
1244 "requested group " + GroupName +
" is not an Epetra_MultiVector",
1245 "__type__ = " + Label));
1247 Read(GroupName,
"GlobalLength", GlobalLength);
1248 Read(GroupName,
"NumVectors", NumVectors);
1262 H5T_NATIVE_INT, x.
Values());
1277 H5T_NATIVE_INT, LinearX.
Values());
1280 Write(GroupName,
"__type__",
"EpetraExt::DistArray<int>");
1282 Write(GroupName,
"RowSize", x.
RowSize());
1290 int GlobalLength, RowSize;
1291 ReadIntDistArrayProperties(GroupName, GlobalLength, RowSize);
1307 Read(GroupName,
"Values", LinearMap.
NumMyElements() * RowSize,
1309 H5T_NATIVE_INT, LinearX.
Values());
1321 int GlobalLength, RowSize;
1322 ReadIntDistArrayProperties(GroupName, GlobalLength, RowSize);
1325 Epetra_Map LinearMap(GlobalLength, 0, Comm_);
1328 Read(GroupName,
"Values", LinearMap.
NumMyElements() * RowSize,
1337 if (!IsContained(GroupName))
1339 "requested group " + GroupName +
" not found"));
1342 Read(GroupName,
"__type__", Label);
1344 if (Label !=
"EpetraExt::DistArray<int>")
1346 "requested group " + GroupName +
" is not an EpetraExt::DistArray<int>",
1347 "__type__ = " + Label));
1349 Read(GroupName,
"GlobalLength", GlobalLength);
1350 Read(GroupName,
"RowSize", RowSize);
1364 H5T_NATIVE_DOUBLE, x.
Values());
1379 H5T_NATIVE_DOUBLE, LinearX.
Values());
1382 Write(GroupName,
"__type__",
"EpetraExt::DistArray<double>");
1384 Write(GroupName,
"RowSize", x.
RowSize());
1392 int GlobalLength, RowSize;
1393 ReadDoubleDistArrayProperties(GroupName, GlobalLength, RowSize);
1409 Read(GroupName,
"Values", LinearMap.
NumMyElements() * RowSize,
1411 H5T_NATIVE_DOUBLE, LinearX.
Values());
1423 int GlobalLength, RowSize;
1424 ReadDoubleDistArrayProperties(GroupName, GlobalLength, RowSize);
1427 Epetra_Map LinearMap(GlobalLength, 0, Comm_);
1430 Read(GroupName,
"Values", LinearMap.
NumMyElements() * RowSize,
1439 if (!IsContained(GroupName))
1441 "requested group " + GroupName +
" not found"));
1444 Read(GroupName,
"__type__", Label);
1446 if (Label !=
"EpetraExt::DistArray<double>")
1448 "requested group " + GroupName +
" is not an EpetraExt::DistArray<double>",
1449 "__type__ = " + Label));
1451 Read(GroupName,
"GlobalLength", GlobalLength);
1452 Read(GroupName,
"RowSize", RowSize);
1463 if (!IsContained(GroupName))
1464 CreateGroup(GroupName);
1466 hid_t filespace_id = H5Screate(H5S_SCALAR);
1467 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1468 hid_t dset_id = H5Dcreate(group_id, DataSetName.c_str(), H5T_NATIVE_INT,
1469 filespace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1471 herr_t status = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, filespace_id,
1472 H5P_DEFAULT, &what);
1478 H5Sclose(filespace_id);
1485 if (!IsContained(GroupName))
1486 CreateGroup(GroupName);
1488 hid_t filespace_id = H5Screate(H5S_SCALAR);
1489 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1490 hid_t dset_id = H5Dcreate(group_id, DataSetName.c_str(), H5T_NATIVE_DOUBLE,
1491 filespace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1493 herr_t status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL,
1494 filespace_id, H5P_DEFAULT, &what);
1500 H5Sclose(filespace_id);
1506 if (!IsContained(GroupName))
1508 "requested group " + GroupName +
" not found"));
1511 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1513 hid_t filespace_id = H5Screate(H5S_SCALAR);
1514 hid_t dset_id = H5Dopen(group_id, DataSetName.c_str(), H5P_DEFAULT);
1516 herr_t status = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, filespace_id,
1517 H5P_DEFAULT, &data);
1520 H5Sclose(filespace_id);
1528 if (!IsContained(GroupName))
1530 "requested group " + GroupName +
" not found"));
1533 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1535 hid_t filespace_id = H5Screate(H5S_SCALAR);
1536 hid_t dset_id = H5Dopen(group_id, DataSetName.c_str(), H5P_DEFAULT);
1538 herr_t status = H5Dread(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL, filespace_id,
1539 H5P_DEFAULT, &data);
1542 H5Sclose(filespace_id);
1549 const std::string& DataSetName,
1550 const std::string& data)
1552 if (!IsContained(GroupName))
1553 CreateGroup(GroupName);
1557 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1559 hid_t dataspace_id = H5Screate_simple(1, &len, NULL);
1561 hid_t atype = H5Tcopy(H5T_C_S1);
1562 H5Tset_size(atype, data.size() + 1);
1564 hid_t dataset_id = H5Dcreate(group_id, DataSetName.c_str(), atype,
1565 dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1566 CHECK_STATUS(H5Dwrite(dataset_id, atype, H5S_ALL, H5S_ALL,
1567 H5P_DEFAULT, data.c_str()));
1580 const std::string& DataSetName,
1583 if (!IsContained(GroupName))
1585 "requested group " + GroupName +
" not found"));
1587 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1589 hid_t dataset_id = H5Dopen(group_id, DataSetName.c_str(), H5P_DEFAULT);
1591 hid_t datatype_id = H5Dget_type(dataset_id);
1593 H5T_class_t typeclass_id = H5Tget_class(datatype_id);
1595 if(typeclass_id != H5T_STRING)
1597 "requested group " + GroupName +
" is not a std::string"));
1599 CHECK_STATUS(H5Dread(dataset_id, datatype_id, H5S_ALL, H5S_ALL,
1600 H5P_DEFAULT, data2));
1603 H5Dclose(dataset_id);
1613 const hid_t type,
const int Length,
1616 if (!IsContained(GroupName))
1617 CreateGroup(GroupName);
1619 hsize_t dimsf = Length;
1621 hid_t filespace_id = H5Screate_simple(1, &dimsf, NULL);
1623 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1625 hid_t dset_id = H5Dcreate(group_id, DataSetName.c_str(), type,
1626 filespace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1628 herr_t status = H5Dwrite(dset_id, type, H5S_ALL, H5S_ALL,
1635 H5Sclose(filespace_id);
1640 const hid_t type,
const int Length,
1643 if (!IsContained(GroupName))
1645 "requested group " + GroupName +
" not found"));
1647 hsize_t dimsf = Length;
1649 hid_t filespace_id = H5Screate_simple(1, &dimsf, NULL);
1651 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1653 hid_t dset_id = H5Dopen(group_id, DataSetName.c_str(), H5P_DEFAULT);
1655 herr_t status = H5Dread(dset_id, type, H5S_ALL, filespace_id,
1662 H5Sclose(filespace_id);
1671 int MySize,
int GlobalSize, hid_t type,
const void* data)
1674 Comm_.ScanSum(&MySize, &Offset, 1);
1677 hsize_t MySize_t = MySize;
1678 hsize_t GlobalSize_t = GlobalSize;
1679 hsize_t Offset_t = Offset;
1681 hid_t filespace_id = H5Screate_simple(1, &GlobalSize_t, NULL);
1684 if (!IsContained(GroupName))
1685 CreateGroup(GroupName);
1687 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1688 hid_t dset_id = H5Dcreate(group_id, DataSetName.c_str(), type, filespace_id,
1689 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
1691 H5Sclose(filespace_id);
1696 hid_t memspace_id = H5Screate_simple(1, &MySize_t, NULL);
1699 filespace_id = H5Dget_space(dset_id);
1700 H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, &Offset_t, NULL, &MySize_t, NULL);
1702 plist_id_ = H5Pcreate(H5P_DATASET_XFER);
1704 H5Pset_dxpl_mpio(plist_id_, H5FD_MPIO_COLLECTIVE);
1707 status = H5Dwrite(dset_id, type, memspace_id, filespace_id,
1714 H5Sclose(filespace_id);
1715 H5Sclose(memspace_id);
1716 H5Pclose(plist_id_);
1721 int MySize,
int GlobalSize,
1722 const hid_t type,
void* data)
1725 throw(
Exception(__FILE__, __LINE__,
"no file open yet"));
1727 hsize_t MySize_t = MySize;
1731 Comm_.ScanSum(&MySize, &itmp, 1);
1732 hsize_t Offset_t = itmp - MySize;
1734 hid_t group_id = H5Gopen(file_id_, GroupName.c_str(), H5P_DEFAULT);
1735 hid_t dataset_id = H5Dopen(group_id, DataSetName.c_str(), H5P_DEFAULT);
1739 hid_t filespace_id = H5Dget_space(dataset_id);
1740 H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, &Offset_t, NULL,
1743 hid_t mem_dataspace = H5Screate_simple (1, &MySize_t, NULL);
1745 herr_t status = H5Dread(dataset_id, type, mem_dataspace, filespace_id,
1749 H5Sclose(mem_dataspace);
1752 H5Dclose(dataset_id);
#define CHECK_STATUS(status)
static void WriteParameterListRecursive(const Teuchos::ParameterList ¶ms, hid_t group_id)
static herr_t f_operator(hid_t loc_id, const char *name, void *opdata)
static herr_t FindDataset(hid_t loc_id, const char *name, void *opdata)
DistArray<T>: A class to store row-oriented multivectors of type T.
T * Values()
Returns a pointer to the internally stored data (non-const version).
int RowSize() const
Returns the row size, that is, the amount of data associated with each element.
int GlobalLength() const
Returns the global length of the array.
void Write(const std::string &GroupName, const Epetra_BlockMap &Map)
Write a block map to group GroupName.
HDF5(const Epetra_Comm &Comm)
Constructor.
void ReadMultiVectorProperties(const std::string &GroupName, int &GlobalLength, int &NumVectors)
Read basic properties of specified Epetra_MultiVector.
bool IsContained(std::string Name, std::string GroupName="")
Return true if Name is contained in the database.
void Write(const std::string &GroupName, const std::string &DataSetName, int data)
Write an integer in group GroupName using the given DataSetName.
void Open(const std::string FileName, int AccessType=H5F_ACC_RDWR)
Open specified file with given access type.
void ReadCrsGraphProperties(const std::string &GroupName, int &NumGlobalRows, int &NumGlobalCols, int &NumGlobalNonzeros, int &NumGlobalDiagonals, int &MaxNumIndices)
Read basic properties of specified Epetra_CrsGraph.
void ReadCrsMatrixProperties(const std::string &GroupName, int &NumGlobalRows, int &NumGlobalCols, int &NumNonzeros, int &NumGlobalDiagonals, int &MaxNumEntries, double &NormOne, double &NormInf)
Read basic properties of specified Epetra_CrsMatrix.
void ReadIntDistArrayProperties(const std::string &GroupName, int &GlobalLength, int &RowSize)
Read the global number of elements and type for a generic handle object.
void ReadDoubleDistArrayProperties(const std::string &GroupName, int &GlobalLength, int &RowSize)
Read the global number of elements and type for a generic handle object.
void ReadIntVectorProperties(const std::string &GroupName, int &GlobalLength)
Read basic properties of specified Epetra_IntVector.
void Read(const std::string &GroupName, const std::string &DataSetName, int &data)
Read an integer from group /GroupName/DataSetName.
void Create(const std::string FileName)
Create a new file.
void ReadMapProperties(const std::string &GroupName, int &NumGlobalElements, int &IndexBase, int &NumProc)
Read basic properties of specified Epetra_Map.
void ReadBlockMapProperties(const std::string &GroupName, int &NumGlobalElements, int &NumGlobalPoints, int &IndexBase, int &NumProc)
Read basic properties of specified Epetra_BlockMap.
int MyGlobalElements(int *MyGlobalElementList) const
int * ElementSizeList() const
int NumGlobalElements() const
int NumMyElements() const
int NumGlobalPoints() const
int ExtractMyRowView(int LocalRow, int &NumIndices, int *&Indices) const
int MaxNumIndices() const
int GCID(int LCID_in) const
int GRID(int LRID_in) const
int NumGlobalDiagonals() const
int NumGlobalNonzeros() const
int NumGlobalRows() const
int NumMyNonzeros() const
int NumGlobalCols() const
const Epetra_BlockMap & Map() const
int Import(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
int InsertGlobalIndices(int numRows, const int *rows, int numCols, const int *cols)
int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
int GlobalAssemble(bool callFillComplete=true, Epetra_CombineMode combineMode=Add, bool save_off_and_reuse_map_exporter=false)
virtual int NumMyRows() const=0
virtual int NumGlobalCols() const=0
virtual int NumGlobalNonzeros() const=0
virtual const Epetra_Map & RowMatrixColMap() const=0
virtual const Epetra_Map & RowMatrixRowMap() const=0
virtual int NumMyNonzeros() const=0
virtual int NumGlobalRows() const=0
virtual int NumGlobalDiagonals() const=0
virtual int MaxNumEntries() const=0
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const=0
virtual double NormOne() const=0
virtual double NormInf() const=0
virtual bool Filled() const=0
std::string toString(const int &x)