void SpecialAgentAccumulateDataAction::fire(Data *d) { // cerr << "# inside specialAgentAccumulatedata" << endl; if (this->agent == NULL) throw HiveException("action was not assigned to an agent", "SpecialAgentAccumulateDataAction::fire(Data *d)"); if (d->getType().compare("tvectordata_double")!=0) throw HiveException("wrong data passed to action", "SpecialAgentAccumulateDataAction::fire(Data *d)"); // cerr << "INSIDE SPECIALAGENT FIRE" << endl; // convert data argument into correct format TVectorData<double> *c = (TVectorData<double> *) d; // get the databases from the agent ... do we really need the meta database ?! not really // one could do without ... i just thought it would be funny to have a meta database in a special agent // called fox mulder ... but i guess that we should remove this ... Database *meta = ((SpecialAgent *) agent)->getMetaDatabase(); Database *db = agent->getDatabase(); // get some meta information IntegerData *num_adds = (IntegerData* ) meta->getDataItem("number_of_adds"); IntegerData *num_cells = (IntegerData* ) meta->getDataItem("total_number_of_cells"); IntegerData *num_time_steps_between_outputs = (IntegerData* ) meta->getDataItem("number_between_outputs"); IntegerData *counter = (IntegerData* ) meta->getDataItem("counter"); // accumulate the data if (num_adds->getInteger() == 0) { // fill data TVectorData<double> *conc = (TVectorData<double> *) db->getDataItem("total_conc"); for (int i=1; i<c->size(); i++) conc->at(i-1) = c->at(i); } else { TVectorData<double> *conc = (TVectorData<double>*) db->getDataItem("total_conc"); for (int i=1; i<c->size(); i++) conc->at(i-1) = conc->at(i-1) + c->at(i); } num_adds->setInteger(num_adds->getInteger()+1); // check whether output has to be generated if (num_adds->getInteger() == num_cells->getInteger() && counter->getInteger() == num_time_steps_between_outputs->getInteger()-1) { // cerr << "JETZT BIN ICH HIER DIRIN UND SOLLTE ETWAS AUSGEBEN!!!" << endl; TVectorData<double> *conc = (TVectorData<double>*) db->getDataItem("total_conc"); DoubleData *gt = (DoubleData* ) meta->getDataItem("global_time"); DoubleData *dt = (DoubleData* ) meta->getDataItem("time_step"); // output time; *this->out << setw(12) << setfill(' ') << gt->getDouble()*num_time_steps_between_outputs->getInteger(); // update time gt->setDouble(gt->getDouble() + dt->getDouble()); // output conc vector for (int i=0; i<conc->size(); i++) *this->out << setw(12) << setfill(' ') << conc->at(i)/num_cells->getInteger(); *this->out << endl; // reset num_adds num_adds->setInteger(0); // reset counter counter->setInteger(0); } else if (num_adds->getInteger() == num_cells->getInteger()){ // cerr << "hier drin" << endl; num_adds->setInteger(0); counter->setInteger(counter->getInteger()+1); } }
void MassBalance::step(double dt) { IntegerVectorData* agBoundaryIndecies = (IntegerVectorData*)this->getDataFromAgent(this->boundaryIndecies); DoubleVectorData* agBoundaryArray = (DoubleVectorData*)this->getDataFromAgent(this->boundaryArray); DoubleVectorData* agSubstrateConcentrationArray = (DoubleVectorData*)this->getDataFromAgent(this->substrateConcentrationArray); DoubleData* agCellVolume = (DoubleData*)this->getDataFromAgent(this->cellVolume); for (int i=0; i < agBoundaryIndecies->getNumElements(); i++) { double conc = agSubstrateConcentrationArray->getDouble(agBoundaryIndecies->getInteger(i)); conc = (agCellVolume->getDouble()*conc+agBoundaryArray->getDouble(i))/agCellVolume->getDouble(); agSubstrateConcentrationArray->setDouble(conc,agBoundaryIndecies->getInteger(i)); } }
void UpdateLigandConcentration::fire (Data *d) { // do the correct cast of the data DoubleData *conc = (DoubleData *) d; DoubleData *ligand = (DoubleData *) agent->getDatabase()->getDataItem("LigandConcentration"); ligand->setDouble(conc->getDouble()); }
void CellNotifyLigandConcToNFsimMessageGenerator::placeMessage(int destID) { Message *msg = new Message(); msg->setAction(ChemotaxisActionIDs::UPDATE_LIGAND_CONCENTRATION_ACTION_ID); msg->setDestinationID(destID); // provide argument for message DoubleData *parameter = new DoubleData("ligand_concentration", 0); // get chemicals out of cells database //if(this->db->existsDataItem("Chemical")) cout<<"got it chief"<<endl; //else cout<<"nopers"<<endl; DoubleVectorData *chem = (DoubleVectorData*) this->db->getDataItem("Chemical"); parameter->setDouble(chem->getDouble(0)); cerr << "i am the cell and i am sending " << parameter->getDouble() << " as lig. to nfsim" << endl; // get the chemoattractant msg->setArgument(parameter); // place message source->placeMessageInOutbox(msg); }
void BlindAgentNotifyWorldThatNewAgentIsBorn::placeMessage(int destID) { //check if I have to give birth or not if(birthFlag->getBool()) { birthFlag->setBool(false); // if the death simulator determined death, then do not create the birth message if(deathFlag->getBool()) return; //get the agentfactory, and use it to create an agent AgentFactory *af = Registrar::getSystemRegistrar()->getAgentFactory(1); Agent *a = af->createAgent(); // has the same parent // NOTE: the parent is the top level agent in the hierarchy of agents, // not the agent that gave birth! a->setParent(source->getParentId()); // has the same special agents for(unsigned int s=0; s<source->getNumOfSpecialAgents(); s++) a->addSpecialAgent(source->getSpecialAgentId(s)); // needs the same communicator, of course, of course a->addCommunicator(source->getCommunicator()); // set the other properties of agent 'a' based on the source exactly... a->copyDatabaseInformationFromExistingAgent(this->source); // CLEARLY A HACK!! CHANGE THIS AT SOME POINT TO DUPLICATE SIMULATORS // replace the movement simulator with the correct one if (((BoolData*) a->getDatabase()->getDataItem("is_levy"))->getBool()) { LevyRunLengthSimulator *levy = new LevyRunLengthSimulator(); a->replaceSimulator(0,levy); } else { ExponentialRunLengthSimulator *expo = new ExponentialRunLengthSimulator(); a->replaceSimulator(0,expo); } // ANOTHER HACK !! TIME TO NEXT OUTPUT IS OFF WHEN WE GET HERE, SO WE MUST UPDATE DoubleData *t = (DoubleData *) a->getDatabase()->getDataItem("celltime"); //DoubleData *oi = (DoubleData *) a->getDatabase()->getDataItem("outputinterval"); //DoubleData *no = (DoubleData*) a->getDatabase()->getDataItem("nextOutputTime"); DoubleData *dt = (DoubleData *) a->getDatabase()->getDataItem("dt"); t->setDouble(t->getDouble()-dt->getDouble()); //register agent a Message *specialMssg = new Message(); specialMssg->setAction(ChemoPopActionIDs::SPECIAL_AGENT_UPDATE_BLIND_AGENT_COUNT_ACTION_ID); specialMssg->setArgument(new IntegerData("ChangeInBlindAgentNumber",1)); Registrar::getSystemRegistrar()->registerNewAgentAndSendMessageToSpecialAgent(a,specialMssg); // Now, send the message to the world!! Message *msg = new Message(); msg->setAction(ChemoPopActionIDs::UPDATE_WORLD_BLIND_AGENT_BIRTH_ACTION_ID); msg->setDestinationID(destID); //pass my agentID (the mother) and the new agent ID (the baby) TVectorData<int> *info = new TVectorData<int>("new_cell_info","tvectordata_int"); info->addElementToEnd(this->source->getAgentId()); info->addElementToEnd(a->getAgentId()); // get new AgentID !!! msg->setArgument(info); source->placeMessageInOutbox(msg); } }