Memosa-FVM  0.2
StructureDeformationModel.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _STRUCTUREDEFORMATIONMODEL_H_
6 #define _STRUCTUREDEFORMATIONMODEL_H_
7 
8 #include "Model.h"
9 #include "GeomFields.h"
10 #include "StructureFields.h"
11 #include "NumType.h"
12 #include "Mesh.h"
13 #include "Array.h"
14 #include "Field.h"
15 #include "Vector.h"
16 #include "CRConnectivity.h"
17 #include "StorageSite.h"
18 
19 
20 template<class T>
22 {
23 public:
24  typedef Array<T> TArray;
27 
29  StructureFields& structureFields,
30  const MeshList& meshes) :
31  Model(meshes),
32  _geomFields(geomFields),
33  _structureFields(structureFields),
34  _meshes(meshes)
35  {
36  logCtor();
37  }
38 
40 
42  {
43  const int numMeshes = _meshes.size();
44  for (int m=0;m<numMeshes;m++)
45  {
46  const Mesh& mesh = *_meshes[m];
47  const StorageSite& nodes = mesh.getNodes();
48  const StorageSite& cells = mesh.getCells();
49  const int nNodes = nodes.getCount();
50  const CRConnectivity& cellNodes = mesh.getCellNodes();
51  shared_ptr<CRConnectivity> nodeCellsPtr = cellNodes.getTranspose();
52  CRConnectivity& nodeCells = *nodeCellsPtr;
53  const VectorT3Array& nodeCoordinate =
54  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[nodes]);
55  const VectorT3Array& cellCentroid =
56  dynamic_cast<const VectorT3Array&> (_geomFields.coordinate[cells]);
57  const VectorT3Array& cellDisplacement =
58  dynamic_cast<const VectorT3Array&>(_structureFields.deformation[cells]);
59  VectorT3Array& nodeDisplacement =
60  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
61  const T one(1.0);
62 
63  for(int j=0;j<nNodes;j++)
64  {
66  T weight(0.0);
67  for(int k=0;k<nodeCells.getCount(j);k++)
68  {
69  const int num = nodeCells(j,k);
70  const VectorT3 ds = cellCentroid[num]-nodeCoordinate[j];
71  dr += cellDisplacement[num]/mag(ds);
72  weight += one/mag(ds);
73  }
74  dr = dr/weight;
75  nodeDisplacement[j] = dr;
76  }
77  }
78  }
79 
81  {
82  const int numMeshes = _meshes.size();
83  for (int n=0;n<numMeshes;n++)
84  {
85  const Mesh& mesh = *_meshes[n];
86  const StorageSite& nodes = mesh.getNodes();
87  const int nNodes = nodes.getCount();
88  VectorT3Array& nodeCoord =
89  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
90  const VectorT3Array& nodeCoord0 =
91  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate0[nodes]);
92  VectorT3Array& nodeDisplacement =
93  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
94  VectorT3Array& nodeCoordK1 =
95  dynamic_cast<VectorT3Array&>(_geomFields.coordinateK1[nodes]);
96  nodeCoordK1 = nodeCoord;
97  for (int i=0;i<nNodes;i++)
98  {
99  nodeCoord[i] = nodeCoord0[i] + nodeDisplacement[i];
100  }
101  }
102  }
103 
105  {
106  const int numMeshes = _meshes.size();
107  for (int n=0;n<numMeshes;n++)
108  {
109  const Mesh& mesh = *_meshes[n];
110  const StorageSite& nodes = mesh.getNodes();
111  const int nNodes = nodes.getCount();
112  const Array<int>& displacementOptions =
113  dynamic_cast<Array<int>& > (_geomFields.displacementOptions[nodes]);
114  VectorT3Array& nodeCoord =
115  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
116  const VectorT3Array& nodeCoord0 =
117  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate0[nodes]);
118  VectorT3Array& nodeDisplacement =
119  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
120  VectorT3Array& nodeCoordK1 =
121  dynamic_cast<VectorT3Array&>(_geomFields.coordinateK1[nodes]);
122  nodeCoordK1 = nodeCoord;
123  for (int i=0;i<nNodes;i++)
124  {
125  if(displacementOptions[i] == 3)
126  {
127  nodeCoord[i] = nodeCoord0[i] + nodeDisplacement[i];
128  }
129  }
130  }
131  }
132 
133 
134  // update node coordinates and face velocity for the boundary mesh
135  // corresponding to the given mesh
136  void updateBoundaryMesh(const Mesh& mesh, Mesh& bMesh,
137  Field& velocityField,
138  const double timeStep)
139  {
140  // update node coords
141  const StorageSite& bMeshNodes = bMesh.getNodes();
142 
143 
144  const StorageSite& nodes = mesh.getNodes();
145 
146  const VectorT3Array& nodeCoord =
147  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[nodes]);
148 
149  VectorT3Array& bNodeCoord =
150  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[bMeshNodes]);
151 
152  VectorT3Array& bMeshCoord = bMesh.getNodeCoordinates();
153 
154  const Array<int>& myNodeIndices =
155  *(bMeshNodes.getCommonMap().find(&nodes)->second);
156  const Array<int>& bNodeIndices =
157  *(nodes.getCommonMap().find(&bMeshNodes)->second);
158 
159  const int nCommon = myNodeIndices.getLength();
160  for(int n=0; n<nCommon; n++)
161  {
162  bNodeCoord[bNodeIndices[n]] = nodeCoord[myNodeIndices[n]];
163  bMeshCoord[bNodeIndices[n]] = nodeCoord[myNodeIndices[n]];
164  }
165 
166 
167 
168  // update face velocity
169 
170  const StorageSite& bMeshFaces = bMesh.getFaces();
171 
172  shared_ptr<VectorT3Array>
173  bVelocity(new VectorT3Array(bMeshFaces.getCount()));
174 
175  velocityField.addArray(bMeshFaces,bVelocity);
176 
177  VectorT3Array& w =
178  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
179  VectorT3Array& wN1 =
180  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacementN1[nodes]);
181 
182  int bMeshFaceCount=0;
183 
184  foreach(const FaceGroupPtr fgPtr, mesh.getAllFaceGroups())
185  {
186  const FaceGroup& fg = *fgPtr;
187  const StorageSite& faces = fg.site;
188  if (fg.groupType!="interior")
189  {
190  const int nFaces = faces.getCount();
191  const CRConnectivity& faceNodes = mesh.getFaceNodes(faces);
192  for(int f=0; f<nFaces; f++)
193  {
194  const int nFaceNodes = faceNodes.getCount(f);
196 
197  for(int nn=0; nn<nFaceNodes; nn++)
198  {
199  const int node = faceNodes(f,nn);
200  VectorT3 vn = (w[node] - wN1[node])/timeStep;
201  vf += vn;
202  }
203  vf /= nFaceNodes;
204  (*bVelocity)[bMeshFaceCount] = vf;
205  bMeshFaceCount++;
206  }
207  }
208  }
209  }
210 
211 
212  // update node coordinates and face velocity for the boundary mesh
213  // corresponding to the given mesh
214  void updateBoundaryMesh(const Mesh& mesh, Mesh& bMesh,
215  Field& velocityField, const map<int,int>& commonFacesMap,
216  const double timeStep)
217  {
218  // update face velocity
219  const StorageSite& bMeshFaces = bMesh.getFaces();
220  shared_ptr<VectorT3Array>
221  bVelocity(new VectorT3Array(bMeshFaces.getCount()));
222  bVelocity->zero();
223 
224  velocityField.addArray(bMeshFaces,bVelocity);
225 
226  const StorageSite& nodes = mesh.getNodes();
227  VectorT3Array& w =
228  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
229  VectorT3Array& wN1 =
230  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacementN1[nodes]);
231 
232  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups()){
233  const FaceGroup& fg = *fgPtr;
234  const StorageSite& faces = fg.site;
235  const int nFaces = faces.getCount();
236  const CRConnectivity& faceNodes = mesh.getFaceNodes(faces);
237  for(int f=0; f<nFaces; f++){
238  const int faceID = f + faces.getOffset();
239  const int nFaceNodes = faceNodes.getCount(f);
241 
242  for(int nn=0; nn<nFaceNodes; nn++){
243  const int node = faceNodes(f,nn);
244  VectorT3 vn = (w[node] - wN1[node])/timeStep;
245  vf += vn;
246  }
247  vf /= nFaceNodes;
248  (*bVelocity)[ commonFacesMap.find(faceID)->second ] = vf;
249  }
250  }
251  }
252 
253 
254  const ArrayBase& getCommon(const StorageSite& site, const StorageSite& osite)
255  {
256 
257  const StorageSite::CommonMap& commonMap = site.getCommonMap();
258  //cout<<"\n The size of commonMap is "<<commonMap.size()<<"\n";
259 
260  const Array<int>& myNodeIndices =
261  *(site.getCommonMap().find(&osite)->second);
262  return myNodeIndices;
263  }
264 
265  void init()
266  {
267  const int numMeshes = _meshes.size();
268  for (int n=0;n<numMeshes;n++)
269  {
270  const Mesh& mesh = *_meshes[n];
271  const StorageSite& nodes = mesh.getNodes();
272  VectorT3Array& nodeCoord =
273  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
275  dynamic_pointer_cast<ArrayBase>(nodeCoord.newCopy()));
276 
278  dynamic_pointer_cast<ArrayBase>(nodeCoord.newCopy()));
279 
280  shared_ptr<VectorT3Array>
281  nodeDisplacement(new VectorT3Array(nodes.getCount()));
282  nodeDisplacement->zero();
283  _geomFields.nodeDisplacement.addArray(nodes,nodeDisplacement);
284 
285  shared_ptr<VectorT3Array>
286  nodeDisplacementN1(new VectorT3Array(nodes.getCount()));
287  nodeDisplacementN1->zero();
288 
290  nodeDisplacementN1);
291  }
292  }
293 
294  void updateTime()
295  {
296  const int numMeshes = _meshes.size();
297  for (int n=0; n<numMeshes; n++)
298  {
299  const Mesh& mesh = *_meshes[n];
300 
301  const StorageSite& nodes = mesh.getNodes();
302  VectorT3Array& w =
303  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
304  VectorT3Array& wN1 =
305  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacementN1[nodes]);
306  wN1 = w;
307  }
308  }
309 
310 private:
314 };
315 
316 
317 #endif
318 
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
int getCount(const int i) const
Field displacementOptions
Definition: GeomFields.h:37
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Field coordinate
Definition: GeomFields.h:19
Field coordinateK1
Definition: GeomFields.h:22
Definition: Mesh.h:28
const FaceGroupList & getAllFaceGroups() const
Definition: Mesh.h:193
const ArrayBase & getCommon(const StorageSite &site, const StorageSite &osite)
const StorageSite & getNodes() const
Definition: Mesh.h:110
Definition: Field.h:14
void updateBoundaryMesh(const Mesh &mesh, Mesh &bMesh, Field &velocityField, const map< int, int > &commonFacesMap, const double timeStep)
Field nodeDisplacement
Definition: GeomFields.h:33
Definition: Mesh.h:49
const CRConnectivity & getFaceNodes(const StorageSite &site) const
Definition: Mesh.cpp:402
const CommonMap & getCommonMap() const
Definition: StorageSite.h:60
T mag(const Vector< T, 3 > &a)
Definition: Vector.h:260
StructureDeformationModel(GeomFields &geomFields, StructureFields &structureFields, const MeshList &meshes)
#define logCtor()
Definition: RLogInterface.h:26
void updateBoundaryMesh(const Mesh &mesh, Mesh &bMesh, Field &velocityField, const double timeStep)
string groupType
Definition: Mesh.h:42
const Array< VecD3 > & getNodeCoordinates() const
Definition: Mesh.h:218
map< const StorageSite *, shared_ptr< Array< int > > > CommonMap
Definition: StorageSite.h:25
const StorageSite & getFaces() const
Definition: Mesh.h:108
Definition: Model.h:13
Field nodeDisplacementN1
Definition: GeomFields.h:34
const StorageSite & getCells() const
Definition: Mesh.h:109
void addArray(const StorageSite &, shared_ptr< ArrayBase > a)
Definition: Field.cpp:72
Definition: Array.h:14
int getOffset() const
Definition: StorageSite.h:87
Field coordinate0
Definition: GeomFields.h:21
shared_ptr< CRConnectivity > getTranspose() const
int getCount() const
Definition: StorageSite.h:39
virtual shared_ptr< IContainer > newCopy() const
Definition: Array.h:483
static Vector getZero()
Definition: Vector.h:182
const CRConnectivity & getCellNodes() const
Definition: Mesh.cpp:426
vector< Mesh * > MeshList
Definition: Mesh.h:439
StorageSite site
Definition: Mesh.h:40
int getLength() const
Definition: Array.h:87