Memosa-FVM  0.2
PlateDeformationModel.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 _PLATEDEFORMATIONMODEL_H_
6 #define _PLATEDEFORMATIONMODEL_H_
7 
8 #include "Model.h"
9 #include "GeomFields.h"
10 #include "PlateFields.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;
26  typedef Vector<T,3> VecD3;
28 
30  PlateFields& plateFields,
31  const MeshList& meshes) :
32  Model(meshes),
33  _geomFields(geomFields),
34  _plateFields(plateFields),
35  _meshes(meshes)
36  {
37  logCtor();
38  }
39 
41 
43  {
44  const int numMeshes = _meshes.size();
45  for (int m=0;m<numMeshes;m++)
46  {
47  const Mesh& mesh = *_meshes[m];
48  const StorageSite& nodes = mesh.getNodes();
49  const StorageSite& cells = mesh.getCells();
50  const int nNodes = nodes.getCount();
51  const CRConnectivity& cellNodes = mesh.getCellNodes();
52  shared_ptr<CRConnectivity> nodeCellsPtr = cellNodes.getTranspose();
53  CRConnectivity& nodeCells = *nodeCellsPtr;
54  const VectorT3Array& nodeCoordinate0 =
55  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate0[nodes]);
56  const VectorT3Array& nodeCoordinate =
57  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[nodes]);
58  const VectorT3Array& cellCentroid =
59  dynamic_cast<const VectorT3Array&> (_geomFields.coordinate[cells]);
60  const VectorT3Array& cellDisplacement =
61  dynamic_cast<const VectorT3Array&>(_plateFields.deformation[cells]);
62  VectorT3Array& nodeDisplacement =
63  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
64  const T one(1.0);
65  const T zero(0.0);
66 
67  for(int j=0;j<nNodes;j++)
68  {
70  T weight(0.0);
71  for(int k=0;k<nodeCells.getCount(j);k++)
72  {
73  const int num = nodeCells(j,k);
74  const VectorT3 ds = cellCentroid[num]-nodeCoordinate[j];
75  dr += cellDisplacement[num]/mag(ds);
76  weight += one/mag(ds);
77  }
78  dr = dr/weight;
79  //nodeDisplacement[j][0] = nodeCoordinate0[j][2]*nodeDisplacement[j][0];
80  //nodeDisplacement[j][1] = nodeCoordinate0[j][2]*nodeDisplacement[j][1];
81  nodeDisplacement[j][0] = zero;
82  nodeDisplacement[j][1] = zero;
83  nodeDisplacement[j][2] = dr[2];
84  }
85  }
86  }
87 
88  void deformPlate()
89  {
90  const int numMeshes = _meshes.size();
91  for (int n=0;n<numMeshes;n++)
92  {
93  const Mesh& mesh = *_meshes[n];
94  const StorageSite& nodes = mesh.getNodes();
95  const int nNodes = nodes.getCount();
96  VectorT3Array& nodeCoord =
97  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
98  //Array<VecD3>& nodeCoordMesh = mesh.getNodeCoordinates();
99  const VectorT3Array& nodeCoord0 =
100  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate0[nodes]);
101  VectorT3Array& nodeDisplacement =
102  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
103  VectorT3Array& nodeCoordK1 =
104  dynamic_cast<VectorT3Array&>(_geomFields.coordinateK1[nodes]);
105  nodeCoordK1 = nodeCoord;
106  for (int i=0;i<nNodes;i++)
107  {
108  nodeCoord[i] = nodeCoord0[i] + nodeDisplacement[i];
109  //nodeCoordMesh[i] = nodeCoord[i];
110  }
111 
112  }
113  }
114 
116  {
117  const int numMeshes = _meshes.size();
118  for (int n=0;n<numMeshes;n++)
119  {
120  const Mesh& mesh = *_meshes[n];
121  const StorageSite& nodes = mesh.getNodes();
122  const int nNodes = nodes.getCount();
123  const Array<int>& displacementOptions =
124  dynamic_cast<Array<int>& > (_geomFields.displacementOptions[nodes]);
125  VectorT3Array& nodeCoord =
126  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
127  const VectorT3Array& nodeCoord0 =
128  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate0[nodes]);
129  VectorT3Array& nodeDisplacement =
130  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
131  VectorT3Array& nodeCoordK1 =
132  dynamic_cast<VectorT3Array&>(_geomFields.coordinateK1[nodes]);
133  nodeCoordK1 = nodeCoord;
134  for (int i=0;i<nNodes;i++)
135  {
136  if(displacementOptions[i] == 3)
137  {
138  nodeCoord[i] = nodeCoord0[i] + nodeDisplacement[i];
139  }
140  }
141  }
142  }
143 
144 
145  void updateBoundaryMesh(const Mesh& mesh, Mesh& bMesh, const double thickness)
146  {
147  // update node coords
148  const StorageSite& bMeshNodes = bMesh.getNodes();
149  const int nBNodes = bMeshNodes.getCount();
150 
151  const StorageSite& nodes = mesh.getNodes();
152 
153  const VectorT3Array& nodeCoord =
154  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[nodes]);
155 
156  VectorT3Array& bNodeCoord =
157  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[bMeshNodes]);
158 
159  VectorT3Array& bMeshCoord = bMesh.getNodeCoordinates();
160  // the node x,y coordinates keep the same;
161  // z coordinate gets updated by beam node coodinate;
162  for(int n=0; n<nBNodes/2; n++)
163  {
164  bNodeCoord[n][2] = -thickness/2 + nodeCoord[n][2];
165  bMeshCoord[n][2] = -thickness/2 + nodeCoord[n][2];
166  }
167 
168  for(int n=nBNodes/2; n<nBNodes; n++)
169  {
170  bNodeCoord[n][2] = thickness/2 + nodeCoord[n-nBNodes/2][2];
171  bMeshCoord[n][2] = thickness/2 + nodeCoord[n-nBNodes/2][2];
172  }
173  }
174 
175 
176  void updateBoundaryMesh(const Mesh& mesh, Mesh& bMesh,
177  const double thickness,
178  const double timeStep,
179  Field& velocityField)
180  {
181  updateBoundaryMesh(mesh, bMesh, thickness);
182 
183  // update face velocity
184  const StorageSite& nodes = mesh.getNodes();
185  const StorageSite& bMeshFaces = bMesh.getFaces();
186 
187  shared_ptr<VectorT3Array>
188  bVelocity(new VectorT3Array(bMeshFaces.getCount()));
189 
190  velocityField.addArray(bMeshFaces,bVelocity);
191 
192  VectorT3Array& w =
193  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
194  VectorT3Array& wN1 =
195  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacementN1[nodes]);
196 
197  const StorageSite& cells = mesh.getCells();
198  const int nLocalCells = cells.getSelfCount();
199  const int nCells = cells.getCount();
200 
201  for (int c=0; c<nLocalCells; c++){
202  const CRConnectivity& cellNodes = mesh.getCellNodes();
203  const int nCellNodes = cellNodes.getCount(c);
205  for (int n=0; n<nCellNodes; n++){
206  const int node = cellNodes(c, n);
207  VectorT3 vn = (w[node]-wN1[node])/timeStep;
208  vf += vn;
209  }
210  vf /= nCellNodes;
211 
212  (*bVelocity)[c] = vf;
213  (*bVelocity)[c+nLocalCells] = vf;
214  }
215 
216  for (int c=nLocalCells; c<nCells; c++){
217  const CRConnectivity& cellNodes = mesh.getCellNodes();
218  const int nCellNodes = cellNodes.getCount(c);
220  for (int n=0; n<nCellNodes; n++){
221  const int node = cellNodes(c, n);
222  VectorT3 vn = (w[node]-wN1[node])/timeStep;
223  vf += vn;
224  }
225  vf /= nCellNodes;
226 
227  (*bVelocity)[c+nLocalCells] = vf;
228  }
229 
230 
231  }
232 
233 
234  const ArrayBase& getCommon(const StorageSite& site, const StorageSite& osite)
235  {
236 
237  const StorageSite::CommonMap& commonMap = site.getCommonMap();
238  cout<<"\n The size of commonMap is "<<commonMap.size()<<"\n";
239 
240  const Array<int>& myNodeIndices =
241  *(site.getCommonMap().find(&osite)->second);
242  return myNodeIndices;
243  }
244 
245  void init()
246  {
247  const int numMeshes = _meshes.size();
248  for (int n=0;n<numMeshes;n++)
249  {
250  const Mesh& mesh = *_meshes[n];
251  const StorageSite& nodes = mesh.getNodes();
252  VectorT3Array& nodeCoord =
253  dynamic_cast<VectorT3Array&>(_geomFields.coordinate[nodes]);
255  dynamic_pointer_cast<ArrayBase>(nodeCoord.newCopy()));
256 
258  dynamic_pointer_cast<ArrayBase>(nodeCoord.newCopy()));
259 
260  shared_ptr<VectorT3Array>
261  nodeDisplacement(new VectorT3Array(nodes.getCount()));
262  nodeDisplacement->zero();
263  _geomFields.nodeDisplacement.addArray(nodes,nodeDisplacement);
264 
265  shared_ptr<VectorT3Array>
266  nodeDisplacementN1(new VectorT3Array(nodes.getCount()));
267  nodeDisplacementN1->zero();
268 
270  nodeDisplacementN1);
271  }
272  }
273 
274  void updateTime()
275  {
276  const int numMeshes = _meshes.size();
277  for (int n=0; n<numMeshes; n++)
278  {
279  const Mesh& mesh = *_meshes[n];
280 
281  const StorageSite& nodes = mesh.getNodes();
282  VectorT3Array& w =
283  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacement[nodes]);
284  VectorT3Array& wN1 =
285  dynamic_cast<VectorT3Array&>(_geomFields.nodeDisplacementN1[nodes]);
286  wN1 = w;
287  }
288  }
289 
290 private:
294 };
295 
296 
297 #endif
298 
void updateBoundaryMesh(const Mesh &mesh, Mesh &bMesh, const double thickness)
int getCount(const int i) const
Field displacementOptions
Definition: GeomFields.h:37
const ArrayBase & getCommon(const StorageSite &site, const StorageSite &osite)
int getSelfCount() const
Definition: StorageSite.h:40
Field coordinate
Definition: GeomFields.h:19
Field coordinateK1
Definition: GeomFields.h:22
const StorageSite & getNodes() const
Definition: Mesh.h:110
Definition: Field.h:14
void updateBoundaryMesh(const Mesh &mesh, Mesh &bMesh, const double thickness, const double timeStep, Field &velocityField)
Field nodeDisplacement
Definition: GeomFields.h:33
Definition: Mesh.h:49
const CommonMap & getCommonMap() const
Definition: StorageSite.h:60
T mag(const Vector< T, 3 > &a)
Definition: Vector.h:260
Array< VectorT3 > VectorT3Array
#define logCtor()
Definition: RLogInterface.h:26
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
PlateDeformationModel(GeomFields &geomFields, PlateFields &plateFields, const MeshList &meshes)
Field coordinate0
Definition: GeomFields.h:21
shared_ptr< CRConnectivity > getTranspose() const
Field deformation
Definition: PlateFields.h:15
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