Chaste Release::3.1
|
00001 /* 00002 00003 Copyright (c) 2005-2012, University of Oxford. 00004 All rights reserved. 00005 00006 University of Oxford means the Chancellor, Masters and Scholars of the 00007 University of Oxford, having an administrative office at Wellington 00008 Square, Oxford OX1 2JD, UK. 00009 00010 This file is part of Chaste. 00011 00012 Redistribution and use in source and binary forms, with or without 00013 modification, are permitted provided that the following conditions are met: 00014 * Redistributions of source code must retain the above copyright notice, 00015 this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright notice, 00017 this list of conditions and the following disclaimer in the documentation 00018 and/or other materials provided with the distribution. 00019 * Neither the name of the University of Oxford nor the names of its 00020 contributors may be used to endorse or promote products derived from this 00021 software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00024 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00025 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00026 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 */ 00035 00036 #ifndef HDF5DATAWRITER_HPP_ 00037 #define HDF5DATAWRITER_HPP_ 00038 00039 #include <string> 00040 #include <vector> 00041 00042 #include "Hdf5DataReader.hpp" //For common definitions 00043 #include "DataWriterVariable.hpp" 00044 #include "DistributedVectorFactory.hpp" 00045 00049 class Hdf5DataWriter// : public AbstractDataWriter 00050 { 00051 private: 00052 00054 DistributedVectorFactory& mrVectorFactory; 00055 std::string mDirectory; 00056 std::string mBaseName; 00057 bool mCleanDirectory; 00058 bool mIsInDefineMode; 00059 bool mIsFixedDimensionSet; 00060 bool mIsUnlimitedDimensionSet; 00061 std::string mUnlimitedDimensionName; 00062 std::string mUnlimitedDimensionUnit; 00063 unsigned mEstimatedUnlimitedLength; 00064 unsigned mFileFixedDimensionSize; 00065 unsigned mDataFixedDimensionSize; 00066 unsigned mLo; 00067 unsigned mHi; 00068 unsigned mNumberOwned; 00069 unsigned mOffset; 00070 bool mIsDataComplete; 00071 bool mNeedExtend; 00072 std::vector<unsigned> mIncompleteNodeIndices; 00073 bool mUseMatrixForIncompleteData; 00075 std::vector<DataWriterVariable> mVariables; 00077 hid_t mFileId; 00078 hid_t mDatasetId; 00079 hid_t mTimeDatasetId; 00081 long mCurrentTimeStep; 00083 static const unsigned DATASET_DIMS=3; 00084 hsize_t mDatasetDims[DATASET_DIMS]; 00086 Mat mSinglePermutation; 00087 Mat mDoublePermutation; 00089 Mat mSingleIncompleteOutputMatrix; 00090 Mat mDoubleIncompleteOutputMatrix; 00092 bool mUseOptimalChunkSizeAlgorithm; 00093 unsigned mFixedChunkSize; 00100 void CheckVariableName(const std::string& rName); 00101 00107 void CheckUnitsName(const std::string& rName); 00108 00112 void ComputeIncompleteOffset(); 00113 00114 public: 00115 00129 Hdf5DataWriter(DistributedVectorFactory& rVectorFactory, 00130 const std::string& rDirectory, 00131 const std::string& rBaseName, 00132 bool cleanDirectory=true, 00133 bool extendData=false); 00134 00138 virtual ~Hdf5DataWriter(); 00139 00145 void DefineFixedDimension(long dimensionSize); 00146 00153 void DefineFixedDimension(const std::vector<unsigned>& rNodesToOuput, long vecSize); 00154 00163 void DefineUnlimitedDimension(const std::string& rVariableName, const std::string& rVariableUnits, unsigned estimatedLength = 1); 00164 00169 void AdvanceAlongUnlimitedDimension(); 00170 00179 int DefineVariable(const std::string& rVariableName, const std::string& rVariableUnits); 00180 00184 virtual void EndDefineMode(); 00185 00189 void PossiblyExtend(); 00190 00197 void PutVector(int variableID, Vec petscVector); 00198 00205 void PutStripedVector(std::vector<int> variableIDs, Vec petscVector); 00206 00212 void PutUnlimitedVariable(double value); 00213 00217 void Close(); 00218 00226 int GetVariableByName(const std::string& rVariableName); 00227 00228 00235 bool ApplyPermutation(const std::vector<unsigned>& rPermutation); 00236 00244 void DefineFixedDimensionUsingMatrix(const std::vector<unsigned>& rNodesToOuput, long vecSize); 00245 00252 void SetFixedChunkSize(unsigned chunkSize); 00253 }; 00254 00255 #endif /*HDF5DATAWRITER_HPP_*/