double MacroCellUrbanAreaChannelRealization::GetPathLoss (void) { /* * According to --- insert standard 3gpp --- * the Path Loss Model For Urban Environment is * L = I + 37.6log10(R) * R, in kilometers, is the distance between two nodes * I = 128.1 at 2GHz */ double distance; double externalWallAttenuation = 20; //[dB] NetworkNode* src = GetSourceNode (); NetworkNode* dst = GetDestinationNode (); distance = src->GetMobilityModel ()->GetAbsolutePosition ()->GetDistance ( dst->GetMobilityModel ()->GetAbsolutePosition ()); /* if (GetSourceNode ()->GetNodeType () == NetworkNode::TYPE_UE && GetDestinationNode ()->GetNodeType () == NetworkNode::TYPE_ENODEB) { UserEquipment* ue = (UserEquipment*) GetSourceNode (); ENodeB* enb = (ENodeB*) GetDestinationNode (); distance = ue->GetMobilityModel ()->GetAbsolutePosition ()->GetDistance (enb->GetMobilityModel ()->GetAbsolutePosition ()); } else if (GetDestinationNode ()->GetNodeType () == NetworkNode::TYPE_UE && GetSourceNode ()->GetNodeType () == NetworkNode::TYPE_ENODEB) { UserEquipment* ue = (UserEquipment*) GetDestinationNode (); ENodeB* enb = (ENodeB*) GetSourceNode (); distance = ue->GetMobilityModel ()->GetAbsolutePosition ()->GetDistance (enb->GetMobilityModel ()->GetAbsolutePosition ()); } */ m_pathLoss = 128.1 + (37.6 * log10 (distance * 0.001)); UserEquipment* ue; if (GetSourceNode ()->GetNodeType () == NetworkNode::TYPE_UE) { ue = (UserEquipment*) GetSourceNode (); } else { ue = (UserEquipment*) GetDestinationNode (); } if ( ue->IsIndoor() ) { m_pathLoss = m_pathLoss + externalWallAttenuation; } return m_pathLoss; }
bool PositionBasedHoManager::CheckHandoverNeed (UserEquipment* ue) { NetworkNode *targetNode = ue->GetTargetNode (); CartesianCoordinates *uePosition = ue->GetMobilityModel ()->GetAbsolutePosition (); CartesianCoordinates *targetPosition; targetPosition = targetNode->GetMobilityModel ()->GetAbsolutePosition (); double targetDistance = uePosition->GetDistance (targetPosition); /* if (targetDistance <= (ue->GetCell ()->GetRadius () * 0.8)) { return false; } */ std::vector<ENodeB*> *listOfNodes = NetworkManager::Init ()->GetENodeBContainer (); std::vector<ENodeB*>::iterator it; for (it = listOfNodes->begin (); it != listOfNodes->end (); it++) { if ((*it)->GetIDNetworkNode () != targetNode->GetIDNetworkNode () ) { NetworkNode *probableNewTargetNode = (*it); double distance = probableNewTargetNode->GetMobilityModel ()-> GetAbsolutePosition ()->GetDistance (uePosition); if (distance < targetDistance) { if (NetworkManager::Init()->CheckHandoverPermissions(probableNewTargetNode,ue)) { targetDistance = distance; targetNode = probableNewTargetNode; } } } } std::vector<HeNodeB*> *listOfNodes2 = NetworkManager::Init ()->GetHomeENodeBContainer(); std::vector<HeNodeB*>::iterator it2; for (it2 = listOfNodes2->begin (); it2 != listOfNodes2->end (); it2++) { if ((*it2)->GetIDNetworkNode () != targetNode->GetIDNetworkNode () ) { NetworkNode *probableNewTargetNode = (*it2); double distance = probableNewTargetNode->GetMobilityModel ()-> GetAbsolutePosition ()->GetDistance (uePosition); if (distance < targetDistance) { if (NetworkManager::Init()->CheckHandoverPermissions(probableNewTargetNode,ue)) { targetDistance = distance; targetNode = probableNewTargetNode; } } } } if (ue->GetTargetNode ()->GetIDNetworkNode () != targetNode->GetIDNetworkNode ()) { m_target = targetNode; return true; } else { return false; } }
void Manhattan::UpdatePosition (double timestamp) { #ifdef MOBILITY_DEBUG // cout << "\t START MOBILITY MODEL for "<< GetNodeID () << endl; #endif if (GetSpeed () == 0) { #ifdef MOBILITY_DEBUG cout << "\t\t speed = 0 --> position has not been updated!"<< endl; #endif return; } double timeInterval = timestamp - GetPositionLastUpdate (); double speedDirection; UserEquipment *thisNode = NetworkManager::Init ()->GetUserEquipmentByID (GetNodeID ()); Cell *thisCell = thisNode->GetCell (); NetworkNode *targetNode = thisNode->GetTargetNode (); #ifdef MOBILITY_DEBUG cout << "MOBILITY_DEBUG: User ID: " << GetNodeID () << "\n\t Cell ID " << NetworkManager::Init()->GetCellIDFromPosition (GetAbsolutePosition()->GetCoordinateX(), GetAbsolutePosition()->GetCoordinateY()) << "\n\t Initial Position (X): " << GetAbsolutePosition()->GetCoordinateX() << "\n\t Initial Position (Y): " << GetAbsolutePosition()->GetCoordinateY() << "\n\t Speed: " << GetSpeed() << "\n\t Speed Direction: " << GetSpeedDirection() << "\n\t Time Last Update: " << GetPositionLastUpdate() << "\n\t Time Interval: " << timeInterval << endl; #endif #ifdef MOBILITY_DEBUG_TAB cout << GetNodeID () << " " << GetAbsolutePosition()->GetCoordinateX() << " " << GetAbsolutePosition()->GetCoordinateY() << " " << GetSpeed() << " " << GetSpeedDirection() << " " << GetPositionLastUpdate() << " " << timeInterval << " " << "-> "; #endif const double pi = 3.14; // Init speedDirection if its not pointing into the direction of Manhattans Streets vector<double> directions; for(int i=0;i<=3;i++) { directions.push_back(i * 1.57); // 1.57 = 90.0 * ((2.0*pi)/360.0)) } double newdir; vector<double>::iterator it; it = find(directions.begin(), directions.end(), GetSpeedDirection()); if(it == directions.end()) { newdir = (double)(pi / 2) * round(GetSpeedDirection() * (double)(2 / pi)); if(newdir==6.28) newdir = 0; SetSpeedDirection(newdir); #ifdef MOBILITY_DEBUG_TAB cout << "NEW SPEED-DIRECTION: " << newdir << " -> "; #endif } double shift = timeInterval * (GetSpeed()*(1000.0/3600.0)); CartesianCoordinates *newPosition = new CartesianCoordinates(GetAbsolutePosition()->GetCoordinateX(), GetAbsolutePosition()->GetCoordinateY()); CartesianCoordinates *ENodeBPosition = targetNode->GetMobilityModel ()->GetAbsolutePosition (); // Init Manhattan grid position if(fmod(GetAbsolutePosition()->GetCoordinateY(),100)!=0 && fmod(GetAbsolutePosition()->GetCoordinateX(),100)!=0){ CartesianCoordinates *Correction = new CartesianCoordinates(); double distfromEnB = newPosition->GetDistance (ENodeBPosition); double azim = newPosition->GetPolarAzimut (ENodeBPosition); //if it was randomly put outside the cell -> shift it inside if(distfromEnB > (thisCell->GetRadius()*1000)) { Correction->SetCoordinates((newPosition->GetDistance (ENodeBPosition) - (thisCell->GetRadius()*1000)) * cos(azim), (newPosition->GetDistance (ENodeBPosition) - (thisCell->GetRadius()*1000)) * sin(azim)); newPosition->SetCoordinates(newPosition->GetCoordinateX() - Correction->GetCoordinateX(), newPosition->GetCoordinateY() - Correction->GetCoordinateY()); } delete Correction; if(GetSpeedDirection()==0 || GetSpeedDirection()==3.14) { if(newPosition->GetCoordinateY() < 0) newPosition->SetCoordinateY( ceil( (double)(newPosition->GetCoordinateY() / 100) ) * 100); else newPosition->SetCoordinateY( floor( (double)(newPosition->GetCoordinateY() / 100) ) * 100); } else { if(newPosition->GetCoordinateX() < 0) newPosition->SetCoordinateX( ceil( (double)(newPosition->GetCoordinateX() / 100)) * 100); else newPosition->SetCoordinateX( floor( (double)(newPosition->GetCoordinateX() / 100) ) * 100); } } //Shift it double shift_x = shift * cos(GetSpeedDirection()); double shift_y = shift * sin(GetSpeedDirection()); if(GetSpeedDirection()==0 || GetSpeedDirection()==3.14) { newPosition->SetCoordinateX(newPosition->GetCoordinateX()+shift_x); } else { newPosition->SetCoordinateY(newPosition->GetCoordinateY()+shift_y); } // if a node reaches a crossing, choose new speedDirection double old_x = abs( ((int)( GetAbsolutePosition()->GetCoordinateX() *1000))/1000.0 ); //cut after 3 decimal places double new_x = abs( ((int)( newPosition->GetCoordinateX() *1000))/1000.0 ); double old_y = abs( ((int)( GetAbsolutePosition()->GetCoordinateY() *1000))/1000.0 ); double new_y = abs( ((int)( newPosition->GetCoordinateY() *1000))/1000.0 ); double rounded_x = abs( round(old_x/100)*100 ); double rounded_y = abs( round(old_y/100)*100 ); if( ((old_x<rounded_x && rounded_x<=new_x) || (old_x>rounded_x && rounded_x>=new_x)) || ((old_y<rounded_y && rounded_y<=new_y) || (old_y>rounded_y && rounded_y>=new_y)) || (rounded_x==0 && old_x<rounded_x && rounded_x<=new_x) || (rounded_x==0 && old_x>rounded_x && rounded_x>=new_x) || (rounded_y==0 && old_y<rounded_y && rounded_y<=new_y) || (rounded_y==0 && old_y>rounded_y && rounded_y>=new_y) ) { srand ( time(NULL) ); double prob_turn = (rand()%100)*0.01; if(prob_turn<=0.25) { speedDirection = GetSpeedDirection() + 1.57; //turn left; newPosition->SetCoordinates(round(newPosition->GetCoordinateX()),round(newPosition->GetCoordinateY())); #ifdef MOBILITY_DEBUG_TAB cout << "TURN LEFT: " << speedDirection << " -> "; #endif } if(prob_turn>0.25 && prob_turn<0.75) { newPosition->SetCoordinates(round(newPosition->GetCoordinateX()),round(newPosition->GetCoordinateY()) ); speedDirection = GetSpeedDirection(); #ifdef MOBILITY_DEBUG_TAB cout << "no TURN: straight -> "; #endif } if(prob_turn>=0.75) { newPosition->SetCoordinates(round(newPosition->GetCoordinateX()),round(newPosition->GetCoordinateY()) ); speedDirection = GetSpeedDirection() - 1.57; #ifdef MOBILITY_DEBUG_TAB cout << "TURN RIGHT: " << speedDirection << " -> "; #endif } //Correction if speedDirection €! [0,2pi[ if(speedDirection>=2*pi) speedDirection -= 2*pi; if(speedDirection<0) speedDirection += 2*pi; SetSpeedDirection(speedDirection); } //If node moves beyond the cell edge double azimut = newPosition->GetPolarAzimut (ENodeBPosition); double newDistanceFromTheENodeB = newPosition->GetDistance (ENodeBPosition); if (newDistanceFromTheENodeB >= (thisCell->GetRadius()*1000)) { if (GetHandover()== false) { newPosition->SetCoordinateX(GetAbsolutePosition()->GetCoordinateX()); newPosition->SetCoordinateY(GetAbsolutePosition()->GetCoordinateY()); speedDirection = GetSpeedDirection() - pi; #ifdef MOBILITY_DEBUG_TAB cout << "Moved back to cell: SPEED DIRECTION CHANGE (HO): " << speedDirection << " -> "; #endif if(speedDirection<0) speedDirection = speedDirection + 2*pi; SetSpeedDirection(speedDirection); } else if (newPosition->GetDistance(0.0, 0.0) >= GetTopologyBorder ()) { newPosition->SetCoordinateX(GetAbsolutePosition()->GetCoordinateX()); newPosition->SetCoordinateY(GetAbsolutePosition()->GetCoordinateY()); speedDirection = GetSpeedDirection() - 1.57; #ifdef MOBILITY_DEBUG_TAB cout << "Moved back to cell: SPEED DIRECTION CHANGE (TOPOLOGY-BORDER): " << speedDirection << " -> "; #endif if(speedDirection<0) speedDirection = speedDirection + 2*pi; SetSpeedDirection(speedDirection); } } SetAbsolutePosition(newPosition); SetPositionLastUpdate (timestamp); #ifdef MOBILITY_DEBUG cout << "\n\t Final Position (X): " << GetAbsolutePosition()->GetCoordinateX() << "\n\t Final Position (Y): " << GetAbsolutePosition()->GetCoordinateY() << endl; #endif #ifdef MOBILITY_DEBUG_TAB cout << GetAbsolutePosition()->GetCoordinateX() << " " << GetAbsolutePosition()->GetCoordinateY() << " " << GetSpeedDirection() << endl; #endif delete newPosition; }