-
Dilawar Singh authored64e5323b
CylMesh.h 6.76 KiB
/**********************************************************************
** This program is part of 'MOOSE', the
** Messaging Object Oriented Simulation Environment.
** Copyright (C) 2011 Upinder S. Bhalla. and NCBS
** It is made available under the terms of the
** GNU Lesser General Public License version 2.1
** See the file COPYING.LIB for the full notice.
**********************************************************************/
#ifndef _CYL_MESH_H
#define _CYL_MESH_H
/**
* The CylMesh represents a chemically identified compartment shaped
* like an extended cylinder. This is psuedo-1 dimension: Only the
* axial dimension is considered for diffusion and subdivisions.
* Typically used in modelling small segments of dendrite
*/
class CylMesh: public MeshCompt
{
public:
CylMesh();
~CylMesh();
//////////////////////////////////////////////////////////////////
// Utility func
//////////////////////////////////////////////////////////////////
/**
* Recomputes all local coordinate and meshing data following
* a change in any of the coord parameters
*/
void updateCoords( const Eref& e, const vector< double >& childConcs );
//////////////////////////////////////////////////////////////////
// Field assignment stuff
//////////////////////////////////////////////////////////////////
void setX0( const Eref& e, double v );
double getX0( const Eref& e ) const;
void setY0( const Eref& e, double v );
double getY0( const Eref& e ) const;
void setZ0( const Eref& e, double v );
double getZ0( const Eref& e ) const;
void setR0( const Eref& e, double v );
double getR0( const Eref& e ) const;
void setX1( const Eref& e, double v );
double getX1( const Eref& e ) const;
void setY1( const Eref& e, double v );
double getY1( const Eref& e ) const;
void setZ1( const Eref& e, double v );
double getZ1( const Eref& e ) const;
void setR1( const Eref& e, double v );
double getR1( const Eref& e ) const;
void innerSetCoords( const Eref& e, const vector< double >& v);
void setCoords( const Eref& e, vector< double > v );
vector< double > getCoords( const Eref& e ) const;
void setDiffLength( const Eref& e, double v );
double getDiffLength( const Eref& e ) const;
double getTotLength() const;
unsigned int innerGetDimensions() const;
//////////////////////////////////////////////////////////////////
// FieldElement assignment stuff for MeshEntries
//////////////////////////////////////////////////////////////////
/// Virtual function to return MeshType of specified entry.
unsigned int getMeshType( unsigned int fid ) const;
/// Virtual function to return dimensions of specified entry.
unsigned int getMeshDimensions( unsigned int fid ) const;
/// Virtual function to return volume of mesh Entry.
double getMeshEntryVolume( unsigned int fid ) const;
/// Virtual function to return coords of mesh Entry.
vector< double > getCoordinates( unsigned int fid ) const;
/// Virtual function to return diffusion X-section area
vector< double > getDiffusionArea( unsigned int fid ) const;
/// Virtual function to return scale factor for diffusion. 1 here.
vector< double > getDiffusionScaling( unsigned int fid ) const;
/// Volume of mesh Entry including abutting diff-coupled voxels
double extendedMeshEntryVolume( unsigned int fid ) const;
//////////////////////////////////////////////////////////////////
/**
* Inherited virtual func. Returns number of MeshEntry in array
*/
unsigned int innerGetNumEntries() const;
/// Inherited virtual func.
void innerSetNumEntries( unsigned int n );
/// Inherited virtual, do nothing for now.
vector< unsigned int > getParentVoxel() const;
const vector< double >& vGetVoxelVolume() const;
const vector< double >& vGetVoxelMidpoint() const;
const vector< double >& getVoxelArea() const;
const vector< double >& getVoxelLength() const;
/// Inherited virtual. Returns entire volume of compartment.
double vGetEntireVolume() const;
/// Inherited virtual. Resizes len and dia of each voxel.
bool vSetVolumeNotRates( double volume );
//////////////////////////////////////////////////////////////////
// Dest funcs
//////////////////////////////////////////////////////////////////
/// Virtual func to make a mesh with specified Volume and numEntries
void innerBuildDefaultMesh( const Eref& e,
double volume, unsigned int numEntries );
void innerHandleRequestMeshStats(
const Eref& e,
const SrcFinfo2< unsigned int, vector< double > >*
meshStatsFinfo
);
void innerHandleNodeInfo(
const Eref& e,
unsigned int numNodes, unsigned int numThreads );
void transmitChange( const Eref& e );
void buildStencil();
//////////////////////////////////////////////////////////////////
// inherited virtual funcs for Boundary
//////////////////////////////////////////////////////////////////
void matchMeshEntries( const ChemCompt* other,
vector< VoxelJunction > & ret ) const;
double nearest( double x, double y, double z,
unsigned int& index ) const;
double nearest( double x, double y, double z,
double& linePos, double& r ) const;
void indexToSpace( unsigned int index,
double& x, double& y, double& z ) const;
//////////////////////////////////////////////////////////////////
// Inner specific functions needed by matchMeshEntries.
//////////////////////////////////////////////////////////////////
void matchCylMeshEntries( const CylMesh* other,
vector< VoxelJunction >& ret ) const;
void matchCubeMeshEntries( const CubeMesh* other,
vector< VoxelJunction >& ret ) const;
void matchNeuroMeshEntries( const NeuroMesh* other,
vector< VoxelJunction >& ret ) const;
// Selects a grid volume for generating intersection with CubeMesh.
double selectGridVolume( double h ) const;
//////////////////////////////////////////////////////////////////
static const Cinfo* initCinfo();
private:
unsigned int numEntries_; // Number of subdivisions to use
bool useCaps_; // Flag: Should the ends have hemispherical caps?
bool isToroid_; // Flag: Should the ends loop around mathemagically?
double x0_; /// coords
double y0_; /// coords
double z0_; /// coords
double x1_; /// coords
double y1_; /// coords
double z1_; /// coords
double r0_; /// Radius at one end
double r1_; /// Radius at other end
double diffLength_; /// Length constant for diffusion. Equal to dx.
/**
* surfaceGranularity_ decides how finely to subdivide DiffLength
* or cubic mesh side, when computing surface area of intersections
* between them when diffusing. Defaults to 0.1
*/
double surfaceGranularity_;
double totLen_; /// Utility value: Total length of cylinder
double rSlope_; /// Utility value: dr/dx
double lenSlope_; /// Utility value: dlen/dx
};
#endif // _CYL_MESH_H