Fesapi 2.10.1.0
This project provides C++ classes which allow an easy access in import and export to the Energistics standards.
Loading...
Searching...
No Matches
AbstractIjkGridRepresentation.h
1/*-----------------------------------------------------------------------
2Licensed to the Apache Software Foundation (ASF) under one
3or more contributor license agreements. See the NOTICE file
4distributed with this work for additional information
5regarding copyright ownership. The ASF licenses this file
6to you under the Apache License, Version 2.0 (the
7"License"; you may not use this file except in compliance
8with the License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12Unless required by applicable law or agreed to in writing,
13software distributed under the License is distributed on an
14"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15KIND, either express or implied. See the License for the
16specific language governing permissions and limitations
17under the License.
18-----------------------------------------------------------------------*/
19#pragma once
20
21#include "AbstractColumnLayerGridRepresentation.h"
22
23#include <stdexcept>
24#include <map>
25
26namespace RESQML2_NS
27{
33 class AbstractIjkGridRepresentation : public RESQML2_NS::AbstractColumnLayerGridRepresentation
34 {
35 public:
36
38 enum class geometryKind { UNKNOWN = 0, EXPLICIT = 1, PARAMETRIC = 2, LATTICE = 3, NO_GEOMETRY = 4}; // UNKNOWN exists in case of partial transfer
39
63 AbstractIjkGridRepresentation(COMMON_NS::DataObjectRepository * repo,
64 const std::string & guid, const std::string & title,
65 unsigned int iCount, unsigned int jCount, unsigned int kCount, bool* kGaps = nullptr, EML2_NS::AbstractHdfProxy* proxy = nullptr);
66
88 AbstractIjkGridRepresentation(RESQML2_NS::AbstractFeatureInterpretation* interp,
89 const std::string & guid, const std::string & title,
90 unsigned int iCount, unsigned int jCount, unsigned int kCount, bool* kGaps = nullptr, EML2_NS::AbstractHdfProxy* proxy = nullptr);
91
115 /*
116 AbstractIjkGridRepresentation(COMMON_NS::DataObjectRepository * repo,
117 const std::string & guid, const std::string & title,
118 unsigned int iCount, unsigned int jCount, unsigned int kCount,
119 unsigned int truncationNodeCount, unsigned int truncationFaceCount, unsigned int truncationCellCount);
120 */
138 /*
139 AbstractIjkGridRepresentation(RESQML2_NS::AbstractFeatureInterpretation* interp,
140 const std::string & guid, const std::string & title,
141 unsigned int iCount, unsigned int jCount, unsigned int kCount,
142 unsigned int truncationNodeCount, unsigned int truncationFaceCount, unsigned int truncationCellCount);
143 */
150 DLL_IMPORT_OR_EXPORT explicit AbstractIjkGridRepresentation(gsoap_resqml2_0_1::eml20__DataObjectReference* partialObject, bool withTruncatedPillars = false);
151
153 DLL_IMPORT_OR_EXPORT virtual ~AbstractIjkGridRepresentation()
154 {
155 unloadSplitInformation();
156 }
157
166 DLL_IMPORT_OR_EXPORT unsigned int getICellCount() const;
167
175 DLL_IMPORT_OR_EXPORT void setICellCount(unsigned int iCount);
176
185 DLL_IMPORT_OR_EXPORT unsigned int getJCellCount() const;
186
194 DLL_IMPORT_OR_EXPORT void setJCellCount(unsigned int jCount);
195
204 DLL_IMPORT_OR_EXPORT uint64_t getCellCount() const final { return getICellCount() * getJCellCount() * getKCellCount(); }
205
215 DLL_IMPORT_OR_EXPORT unsigned int getColumnCount() const { return getICellCount() * getJCellCount(); }
216
226 DLL_IMPORT_OR_EXPORT unsigned int getPillarCount() const { return (getICellCount()+1) * (getJCellCount()+1); }
227
237 DLL_IMPORT_OR_EXPORT uint64_t getKGapsCount() const;
238
247 DLL_IMPORT_OR_EXPORT void getKGaps(bool * kGaps) const;
248
260 DLL_IMPORT_OR_EXPORT uint64_t getFaceCount() const;
261
278 DLL_IMPORT_OR_EXPORT unsigned int getIPillarFromGlobalIndex(unsigned int globalIndex) const;
279
296 DLL_IMPORT_OR_EXPORT unsigned int getJPillarFromGlobalIndex(unsigned int globalIndex) const;
297
315 DLL_IMPORT_OR_EXPORT unsigned int getGlobalIndexPillarFromIjIndex(unsigned int iPillar, unsigned int jPillar) const;
316
333 DLL_IMPORT_OR_EXPORT unsigned int getIColumnFromGlobalIndex(unsigned int globalIndex) const;
334
351 DLL_IMPORT_OR_EXPORT unsigned int getJColumnFromGlobalIndex(unsigned int globalIndex) const;
352
370 DLL_IMPORT_OR_EXPORT unsigned int getGlobalIndexColumnFromIjIndex(unsigned int iColumn, unsigned int jColumn) const;
371
388 DLL_IMPORT_OR_EXPORT unsigned int getGlobalIndexCellFromIjkIndex(unsigned int iCell, unsigned int jCell, unsigned int kCell) const;
389
399 DLL_IMPORT_OR_EXPORT bool isRightHanded() const;
400
418 DLL_IMPORT_OR_EXPORT void getPillarsOfSplitCoordinateLines(unsigned int * pillarIndices, bool reverseIAxis = false, bool reverseJAxis = false) const;
419
438 DLL_IMPORT_OR_EXPORT void getColumnsOfSplitCoordinateLines(unsigned int * columnIndices, bool reverseIAxis = false, bool reverseJAxis = false) const;
439
455 DLL_IMPORT_OR_EXPORT void getColumnCountOfSplitCoordinateLines(unsigned int * columnIndexCountPerSplitCoordinateLine) const;
456
466 DLL_IMPORT_OR_EXPORT uint64_t getSplitCoordinateLineCount() const;
467
476 DLL_IMPORT_OR_EXPORT uint64_t getBlockSplitCoordinateLineCount() const;
477
485 DLL_IMPORT_OR_EXPORT uint64_t getSplitNodeCount() const;
486
505 DLL_IMPORT_OR_EXPORT void getPillarGeometryIsDefined(bool * pillarGeometryIsDefined, bool reverseIAxis = false, bool reverseJAxis = false) const;
506
514 DLL_IMPORT_OR_EXPORT bool hasCellGeometryIsDefinedFlags() const;
515
535 DLL_IMPORT_OR_EXPORT void getCellGeometryIsDefinedFlags(bool* cellGeometryIsDefinedFlags, bool reverseIAxis = false, bool reverseJAxis= false, bool reverseKAxis= false) const;
536
555 DLL_IMPORT_OR_EXPORT void setCellGeometryIsDefinedFlags(uint8_t* cellGeometryIsDefinedFlags, EML2_NS::AbstractHdfProxy* proxy = nullptr);
556
562 DLL_IMPORT_OR_EXPORT void setAllCellGeometryFlagsToDefined();
563
568 DLL_IMPORT_OR_EXPORT void loadSplitInformation();
569
597 DLL_IMPORT_OR_EXPORT void loadBlockInformation(unsigned int iInterfaceStart, unsigned int iInterfaceEnd, unsigned int jInterfaceStart, unsigned int jInterfaceEnd, unsigned int kInterfaceStart, unsigned int kInterfaceEnd);
598
600 DLL_IMPORT_OR_EXPORT void unloadSplitInformation();
601
620 DLL_IMPORT_OR_EXPORT bool isColumnEdgeSplitted(unsigned int iColumn, unsigned int jColumn, unsigned int edge) const;
621
642 DLL_IMPORT_OR_EXPORT uint64_t getXyzPointIndexFromCellCorner(unsigned int iCell, unsigned int jCell, unsigned int kCell, unsigned int corner) const;
643
667 DLL_IMPORT_OR_EXPORT void getXyzPointOfBlockFromCellCorner(unsigned int iCell, unsigned int jCell, unsigned int kCell, unsigned int corner,
668 const double* xyzPoints, double & x, double & y, double & z) const;
669
682 DLL_IMPORT_OR_EXPORT uint64_t getXyzPointCountOfKInterface() const;
683
691 DLL_IMPORT_OR_EXPORT uint64_t getXyzPointCountOfBlock() const;
692
693 /*
694 * Gets all the XYZ points of a particular K interface. XYZ points are given in the local CRS.
695 * This method is not const since it is optimized in order not to recompute the pillar
696 * information but to get it as input.
697 *
698 * @param kInterface The K interface index starting from zero to kCellCount.
699 * @param [out] xyzPoints A linearized 2d array where the first (quickest) dimension is
700 * coordinate dimension (XYZ) and second dimension is vertex
701 * dimension. It must be pre allocated with a size of
702 * <tt>3 * getXyzPointCountOfKInterface()</tt>.
703 */
704 DLL_IMPORT_OR_EXPORT void getXyzPointsOfKInterface(unsigned int kInterface, double * xyzPoints);
705
725 DLL_IMPORT_OR_EXPORT virtual void getXyzPointsOfKInterfaceSequence(unsigned int kInterfaceStart, unsigned int kInterfaceEnd, double * xyzPoints);
726
739 DLL_IMPORT_OR_EXPORT virtual void getXyzPointsOfBlock(double * xyzPoints);
740
748 DLL_IMPORT_OR_EXPORT virtual bool isNodeGeometryCompressed() const { return false; }
749
750 DLL_IMPORT_OR_EXPORT gsoap_resqml2_0_1::resqml20__KDirection getKDirection() const override;
751
757 DLL_IMPORT_OR_EXPORT virtual geometryKind getGeometryKind() const { return geometryKind::UNKNOWN; }
758
759 virtual COMMON_NS::DataObjectReference getHdfProxyDor() const override { throw std::logic_error("Partial object"); }
760
761 DLL_IMPORT_OR_EXPORT virtual uint64_t getXyzPointCountOfPatch(unsigned int patchIndex) const override;
762
773 DLL_IMPORT_OR_EXPORT virtual void getXyzPointsOfPatch(unsigned int patchIndex, double * xyzPoints) const override;
774
776 DLL_IMPORT_OR_EXPORT static constexpr char const* XML_TAG = "IjkGridRepresentation";
777
779 DLL_IMPORT_OR_EXPORT static constexpr char const* XML_TAG_TRUNCATED = "TruncatedIjkGridRepresentation";
780
781 DLL_IMPORT_OR_EXPORT std::string getXmlTag() const final;
782
783 DLL_IMPORT_OR_EXPORT uint64_t getPatchCount() const override {return 1;}
784
788 DLL_IMPORT_OR_EXPORT virtual std::string getXmlNamespace() const override {
789 if (gsoapProxy2_0_1 != nullptr) { return "resqml20"; }
790 if (gsoapProxy2_3 != nullptr) { return "resqml22"; }
791
792
793 if (partialObject != nullptr) {
794 if (partialObject->ContentType.find("x-resqml+xml;version=2.0") != std::string::npos ||
795 partialObject->ContentType.find("resqml20.") == 0) { return "resqml20"; }
796 if (partialObject->ContentType.find("x-resqml+xml;version=2.2") != std::string::npos ||
797 partialObject->ContentType.find("resqml22.") == 0) { return "resqml22"; }
798 }
799
800 throw std::logic_error("Cannot infer what is the Energistics namespace of this instance.");
801 }
802
803 protected:
804
810 explicit AbstractIjkGridRepresentation(gsoap_resqml2_0_1::_resqml20__IjkGridRepresentation* fromGsoap) : AbstractColumnLayerGridRepresentation(fromGsoap, false) {}
811
817 explicit AbstractIjkGridRepresentation(gsoap_resqml2_0_1::_resqml20__TruncatedIjkGridRepresentation* fromGsoap) : AbstractColumnLayerGridRepresentation(fromGsoap, true) {}
818 explicit AbstractIjkGridRepresentation(gsoap_eml2_3::_resqml22__IjkGridRepresentation* fromGsoap) : AbstractColumnLayerGridRepresentation(fromGsoap, false) {}
819 explicit AbstractIjkGridRepresentation(gsoap_eml2_3::_resqml22__TruncatedIjkGridRepresentation* fromGsoap) : AbstractColumnLayerGridRepresentation(fromGsoap, true) {}
820
821 gsoap_resqml2_0_1::_resqml20__IjkGridRepresentation* getSpecializedGsoapProxy2_0_1() const;
822 gsoap_resqml2_0_1::_resqml20__TruncatedIjkGridRepresentation* getSpecializedTruncatedGsoapProxy2_0_1() const;
823 gsoap_eml2_3::_resqml22__IjkGridRepresentation* getSpecializedGsoapProxy2_2() const;
824 gsoap_eml2_3::_resqml22__TruncatedIjkGridRepresentation* getSpecializedTruncatedGsoapProxy2_2() const;
825
833 gsoap_resqml2_0_1::resqml20__PointGeometry* getPointGeometry2_0_1(uint64_t patchIndex) const final;
834 gsoap_eml2_3::resqml22__PointGeometry* getPointGeometry2_2(uint64_t patchIndex) const final;
835
855 std::unique_ptr < std::vector< std::pair< unsigned int, std::vector<unsigned int> > > [] > splitInformation;
856
861 std::unique_ptr<uint32_t[]> kCellIndexWithGapLayer;
862
864 class BlockInformation
865 {
866 public:
867
869 unsigned int iInterfaceStart;
871 unsigned int iInterfaceEnd;
873 unsigned int jInterfaceStart;
875 unsigned int jInterfaceEnd;
877 unsigned int kInterfaceStart;
879 unsigned int kInterfaceEnd;
880
882 std::map<unsigned int, unsigned int> globalToLocalSplitCoordinateLinesIndex;
883
884 BlockInformation(unsigned int iNodeStart, unsigned int iNodeEnd, unsigned int jNodeStart, unsigned int jNodeEnd, unsigned int kNodeStart, unsigned int kNodeEnd) :
885 iInterfaceStart(iNodeStart), iInterfaceEnd(iNodeEnd), jInterfaceStart(jNodeStart), jInterfaceEnd(jNodeEnd), kInterfaceStart(kNodeStart), kInterfaceEnd(kNodeEnd) {}
886
888 ~BlockInformation() = default;
889 };
890
892 std::unique_ptr <BlockInformation> blockInformation;
893
894 private:
895
912 void init(COMMON_NS::DataObjectRepository * repo,
913 const std::string & guid, const std::string & title,
914 unsigned int iCount, unsigned int jCount, unsigned int kCount, bool* kGaps, EML2_NS::AbstractHdfProxy* proxy = nullptr);
915 };
916}
Proxy class for an abstract column layer grid representation.
Definition AbstractColumnLayerGridRepresentation.h:27
Proxy class for an abstract IJK grid representation. This class is semantically abstract....
Definition AbstractIjkGridRepresentation.h:34
void getPillarGeometryIsDefined(bool *pillarGeometryIsDefined, bool reverseIAxis=false, bool reverseJAxis=false) const
AbstractIjkGridRepresentation(common::DataObjectRepository *repo, const std::string &guid, const std::string &title, unsigned int iCount, unsigned int jCount, unsigned int kCount, bool *kGaps=nullptr, eml2::AbstractHdfProxy *proxy=nullptr)
unsigned int getIPillarFromGlobalIndex(unsigned int globalIndex) const
unsigned int getJPillarFromGlobalIndex(unsigned int globalIndex) const
geometryKind
Definition AbstractIjkGridRepresentation.h:38
uint64_t getBlockSplitCoordinateLineCount() const
void setJCellCount(unsigned int jCount)
Sets the count of cells in the J direction.
void setICellCount(unsigned int iCount)
gsoap_resqml2_0_1::resqml20__KDirection getKDirection() const override
virtual ~AbstractIjkGridRepresentation()
Definition AbstractIjkGridRepresentation.h:153
virtual bool isNodeGeometryCompressed() const
Definition AbstractIjkGridRepresentation.h:748
unsigned int getIColumnFromGlobalIndex(unsigned int globalIndex) const
unsigned int getJColumnFromGlobalIndex(unsigned int globalIndex) const
uint64_t getXyzPointIndexFromCellCorner(unsigned int iCell, unsigned int jCell, unsigned int kCell, unsigned int corner) const
Gets the XYZ point index in the HDF dataset from the corner of a cell. This method requires that you ...
bool isColumnEdgeSplitted(unsigned int iColumn, unsigned int jColumn, unsigned int edge) const
Checks either a given column edge is splitted or not. This method requires that you have already load...
void getColumnsOfSplitCoordinateLines(unsigned int *columnIndices, bool reverseIAxis=false, bool reverseJAxis=false) const
virtual geometryKind getGeometryKind() const
Definition AbstractIjkGridRepresentation.h:757
void setCellGeometryIsDefinedFlags(uint8_t *cellGeometryIsDefinedFlags, eml2::AbstractHdfProxy *proxy=nullptr)
std::string getXmlTag() const final
void loadBlockInformation(unsigned int iInterfaceStart, unsigned int iInterfaceEnd, unsigned int jInterfaceStart, unsigned int jInterfaceEnd, unsigned int kInterfaceStart, unsigned int kInterfaceEnd)
virtual void getXyzPointsOfKInterfaceSequence(unsigned int kInterfaceStart, unsigned int kInterfaceEnd, double *xyzPoints)
Gets all the XYZ points of a particular sequence of K interfaces. XYZ points are given in the local C...
void getXyzPointOfBlockFromCellCorner(unsigned int iCell, unsigned int jCell, unsigned int kCell, unsigned int corner, const double *xyzPoints, double &x, double &y, double &z) const
Gets the x, y and z values of the corner of a cell of a given block. This method requires that you ha...
virtual common::DataObjectReference getHdfProxyDor() const override
Gets the data object reference of the HDF proxy which is used for storing the numerical values of thi...
Definition AbstractIjkGridRepresentation.h:759
AbstractIjkGridRepresentation(resqml2::AbstractFeatureInterpretation *interp, const std::string &guid, const std::string &title, unsigned int iCount, unsigned int jCount, unsigned int kCount, bool *kGaps=nullptr, eml2::AbstractHdfProxy *proxy=nullptr)
unsigned int getGlobalIndexColumnFromIjIndex(unsigned int iColumn, unsigned int jColumn) const
void getColumnCountOfSplitCoordinateLines(unsigned int *columnIndexCountPerSplitCoordinateLine) const
virtual std::string getXmlNamespace() const override
Definition AbstractIjkGridRepresentation.h:788
unsigned int getGlobalIndexPillarFromIjIndex(unsigned int iPillar, unsigned int jPillar) const
virtual void getXyzPointsOfBlock(double *xyzPoints)
Gets all the XYZ points of the current block. XYZ points are given in the local CRS....
unsigned int getPillarCount() const
Definition AbstractIjkGridRepresentation.h:226
AbstractIjkGridRepresentation(gsoap_resqml2_0_1::eml20__DataObjectReference *partialObject, bool withTruncatedPillars=false)
void getCellGeometryIsDefinedFlags(bool *cellGeometryIsDefinedFlags, bool reverseIAxis=false, bool reverseJAxis=false, bool reverseKAxis=false) const
virtual void getXyzPointsOfPatch(unsigned int patchIndex, double *xyzPoints) const override
Gets all the xyz points of a particular patch of this representation. xyz points are given in the loc...
void getPillarsOfSplitCoordinateLines(unsigned int *pillarIndices, bool reverseIAxis=false, bool reverseJAxis=false) const
uint64_t getCellCount() const final
Definition AbstractIjkGridRepresentation.h:204
void getKGaps(bool *kGaps) const
unsigned int getGlobalIndexCellFromIjkIndex(unsigned int iCell, unsigned int jCell, unsigned int kCell) const
unsigned int getColumnCount() const
Definition AbstractIjkGridRepresentation.h:215
virtual uint64_t getXyzPointCountOfPatch(unsigned int patchIndex) const override