MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
PsdMesh.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 ** This program is part of 'MOOSE', the
3 ** Messaging Object Oriented Simulation Environment.
4 ** Copyright (C) 2013 Upinder S. Bhalla. and NCBS
5 ** It is made available under the terms of the
6 ** GNU Lesser General Public License version 2.1
7 ** See the file COPYING.LIB for the full notice.
8 **********************************************************************/
9 
10 #include <cctype>
11 #include "header.h"
12 #include "SparseMatrix.h"
13 #include "../utility/Vec.h"
14 
15 #include "ElementValueFinfo.h"
16 #include "Boundary.h"
17 #include "MeshEntry.h"
18 #include "ChemCompt.h"
19 #include "MeshCompt.h"
20 #include "CubeMesh.h"
21 #include "CylBase.h"
22 #include "NeuroNode.h"
23 #include "NeuroMesh.h"
24 #include "PsdMesh.h"
25 #include "SpineEntry.h"
26 #include "SpineMesh.h"
27 #include "../utility/numutil.h"
29 {
31  // Field Definitions
33  static ValueFinfo< PsdMesh, double > thickness(
34  "thickness",
35  "An assumed thickness for PSD. The volume is computed as the"
36  "PSD area passed in to each PSD, times this value."
37  "defaults to 50 nanometres. For reference, membranes are 5 nm.",
40  );
41 
43  neuronVoxel
44  (
45  "neuronVoxel",
46  "Vector of indices of voxels on parent NeuroMesh, from which "
47  "the respective spines emerge.",
49  );
50 
51  static ReadOnlyValueFinfo< PsdMesh, vector< Id > > elecComptMap(
52  "elecComptMap",
53  "Vector of Ids of electrical compartments that map to each "
54  "voxel. This is necessary because the order of the IDs may "
55  "differ from the ordering of the voxels. Note that there "
56  "is always just one voxel per PSD. ",
58  );
59  static ReadOnlyValueFinfo< PsdMesh, vector< Id > > elecComptList(
60  "elecComptList",
61  "Vector of Ids of all electrical compartments in this "
62  "PsdMesh. Ordering is as per the tree structure built in "
63  "the NeuroMesh, and may differ from Id order. Ordering "
64  "matches that used for startVoxelInCompt and endVoxelInCompt",
66  );
67  static ReadOnlyValueFinfo< PsdMesh, vector< unsigned int > > startVoxelInCompt(
68  "startVoxelInCompt",
69  "Index of first voxel that maps to each electrical "
70  "compartment. This is a trivial function in the PsdMesh, as"
71  "we have a single voxel per spine. So just a vector of "
72  "its own indices.",
74  );
76  "endVoxelInCompt",
77  "Index of end voxel that maps to each electrical "
78  "compartment. Since there is just one voxel per electrical "
79  "compartment in the spine, this is just a vector of index+1",
81  );
82 
84  // MsgDest Definitions
86 
87  static DestFinfo psdList( "psdList",
88  "Specifies the geometry of the spine,"
89  "and the associated parent voxel"
90  "Arguments: "
91  "disk params vector with 8 entries per psd, "
92  "vector of Ids of electrical compts mapped to voxels, "
93  "parent voxel index ",
94  new EpFunc3< PsdMesh,
95  vector< double >,
96  vector< Id >,
97  vector< unsigned int > >(
99  );
100 
102  // Field Elements
104 
105  static Finfo* psdMeshFinfos[] = {
106  &thickness, // ValueFinfo
107  &neuronVoxel, // ReadOnlyValueFinfo
108  &elecComptMap, // ReadOnlyValueFinfo
109  &elecComptList, // ReadOnlyValueFinfo
110  &startVoxelInCompt, // ReadOnlyValueFinfo
111  &endVoxelInCompt, // ReadOnlyValueFinfo
112  &psdList, // DestFinfo
113  };
114 
115  static Dinfo< PsdMesh > dinfo;
116  static Cinfo psdMeshCinfo (
117  "PsdMesh",
119  psdMeshFinfos,
120  sizeof( psdMeshFinfos ) / sizeof ( Finfo* ),
121  &dinfo
122  );
123 
124  return &psdMeshCinfo;
125 }
126 
128 // Basic class Definitions
130 
132 
134 // Class stuff.
137  :
138  thickness_( 50.0e-9 ),
139  psd_( 1 ),
140  pa_( 1 ),
141  parentDist_( 1, 1e-6 ),
142  parent_( 1, 0 ),
143  surfaceGranularity_( 0.1 ),
144  vs_(1, 5.0e-21 ),
145  area_(1, 1.0e-13 ),
146  length_(1, 50.0e-9 )
147 {
148  const double defaultLength = 1e-6;
149  psd_[0].setDia( defaultLength );
150  psd_[0].setLength( thickness_ );
151  psd_[0].setNumDivs( 1 );
152  psd_[0].setIsCylinder( true );
153 }
154 
155 PsdMesh::PsdMesh( const PsdMesh& other )
156  :
157  psd_( other.psd_ ),
158  surfaceGranularity_( other.surfaceGranularity_ )
159 {;}
160 
162 {
163  ;
164 }
165 
167 // Field assignment stuff
169 double PsdMesh::getThickness() const
170 {
171  return thickness_;
172 }
173 void PsdMesh::setThickness( double v )
174 {
175  thickness_ = v;
176 }
177 
184 vector< unsigned int > PsdMesh::getNeuronVoxel() const
185 {
186  cout << "Warning: PsdMesh::getNeuronVoxel. Currently not working\n";
187  return parent_;
188 }
189 
190 vector< Id > PsdMesh::getElecComptMap() const
191 {
192  return elecCompt_;
193 }
194 
195 vector< unsigned int > PsdMesh::getStartVoxelInCompt() const
196 {
197  vector< unsigned int > ret( elecCompt_.size() );
198  for ( unsigned int i = 0; i < ret.size(); ++i )
199  ret[i] = i;
200  return ret;
201 }
202 
203 vector< unsigned int > PsdMesh::getEndVoxelInCompt() const
204 {
205  vector< unsigned int > ret( elecCompt_.size() );
206  for ( unsigned int i = 0; i < ret.size(); ++i )
207  ret[i] = i+1;
208  return ret;
209 }
210 
217 {
218  buildStencil();
219 }
220 
221 unsigned int PsdMesh::innerGetDimensions() const
222 {
223  return 2;
224 }
225 
226 // Here we set up the psds.
228  const Eref& e,
229  vector< double > diskCoords, //ctr(xyz), dir(xyz), dia, diffDist
230  // The elecCompt refers to the spine head elec compartment.
231  vector< Id > elecCompt,
232  // The parentVoxel is just a vector where parentVoxel[i] == i
233  // Thus the parent voxel is the spine head with the same index
234  vector< unsigned int > parentVoxel )
235 {
236  double oldVol = getMeshEntryVolume( 0 );
237  assert( diskCoords.size() == 8 * parentVoxel.size() );
238  psd_.resize( parentVoxel.size() );
239  pa_.resize( parentVoxel.size() );
240  vs_.resize( parentVoxel.size() );
241  area_.resize( parentVoxel.size() );
242  length_.resize( parentVoxel.size() );
243  elecCompt_ = elecCompt;
244 
245  psd_.clear();
246  pa_.clear();
247  parentDist_.clear();
248  parent_.clear();
249  vector< double >::const_iterator x = diskCoords.begin();
250  for ( unsigned int i = 0; i < parentVoxel.size(); ++i ) {
251  double p = *x;
252  double q = *(x+1);
253  double r = *(x+2);
254 
255  psd_.push_back( CylBase( p, q, r, 1, 0, 1 ));
256  x += 3;
257  pa_.push_back( CylBase( p - *x, q - *(x+1), r - *(x+2), 1, 0, 1 ));
258  x += 3;
259  psd_.back().setDia( *x++ );
260  psd_.back().setIsCylinder( true );
261  // This is an entirely nominal
262  // length, so that the effective vol != 0.
263  psd_.back().setLength( thickness_ );
264 
265  parentDist_.push_back( *x++ );
266  vs_[i] = psd_.back().volume( psd_.back() );
267  area_[i] = psd_.back().getDiffusionArea( psd_.back(), 0 );
268  length_[i] = parentDist_.back();
269  }
270  parent_ = parentVoxel;
271 
272  updateCoords();
273 
274  Id meshEntry( e.id().value() + 1 );
275 
276  vector< unsigned int > localIndices( psd_.size() );
277  vector< double > vols( psd_.size() );
278  for ( unsigned int i = 0; i < psd_.size(); ++i ) {
279  localIndices[i] = i;
280  vols[i] = thickness_ * psd_[i].getDiffusionArea( pa_[i], 0 );
281  }
282  vector< vector< unsigned int > > outgoingEntries;
283  vector< vector< unsigned int > > incomingEntries;
284  // meshSplit()->send( e, oldVol, vols, localIndices, outgoingEntries, incomingEntries );
285  lookupEntry( 0 )->triggerRemesh( meshEntry.eref(),
286  oldVol, 0, localIndices, vols );
287 
288 }
289 
291 // FieldElement assignment stuff for MeshEntries
293 
294 
296 unsigned int PsdMesh::getMeshType( unsigned int fid ) const
297 {
298  assert( fid < psd_.size() );
299  return DISK;
300 }
301 
303 unsigned int PsdMesh::getMeshDimensions( unsigned int fid ) const
304 {
305  return 2;
306 }
307 
309 double PsdMesh::getMeshEntryVolume( unsigned int fid ) const
310 {
311  if ( psd_.size() == 0 ) // Default for meshes before init.
312  return 1.0;
313  assert( fid < psd_.size() );
314  return thickness_ * psd_[ fid ].getDiffusionArea( pa_[fid], 0 );
315 }
316 
318 void PsdMesh::setMeshEntryVolume( unsigned int fid, double volume )
319 {
320  if ( psd_.size() == 0 ) // Default for meshes before init.
321  return;
322  assert( fid < psd_.size() );
323  vs_[fid] = volume;
324  area_[fid] = volume / thickness_;
325  double dia = 2.0 * sqrt( area_[fid] / PI );
326  psd_[ fid ].setDia( dia );
327 }
328 
331 vector< double > PsdMesh::getCoordinates( unsigned int fid ) const
332 {
333  vector< double > ret;
334  ret.push_back( psd_[fid].getX() );
335  ret.push_back( psd_[fid].getY() );
336  ret.push_back( psd_[fid].getZ() );
337  ret.push_back( psd_[fid].getX() - pa_[fid].getX() );
338  ret.push_back( psd_[fid].getY() - pa_[fid].getY() );
339  ret.push_back( psd_[fid].getZ() - pa_[fid].getZ() );
340  ret.push_back( psd_[fid].getDia() );
341  return ret;
342 }
343 
345 vector< double > PsdMesh::getDiffusionArea( unsigned int fid ) const
346 {
347  vector< double > ret;
348  assert( fid < psd_.size() );
349  ret.push_back( psd_[ fid ].getDiffusionArea( pa_[fid], 0 ) );
350 
351  return ret;
352 }
353 
356 // Regular points return vector( 2, 1.0 );
357 vector< double > PsdMesh::getDiffusionScaling( unsigned int fid ) const
358 {
359  return vector< double >( 2, 1.0 );
360 }
361 
364 double PsdMesh::extendedMeshEntryVolume( unsigned int fid ) const
365 {
366  if ( fid < psd_.size() ) {
367  return getMeshEntryVolume( fid );
368  } else {
369  return MeshCompt::extendedMeshEntryVolume( fid - psd_.size() );
370  }
371 }
372 
373 
374 
376 // Dest funcsl
378 
382  const SrcFinfo2< unsigned int, vector< double > >* meshStatsFinfo
383  )
384 {
385  ;
386 }
387 
389  const Eref& e,
390  unsigned int numNodes, unsigned int numThreads )
391 {
392 }
394 
395 unsigned int PsdMesh::parent( unsigned int i ) const
396 {
397  if ( i < parent_.size() )
398  return parent_[i];
399  cout << "Error: PsdMesh::parent: Index " << i << " out of range: " <<
400  parent_.size() << "\n";
401  return 0;
402 }
403 
407 unsigned int PsdMesh::innerGetNumEntries() const
408 {
409  return psd_.size();
410 }
411 
416 void PsdMesh::innerSetNumEntries( unsigned int n )
417 {
418 }
419 
420 
425  double volume, unsigned int numEntries )
426 {
427  cout << "Warning: PsdMesh::innerBuildDefaultMesh: attempt to build a default psd: not permitted\n";
428 }
429 
431 // Utility function to set up Stencil for diffusion
434 {
435  setStencilSize( psd_.size(), psd_.size() );
437 }
438 
440 // Utility function for junctions
442 
444  vector< VoxelJunction >& ret ) const
445 {
446  const SpineMesh* sm = dynamic_cast< const SpineMesh* >( other );
447  if ( sm ) {
448  matchSpineMeshEntries( other, ret );
449  return;
450  }
451  const CubeMesh* cm = dynamic_cast< const CubeMesh* >( other );
452  if ( cm ) {
453  matchCubeMeshEntries( other, ret );
454  return;
455  }
456  const NeuroMesh* nm = dynamic_cast< const NeuroMesh* >( other );
457  if ( nm ) {
458  matchNeuroMeshEntries( other, ret );
459  return;
460  }
461  cout << "Warning: PsdMesh::matchMeshEntries: unknown class\n";
462 }
463 
464 void PsdMesh::indexToSpace( unsigned int index,
465  double& x, double& y, double& z ) const
466 {
467  if ( index >= innerGetNumEntries() )
468  return;
469  x = psd_[index].getX();
470  y = psd_[index].getY();
471  z = psd_[index].getZ();
472 }
473 
474 double PsdMesh::nearest( double x, double y, double z,
475  unsigned int& index ) const
476 {
477  double best = 1e12;
478  index = 0;
479  for( unsigned int i = 0; i < psd_.size(); ++i ) {
480  Vec a( psd_[i].getX(), psd_[i].getY(), psd_[i].getZ() );
481  Vec b( x, y, z );
482  double d = a.distance( b );
483  if ( best > d ) {
484  best = d;
485  index = i;
486  }
487  }
488  if ( best == 1e12 )
489  return -1;
490  return best;
491 }
492 
494  vector< VoxelJunction >& ret ) const
495 {
496  const SpineMesh* sm = dynamic_cast< const SpineMesh* >( other );
497  assert( sm );
498  for ( unsigned int i = 0; i < psd_.size(); ++i ) {
499  double xda = psd_[i].getDiffusionArea( pa_[i], 0 ) / parentDist_[i];
500  ret.push_back( VoxelJunction( i, parent_[i], xda ) );
501  ret.back().firstVol = getMeshEntryVolume( i );
502  ret.back().secondVol = sm->getMeshEntryVolume( parent_[i] );
503  }
504 }
505 
506 // This only makes sense if the PSD is directly on the NeuroMesh, that is,
507 // no spine shaft or head. In this case the parent_ vector must refer to
508 // the parent compartment on the NeuroMesh.
510  vector< VoxelJunction >& ret ) const
511 {
512  const NeuroMesh* nm = dynamic_cast< const NeuroMesh* >( other );
513  assert( nm );
514  for ( unsigned int i = 0; i < psd_.size(); ++i ) {
515  double xda = psd_[i].getDiffusionArea( pa_[i], 0) / parentDist_[i];
516  ret.push_back( VoxelJunction( i, parent_[i], xda ) );
517  }
518 }
519 
521  vector< VoxelJunction >& ret ) const
522 {
523  for( unsigned int i = 0; i < psd_.size(); ++i ) {
524  const CylBase& cb = psd_[i];
525  cb.matchCubeMeshEntries( other, pa_[i],
526  i, surfaceGranularity_, ret, false, true );
527  }
528 }
529 
530 
532 // Inherited Virtual funcs for getting voxel info.
534 
542 vector< unsigned int > PsdMesh::getParentVoxel() const
543 {
544  vector< unsigned int > ret( parent_.size(), -1U );
545  return ret;
546  // return parent_;
547 }
548 
549 const vector< double >& PsdMesh::vGetVoxelVolume() const
550 {
551  return vs_;
552 }
553 
554 /*
555 * The order of coords sent in is
556  * centre xyz
557  * direction xyz
558  * dia,
559  * diffusion distance to middle of spine Head.
560 */
561 const vector< double >& PsdMesh::vGetVoxelMidpoint() const
562 {
563  static vector< double > midpoint;
564  midpoint.resize( psd_.size() * 3 );
565  vector< double >::iterator k = midpoint.begin();
566  for ( unsigned int i = 0; i < psd_.size(); ++i ) {
567  vector< double > coords =
568  psd_[i].getCoordinates( pa_[i], 0 );
569  *k = ( coords[0] + coords[3] ) / 2.0;
570  *(k + psd_.size() ) = ( coords[1] + coords[4] ) / 2.0;
571  *(k + 2 * psd_.size() ) = ( coords[2] + coords[5] ) / 2.0;
572  k++;
573  // cout << i << " " << coords[0] << " " << coords[3]<< " " << coords[1]<< " " << coords[4]<< " " << coords[2]<< " " << coords[5] << " " << coords[6] << endl;
574  }
575  return midpoint;
576 }
577 
578 const vector< double >& PsdMesh::getVoxelArea() const
579 {
580  return area_;
581 }
582 
583 const vector< double >& PsdMesh::getVoxelLength() const
584 {
585  return length_;
586 }
587 
589 {
590  double ret = 0.0;
591  for ( vector< double >::const_iterator i =
592  vs_.begin(); i != vs_.end(); ++i )
593  ret += *i;
594  return ret;
595 }
596 
597 bool PsdMesh::vSetVolumeNotRates( double volume )
598 {
599  double volscale = volume / vGetEntireVolume();
600  double linscale = pow( volscale, 1.0/3.0 );
601  assert( vs_.size() == psd_.size() );
602  assert( area_.size() == psd_.size() );
603  assert( length_.size() == psd_.size() );
604  thickness_ *= linscale;
605  for ( unsigned int i = 0; i < psd_.size(); ++i ) {
606  psd_[i].setLength( psd_[i].getLength() * linscale );
607  psd_[i].setDia( psd_[i].getDia() * linscale );
608  vs_[i] *= volscale;
609  area_[i] *= linscale * linscale;
610  length_[i] *= linscale;
611  }
612  return true;
613 }
614 
static const Cinfo * initCinfo()
Definition: ChemCompt.cpp:25
Id id() const
Definition: Eref.cpp:62
vector< CylBase > psd_
Definition: PsdMesh.h:178
vector< unsigned int > getNeuronVoxel() const
Definition: PsdMesh.cpp:184
unsigned int getMeshDimensions(unsigned int fid) const
Virtual function to return dimensions of specified entry.
Definition: PsdMesh.cpp:303
vector< Id > elecCompt_
Parent voxel index.
Definition: PsdMesh.h:182
void innerResetStencil()
virtual func implemented here.
Definition: MeshCompt.cpp:49
unsigned int parent(unsigned int index) const
Definition: PsdMesh.cpp:395
double getMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry.
Definition: SpineMesh.cpp:307
double getMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry.
Definition: PsdMesh.cpp:309
PsdMesh()
Definition: PsdMesh.cpp:136
unsigned int value() const
Definition: Id.cpp:197
static const Cinfo * psdMeshCinfo
Definition: PsdMesh.cpp:131
Definition: Dinfo.h:60
MeshEntry * lookupEntry(unsigned int index)
Definition: ChemCompt.cpp:379
double extendedMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry, including.
Definition: MeshCompt.cpp:36
void matchNeuroMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
Definition: PsdMesh.cpp:509
vector< unsigned int > getStartVoxelInCompt() const
Returns index of first voxel mapping to elec compt.
Definition: PsdMesh.cpp:195
vector< double > getDiffusionScaling(unsigned int fid) const
Virtual function to return scale factor for diffusion. 1 here.
Definition: PsdMesh.cpp:357
void buildStencil()
Definition: PsdMesh.cpp:433
vector< double > getCoordinates(unsigned int fid) const
Virtual function to return coords of mesh Entry.
Definition: PsdMesh.cpp:331
const int numEntries
Definition: proc.cpp:60
double thickness_
Thickness of PSD.
Definition: PsdMesh.h:173
Definition: EpFunc.h:95
void setMeshEntryVolume(unsigned int fid, double volume)
Virtual function to set volume of mesh Entry.
Definition: PsdMesh.cpp:318
unsigned int innerGetDimensions() const
Returns # of dimensions, always 3 here. Inherited pure virt func.
Definition: PsdMesh.cpp:221
vector< double > area_
Vol.
Definition: PsdMesh.h:192
double getThickness() const
Definition: PsdMesh.cpp:169
vector< CylBase > pa_
Specified disk of psd.
Definition: PsdMesh.h:179
Definition: Vec.h:13
vector< double > parentDist_
Specifies direction of psd. Length ignored.
Definition: PsdMesh.h:180
vector< double > getDiffusionArea(unsigned int fid) const
Virtual function to return diffusion X-section area.
Definition: PsdMesh.cpp:345
void matchCubeMeshEntries(const ChemCompt *other, const CylBase &parent, unsigned int startIndex, double granularity, vector< VoxelJunction > &ret, bool useCylinderCurve, bool useCylinderCap) const
Definition: CylBase.cpp:320
const vector< double > & getVoxelArea() const
Definition: PsdMesh.cpp:578
double nearest(double x, double y, double z, unsigned int &index) const
Definition: PsdMesh.cpp:474
Definition: MeshEntry.h:22
void innerSetNumEntries(unsigned int n)
Inherited virtual func.
Definition: PsdMesh.cpp:416
vector< unsigned int > getEndVoxelInCompt() const
Returns index of end voxel mapping to elec compt, just first+1.
Definition: PsdMesh.cpp:203
void innerHandleNodeInfo(const Eref &e, unsigned int numNodes, unsigned int numThreads)
Definition: PsdMesh.cpp:388
Definition: Eref.h:26
double distance(const Vec &other) const
Definition: Vec.cpp:81
void innerBuildDefaultMesh(const Eref &e, double volume, unsigned int numEntries)
Virtual func to make a mesh with specified Volume and numEntries.
Definition: PsdMesh.cpp:424
void matchCubeMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
Definition: PsdMesh.cpp:520
void matchSpineMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
Definition: PsdMesh.cpp:493
double vGetEntireVolume() const
Inherited virtual func.
Definition: PsdMesh.cpp:588
double extendedMeshEntryVolume(unsigned int fid) const
Vol of all mesh Entries including abutting diff-coupled voxels.
Definition: PsdMesh.cpp:364
unsigned int innerGetNumEntries() const
Definition: PsdMesh.cpp:407
vector< double > vs_
Definition: PsdMesh.h:191
~PsdMesh()
Definition: PsdMesh.cpp:161
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
Definition: PsdMesh.cpp:443
void updateCoords()
Definition: PsdMesh.cpp:216
void triggerRemesh(const Eref &e, double oldvol, unsigned int startEntry, const vector< unsigned int > &localIndices, const vector< double > &vols)
Definition: MeshEntry.cpp:267
static unsigned int numNodes
vector< unsigned int > parent_
Specifies diff distance to PSD.
Definition: PsdMesh.h:181
double surfaceGranularity_
Ids of elec compts mapped to each voxel.
Definition: PsdMesh.h:189
unsigned int getMeshType(unsigned int fid) const
Virtual function to return MeshType of specified entry.
Definition: PsdMesh.cpp:296
const double PI
Definition: consts.cpp:12
Definition: Id.h:17
const vector< double > & vGetVoxelMidpoint() const
Virtual func so that derived classes can return voxel midpoint.
Definition: PsdMesh.cpp:561
vector< unsigned int > getParentVoxel() const
Definition: PsdMesh.cpp:542
static const Cinfo * initCinfo()
Definition: PsdMesh.cpp:28
void handlePsdList(const Eref &e, vector< double > params, vector< Id > elecCompts, vector< unsigned int > parentVoxel)
Definition: PsdMesh.cpp:227
void setStencilSize(unsigned int numRows, unsigned int numCols)
Definition: MeshCompt.cpp:106
bool vSetVolumeNotRates(double volume)
Inherited virtual func.
Definition: PsdMesh.cpp:597
const vector< double > & getVoxelLength() const
Definition: PsdMesh.cpp:583
vector< double > length_
area
Definition: PsdMesh.h:193
void innerHandleRequestMeshStats(const Eref &e, const SrcFinfo2< unsigned int, vector< double > > *meshStatsFinfo)
Definition: PsdMesh.cpp:381
void indexToSpace(unsigned int index, double &x, double &y, double &z) const
Definition: PsdMesh.cpp:464
Definition: Cinfo.h:18
Definition: Finfo.h:12
const vector< double > & vGetVoxelVolume() const
Virtual func so that derived classes can pass voxel volume back.
Definition: PsdMesh.cpp:549
void setThickness(double v)
Definition: PsdMesh.cpp:173
vector< Id > getElecComptMap() const
Definition: PsdMesh.cpp:190