12 #include "../shell/Shell.h"
24 #include "../utility/Vec.h"
40 Id subCompt = s->
doCreate(
"CubeMesh", kin,
"subCompt", 1 );
42 Id SP = s->
doCreate(
"Pool", subCompt,
"SP", 1 );
78 assert(
doubleEq( n[0] * 10, m[0] ) );
79 assert(
doubleEq( n[1] * 10, m[1] ) );
80 assert(
doubleEq( n[2] / 10, m[2] ) );
82 assert(
doubleEq( n[4] / 10, m[4] ) );
84 assert(
doubleEq( n[6] / 10, m[6] ) );
103 CylBase b( 1, 2, 3, 1, 2, 10 );
105 assert(
doubleEq( b.volume( a ),
PI * 0.25 * 2 ) );
106 assert( a.getNumDivs() == 1 );
107 assert( b.getNumDivs() == 10 );
109 for (
unsigned int i = 0; i < 10; ++i ) {
110 assert(
doubleEq( b.voxelVolume( a, i ),
PI * 0.25 * 2 * 0.1 ) );
111 vector< double > coords = b.getCoordinates( a, i );
113 assert(
doubleEq( coords[0], x / 10.0 ) );
114 assert(
doubleEq( coords[1], x * 2.0 / 10.0 ) );
115 assert(
doubleEq( coords[2], x * 3.0 / 10.0 ) );
116 assert(
doubleEq( coords[3], (1.0 + x) / 10.0 ) );
117 assert(
doubleEq( coords[4], (1.0 + x) * 2.0 / 10.0 ) );
118 assert(
doubleEq( coords[5], (1.0 + x) * 3.0 / 10.0 ) );
119 assert(
doubleEq( coords[6], 0.5 ) );
120 assert(
doubleEq( coords[7], 0.5 ) );
121 assert(
doubleEq( coords[8], 0.0 ) );
122 assert(
doubleEq( coords[9], 0.0 ) );
124 assert(
doubleEq( b.getDiffusionArea( a, i ),
PI * 0.25 ) );
127 assert(
doubleEq( b.getDia(), 2.0 ) );
128 assert(
doubleEq( b.volume( a ),
PI * (2*(0.5*0.5+0.5+1)/3.0) ) );
129 for (
unsigned int i = 0; i < 10; ++i ) {
130 double x =
static_cast< double >( i ) / 10.0;
131 double r0 = 0.5 * ( a.getDia() * ( 1.0 - x ) + b.getDia() * x );
133 double r1 = 0.5 * ( a.getDia() * ( 1.0 - x ) + b.getDia() * x );
135 double vv = 0.2 * ( r0 * r0 + r0 * r1 + r1 * r1 ) *
PI / 3.0;
136 assert(
doubleEq( b.voxelVolume( a, i ), vv ) );
137 assert(
doubleEq( b.getDiffusionArea( a, i ),
PI * r0 * r0 ) );
140 cout <<
"." << flush;
149 CylBase b( 1, 2, 3, 2, 2, 10 );
150 CylBase dcb( 1, 2, 3, 2, 2, 0 );
151 vector< unsigned int > twoKids( 2, 2 );
154 vector< unsigned int > oneKid( 1, 2 );
155 vector< unsigned int > noKids( 0 );
157 NeuroNode ndummy( dcb, 0, oneKid, 1,
Id(),
false );
160 assert( na.parent() == 0 );
161 assert( na.startFid() == 0 );
162 assert( na.elecCompt() ==
Id() );
163 assert( na.isDummyNode() == false );
164 assert( na.isSphere() == true );
165 assert( na.isStartNode() == true );
166 assert( na.children().size() == 2 );
167 assert( na.children()[0] == 2 );
168 assert( na.children()[1] == 4 );
169 assert(
doubleEq( na.volume( a ),
PI * 0.25 ) );
171 assert( ndummy.parent() == 0 );
172 assert( ndummy.startFid() == 1 );
173 assert( ndummy.elecCompt() ==
Id() );
174 assert( ndummy.isDummyNode() == true );
175 assert( ndummy.isSphere() == false );
176 assert( ndummy.isStartNode() == false );
177 assert( ndummy.children().size() == 1 );
178 assert( ndummy.children()[0] == 2 );
180 assert( nb.parent() == 1 );
181 assert( nb.startFid() == 1 );
182 assert( nb.elecCompt() ==
Id() );
183 assert( nb.isDummyNode() == false );
184 assert( nb.isSphere() == false );
185 assert( nb.isStartNode() == false );
186 assert( nb.children().size() == 0 );
187 assert(
doubleEq( nb.volume( a ),
PI * (2*(0.5*0.5+0.5+1)/3.0) ) );
189 cout <<
"." << flush;
192 void zebraConcPattern( vector< vector< double > >& S )
196 assert( S.size() == 44 );
197 for (
unsigned int i = 0; i < S.size(); ++i )
232 void uniformConcPattern( vector< vector< double > >& S,
233 vector< double >& vs )
237 assert( S.size() == 44 );
238 for (
unsigned int i = 0; i < S.size(); ++i )
239 S[i][0] = 10 * vs[i];
276 unsigned int buildNode( vector< NeuroNode >& nodes,
unsigned int parent,
277 double x,
double y,
double z,
double dia,
278 unsigned int numDivs,
bool isDummy,
unsigned int startFid )
284 CylBase cb( x, y, z, dia, dia/2, numDivs );
285 vector< unsigned int > kids( 0 );
286 if ( nodes.size() == 0 ) {
287 NeuroNode nn( cb, parent, kids, startFid,
Id(),
true );
288 nodes.push_back( nn );
289 }
else if ( isDummy ) {
290 NeuroNode nn( cb, parent, kids, startFid,
Id(),
false );
291 nodes.push_back( nn );
293 NeuroNode nn( cb, parent, kids, startFid,
Id(),
false );
294 nodes.push_back( nn );
297 nodes.back().calculateLength( paNode );
298 return startFid + numDivs;
301 void connectChildNodes( vector< NeuroNode >& nodes )
303 assert( nodes.size() == 11 );
304 for (
unsigned int i = 1; i < nodes.size(); ++i ) {
305 assert( nodes[i].parent() < nodes.size() );
306 NeuroNode& parent = nodes[ nodes[i].parent() ];
307 parent.addChild( i );
311 assert( nodes[0].children().size() == 3 );
312 assert( nodes[0].children()[0] == 1 );
313 assert( nodes[0].children()[1] == 4 );
314 assert( nodes[0].children()[2] == 8 );
315 assert( nodes[1].children().size() == 1 );
316 assert( nodes[1].children()[0] == 2 );
317 assert( nodes[2].children().size() == 1 );
318 assert( nodes[2].children()[0] == 3 );
319 assert( nodes[3].children().size() == 0 );
320 assert( nodes[4].children().size() == 1 );
321 assert( nodes[4].children()[0] == 5 );
322 assert( nodes[5].children().size() == 2 );
323 assert( nodes[5].children()[0] == 6 );
324 assert( nodes[5].children()[1] == 7 );
325 assert( nodes[6].children().size() == 0 );
326 assert( nodes[7].children().size() == 0 );
327 assert( nodes[8].children().size() == 1 );
328 assert( nodes[8].children()[0] == 9 );
329 assert( nodes[9].children().size() == 1 );
330 assert( nodes[9].children()[0] == 10 );
331 assert( nodes[10].children().size() == 0 );
345 vector< double > coords( 9 );
385 vector< double > temp = cm.
getCoords(
Id().eref(), 0 );
386 assert( temp.size() == 9 );
388 for (
unsigned int i = 0; i < temp.size() - 1; ++i )
389 assert(
doubleEq( temp[i], coords[i] + 1 ) );
391 double totLen = sqrt( 29.0 );
412 assert( coords.size() == 10 );
413 assert(
doubleEq( coords[0], 2 + (0.4 - 0.048) * 2 ) );
414 assert(
doubleEq( coords[1], 3 + (0.4 - 0.048) * 3 ) );
415 assert(
doubleEq( coords[2], 4 + (0.4 - 0.048) * 4 ) );
417 assert(
doubleEq( coords[3], 2 + (0.6 - 0.048) * 2 ) );
418 assert(
doubleEq( coords[4], 3 + (0.6 - 0.048) * 3 ) );
419 assert(
doubleEq( coords[5], 4 + (0.6 - 0.048) * 4 ) );
421 assert(
doubleEq( coords[6], 2.4 ) );
422 assert(
doubleEq( coords[7], 2.6 ) );
425 vector< unsigned int > neighbors = cm.
getNeighbors( 2 );
426 assert( neighbors.size() == 2 );
427 assert( neighbors[0] == 1 );
428 assert( neighbors[1] == 3 );
432 assert( coords.size() == 2 );
433 assert(
doubleEq( coords[0], 2.4 * 2.4 *
PI ) );
434 assert(
doubleEq( coords[1], 2.6 * 2.6 *
PI ) );
438 assert( coords.size() == 9 );
442 double ux = ( coords[3] - coords[0] ) / ne;
443 double uy = ( coords[4] - coords[1] ) / ne;
444 double uz = ( coords[5] - coords[2] ) / ne;
446 assert(
doubleEq( x, coords[0] + 0.5 * ux ) );
447 assert(
doubleEq( y, coords[1] + 0.5 * uy ) );
448 assert(
doubleEq( z, coords[2] + 0.5 * uz ) );
450 assert(
doubleEq( x, coords[3] - 0.5 * ux ) );
451 assert(
doubleEq( y, coords[4] - 0.5 * uy ) );
452 assert(
doubleEq( z, coords[5] - 0.5 * uz ) );
457 double dist = cm.
nearest( x, y, z, index );
461 dist = cm.
nearest( x, y, z, index );
462 assert( dist > 0.0 && dist < 1.0 );
466 dist = cm.
nearest( x, y, z, index );
467 assert( dist < 0.0 );
474 assert( dist <= 0.01 );
491 vector< VoxelJunction > ret;
494 for (
unsigned int i = 0; i < ret.size(); ++i ) {
495 assert( ret[i].first == i );
496 assert( ret[i].second == 0 );
497 double r = cm.
getR0() +
503 assert( fabs( ret[i].diffScale - a ) < 0.5 );
511 coords[3] = coords[0];
512 coords[4] = coords[1];
513 coords[5] = coords[2];
522 vector< VoxelJunction > vj;
524 assert( vj.size() == 1 );
525 assert( vj[0].first == 0 );
528 assert(
doubleEq( vj[0].diffScale, xda ) );
530 cout <<
"." << flush;
537 void testMidLevelCylMesh()
542 Id meshId( cylId.
value() + 1 );
544 vector< double > coords( 9 );
572 meshId.element()->syncFieldDim();
574 assert( meshId()->dataHandler()->localEntries() == 5 );
581 double totLen = sqrt( 29.0 );
583 1.5 * 1.5 *
PI * totLen / 5 ) );
585 vector< unsigned int > neighbors =
587 assert( neighbors.size() == 2 );
588 assert( neighbors[0] = 1 );
589 assert( neighbors[1] = 3 );
593 cout <<
"." << flush;
608 vector< double > coords( 9 );
623 vector< unsigned int > neighbors = cm.
getNeighbors( 0 );
624 assert( neighbors.size() == 3 );
625 assert( neighbors[0] = 1 );
626 assert( neighbors[0] = 2 );
627 assert( neighbors[0] = 8 );
642 assert( cm.
getNx() == 2 );
643 assert( cm.
getNy() == 4 );
644 assert( cm.
getNz() == 8 );
654 vector< double > temp = cm.
getCoords(
Id().eref() );
655 assert( temp.size() == 9 );
666 assert( cm.
getNx() == 4 );
667 assert( cm.
getNy() == 4 );
668 assert( cm.
getNz() == 4 );
671 assert( neighbors.size() == 3 );
672 assert( neighbors[0] == 1 );
673 assert( neighbors[1] == 4 );
674 assert( neighbors[2] = 16 );
677 assert( neighbors.size() == 3 );
678 assert( neighbors[0] == 47 );
679 assert( neighbors[1] == 59 );
680 assert( neighbors[2] == 62 );
683 assert( neighbors.size() == 4 );
684 assert( neighbors[0] == 1 );
685 assert( neighbors[1] == 3 );
686 assert( neighbors[2] == 6 );
687 assert( neighbors[3] == 18 );
690 assert( neighbors.size() == 5 );
691 assert( neighbors[0] == 2 );
692 assert( neighbors[1] == 5 );
693 assert( neighbors[2] == 7 );
694 assert( neighbors[3] == 10 );
695 assert( neighbors[4] == 22 );
698 assert( neighbors.size() == 6 );
699 assert( neighbors[0] == 6 );
700 assert( neighbors[1] == 18 );
701 assert( neighbors[2] == 21 );
702 assert( neighbors[3] == 23 );
703 assert( neighbors[4] == 26 );
704 assert( neighbors[5] == 38 );
707 assert( cm.
getNx() == 4 );
708 assert( cm.
getNy() == 4 );
709 assert( cm.
getNz() == 4 );
723 cout <<
"." << flush;
735 vector< double > coords( 9 );
751 cm1.innerSetCoords( coords );
754 const unsigned int* colIndex;
755 unsigned int num = cm0.
getStencilRow( 0, &entry, &colIndex );
757 assert( colIndex[0] == 1 );
758 assert( colIndex[1] == 2 );
759 assert( colIndex[2] == 8 );
763 assert( colIndex[0] == 48 );
764 assert( colIndex[1] == 57 );
765 assert( colIndex[2] == 58 );
767 vector< VoxelJunction > vj;
768 for (
unsigned int i = 0; i < 8; ++i ) {
775 assert( colIndex[0] == 48 );
776 assert( colIndex[1] == 57 );
777 assert( colIndex[2] == 58 );
778 assert( colIndex[3] == 64 );
780 for (
unsigned int i = 0; i < 8; ++i ) {
783 assert( colIndex[0] == 56 + i );
786 cout <<
"." << flush;
797 Id cube = s->
doCreate(
"CubeMesh", base,
"cube", 1 );
799 cube,
"buildDefaultMesh", 1.0, 1 );
803 Id pool = s->
doCreate(
"Pool", cube,
"pool", 1 );
804 Id mesh(
"/base/cube/mesh" );
805 assert( mesh !=
Id() );
818 cube,
"buildDefaultMesh", 1.0e-3, 1 );
828 cube,
"buildDefaultMesh", 1, 8 );
831 assert(
doubleEq( linsize, 0.125 ) );
848 cout <<
"." << flush;
856 string name,
double len,
double dia,
double theta )
859 Id ret = shell->
doCreate(
"Compartment", parentObj, name, 1 );
862 if ( parentCompt !=
Id() ) {
865 shell->
doAddMsg(
"Single", parentCompt,
"raxial", ret,
"axial" );
870 double x = pax + len * cos( theta *
PI / 180.0 );
871 double y = pay + len * sin( theta *
PI / 180.0 );
883 Id makeSpine(
Id parentCompt,
Id parentObj,
unsigned int index,
884 double frac,
double len,
double dia,
double theta )
888 const double CM = 0.01;
889 assert( parentCompt !=
Id() );
899 ss <<
"shaft" << index;
900 string sname = ss.str();
902 ss2 <<
"head" << index;
903 string hname = ss2.str();
905 Id shaft = shell->
doCreate(
"Compartment", parentObj, sname, 1 );
907 shell->
doAddMsg(
"Single", parentCompt,
"raxial", shaft,
"axial" );
908 assert( !mid.
bad() );
909 double x = pax0 + frac * ( pax1 - pax0 );
910 double y = pay0 + frac * ( pay1 - pay0 );
911 double z = paz0 + frac * ( paz1 - paz0 );
915 double sy = y + len * cos( theta *
PI / 180.0 );
916 double sz = z + len * sin( theta *
PI / 180.0 );
922 double xa =
PI * dia * dia / 400.0;
923 double circumference =
PI * dia / 10.0;
928 Id head = shell->
doCreate(
"Compartment", parentObj, hname, 1 );
929 mid = shell->
doAddMsg(
"Single", shaft,
"raxial", head,
"axial" );
930 assert( !mid.
bad() );
934 double hy = sy + len * cos( theta *
PI / 180.0 );
935 double hz = sz + len * sin( theta *
PI / 180.0 );
941 xa =
PI * dia * dia / 4.0;
942 circumference =
PI * dia;
964 pair< unsigned int, unsigned int > buildBranchingCell(
965 Id cell,
double len,
double dia )
969 Id d1 =
makeCompt( soma, cell,
"d1", len , dia, 0 );
970 Id d2 =
makeCompt( soma, cell,
"d2", len , dia, 180 );
971 Id d1a =
makeCompt( d1, cell,
"d1a", len , dia, 0 );
972 Id d2a =
makeCompt( d2, cell,
"d2a", len , dia, 180 );
974 Id d11 =
makeCompt( d1a, cell,
"d11", len , dia, -45 );
975 Id d12 =
makeCompt( d1a, cell,
"d12", len , dia, 45 );
976 Id d21 =
makeCompt( d2a, cell,
"d21", len , dia, 45 );
977 Id d22 =
makeCompt( d2a, cell,
"d22", len , dia, -45 );
979 Id d111 =
makeCompt( d11, cell,
"d111", len , dia, -90 );
980 Id d112 =
makeCompt( d11, cell,
"d112", len , dia, 0 );
981 Id d121 =
makeCompt( d12, cell,
"d121", len , dia, 0 );
982 Id d122 =
makeCompt( d12, cell,
"d122", len , dia, 90 );
983 Id d211 =
makeCompt( d21, cell,
"d211", len , dia, 90 );
984 Id d212 =
makeCompt( d21, cell,
"d212", len , dia, 180 );
985 Id d221 =
makeCompt( d22, cell,
"d221", len , dia, 180 );
986 Id d222 =
makeCompt( d22, cell,
"d222", len , dia, -90 );
988 return pair< unsigned int, unsigned int >( 17, 161 );
993 double diffusionFunction(
double D,
double dx,
double x,
double t )
996 dx * (0.5 / sqrt(
PI * D * t ) ) * exp( -x * x / ( 4 * D * t ) );
999 void testNeuroMeshLinear()
1003 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1004 unsigned int numCompts = 500;
1006 double diffLength = 0.2e-6;
1007 double len = diffLength * numCompts;
1009 double totNum = 1e6;
1014 Id nm = shell->
doCreate(
"NeuroMesh",
Id(),
"neuromesh", 1 );
1021 assert( ndc == numCompts );
1022 const vector< NeuroNode >& nodes =
1025 assert( nodes.size() == 2 );
1026 assert( nodes[0].children().size() == 0 );
1031 vector< double > molNum( 1, 0 );
1033 vector< vector< double > > S( ndc, molNum );
1035 vector< double > diffConst( 1, D );
1036 vector< double > temp( 1, 0.0 );
1037 vector< vector< double > > flux( ndc, temp );
1041 const double adx = dia * dia *
PI * 0.25 / diffLength;
1042 for (
unsigned int i = 0; i < numCompts; ++i ) {
1043 const double* entry;
1044 const unsigned int* colIndex;
1045 unsigned int numAbut = mc->
getStencilRow( i, &entry, &colIndex );
1047 assert( numAbut == 1 );
1048 assert(
doubleEq( entry[0], adx ) );
1049 assert( colIndex[0] == 1 );
1050 }
else if ( i == numCompts - 1 ) {
1051 assert( numAbut == 1 );
1052 assert(
doubleEq( entry[0], adx ) );
1053 assert( colIndex[0] == numCompts - 2 );
1055 assert( numAbut == 2 );
1056 assert(
doubleEq( entry[0], adx ) );
1057 assert( colIndex[0] == i - 1 );
1058 assert(
doubleEq( entry[1], adx ) );
1059 assert( colIndex[1] == i + 1 );
1066 double near = mc->
nearest( diffLength * 27.5, diffLength / 10.0, 0, index );
1067 assert( index == 27 );
1068 assert(
doubleEq( near, diffLength / 10.0 ) );
1070 near = mc->
nearest( -10, 0, 0, index );
1071 assert( index == 0 );
1077 assert(
doubleEq( x, diffLength * 27.5 ) );
1084 cout <<
"." << flush;
1087 void testNeuroMeshBranching()
1091 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1094 double diffLength = 1e-6;
1096 double totNum = 1e6;
1100 pair< unsigned int, unsigned int > ret =
1101 buildBranchingCell( cell, len, dia );
1104 Id nm = shell->
doCreate(
"NeuroMesh",
Id(),
"neuromesh", 1 );
1109 assert( ns == ret.first );
1111 assert( ndc == ret.second );
1113 const vector< NeuroNode >& nodes = neuro-> getNodes();
1114 assert( nodes.size() == ns + 15 );
1130 assert( nodes[0].children().size() == 2 );
1131 assert( nodes[1].children().size() == 1 );
1132 assert( nodes[2].children().size() == 2 );
1133 assert( nodes[3].children().size() == 2 );
1134 assert( nodes[4].children().size() == 0 );
1135 assert( nodes[5].children().size() == 0 );
1136 assert( nodes[6].children().size() == 2 );
1137 assert( nodes[7].children().size() == 0 );
1138 assert( nodes[8].children().size() == 0 );
1140 assert( nodes[9].children().size() == 1 );
1141 assert( nodes[10].children().size() == 2 );
1142 assert( nodes[11].children().size() == 2 );
1143 assert( nodes[12].children().size() == 0 );
1144 assert( nodes[13].children().size() == 0 );
1145 assert( nodes[14].children().size() == 2 );
1146 assert( nodes[15].children().size() == 0 );
1147 assert( nodes[16].children().size() == 0 );
1150 vector< double > molNum( 1, 0 );
1152 vector< double > S( ndc, 0.0 );
1154 vector< double > flux( ndc, 0.0 );
1155 vector< double > vol( ndc, 0.0 );
1156 for (
unsigned int i = 0; i < ndc; ++i )
1159 assert(
doubleEq( vol[0], dia * dia * 0.25 *
PI * diffLength ) );
1160 assert(
doubleEq( vol[1], dia * dia * 0.125 *
PI * diffLength ) );
1163 for (
double t = 0; t < maxt; t += dt ) {
1164 flux.assign( ndc, 0.0 );
1166 for (
unsigned int i = 0; i < ndc; ++i ) {
1167 const double* entry;
1168 const unsigned int* colIndex;
1171 for (
unsigned int j = 0; j <
numEntries; ++j ) {
1172 unsigned int k = colIndex[j];
1173 double delta = ( S[k]/vol[k] - S[i]/vol[i] ) * entry[j];
1178 for (
unsigned int i = 0; i < ndc; ++i )
1179 S[i] += flux[i] * D * dt;
1182 for (
unsigned int i = 0; i < ndc; ++i ) {
1188 double x = 1.5 * diffLength;
1189 for (
unsigned int i = 1; i < 11; ++i ) {
1190 double y = totNum * diffusionFunction( D, diffLength, x, maxt );
1196 for (
double x = diffLength / 2.0 ; x < 10 * len; x += diffLength ) {
1199 double y = 2 * totNum * diffusionFunction( D, diffLength, x, maxt);
1213 double near = mc->
nearest( x, y, z + diffLength/10.0, index );
1214 assert( index == 60 );
1215 assert(
doubleEq( near, diffLength / 10.0 ) );
1217 near = mc->
nearest( -10, 0, 0, index );
1218 assert( index == 0 );
1221 vector< NeuroNode > nn =
dynamic_cast< NeuroMesh*
>( mc )->getNodes();
1222 assert( nn.size() == 32 );
1236 near = mc->
nearest( x, y, z, index );
1237 assert( index == 72 );
1240 for(
unsigned int i = 0; i < ndc; ++i ) {
1242 near = mc->
nearest( x, y, z + diffLength/10.0, index );
1243 assert( index == i );
1244 assert( near == diffLength / 10.0 );
1252 vector< double > coords( 9, 0.0 );
1264 vector< VoxelJunction > vj;
1268 for (
unsigned int i = 0; i < vj.size(); ++i ) {
1269 assert( vj[i].first == i );
1270 assert( vj[i].second == 0 );
1271 area += vj[i].diffScale;
1282 double a2 = dia * dia *
PI +
1283 4 * len * dia *
PI / sqrt( 2.0 ) +
1284 4 * len * dia *
PI / 2.0 +
1285 8 * len * dia *
PI / (2.0 * sqrt( 2.0 ) );
1295 cout <<
"." << flush;
1302 static const unsigned int ABUT = ~2;
1304 typedef pair< unsigned int, unsigned int >
PII;
1306 vector< PII >& intersect,
1307 unsigned int ix,
unsigned int iy,
unsigned int iz,
1308 unsigned int nx,
unsigned int ny,
unsigned int nz,
1309 unsigned int meshIndex );
1312 const vector< PII >& intersect,
1313 unsigned int ix,
unsigned int iy,
unsigned int iz,
1314 unsigned int nx,
unsigned int ny,
unsigned int nz,
1315 unsigned int meshIndex,
1316 vector< VoxelJunction >& ret );
1341 unsigned int nx = 5;
1342 unsigned int ny = 3;
1343 unsigned int nz = 1;
1344 vector< PII > intersect( nx * ny * nz,
PII(
1346 unsigned int meshIndex = 0;
1355 assert( intersect[0].first == 0 &&
1357 assert( intersect[1].first == 0 &&
1359 assert( intersect[2].first == 1 &&
1361 assert( intersect[3].first == 2 &&
1363 assert( intersect[4].first == 2 &&
1366 assert( intersect[5].first == 3 &&
1368 assert( intersect[6].first == 3 &&
1370 assert( intersect[7].first == 1 &&
1372 assert( intersect[8].first == 2 &&
1374 assert( intersect[9].first == EMPTY &&
1377 assert( intersect[10].first == 4 &&
1379 assert( intersect[11].first == 4 &&
1381 assert( intersect[12].first == 5 &&
1383 assert( intersect[13].first == 6 &&
1385 assert( intersect[14].first == 6 &&
1389 vector< VoxelJunction > ret;
1390 checkAbut( intersect, 0, 0, 0, nx, ny, nz, 1234, ret );
1391 assert( ret.size() == 1 );
1392 assert( ret[0].first == 0 && ret[0].second == 1234 );
1395 checkAbut( intersect, 1, 0, 0, nx, ny, nz, 1234, ret );
1396 checkAbut( intersect, 2, 0, 0, nx, ny, nz, 1234, ret );
1397 checkAbut( intersect, 3, 0, 0, nx, ny, nz, 1234, ret );
1398 checkAbut( intersect, 1, 1, 0, nx, ny, nz, 1234, ret );
1399 checkAbut( intersect, 4, 1, 0, nx, ny, nz, 1234, ret );
1400 checkAbut( intersect, 1, 2, 0, nx, ny, nz, 1234, ret );
1401 checkAbut( intersect, 2, 2, 0, nx, ny, nz, 1234, ret );
1402 checkAbut( intersect, 3, 2, 0, nx, ny, nz, 1234, ret );
1403 assert( ret.size() == 0 );
1404 checkAbut( intersect, 2, 1, 0, nx, ny, nz, 9999, ret );
1405 assert( ret.size() == 3 );
1406 assert( ret[0].first == 3 && ret[0].second == 9999 );
1407 assert( ret[1].first == 1 && ret[1].second == 9999 );
1408 assert( ret[2].first == 5 && ret[1].second == 9999 );
1410 checkAbut( intersect, 3, 1, 0, nx, ny, nz, 8888, ret );
1411 assert( ret.size() == 2 );
1412 assert( ret[0].first == 2 && ret[0].second == 8888 );
1413 assert( ret[1].first == 6 && ret[1].second == 8888 );
1415 checkAbut( intersect, 4, 0, 0, nx, ny, nz, 7777, ret );
1416 checkAbut( intersect, 0, 1, 0, nx, ny, nz, 6666, ret );
1417 checkAbut( intersect, 0, 2, 0, nx, ny, nz, 5555, ret );
1418 checkAbut( intersect, 4, 2, 0, nx, ny, nz, 4444, ret );
1419 assert( ret.size() == 4 );
1420 assert( ret[0].first == 2 && ret[0].second == 7777 );
1421 assert( ret[1].first == 3 && ret[1].second == 6666 );
1422 assert( ret[2].first == 4 && ret[2].second == 5555 );
1423 assert( ret[3].first == 6 && ret[3].second == 4444 );
1425 cout <<
"." << flush;
1431 vector< double > coords( 9, 0.0 );
1435 coords[6] = coords[7] = coords[8] = 1.0;
1439 const vector< unsigned int >& surface = cm.
surface();
1440 assert( surface.size() == 15 );
1441 for (
unsigned int i = 0; i < 15; ++i ) {
1442 assert( surface[i] == i );
1444 cout <<
"." << flush;
1449 cout <<
"." << flush;
1464 vector< double > coords( 9, 0.0 );
1468 coords[6] = coords[7] = coords[8] = 1.0;
1471 vector< unsigned int > surface = cm1.
surface();
1472 assert( surface.size() == 15 );
1481 coords[6] = coords[7] = coords[8] = 1.0;
1482 cm2.setPreserveNumEntries(
false );
1483 cm2.innerSetCoords( coords );
1484 const vector< unsigned int >& surface2 = cm2.surface();
1485 assert( surface2.size() == 10 );
1487 vector< VoxelJunction > ret;
1489 assert( ret.size() == 3 );
1491 assert( ret[0].first == 4 );
1492 assert( ret[0].second == 2 );
1493 assert( ret[1].first == 9 );
1494 assert( ret[1].second == 4 );
1495 assert( ret[2].first == 14 );
1496 assert( ret[2].second == 6 );
1513 assert( m2s.size() == 15 );
1517 assert( s2m.size() == 15 );
1520 surface.resize( 4 );
1530 m2s = cm2.getMeshToSpace();
1531 assert( m2s.size() == 10 );
1534 for (
unsigned int i = 1; i < 8; ++i )
1536 cm2.setMeshToSpace( m2s );
1538 s2m.resize( 10, ~0 );
1539 for (
unsigned int i = 0; i < 8; ++i )
1541 cm2.setSpaceToMesh( s2m );
1548 cm2.setSurface( surface );
1553 assert( ret.size() == 1 );
1554 assert( ret[0].first == 9 );
1555 assert( ret[0].second == 2 );
1557 cout <<
"." << flush;
1575 vector< double > coords( 9, 0.0 );
1579 coords[6] = coords[7] = coords[8] = 1.0;
1582 vector< unsigned int > surface = cm1.
surface();
1583 assert( surface.size() == 15 );
1595 cm2.setPreserveNumEntries(
false );
1596 cm2.innerSetCoords( coords );
1597 const vector< unsigned int >& surface2 = cm2.surface();
1598 assert( surface2.size() == 16 );
1600 vector< VoxelJunction > ret;
1602 assert( ret.size() == 6 );
1604 assert( ret[0].first == 4 );
1605 assert( ret[0].second == 2 );
1606 assert( ret[1].first == 4 );
1607 assert( ret[1].second == 4 );
1608 assert( ret[2].first == 9 );
1609 assert( ret[2].second == 6 );
1610 assert( ret[3].first == 9 );
1611 assert( ret[3].second == 8 );
1612 assert( ret[4].first == 14 );
1613 assert( ret[4].second == 10 );
1614 assert( ret[5].first == 14 );
1615 assert( ret[5].second == 12 );
1617 cout <<
"." << flush;
1622 cout <<
"." << flush;
1639 vector< double > coords( 9, 0.0 );
1643 coords[6] = coords[7] = coords[8] = 10e-6;
1646 vector< unsigned int > surface = A.
surface();
1647 assert( surface.size() == 1 );
1648 assert( surface[0] == 0 );
1651 coords[0] = -30e-6; coords[1] = 0; coords[2] = 0;
1652 coords[3] = 0; coords[4] = 10e-6; coords[5] = 10e-6;
1653 coords[6] = coords[7] = coords[8] = 10e-6;
1657 assert( surface.size() == 3 );
1658 assert( surface[0] == 0 );
1659 assert( surface[1] == 1 );
1660 assert( surface[2] == 2 );
1663 coords[0] = 0; coords[1] = 10e-6; coords[2] = 0;
1664 coords[3] = 10e-6; coords[4] = 30e-6; coords[5] = 10e-6;
1665 coords[6] = coords[7] = coords[8] = 10e-6;
1669 assert( surface.size() == 2 );
1670 assert( surface[0] == 0 );
1671 assert( surface[1] == 1 );
1674 coords[0] = -30e-6; coords[1] = -10e-6; coords[2] = 0;
1675 coords[3] = 20e-6; coords[4] = 0; coords[5] = 10e-6;
1676 coords[6] = coords[7] = coords[8] = 10e-6;
1680 assert( surface.size() == 5 );
1681 assert( surface[0] == 0 );
1682 assert( surface[1] == 1 );
1683 assert( surface[2] == 2 );
1684 assert( surface[3] == 3 );
1685 assert( surface[4] == 4 );
1688 cout <<
"." << flush;
1708 cout <<
"." << flush;
1712 void testSpineEntry()
1716 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1719 Id head =
makeCompt( neck, cell,
"head", 1e-6, 1e-6, 0 );
1723 assert( se.parent() == 1234 );
1724 assert( se.shaftId() == neck );
1725 assert( se.headId() == head );
1726 assert(
doubleEq( se.volume(), 1e-18 *
PI/4.0 ) );
1735 vector< VoxelJunction > vj;
1738 vector< double > coords( 9, 0.0 );
1750 se.matchCubeMeshEntriesToHead( &cube, 1234, 0.1, vj );
1751 assert( vj.size() == 1 );
1752 assert( vj[0].first == 1234 );
1753 assert( vj[0].second == 0 );
1754 assert(
doubleApprox( vj[0].diffScale * 1e10, 1e-12 *
PI * 1e10 ) );
1757 se.matchCubeMeshEntriesToPSD( &cube, 4321, 0.1, vj );
1758 assert( vj.size() == 1 );
1759 assert( vj[0].first == 4321 );
1760 assert( vj[0].second == 0 );
1761 assert(
doubleApprox( vj[0].diffScale * 1e10, 1e-12 *
PI * 0.25 * 1e10 ) );
1765 cout <<
"." << flush;
1768 void testSpineAndPsdMesh()
1772 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1773 unsigned int numCompts = 500;
1775 double diffLength = 0.5e-6;
1776 double len = diffLength * numCompts;
1777 unsigned int numSpines = 10;
1781 Id dend =
makeCompt( soma, cell,
"dend", len, dia, 0 );
1783 for (
unsigned int i = 0; i < numSpines; ++i ) {
1784 double frac = i /
static_cast< double >( numSpines );
1785 makeSpine( dend, cell, i, frac, 1.0e-6, 1.0e-6, i * 30.0 );
1788 Id nm = shell->
doCreate(
"NeuroMesh",
Id(),
"neuromesh", 1 );
1792 Id sm = shell->
doCreate(
"SpineMesh",
Id(),
"spinemesh", 1 );
1794 "OneToOne", nm,
"spineListOut", sm,
"spineList" );
1795 assert( !mid.
bad() );
1796 Id pm = shell->
doCreate(
"PsdMesh",
Id(),
"psdmesh", 1 );
1798 "OneToOne", nm,
"psdListOut", pm,
"psdList" );
1799 assert( !mid.
bad() );
1804 assert( ndc == numCompts + floor( dia / diffLength + 0.5 ) );
1807 assert( sdc == numSpines );
1812 for (
unsigned int i = 0; i < sdc; ++i ) {
1813 assert( s->
spines()[i].parent() == 40 + i * numCompts/numSpines );
1815 double x = i * diffLength * numCompts/numSpines;
1816 unsigned int index = 0;
1818 assert( index == i );
1822 vector< VoxelJunction > ret;
1825 assert( ret.size() == numSpines );
1826 for (
unsigned int i = 0; i < numSpines; ++i ) {
1827 assert( ret[i].first == i );
1828 assert( ret[i].second == s->
spines()[i].parent() );
1829 assert(
doubleEq( ret[i].diffScale,
PI * 0.25e-14 / 1.5e-6 ) );
1835 vector< double > coords( 9, 0.0 );
1836 coords[0] = -len/2.0 - 1.2e-5;
1840 coords[3] = len * 2.0 - 1.2e-5;
1849 assert( ret.size() == numSpines );
1850 for (
unsigned int i = 0; i < ret.size(); ++i ) {
1851 assert( ret[i].first == i );
1852 unsigned int cubeIndex = i + 5;
1853 assert( ret[i].second == cubeIndex );
1854 assert(
doubleApprox( ret[i].diffScale * 1e10,
PI * 1e-12 * 1e10 ) );
1864 Id pe( pm.value() + 1 );
1865 assert( pdc == numSpines );
1867 for (
unsigned int i = 0; i < pdc; ++i ) {
1868 assert( p->
parent( i ) == i );
1871 assert(
doubleEq( area, 1e-12 * 0.25 *
PI ) );
1874 double x = i * diffLength * numCompts/numSpines;
1875 unsigned int index = 0;
1877 assert( index == i );
1881 assert( ret.size() == numSpines );
1882 for (
unsigned int i = 0; i < ret.size(); ++i ) {
1883 assert( ret[i].first == i );
1884 assert( ret[i].second == i );
1886 1e10 * 0.25 *
PI * 1e-12 / 0.5e-6 ) );
1890 assert( ret.size() == numSpines );
1891 for (
unsigned int i = 0; i < ret.size(); ++i ) {
1892 assert( ret[i].first == i );
1893 unsigned int cubeIndex = i + 5;
1894 assert( ret[i].second == cubeIndex );
1895 assert(
doubleApprox( ret[i].diffScale * 1e10, 0.25 *
PI * 1e-12 * 1e10 ) );
1903 cout <<
"." << flush;
1906 #include "../shell/Wildcard.h"
1907 void testNeuroNodeTree()
1911 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1915 buildBranchingCell( cell, len, dia );
1917 vector< NeuroNode > nodes;
1921 assert( nodes.size() == 17 );
1924 assert( nodes[i++].elecCompt().element()->getName() ==
"soma" );
1925 assert( nodes[i++].elecCompt().element()->getName() ==
"d1" );
1926 assert( nodes[i++].elecCompt().element()->getName() ==
"d1a" );
1927 assert( nodes[i++].elecCompt().element()->getName() ==
"d11" );
1928 assert( nodes[i++].elecCompt().element()->getName() ==
"d111" );
1929 assert( nodes[i++].elecCompt().element()->getName() ==
"d112" );
1930 assert( nodes[i++].elecCompt().element()->getName() ==
"d12" );
1931 assert( nodes[i++].elecCompt().element()->getName() ==
"d121" );
1932 assert( nodes[i++].elecCompt().element()->getName() ==
"d122" );
1934 assert( nodes[i++].elecCompt().element()->getName() ==
"d2" );
1935 assert( nodes[i++].elecCompt().element()->getName() ==
"d2a" );
1936 assert( nodes[i++].elecCompt().element()->getName() ==
"d21" );
1937 assert( nodes[i++].elecCompt().element()->getName() ==
"d211" );
1938 assert( nodes[i++].elecCompt().element()->getName() ==
"d212" );
1939 assert( nodes[i++].elecCompt().element()->getName() ==
"d22" );
1940 assert( nodes[i++].elecCompt().element()->getName() ==
"d221" );
1941 assert( nodes[i++].elecCompt().element()->getName() ==
"d222" );
1956 cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
1957 vector< Id > compt( 10 );
1958 for (
unsigned int i = 0; i < compt.size(); ++i ) {
1961 string name = ss.str();
1962 compt[i] = shell->
doCreate(
"SymCompartment", cell, name, 1 );
1963 double dia = 50.0 - (i - 3) * (i - 3 );
1966 shell->
doAddMsg(
"Single", compt[0],
"proximal", compt[1],
"distal" );
1967 shell->
doAddMsg(
"Single", compt[1],
"proximal", compt[2],
"distal" );
1968 shell->
doAddMsg(
"Single", compt[2],
"distal", compt[3],
"proximal" );
1969 shell->
doAddMsg(
"Single", compt[3],
"sibling", compt[2],
"sibling" );
1970 shell->
doAddMsg(
"Single", compt[3],
"sphere", compt[4],
"proximalOnly" );
1971 shell->
doAddMsg(
"Single", compt[4],
"distal", compt[5],
"proximal" );
1972 shell->
doAddMsg(
"Single", compt[4],
"distal", compt[6],
"proximal" );
1973 shell->
doAddMsg(
"Single", compt[4],
"axial", compt[7],
"raxial" );
1974 shell->
doAddMsg(
"Single", compt[7],
"cylinder", compt[8],
"proximalOnly" );
1975 shell->
doAddMsg(
"Single", compt[7],
"cylinder", compt[9],
"proximalOnly" );
1976 shell->
doAddMsg(
"Single", compt[9],
"proximal", compt[0],
"distal" );
1982 assert( nodes.size() == 10 );
1985 assert( nodes[i++].elecCompt().element()->getName() ==
"compt3" );
1986 assert( nodes[i++].elecCompt().element()->getName() ==
"compt2" );
1987 assert( nodes[i++].elecCompt().element()->getName() ==
"compt1" );
1988 assert( nodes[i++].elecCompt().element()->getName() ==
"compt0" );
1989 assert( nodes[i++].elecCompt().element()->getName() ==
"compt9" );
1990 assert( nodes[i++].elecCompt().element()->getName() ==
"compt7" );
1991 assert( nodes[i++].elecCompt().element()->getName() ==
"compt8" );
1992 assert( nodes[i++].elecCompt().element()->getName() ==
"compt4" );
1993 assert( nodes[i++].elecCompt().element()->getName() ==
"compt5" );
1994 assert( nodes[i++].elecCompt().element()->getName() ==
"compt6" );
2002 assert( nodes.size() == 10 );
2004 assert( nodes[i++].elecCompt().element()->getName() ==
"compt5" );
2005 assert( nodes[i++].elecCompt().element()->getName() ==
"compt4" );
2006 assert( nodes[i++].elecCompt().element()->getName() ==
"compt3" );
2007 assert( nodes[i++].elecCompt().element()->getName() ==
"compt2" );
2008 assert( nodes[i++].elecCompt().element()->getName() ==
"compt1" );
2009 assert( nodes[i++].elecCompt().element()->getName() ==
"compt0" );
2010 assert( nodes[i++].elecCompt().element()->getName() ==
"compt9" );
2011 assert( nodes[i++].elecCompt().element()->getName() ==
"compt7" );
2012 assert( nodes[i++].elecCompt().element()->getName() ==
"compt8" );
2013 assert( nodes[i++].elecCompt().element()->getName() ==
"compt6" );
2018 cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
2019 vector< Id > dend( 10 );
2020 vector< Id > neck( 10 );
2021 vector< Id > head( 10 );
2022 for (
unsigned int i = 0; i < neck.size(); ++i ) {
2025 string name = ss.str();
2026 dend[i] = shell->
doCreate(
"SymCompartment", cell, name, 1 );
2031 neck[i] = shell->
doCreate(
"SymCompartment", cell, name, 1 );
2036 head[i] = shell->
doCreate(
"SymCompartment", cell, name, 1 );
2039 for (
unsigned int i = 0; i < neck.size(); ++i ) {
2042 shell->
doAddMsg(
"Single", dend[i],
"proximal",
2043 dend[ (i-1)],
"distal" );
2044 shell->
doAddMsg(
"Single", neck[i],
"proximalOnly",
2045 dend[ (i+7) % head.size()],
"cylinder" );
2046 shell->
doAddMsg(
"Single", neck[i],
"distal",
2047 head[ (i+4) % neck.size() ],
"proximal" );
2053 assert( nodes.size() == 30 );
2054 vector< NeuroNode > orig = nodes;
2055 vector< Id > shaftId;
2056 vector< Id > headId;
2057 vector< unsigned int > parent;
2059 assert( nodes.size() == 10 );
2073 for (
unsigned int i = 0; i < parent.size(); ++i ) {
2074 unsigned int j = (shaftId[i].value() - neck[0].
value())/3;
2075 assert( parent[i] == (j+7) % 10 );
2076 unsigned int k = (headId[i].value() - head[0].
value())/3;
2077 assert( k == (j+4) % 10 );
2081 cout <<
"." << flush;
2084 void testCellPortion()
2088 Id cell = shell->
doCreate(
"Neutral",
Id(),
"cell", 1 );
2089 unsigned int numCompts = 50;
2091 double diffLength = 0.5e-6;
2092 double len = diffLength * numCompts;
2093 unsigned int numSpines = 10;
2094 unsigned int numSpines2 = 25;
2098 Id dend0 =
makeCompt( soma, cell,
"dend0", len, dia, 0 );
2099 Id dend1 =
makeCompt( dend0, cell,
"dend1", len, dia, 0 );
2100 Id dend2 =
makeCompt( dend1, cell,
"dend2", len, dia, 0 );
2102 for (
unsigned int i = 0; i < numSpines; ++i ) {
2103 double frac = i /
static_cast< double >( numSpines );
2104 makeSpine( dend1, cell, i, frac, 1.0e-6, 1.0e-6, i * 30.0 );
2106 for (
unsigned int i = 0; i < numSpines2; ++i ) {
2107 double frac = i /
static_cast< double >( numSpines2 );
2108 makeSpine( dend2, cell, i + numSpines, frac, 1.0e-6, 1.0e-6, i * 30.0 );
2111 Id nm = shell->
doCreate(
"NeuroMesh",
Id(),
"neuromesh", 1 );
2115 Id sm = shell->
doCreate(
"SpineMesh",
Id(),
"spinemesh", 1 );
2117 "OneToOne", nm,
"spineListOut", sm,
"spineList" );
2118 assert( !mid.
bad() );
2119 Id pm = shell->
doCreate(
"PsdMesh",
Id(),
"psdmesh", 1 );
2121 "OneToOne", nm,
"psdListOut", pm,
"psdList" );
2122 assert( !mid.
bad() );
2124 SetGet2< Id, string >::set( nm,
"cellPortion", cell,
"/cell/dend1,/cell/dend2,/cell/shaft1?,/cell/head1?,/cell/shaft3,cell/head3" );
2128 assert( ndc == numCompts * 2 );
2131 assert( sdc == 11 );
2134 cout <<
"." << flush;
int wildcardFind(const string &path, vector< ObjId > &ret)
double getMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry.
vector< double > getDiffusionArea(unsigned int fid) const
Virtual function to return diffusion X-section area.
double nearest(double x, double y, double z, unsigned int &index) const
unsigned int getStencilRow(unsigned int meshIndex, const double **entry, const unsigned int **colIndex) const
unsigned int getNx() const
virtual double nearest(double x, double y, double z, unsigned int &index) const =0
unsigned int getNz() const
Id makeCompt(Id parentCompt, Id parentObj, string name, double len, double dia, double theta)
static const unsigned int ABUT
double getY0(const Eref &e) const
unsigned int parent(unsigned int index) const
vector< double > getCoordinates(unsigned int fid) const
Virtual function to return coords of mesh Entry.
unsigned int getMeshType(unsigned int fid) const
Virtual function to return MeshType of specified entry.
vector< unsigned int > getNeighbors(unsigned int fid) const
Looks up stencil to return vector of indices of coupled voxels.
unsigned int value() const
pair< unsigned int, unsigned int > PII
void setIntersectVoxel(vector< PII > &intersect, unsigned int ix, unsigned int iy, unsigned int iz, unsigned int nx, unsigned int ny, unsigned int nz, unsigned int meshIndex)
static void filterSpines(vector< NeuroNode > &nodes, vector< Id > &shaftId, vector< Id > &headId, vector< unsigned int > &parent)
static void buildTree(vector< NeuroNode > &nodes, vector< ObjId > elist)
void testCubeMeshFillThreeDimSurface()
vector< double > getCoords(const Eref &e) const
void setDiffLength(const Eref &e, double v)
static const unsigned int EMPTY
void indexToSpace(unsigned int index, double &x, double &y, double &z) const
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
void setY1(const Eref &e, double v)
vector< double > getCoords(const Eref &e) const
void matchCubeMeshEntries(const CubeMesh *other, vector< VoxelJunction > &ret) const
const vector< SpineEntry > & spines() const
static bool set(const ObjId &dest, const string &field, A arg)
unsigned int getNy() const
void innerSetCoords(const vector< double > &v)
Id doCreate(string type, ObjId parent, string name, unsigned int numData, NodePolicy nodePolicy=MooseBlockBalance, unsigned int preferredNode=1)
Vec crossProduct(const Vec &other) const
const vector< unsigned int > & surface() const
Utility and test function to read surface.
static const unsigned int MULTI
void testCubeMeshJunctionTwoDimSurface()
void testCubeMeshJunctionThreeDimSurface()
void setSpaceToMesh(vector< unsigned int > v)
unsigned int getNumEntries() const
bool doubleApprox(double x, double y)
double getTotLength() const
unsigned int getDimensions() const
unsigned int innerGetNumEntries() const
double getX1(const Eref &e) const
unsigned int getMeshDimensions(unsigned int fid) const
Virtual function to return dimensions of specified entry.
bool doubleEq(double x, double y)
void setZ0(const Eref &e, double v)
double getMeshEntryVolume(unsigned int fid) const
Virtual function to return volume of mesh Entry.
vector< unsigned int > getMeshToSpace() const
void setX0(const Eref &e, double v)
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
void setX1(const Eref &e, double v)
void setMeshToSpace(vector< unsigned int > v)
double getR1(const Eref &e) const
vector< unsigned int > getSpaceToMesh() const
virtual unsigned int innerGetNumEntries() const =0
void setR0(const Eref &e, double v)
unsigned int getMeshType(unsigned int fid) const
Virtual function to return MeshType of specified entry.
virtual void indexToSpace(unsigned int index, double &x, double &y, double &z) const =0
static const unsigned int SURFACE
static const unsigned int MULTI
void checkAbut(const vector< PII > &intersect, unsigned int ix, unsigned int iy, unsigned int iz, unsigned int nx, unsigned int ny, unsigned int nz, unsigned int meshIndex, vector< VoxelJunction > &ret)
double getR0(const Eref &e) const
static const unsigned int SURFACE
double getZ0(const Eref &e) const
double dotProduct(const Vec &other) const
void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const
void extendStencil(const ChemCompt *other, const vector< VoxelJunction > &vj)
Add boundary voxels to stencil for cross-solver junctions.
double nearest(double x, double y, double z, unsigned int &index) const
double getY1(const Eref &e) const
void testIntersectVoxel()
void setR1(const Eref &e, double v)
void matchCubeMeshEntries(const CubeMesh *other, vector< VoxelJunction > &ret) const
void testCubeMeshFillTwoDimSurface()
double getX0(const Eref &e) const
ObjId doAddMsg(const string &msgType, ObjId src, const string &srcField, ObjId dest, const string &destField)
void testCubeMeshJunctionDiffSizeMesh()
static const unsigned int EMPTY
virtual void matchMeshEntries(const ChemCompt *other, vector< VoxelJunction > &ret) const =0
void orthogonalAxes(Vec &u, Vec &v) const
Generates vectors u and v to form a mutually orthogonal system.
void setY0(const Eref &e, double v)
void setZ1(const Eref &e, double v)
double getDiffLength(const Eref &e) const
static A get(const ObjId &dest, const string &field)
void setPreserveNumEntries(bool v)
void testCubeMeshMultiJunctionTwoD()
static const unsigned int ABUTX
unsigned int getMeshDimensions(unsigned int fid) const
Virtual function to return dimensions of specified entry.
unsigned int numDims() const
Utility function for returning # of dimensions in mesh.
void setSurface(vector< unsigned int > v)
void testCubeMeshExtendStencil()
double getZ1(const Eref &e) const
unsigned int innerGetNumEntries() const
double selectGridVolume(double h) const
void innerSetCoords(const Eref &e, const vector< double > &v)
static bool set(const ObjId &dest, const string &field, A1 arg1, A2 arg2)