@@ -636,7 +636,7 @@ void SpatialModel::generate(unsigned niter)
636636unsigned SpatialModel::migrate ()
637637{
638638 /* each cell gets a distinct random salt value */
639- hostForAll ([=,this ](EcolabCell& c) {c.salt =c.rand ();});
639+ hostForAll ([=,this ](EcolabCell& c) {c.salt =Float ( c.rand ()-c. rand . min ())/(c. rand . max ()-c. rand . min () );});
640640
641641 prepareNeighbours ();
642642
@@ -660,37 +660,36 @@ unsigned SpatialModel::migrate()
660660 auto & nbr=*n->as <EcolabCell>();
661661 Float salt=c.id <nbr.id ? c.salt : nbr.salt ;
662662 array<Float> m=(tstep-last_mig_tstep) * migration * (nbr.density - c.density );
663- delta[c.idx ()]+=m + array<Float>((m!=0.0 )*(2 *(m>0.0 )-1 )) * salt;
663+ delta[c.idx ()]+=m+ array<Float>((m!=0.0 )*(2 *(m>0.0 )-1 )) * salt;
664664 }
665665 });
666666
667667 array<int > ssum (species.size (),0 );
668668 size_t totalMigration=0 ;
669669 hostForAll ([&,this ](EcolabCell& c) {
670- // // adjust delta so that density remains +ve
671- // array<int> adjust=delta[c.idx()]+c.density;
672- // adjust*=-(adjust<0);
673- // if (sum(adjust)>0)
674- // {
675- // // distribute adjust among neighbours
676- // array<int> totalDiff(c.density.size(),0);
677- // for (auto& n: c)
678- // {
679- // auto& nbr=*n->as<EcolabCell>();
680- // totalDiff+=nbr.density-c.density;
681- // }
682- // // adjust adjust to be divisible by totalDiff
683- // adjust-=adjust%totalDiff;
684- // for (auto& n: c)
685- // {
686- // auto& nbr=*n->as<EcolabCell>();
687- // delta[nbr.idx()]+=((nbr.density-c.density)/totalDiff)*adjust;
688- // }
689- // delta[c.idx()]-=adjust;
690- // }
691-
692- // c.density+=delta[c.idx()];
693- cout<<delta[c.idx ()]<<endl;
670+ // adjust delta so that density remains +ve
671+ array<int > adjust=delta[c.idx ()]+c.density ;
672+ adjust*=-(adjust<0 );
673+ if (sum (adjust)>0 )
674+ {
675+ // distribute adjust among neighbours
676+ array<int > totalDiff (c.density .size (),0 );
677+ for (auto & n: c)
678+ {
679+ auto & nbr=*n->as <EcolabCell>();
680+ totalDiff+=nbr.density -c.density ;
681+ }
682+ // adjust adjust to be divisible by totalDiff
683+ adjust-=adjust%totalDiff;
684+ for (auto & n: c)
685+ {
686+ auto & nbr=*n->as <EcolabCell>();
687+ delta[nbr.idx ()]+=((nbr.density -c.density )/totalDiff)*adjust;
688+ }
689+ delta[c.idx ()]-=adjust;
690+ }
691+
692+ c.density +=delta[c.idx ()];
694693 totalMigration+=sum (abs (delta[c.idx ()]));
695694#if !defined(NDEBUG)
696695#pragma omp critical
0 commit comments