00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <CompuCell3D/Potts3D/CellInventory.h>
00026 #include <CompuCell3D/Automaton/Automaton.h>
00027 #include <CompuCell3D/Boundary/BoundaryStrategy.h>
00028 #include <CompuCell3D/Field3D/Field3D.h>
00029 #include <CompuCell3D/Field3D/WatchableField3D.h>
00030
00031 #include <CompuCell3D/Simulator.h>
00032 #include <CompuCell3D/Potts3D/Cell.h>
00033 #include <CompuCell3D/Potts3D/Potts3D.h>
00034 #include <CompuCell3D/Field3D/Point3D.h>
00035 #include <CompuCell3D/Field3D/Dim3D.h>
00036 using namespace CompuCell3D;
00037
00038
00039 #include <BasicUtils/BasicString.h>
00040 #include <BasicUtils/BasicException.h>
00041
00042 #include <BasicUtils/BasicRandomNumberGenerator.h>
00043 #include <PublicUtilities/StringUtils.h>
00044
00045 #include <string>
00046
00047 using namespace std;
00048 #define EXP_STL
00049 #include "UniformFieldInitializer.h"
00050
00051 UniformFieldInitializer::UniformFieldInitializer() :
00052 potts(0) {}
00053
00054
00055 void UniformFieldInitializer::init(Simulator *simulator, CC3DXMLElement * _xmlData){
00056
00057 potts = simulator->getPotts();
00058 WatchableField3D<CellG *> *cellFieldG = (WatchableField3D<CellG *> *)potts->getCellFieldG();
00059 ASSERT_OR_THROW("initField() Cell field G cannot be null!", cellFieldG);
00060 Dim3D dim = cellFieldG->getDim();
00061
00062
00063 oldStyleInitData.boxMin=Dim3D(0,0,0);
00064 oldStyleInitData.boxMax=dim;
00065
00066 if(_xmlData->getFirstElement("RangeBox")){
00067 oldStyleInitData.boxMax.x=_xmlData->getFirstElement("RangeBox")->getAttributeAsUInt("x");
00068 oldStyleInitData.boxMax.y=_xmlData->getFirstElement("RangeBox")->getAttributeAsUInt("y");
00069 oldStyleInitData.boxMax.z=_xmlData->getFirstElement("RangeBox")->getAttributeAsUInt("z");
00070 if (oldStyleInitData.boxMax.x > dim.x || oldStyleInitData.boxMax.y > dim.y || oldStyleInitData.boxMax.z > dim.z )
00071 oldStyleInitData.boxMax=dim;
00072 }
00073
00074 if(_xmlData->getFirstElement("Width")){
00075 oldStyleInitData.width=_xmlData->getFirstElement("Width")->getUInt();
00076
00077 }
00078 if(_xmlData->getFirstElement("Gap")){
00079 oldStyleInitData.gap=_xmlData->getFirstElement("Gap")->getUInt();
00080
00081 }
00082
00083
00084
00085
00086 initDataVec.clear();
00087
00088 CC3DXMLElementList regionVec=_xmlData->getElements("Region");
00089
00090 for (int i = 0 ; i<regionVec.size(); ++i){
00091 UniformFieldInitializerData initData;
00092
00093 if(regionVec[i]->findElement("Gap"))
00094 initData.gap=regionVec[i]->getFirstElement("Gap")->getUInt();
00095 if(regionVec[i]->findElement("Width"))
00096 initData.width=regionVec[i]->getFirstElement("Width")->getUInt();
00097 if(regionVec[i]->findElement("Types")){
00098 initData.typeNamesString=regionVec[i]->getFirstElement("Types")->getText();
00099 parseStringIntoList(initData.typeNamesString , initData.typeNames , ",");
00100 }
00101 if(regionVec[i]->findElement("BoxMax")){
00102 initData.boxMax.x=regionVec[i]->getFirstElement("BoxMax")->getAttributeAsUInt("x");
00103 initData.boxMax.y=regionVec[i]->getFirstElement("BoxMax")->getAttributeAsUInt("y");
00104 initData.boxMax.z=regionVec[i]->getFirstElement("BoxMax")->getAttributeAsUInt("z");
00105 }
00106
00107 if(regionVec[i]->findElement("BoxMin")){
00108 initData.boxMin.x=regionVec[i]->getFirstElement("BoxMin")->getAttributeAsUInt("x");
00109 initData.boxMin.y=regionVec[i]->getFirstElement("BoxMin")->getAttributeAsUInt("y");
00110 initData.boxMin.z=regionVec[i]->getFirstElement("BoxMin")->getAttributeAsUInt("z");
00111 }
00112
00113
00114 initDataVec.push_back(initData);
00115 }
00116
00117
00118 }
00119 void UniformFieldInitializer::layOutCells(const UniformFieldInitializerData & _initData){
00120
00121 int size = _initData.gap + _initData.width;
00122 int cellWidth=_initData.width;
00123
00124 WatchableField3D<CellG *> *cellField = (WatchableField3D<CellG *> *)potts->getCellFieldG();
00125 ASSERT_OR_THROW("initField() Cell field cannot be null!", cellField);
00126
00127 Dim3D dim = cellField->getDim();
00128 Point3D boxDim=_initData.boxMax-_initData.boxMin;
00129 cerr<<" _initData.boxMin "<<_initData.boxMin<<" _initData.boxMax="<<_initData.boxMax<<" dim="<<dim<<endl;
00130
00131 ASSERT_OR_THROW(" BOX DOES NOT FIT INTO LATTICE ",
00132 _initData.boxMin.x>=0 && _initData.boxMin.y>=0 && _initData.boxMin.z>=0
00133 && _initData.boxMax.x<=dim.x
00134 && _initData.boxMax.y<=dim.y
00135 && _initData.boxMax.z<=dim.z
00136 );
00137
00138
00139
00140
00141
00142
00143
00144 Dim3D itDim;
00145
00146 itDim.x = boxDim.x / size;
00147 if (boxDim.x % size) itDim.x += 1;
00148 itDim.y = boxDim.y / size;
00149 if (boxDim.y % size) itDim.y += 1;
00150 itDim.z = boxDim.z / size;
00151 if (boxDim.z % size) itDim.z += 1;
00152
00153 cerr<<"itDim="<<itDim<<endl;
00154 Point3D pt;
00155 Point3D cellPt;
00156 CellG *cell;
00157
00158
00159
00160 for (int z = 0; z < itDim.z; z++)
00161 for (int y = 0; y < itDim.y; y++)
00162 for (int x = 0; x < itDim.x; x++) {
00163 pt.x = _initData.boxMin.x + x * size;
00164 pt.y = _initData.boxMin.y + y * size;
00165 pt.z = _initData.boxMin.z + z * size;
00166
00167
00168 if (BoundaryStrategy::getInstance()->isValid(pt)){
00169 cell = potts->createCellG(pt);
00170 cell->type=initCellType(_initData);
00171 }
00172 else{
00173 continue;
00174 }
00175
00176 for (cellPt.z = pt.z; cellPt.z < pt.z + cellWidth &&
00177 cellPt.z < dim.z; cellPt.z++)
00178 for (cellPt.y = pt.y; cellPt.y < pt.y + cellWidth &&
00179 cellPt.y < dim.y; cellPt.y++)
00180 for (cellPt.x = pt.x; cellPt.x < pt.x + cellWidth &&
00181 cellPt.x < dim.x; cellPt.x++){
00182
00183 if (BoundaryStrategy::getInstance()->isValid(pt))
00184 cellField->set(cellPt, cell);
00185
00186 }
00187 }
00188
00189
00190 }
00191
00192 unsigned char UniformFieldInitializer::initCellType(const UniformFieldInitializerData & _initData){
00193 Automaton * automaton=potts->getAutomaton();
00194 if(_initData.typeNames.size()==0){
00195 return 1;
00196 }
00197
00198 else{
00199 BasicRandomNumberGenerator * randGen=BasicRandomNumberGenerator::getInstance();
00200 int index = randGen->getInteger(0, _initData.typeNames.size()-1);
00201
00202 cerr<<"automaton="<<automaton<<endl;
00203 cerr<<"index="<<index<<" _initData.typeNames.size()="<<_initData.typeNames.size()<<endl;
00204
00205 return automaton->getTypeId(_initData.typeNames[index]);
00206 }
00207
00208 }
00209
00210 void UniformFieldInitializer::start() {
00211 cerr<<"INSIDE START"<<endl;
00212
00213 WatchableField3D<CellG *> *cellField =(WatchableField3D<CellG *> *) potts->getCellFieldG();
00214 ASSERT_OR_THROW("initField() Cell field cannot be null!", cellField);
00215 Dim3D dim = cellField->getDim();
00216
00217
00218
00219
00220 if(initDataVec.size()!=0){
00221 for (int i = 0 ; i < initDataVec.size(); ++i){
00222
00223 layOutCells(initDataVec[i]);
00224
00225 }
00226 }else{
00227 layOutCells(oldStyleInitData);
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 }
00290
00291
00292
00293 void UniformFieldInitializer::initializeCellTypes(){
00294 BasicRandomNumberGenerator *rand = BasicRandomNumberGenerator::getInstance();
00295
00296 cellInventoryPtr=& potts->getCellInventory();
00297
00299 CellInventory::cellInventoryIterator cInvItr;
00301 Point3D com;
00302 CellG * cell;
00303
00304
00305 float x,y,z;
00306
00307 for(cInvItr=cellInventoryPtr->cellInventoryBegin() ; cInvItr !=cellInventoryPtr->cellInventoryEnd() ;++cInvItr ){
00308
00309 cell=*cInvItr;
00311 x = cell->xCM / (float)cell->volume;
00312 y = cell->yCM / (float)cell->volume;
00313 z = cell->zCM / (float)cell->volume;
00314 cell->type=rand->getInteger(0,1)+1;
00315 cell->type=1;
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 }
00332 }
00333
00334 std::string UniformFieldInitializer::steerableName(){
00335 return toString();
00336 }
00337
00338 std::string UniformFieldInitializer::toString(){
00339 return "UniformInitializer";
00340 }
00341
00342
00343
00344
00345