Contents of /branches/ripleygmg_from_3668/ripley/src/Brick.h

Revision 3746 - (show annotations)
Thu Dec 15 00:02:22 2011 UTC (7 years, 10 months ago) by caltinay
File MIME type: text/plain
File size: 5966 byte(s)
```In Ripley Solution==ContinuousFunction and ReducedSolution==ReducedCF now.
Removed a test in escript that relied on failure when trying to tag Data on
Solution/ReducedSolution.

```
 1 2 /******************************************************* 3 * 4 * Copyright (c) 2003-2011 by University of Queensland 5 * Earth Systems Science Computational Center (ESSCC) 6 * http://www.uq.edu.au/esscc 7 * 8 * Primary Business: Queensland, Australia 9 * Licensed under the Open Software License version 3.0 10 * http://www.opensource.org/licenses/osl-3.0.php 11 * 12 *******************************************************/ 13 14 #ifndef __RIPLEY_BRICK_H__ 15 #define __RIPLEY_BRICK_H__ 16 17 #include 18 19 namespace ripley { 20 21 /** 22 \brief 23 Brick is the 3-dimensional implementation of a RipleyDomain. 24 */ 25 class Brick: public RipleyDomain 26 { 27 public: 28 29 /** 30 \brief creates a hexagonal mesh with n0 x n1 x n2 elements over the 31 brick [0,l0] x [0,l1] x [0,l2]. 32 \param n0,n1,n2 number of elements in each dimension 33 \param l0,l1,l2 length of each side of brick 34 \param d0,d1,d2 number of subdivisions in each dimension 35 */ 36 RIPLEY_DLL_API 37 Brick(int n0, int n1, int n2, double l0, double l1, double l2, int d0, 38 int d1, int d2); 39 40 /** 41 \brief 42 Destructor. 43 */ 44 RIPLEY_DLL_API 45 ~Brick(); 46 47 /** 48 \brief 49 returns a description for this domain 50 */ 51 RIPLEY_DLL_API 52 virtual std::string getDescription() const; 53 54 /** 55 \brief equality operator 56 */ 57 RIPLEY_DLL_API 58 virtual bool operator==(const escript::AbstractDomain& other) const; 59 60 /** 61 \brief 62 dumps the mesh to a file with the given name 63 \param filename The name of the output file 64 */ 65 RIPLEY_DLL_API 66 void dump(const std::string& filename) const; 67 68 /** 69 \brief 70 returns the reference number of the given sample number 71 \param fsType The function space type 72 */ 73 RIPLEY_DLL_API 74 const int* borrowSampleReferenceIDs(int fsType) const; 75 76 /** 77 \brief 78 returns true if this rank owns the sample id. 79 */ 80 RIPLEY_DLL_API 81 virtual bool ownSample(int fs_code, index_t id) const; 82 83 /** 84 \brief 85 copies the gradient of 'in' into 'out'. The actual function space to be 86 considered for the gradient is defined by 'in'. Both arguments have to 87 be defined on this domain. 88 */ 89 RIPLEY_DLL_API 90 virtual void setToGradient(escript::Data& out, const escript::Data& in) const; 91 92 /** 93 \brief 94 copies the integrals of the function defined by arg into integrals. 95 arg has to be defined on this domain. 96 */ 97 RIPLEY_DLL_API 98 virtual void setToIntegrals(std::vector& integrals, const escript::Data& arg) const; 99 100 /** 101 \brief 102 copies the surface normals at data points into out. The actual function 103 space to be considered is defined by out. out has to be defined on this 104 domain. 105 */ 106 RIPLEY_DLL_API 107 virtual void setToNormal(escript::Data& out) const; 108 109 /** 110 \brief 111 returns the number of data points summed across all MPI processes 112 */ 113 RIPLEY_DLL_API 114 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); } 115 116 /** 117 \brief 118 writes information about the mesh to standard output 119 \param full whether to print additional data 120 */ 121 RIPLEY_DLL_API 122 virtual void Print_Mesh_Info(const bool full=false) const; 123 124 /** 125 \brief 126 returns the number of nodes per MPI rank in each dimension 127 */ 128 RIPLEY_DLL_API 129 virtual IndexVector getNumNodesPerDim() const; 130 131 /** 132 \brief 133 returns the number of elements per MPI rank in each dimension 134 */ 135 RIPLEY_DLL_API 136 virtual IndexVector getNumElementsPerDim() const; 137 138 /** 139 \brief 140 returns the number of face elements in the order 141 (left,right,bottom,top,[front,back]) on current MPI rank 142 */ 143 RIPLEY_DLL_API 144 virtual IndexVector getNumFacesPerBoundary() const; 145 146 /** 147 \brief 148 returns the node distribution vector 149 */ 150 RIPLEY_DLL_API 151 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; } 152 153 /** 154 \brief 155 returns the first coordinate value and the node spacing along given 156 dimension as a pair 157 */ 158 RIPLEY_DLL_API 159 virtual std::pair getFirstCoordAndSpacing(dim_t dim) const; 160 161 protected: 162 virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; } 163 virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; } 164 virtual dim_t getNumFaceElements() const; 165 virtual void assembleCoordinates(escript::Data& arg) const; 166 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const; 167 virtual void interpolateNodesOnElements(escript::Data& out, 168 escript::Data& in, bool reduced) const; 169 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in, 170 bool reduced) const; 171 172 private: 173 void populateSampleIds(); 174 175 /// total number of elements in each dimension 176 dim_t m_gNE0, m_gNE1, m_gNE2; 177 178 /// side lengths of domain 179 double m_l0, m_l1, m_l2; 180 181 /// number of spatial subdivisions 182 int m_NX, m_NY, m_NZ; 183 184 /// number of elements for this rank in each dimension 185 dim_t m_NE0, m_NE1, m_NE2; 186 187 /// number of nodes for this rank in each dimension 188 dim_t m_N0, m_N1, m_N2; 189 190 /// first node on this rank is at (offset0,offset1,offset2) in global mesh 191 dim_t m_offset0, m_offset1, m_offset2; 192 193 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is 194 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top, 195 /// 4=front, 5=back) 196 IndexVector m_faceOffset; 197 198 /// vector of sample reference identifiers 199 IndexVector m_nodeId; 200 IndexVector m_elementId; 201 IndexVector m_faceId; 202 203 // vector with first node id on each rank 204 IndexVector m_nodeDistribution; 205 }; 206 207 } // end of namespace ripley 208 209 #endif // __RIPLEY_BRICK_H__ 210