From e6870ddaf818287591c788fd5bb8dbeb0216b758 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Thu, 4 Dec 2025 11:37:23 +0100 Subject: [PATCH 1/7] Underwater channel model --- .../underwaterChannel/UnderWaterChannel.cc | 629 ++++++++++++++++++ .../underwaterChannel/UnderWaterChannel.h | 97 +++ .../underwaterChannel/UnderWaterChannel.ned | 55 ++ 3 files changed, 781 insertions(+) create mode 100644 src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc create mode 100644 src/wirelessChannel/underwaterChannel/UnderWaterChannel.h create mode 100644 src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc new file mode 100644 index 00000000..1a42bd50 --- /dev/null +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc @@ -0,0 +1,629 @@ +/**************************************************************************** + * Copyright: National ICT Australia, 2007 - 2010 * + * Developed at the ATP lab, Networked Systems research theme * + * Author(s): Athanassios Boulis, Yuriy Tselishchev * + * This file is distributed under the terms in the attached LICENSE file. * + * If you do not find this file, copies can be found by writing to: * + * * + * NICTA, Locked Bag 9013, Alexandria, NSW 1435, Australia * + * Attention: License Inquiry. * + * * + ****************************************************************************/ + +#include "wirelessChannel/underwaterChannel/UnderWaterChannel.h" + +Define_Module(UnderWaterChannel); + +int UnderWaterChannel::numInitStages() const +{ + return 2; +} + +void UnderWaterChannel::initialize(int stage) +{ + if (stage == 0) { + readIniFileParameters(); + return; + } + + /* variable to report initialization run time */ + clock_t startTime; + startTime = clock(); + + /**************************************************** + * To handle mobile nodes we break up the space into + * cells. All path loss calculations are now done + * between cells. First we need to find out how many + * distinct cells we have in space, based on the + * dimensions of the space and the declared cell size. + * If we only have static nodes, then we keep the + * same variables and abstractions to make the code + * more compact and easier to read, but we do not + * really need to divide the space into cells. Even + * though we keep the variable names, cells in the + * static case only correspond to node positions + * and we only have numOfNodes cells, much like + * we used to do in Castalia 1.3 + ****************************************************/ + + if (onlyStaticNodes) { + numOfSpaceCells = numOfNodes; + } else { + if (xFieldSize <= 0) { + xFieldSize = 1; + xCellSize = 1; + } + if (yFieldSize <= 0) { + yFieldSize = 1; + yCellSize = 1; + } + if (zFieldSize <= 0) { + zFieldSize = 1; + zCellSize = 1; + } + if (xCellSize <= 0) + xCellSize = xFieldSize; + if (yCellSize <= 0) + yCellSize = yFieldSize; + if (zCellSize <= 0) + zCellSize = zFieldSize; + + numOfZCells = (int)ceil(zFieldSize / zCellSize); + numOfYCells = (int)ceil(yFieldSize / yCellSize); + numOfXCells = (int)ceil(xFieldSize / xCellSize); + numOfSpaceCells = numOfZCells * numOfYCells * numOfXCells; + + /*************************************************************** + * Calculate some values that help us transform a 1D index in + * [0..numOfSpaceCells -1] to a 3D index x, y, z and vice versa. + * Each variable holds index increments (in the 1D large index) + * needed to move one space cell in the z, y, and x directions + **************************************************************/ + zIndexIncrement = numOfYCells * numOfXCells; + yIndexIncrement = numOfXCells; + xIndexIncrement = 1; + } + + /*************************************************************** + * Allocate and initialize cellOccupation and nodeLocation. + * nodeLocation keeps the state about all nodes locations and + * cellOccupation is an array of lists. List at index i contains + * the node IDs that reside in cell i. We define and use these + * arrays even for the static nodes case as it makes the code + * more compact and easier to follow. + **************************************************************/ + nodeLocation = new NodeLocation_type[numOfNodes]; + if (nodeLocation == NULL) + throw cRuntimeError("Could not allocate array nodeLocation\n"); + + cellOccupation = new list[numOfSpaceCells]; + if (cellOccupation == NULL) + throw cRuntimeError("Could not allocate array cellOccupation\n"); + + cTopology *topo; // temp variable to access initial location of the nodes + topo = new cTopology("topo"); + topo->extractByNedTypeName(cStringTokenizer("node.Node").asVector()); + + for (int i = 0; i < numOfNodes; i++) { + VirtualMobilityManager *nodeMobilityModule = + check_and_cast + (topo->getNode(i)->getModule()->getSubmodule("MobilityManager")); + nodeLocation[i] = nodeMobilityModule->getLocation(); + nodeLocation[i].cell = i; + + if (!onlyStaticNodes) { + /****************************************************************** + * Compute the cell this node is in and initialize cellOccupation. + * Cavaet in computing the XYZ indices: + * Because we allow cell resolutions that do not perfectly divide + * the field (we take the ceiling of the division when calculating + * numOfXCells) this means that the edge cells might be smaller than + * the others. So in some cases, the calculation we are doing + * below, might give the wrong cell by +1. That's why we are doing + * the test immediately after. + ******************************************************************/ + int xIndex = (int)floor(nodeLocation[i].x / xFieldSize * numOfXCells); + if (((xIndex - 1) * xCellSize) >= nodeLocation[i].x) + xIndex--; + else if (xIndex >= numOfXCells) { + xIndex = numOfXCells - 1; // the maximum possible x index + if (nodeLocation[i].x > xFieldSize) + trace() << "WARNING at initialization: node position out of bounds in X dimension!\n"; + } + + int yIndex = (int)floor(nodeLocation[i].y / yFieldSize * numOfYCells); + if (((yIndex - 1) * yCellSize) >= nodeLocation[i].y) + yIndex--; + else if (yIndex >= numOfYCells) { + yIndex = numOfYCells - 1; // the maximum possible y index + if (nodeLocation[i].y > yFieldSize) + trace() << "WARNING at initialization: node position out of bounds in Y dimension!\n"; + } + + int zIndex = (int)floor(nodeLocation[i].z / zFieldSize * numOfZCells); + if (((zIndex - 1) * zCellSize) >= nodeLocation[i].z) + zIndex--; + else if (zIndex >= numOfZCells) { + zIndex = numOfZCells - 1; // the maximum possible z index + if (nodeLocation[i].z > zFieldSize) + trace() << "WARNING at initialization: node position out of bounds in Z dimension!\n"; + } + + int cell = zIndex * zIndexIncrement + yIndex * yIndexIncrement + xIndex * xIndexIncrement; + if (cell < 0 || cell >= numOfSpaceCells) { + throw cRuntimeError("Cell out of bounds for node %i, please check your mobility module settings\n", i); + } + + nodeLocation[i].cell = cell; + } + + /************************************************* + * pushing ID i into the list cellOccupation[cell] + * (if onlyStaticNodes cell=i ) + *************************************************/ + cellOccupation[nodeLocation[i].cell].push_front(i); + } + delete(topo); + + /********************************************** + * Allocate and initialize the pathLoss array. + * This is the "propagation map" of our space. + **********************************************/ + pathLoss = new list[numOfSpaceCells]; + if (pathLoss == NULL) + throw cRuntimeError("Could not allocate array pathLoss\n"); + + int elementSize = sizeof(PathLossElement) + 3 * sizeof(PathLossElement *); + int totalElements = 0; //keep track of pathLoss size for reporting purposes + + float x1, x2, y1, y2, z1, z2, dist; + float PLd; // path loss at distance dist, in dB + float bidirectionalPathLossJitter; // variation of the pathloss in the two directions of a link, in dB + + /******************************************************* + * Calculate the distance, beyond which we cannot + * have connectivity between two nodes. This calculation is + * based on the maximum TXPower the signalDeliveryThreshold + * the pathLossExponent, the PLd0. For the random + * shadowing part we use 3*sigma to account for 99.7% + * of the cases. We use this value to considerably + * speed up the filling of the pathLoss array, + * especially for the mobile case. + *******************************************************/ + float distanceThreshold = d0 * + pow(10.0,(maxTxPower - signalDeliveryThreshold - PLd0 + 3 * sigma) / + (10.0 * pathLossExponent)); + + for (int i = 0; i < numOfSpaceCells; i++) { + if (onlyStaticNodes) { + x1 = nodeLocation[i].x; + y1 = nodeLocation[i].y; + z1 = nodeLocation[i].z; + } else { + z1 = zCellSize * (int)floor(i / zIndexIncrement); + y1 = yCellSize * (((int)floor(i / yIndexIncrement)) % zIndexIncrement); + x1 = xCellSize * (((int)floor(i / xIndexIncrement)) % yIndexIncrement); + } + + /* Path loss to yourself is 0.0 */ + pathLoss[i].push_front(new PathLossElement(i, 0.0)); + totalElements++; //keep track of pathLoss size for reporting purposes + + for (int j = i + 1; j < numOfSpaceCells; j++) { + if (onlyStaticNodes) { + x2 = nodeLocation[j].x; + y2 = nodeLocation[j].y; + z2 = nodeLocation[j].z; + } else { + z2 = zCellSize * (int)(j / zIndexIncrement); + y2 = yCellSize * (((int)(j / yIndexIncrement)) % zIndexIncrement); + x2 = xCellSize * (((int)(j / xIndexIncrement)) % yIndexIncrement); + + if (fabs(x1 - x2) > distanceThreshold) + continue; + if (fabs(y1 - y2) > distanceThreshold) + continue; + if (fabs(z1 - z2) > distanceThreshold) + continue; + } + + dist = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)); + if (dist > distanceThreshold) + continue; + + /* if the distance is very small (arbitrarily: smaller than one tenth + * of the reference distance) then make the path loss 0dB + */ + if (dist < d0/10.0) { + PLd = 0; + bidirectionalPathLossJitter = 0; + } + else { + PLd = PLd0 + 10.0 * pathLossExponent * log10(dist / d0) + normal(0, sigma); + bidirectionalPathLossJitter = normal(0, bidirectionalSigma) / 2; + } + + if (maxTxPower - PLd - bidirectionalPathLossJitter >= signalDeliveryThreshold) { + pathLoss[i].push_front(new PathLossElement(j,PLd + bidirectionalPathLossJitter)); + totalElements++; //keep track of pathLoss size for reporting purposes + } + + if (maxTxPower - PLd + bidirectionalPathLossJitter >= signalDeliveryThreshold) { + pathLoss[j].push_front(new PathLossElement(i,PLd - bidirectionalPathLossJitter)); + totalElements++; //keep track of pathLoss size for reporting purposes + } + } + } + + trace() << "Number of distinct space cells: " << numOfSpaceCells; + trace() << "Each cell affects " << + (double)totalElements / numOfSpaceCells << " other cells on average"; + trace() << "The pathLoss array of lists was allocated in " << + (double)(totalElements * elementSize) / 1048576 << " MBytes"; + // The larger this number, the slower your simulation. Consider increasing the cell size, + // decreasing the field size, or if you only have static nodes, decreasing the number of nodes + + /********************************************************************* + * Allocate nodesAffectedByTransmitter even for static nodes. + * This makes the code more compact. We also have temporal variations + * so the nodes that are affected are not necessarily the same. + *********************************************************************/ + nodesAffectedByTransmitter = new list[numOfNodes]; + if (nodesAffectedByTransmitter == NULL) + throw cRuntimeError("Could not allocate array nodesAffectedByTransmitter\n"); + + /************************************************************ + * If direct assignment of link qualities is given at the + * omnetpp.ini file we parse the input and update pathLoss. + * This is only for static nodes. (onlyStaticNodes==TRUE) + ************************************************************/ + parsePathLossMap(); + + /* Create temporal model object from parameters file (if given) */ + if (strlen(temporalModelParametersFile) > 0) { + temporalModel = new channelTemporalModel(temporalModelParametersFile, getRNG(2)); + temporalModelDefined = true; + } else { + temporalModelDefined = false; + } + + declareHistogram("Fade depth distribution", -50, 15, 13); + + trace() << "Time for Wireless Channel module initialization: " << + (double)(clock() - startTime) / CLOCKS_PER_SEC << "secs"; +} + +/***************************************************************************** + * This is where the main work is done by processing all the messages received + *****************************************************************************/ +void UnderWaterChannel::handleMessage(cMessage * msg) +{ + switch (msg->getKind()) { + + case WC_NODE_MOVEMENT:{ + + WirelessChannelNodeMoveMessage *mobilityMsg = + check_and_cast (msg); + int srcAddr = mobilityMsg->getNodeID(); + + /***************************************************** + * A node notified the wireless channel that it moved + * to a new space cell. Update the nodeLocation and + * based on the new cell calculation decide if the + * cellOccupation array needs to be updated. + *****************************************************/ + + if (onlyStaticNodes) + throw cRuntimeError("Error: Rerceived WS_NODE_MOVEMENT msg, while onlyStaticNodes is TRUE"); + + int oldCell = nodeLocation[srcAddr].cell; + nodeLocation[srcAddr].x = mobilityMsg->getX(); + nodeLocation[srcAddr].y = mobilityMsg->getY(); + nodeLocation[srcAddr].z = mobilityMsg->getZ(); + nodeLocation[srcAddr].phi = mobilityMsg->getPhi(); + nodeLocation[srcAddr].theta = mobilityMsg->getTheta(); + if ((nodeLocation[srcAddr].x < 0.0) || + (nodeLocation[srcAddr].y < 0.0) || + (nodeLocation[srcAddr].z < 0.0)) + throw cRuntimeError("Wireless channel received faulty WC_NODE_MOVEMENT msg. We cannot have negative node coordinates"); + + int xIndex = (int)floor(nodeLocation[srcAddr].x / xFieldSize * numOfXCells); + if (((xIndex - 1) * xCellSize) >= nodeLocation[srcAddr].x) + xIndex--; + else if (xIndex >= numOfXCells) { + xIndex = numOfXCells - 1; // the maximum possible x index + if (nodeLocation[srcAddr].x > xFieldSize) + debug() << "WARNING at WC_NODE_MOVEMENT: node position out of bounds in X dimension!\n"; + } + + int yIndex = (int)floor(nodeLocation[srcAddr].y / yFieldSize * numOfYCells); + if (((yIndex - 1) * yCellSize) >= nodeLocation[srcAddr].y) + yIndex--; + else if (yIndex >= numOfYCells) { + yIndex = numOfYCells - 1; // the maximum possible y index + if (nodeLocation[srcAddr].y > yFieldSize) + debug() << "WARNING at WC_NODE_MOVEMENT: node position out of bounds in Y dimension!\n"; + } + + int zIndex = (int)floor(nodeLocation[srcAddr].z / zFieldSize * numOfZCells); + if (((zIndex - 1) * zCellSize) >= nodeLocation[srcAddr].z) + zIndex--; + else if (zIndex >= numOfZCells) { + zIndex = numOfZCells - 1; // the maximum possible z index + if (nodeLocation[srcAddr].z > zFieldSize) + debug() << "WARNING at WC_NODE_MOVEMENT: node position out of bounds in Z dimension!\n"; + } + + int newCell = zIndex * zIndexIncrement + yIndex * yIndexIncrement + xIndex * xIndexIncrement; + if (newCell != oldCell) { + cellOccupation[oldCell].remove(srcAddr); + cellOccupation[newCell].push_front(srcAddr); + nodeLocation[srcAddr].cell = newCell; + } + + break; + } + + case WC_SIGNAL_START:{ + + WirelessChannelSignalBegin *signalMsg = + check_and_cast (msg); + int srcAddr = signalMsg->getNodeID(); + int receptioncount = 0; + + /* Find the cell that the transmitting node resides */ + int cellTx = nodeLocation[srcAddr].cell; + + /* Iterate through the list of cells that are affected + * by cellTx and check if there are nodes there. + * Update the nodesAffectedByTransmitter array + */ + list < PathLossElement * >::iterator it1; + for (it1 = pathLoss[cellTx].begin(); it1 != pathLoss[cellTx].end(); it1++) { + /* If no nodes exist in this cell, move on. */ + if (cellOccupation[(*it1)->cellID].empty()) + continue; + + /* Otherwise there are some nodes in that cell. + * Calculate the signal received by these nodes + * It is exactly the same for all of them. + * The signal may be variable in time. + */ + float currentSignalReceived = signalMsg->getPower_dBm() - (*it1)->avgPathLoss; + if (temporalModelDefined) { + simtime_t timePassed_msec = (simTime() - (*it1)->lastObservationTime) * 1000; + simtime_t timeProcessed_msec = + temporalModel->runTemporalModel(SIMTIME_DBL(timePassed_msec), + &((*it1)->lastObservedDiffFromAvgPathLoss)); + currentSignalReceived += (*it1)->lastObservedDiffFromAvgPathLoss; + collectHistogram("Fade depth distribution", + (*it1)->lastObservedDiffFromAvgPathLoss); + /* Update the observation time */ + (*it1)->lastObservationTime = simTime() - + (timePassed_msec - timeProcessed_msec) / 1000; + } + + /* If the resulting current signal received is not strong enough, + * to be delivered to the radio module, continue to the next cell. + */ + if (currentSignalReceived < signalDeliveryThreshold) + continue; + + /* Else go through all the nodes of that cell. + * Iterator it2 returns node IDs. + */ + list < int >::iterator it2; + for (it2 = cellOccupation[(*it1)->cellID].begin(); + it2 != cellOccupation[(*it1)->cellID].end(); it2++) { + if (*it2 == srcAddr) + continue; + receptioncount++; + WirelessChannelSignalBegin *signalMsgCopy = signalMsg->dup(); + signalMsgCopy->setPower_dBm(currentSignalReceived); + send(signalMsgCopy, "toNode", *it2); + nodesAffectedByTransmitter[srcAddr].push_front(*it2); + } //for it2 + } //for it1 + + if (receptioncount > 0) + trace() << "signal from node[" << srcAddr << "] reached " << + receptioncount << " other nodes"; + break; + } + + case WC_SIGNAL_END:{ + WirelessChannelSignalEnd *signalMsg = + check_and_cast (msg); + int srcAddr = signalMsg->getNodeID(); + + /* Go through the list of nodes that were affected + * by this transmission. *it1 holds the node ID + */ + list ::iterator it1; + for (it1 = nodesAffectedByTransmitter[srcAddr].begin(); + it1 != nodesAffectedByTransmitter[srcAddr].end(); it1++) { + WirelessChannelSignalEnd *signalMsgCopy = signalMsg->dup(); + send(signalMsgCopy, "toNode", *it1); + } //for it1 + + /* Now that we are done processing the msg we delete the whole list + * nodesAffectedByTransmitter[srcAddr], since srcAddr in not TXing anymore. + */ + nodesAffectedByTransmitter[srcAddr].clear(); + break; + } + + default:{ + throw cRuntimeError("ERROR: Wireless Channel received unknown message kind=%i", msg->getKind()); + break; + } + } + delete msg; +} + +void UnderWaterChannel::finishSpecific() +{ + + YAML::Emitter y_out; + y_out<::iterator it1; + y_out<cellID; + y_out<avgPathLoss; + y_out<par("debugInfoFileName").stringValue()); + + onlyStaticNodes = par("onlyStaticNodes"); + pathLossExponent = par("pathLossExponent"); + sigma = par("sigma"); + bidirectionalSigma = par("bidirectionalSigma"); + PLd0 = par("PLd0"); + d0 = par("d0"); + + pathLossMapFile = par("pathLossMapFile"); + temporalModelParametersFile = par("temporalModelParametersFile"); + signalDeliveryThreshold = par("signalDeliveryThreshold"); + + numOfNodes = getParentModule()->par("numNodes"); + xFieldSize = getParentModule()->par("field_x"); + yFieldSize = getParentModule()->par("field_y"); + zFieldSize = getParentModule()->par("field_z"); + xCellSize = par("xCellSize"); + yCellSize = par("yCellSize"); + zCellSize = par("zCellSize"); + + maxTxPower = 0.0; + serializePathLossData = par("serializePathLossData"); +} // readIniParameters + +/* Parsing of custom pathloss map from a file, + * filename given by the parameter pathLossMapFile + */ +void UnderWaterChannel::parsePathLossMap(void) +{ + if (strlen(pathLossMapFile) == 0) + return; + ifstream f(pathLossMapFile); + if (!f.is_open()) + throw cRuntimeError("\n[Wireless Channel]:\n Error reading from pathLossMapFile %s\n", pathLossMapFile); + + string s; + const char *ct; + int source, destination; + float pathloss_db; + + /* each line in a file is in the same format: + * Transmitter_id>Receiver_id:PathLoss_dB, ... ,Receiver_id:PathLoss_dB + * based on these values we will update the pathloss array + * (using updatePathLossElement function) + */ + while (getline(f, s)) { + ct = s.c_str(); //ct points to the beginning of a line + while (ct[0] && (ct[0] == ' ' || ct[0] == '\t')) + ct++; + if (!ct[0] || ct[0] == '#') + continue; // skip comments + if (parseInt(ct, &source)) + throw cRuntimeError("\n[Wireless Channel]:\n Bad syntax in pathLossMapFile, expecting source identifier\n"); + while (ct[0] && ct[0] != '>') + ct++; //skip untill '>' character + if (!ct[0]) + throw cRuntimeError("\n[Wireless Channel]:\n Bad syntax in pathLossMapFile, expecting comma separated list of values\n"); + cStringTokenizer t(++ct, ","); //divide the rest of the strig with comma delimiter + while ((ct = t.nextToken())) { + if (parseInt(ct, &destination)) + throw cRuntimeError("\n[Wireless Channel]:\n Bad syntax in pathLossMapFile, expecting target identifier\n"); + while (ct[0] && ct[0] != ':') + ct++; //skip untill ':' character + if (parseFloat(++ct, &pathloss_db)) + throw cRuntimeError("\n[Wireless Channel]:\n Bad syntax in pathLossMapFile, expecting dB value for path loss\n"); + updatePathLossElement(source, destination, pathloss_db); + } + } +} + +//This function will update a pathloss element for given source and destination cells with a given value of pathloss +//If this pair is already defined in pathloss array, the old value is replaced, otherwise a new pathloss element is created +void UnderWaterChannel::updatePathLossElement(int src, int dst, float pathloss_db) +{ + if (src >= numOfSpaceCells || dst >= numOfSpaceCells) return; + list ::iterator it1; + for (it1 = pathLoss[src].begin(); it1 != pathLoss[src].end(); it1++) { + if ((*it1)->cellID == dst) { + (*it1)->avgPathLoss = pathloss_db; + return; + } + } + pathLoss[src].push_front(new PathLossElement(dst, pathloss_db)); +} + +//wrapper function for atoi(...) call. returns 1 on error, 0 on success +int UnderWaterChannel::parseInt(const char *c, int *dst) +{ + while (c[0] && (c[0] == ' ' || c[0] == '\t')) + c++; + if (!c[0] || c[0] < '0' || c[0] > '9') + return 1; + *dst = atoi(c); + return 0; +} + +//wrapper function for strtof(...) call. returns 1 on error, 0 on success +int UnderWaterChannel::parseFloat(const char *c, float *dst) +{ + char *tmp; + *dst = strtof(c, &tmp); + if (c == tmp) + return 1; + return 0; +} diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h new file mode 100644 index 00000000..a0d6bf0d --- /dev/null +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h @@ -0,0 +1,97 @@ +/**************************************************************************** + * Copyright: National ICT Australia, 2007 - 2010 * + * Developed at the ATP lab, Networked Systems research theme * + * Author(s): Athanassios Boulis, Yuriy Tselishchev * + * This file is distributed under the terms in the attached LICENSE file. * + * If you do not find this file, copies can be found by writing to: * + * * + * NICTA, Locked Bag 9013, Alexandria, NSW 1435, Australia * + * Attention: License Inquiry. * + * * + ****************************************************************************/ + +#ifndef _UNDERWATERCHANNEL_H +#define _UNDERWATERCHANNEL_H + +#include "wirelessChannel/WirelessChannelMessages_m.h" +#include "wirelessChannel/defaultChannel/WirelessChannelTemporal.h" +#include "wirelessChannel/defaultChannel/WirelessChannel.h" +#include "node/mobilityManager/VirtualMobilityManager.h" +#include "helpStructures/CastaliaModule.h" + +#include "time.h" +#include +#include + +using namespace std; + +class UnderWaterChannel: public CastaliaModule { + private: + + /*--- variables corresponding to .ned file's parameters ---*/ + int numOfNodes; + + double xFieldSize; + double yFieldSize; + double zFieldSize; + double xCellSize; + double yCellSize; + double zCellSize; + + // variables corresponding to Wireless Channel module parameters + double pathLossExponent; // the path loss exponent + double noiseFloor; // in dBm + double PLd0; // Power loss at a reference distance d0 (in dBm) + double d0; // reference distance (in meters) + double sigma; // std of a zero-mean Gaussian RV + double bidirectionalSigma; // std of a zero-mean Gaussian RV + + const char *pathLossMapFile; + const char *temporalModelParametersFile; + double signalDeliveryThreshold; + bool onlyStaticNodes; + double receiverSensitivity; + double maxTxPower; // this is derived, by reading all the Tx power levels + + /*--- other class member variables ---*/ + int numOfXCells, numOfYCells, numOfZCells; + int numOfSpaceCells; + int xIndexIncrement, yIndexIncrement, zIndexIncrement; + + list *pathLoss; // an array of lists (numOfSpaceCels long) + // holding info on path loss. Element i of the + // array is a list elements that describe which + // cells are affected (and how) when a + // node in cell i transmits. + + list *nodesAffectedByTransmitter; // an array of lists (numOfNodes long). The list + // at array element i holds the node IDs that are + // affected when node i transmits. + + list *cellOccupation; // an array of lists (numOfSpaceCels long) that + // tells us which nodes are in cell i. + + NodeLocation_type *nodeLocation; // an array (numOfNodes long) that gives the + // location for each node. + + bool temporalModelDefined; + channelTemporalModel *temporalModel; + bool serializePathLossData; + + protected: + virtual void initialize(int); + virtual void handleMessage(cMessage * msg); + virtual void finishSpecific(); + + void readIniFileParameters(void); + void parsePathLossMap(void); + int parseInt(const char *, int *); + int parseFloat(const char *, float *); + void printRxSignalTable(void); + void updatePathLossElement(int, int, float); + float calculateProb(float, int); + + int numInitStages() const; +}; + +#endif //_UNDERWATERCHANNEL_H diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned new file mode 100644 index 00000000..6aa6c14c --- /dev/null +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned @@ -0,0 +1,55 @@ +//******************************************************************************** +//* Copyright: National ICT Australia, 2007 - 2010 * +//* Developed at the ATP lab, Networked Systems research theme * +//* Author(s): Athanassios Boulis, Dimosthenis Pediaditakis, Yuriy Tselishchev * +//* This file is distributed under the terms in the attached LICENSE file. * +//* If you do not find this file, copies can be found by writing to: * +//* * +//* NICTA, Locked Bag 9013, Alexandria, NSW 1435, Australia * +//* Attention: License Inquiry. * +//* * +//*******************************************************************************/* + +package wirelessChannel.defaultChannel; + +// The wireless channel module simulates the wireless medium. Nodes sent packets to it +// and according to various conditions (fading, interference etc) it is decided which +// nodes can receive this packet + +simple WirelessChannel like wirelessChannel.iWirelessChannel { + parameters: + bool collectTraceInfo = default (false); + bool onlyStaticNodes = default (true); // if NO mobility, set it to true for greater efficiency + + double xCellSize = default (5); // if we define cells (to handle mobility) + double yCellSize = default (5); // how big are the cells in each dimension + double zCellSize = default (1); + + double pathLossExponent = default (2.4); // how fast is the signal strength fading + double PLd0 = default (55); // path loss at reference distance d0 (in dBm) + double d0 = default (1.0); // reference distance d0 (in meters) + + double sigma = default (4.0); // how variable is the average fade for nodes at the same distance + // from eachother. std of a gaussian random variable. + + double bidirectionalSigma = default (1.0); // how variable is the average fade for link B->A if we know + // the fade of link A->B. std of a gaussian random variable + + string pathLossMapFile = default (""); // describes a map of the connectivity based on pathloss + // if defined, then the parameters above become irrelevant + + string temporalModelParametersFile = default (""); + // the filename that contains all parameters for + // the temporal channel variation model + + double signalDeliveryThreshold = default (-100); + // threshold in dBm above which, wireless channel module + // is delivering signal messages to radio modules of + // individual nodes + bool serializePathLossData = default(false);// Serialize path loss data to yaml file + + gates: + output toNode[]; + input fromMobilityModule @ directIn; + input fromNode[]; +} From daa2343c5f94f83192d5ea500a60adc0163eb236 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Thu, 4 Dec 2025 11:57:10 +0100 Subject: [PATCH 2/7] NED file update --- src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned index 6aa6c14c..b6f6d795 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned @@ -10,13 +10,13 @@ //* * //*******************************************************************************/* -package wirelessChannel.defaultChannel; +package wirelessChannel.underwaterChannel; // The wireless channel module simulates the wireless medium. Nodes sent packets to it // and according to various conditions (fading, interference etc) it is decided which // nodes can receive this packet -simple WirelessChannel like wirelessChannel.iWirelessChannel { +simple UnderWaterChannel like wirelessChannel.iWirelessChannel { parameters: bool collectTraceInfo = default (false); bool onlyStaticNodes = default (true); // if NO mobility, set it to true for greater efficiency From c4b35ba3c401d6f34cb1609332bd96cb3e8c6574 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Tue, 9 Dec 2025 08:24:32 +0100 Subject: [PATCH 3/7] some channel description --- doc/uwsn/channel.tex | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 doc/uwsn/channel.tex diff --git a/doc/uwsn/channel.tex b/doc/uwsn/channel.tex new file mode 100644 index 00000000..93b2d2fe --- /dev/null +++ b/doc/uwsn/channel.tex @@ -0,0 +1,48 @@ +\documentclass[a4paper]{article} +\usepackage{amsmath} +\usepackage[utf8]{inputenc} +\usepackage[english]{babel} + +\usepackage[style=ieee]{biblatex} +\addbibresource{channel.bib} + + +\title{Channel models for terrestrial radio and acoustic underwater links} +\author{Bálint Áron Üveges} +\date{\today} + +\begin{document} +\maketitle + +\section{Castalia's path loss model} +Castalia utilizes the Log-distance path loss model: +\begin{equation} + PL_{d} = PL_{d0} + 10.0 \cdot \gamma \cdot log_{10} \left( \frac{d}{d_0} \right) + \mathcal{N}(0,\sigma) + \frac{\mathcal{N}(0,\sigma_{b})}{2} +\label{eq:log_d_pl} +\end{equation} +In \eqref{eq:log_d_pl}, $PL_{d0}$ is the path loss at the reference distance $d_{0}$; $d$ is the length of the path; $\gamma$ is the path loss exponent; $\mathcal{N}$ is the Gaussian-distribution, $\sigma$ is the standard variance of shadow fading; whereas $\sigma_{b}$ is the standard variance of bidirectional path loss jitter. + +\section{Underwater acoustic channel path loss model} +According to \cite{Stojanovic_2007}, the narrowband + +\section{Castalia's parameters, bits and pieces} +defaultChannel: +\begin{itemize} + \item \texttt{signalDeliveryThreshold} -- threshold in dBm above which, wireless channel module is delivering signal messages to radio modules of individual nodes. +\end{itemize} + +radio: +\begin{itemize} + \item \texttt{carrierFreq} -- The carrier frequency in MHz. + \item \texttt{rssiIntegrationTime} -- rssiIntegrationTime = symbolsForRSSI * RXmode->bitsPerSymbol / RXmode->datarate + \item \texttt{timeToTxPacket} -- Provided by popAndSendToWirelessChannel(), calculated as: double txTime = ((double)(end->getByteLength() * 8.0f)) / RXmode->datarate; (in seconds) + \item \texttt{parameter file} -- Name, dataRate(kbps), modulationType, bitsPerSymbol, bandwidth(MHz), noiseBandwidth(KHz), noiseFloor(dBm), sensitivity(dBm), powerConsumed(mW) + \item \texttt{SNR2BER} -- method used to calculate BER based on SNR and the actual modulation. +\end{itemize} + +\section{AquaSim's parameters, bits and pieces} + + + +\printbibliography +\end{document} From 01d0f5d0fc05e0b0fe69043cbf1daf660cd44dd0 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Mon, 15 Dec 2025 15:04:52 +0100 Subject: [PATCH 4/7] document update, mostly AquaSim's --- doc/uwsn/aqua-sim-ng-packet-path.png | Bin 0 -> 163613 bytes doc/uwsn/build.sh | 1 + doc/uwsn/channel.tex | 69 ++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 doc/uwsn/aqua-sim-ng-packet-path.png create mode 100755 doc/uwsn/build.sh diff --git a/doc/uwsn/aqua-sim-ng-packet-path.png b/doc/uwsn/aqua-sim-ng-packet-path.png new file mode 100644 index 0000000000000000000000000000000000000000..f52a50fef673baab241ef22d591eb826b448e0fe GIT binary patch literal 163613 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 literal 0 HcmV?d00001 diff --git a/doc/uwsn/build.sh b/doc/uwsn/build.sh new file mode 100755 index 00000000..6756b43a --- /dev/null +++ b/doc/uwsn/build.sh @@ -0,0 +1 @@ +latexmk -bibtex -pdf -pdflatex="pdflatex -halt-on-error -interaction=nonstopmode -shell-escape" -use-make channel.tex diff --git a/doc/uwsn/channel.tex b/doc/uwsn/channel.tex index 93b2d2fe..42f8f09a 100644 --- a/doc/uwsn/channel.tex +++ b/doc/uwsn/channel.tex @@ -2,7 +2,8 @@ \usepackage{amsmath} \usepackage[utf8]{inputenc} \usepackage[english]{babel} - +\usepackage{cleveref} +\usepackage{graphicx} \usepackage[style=ieee]{biblatex} \addbibresource{channel.bib} @@ -41,7 +42,73 @@ \section{Castalia's parameters, bits and pieces} \end{itemize} \section{AquaSim's parameters, bits and pieces} +\subsection{Packet traversal} + +Packets generated by an AquaSim node traverses along the data path illustrated in \cref{fig:aquasim-packet-path}. From propagation perspective, it is only relevant to analyze the traversal from the MAC layer. + +\begin{figure}[h] +\centering +\includegraphics[width=\textwidth]{aqua-sim-ng-packet-path.png} + \caption{Path of a packet traversing between different components} +\label{fig:aquasim-packet-path} +\end{figure} + +\subsubsection{\texttt{AquaSimMac::TxProcess}} +The \texttt{TxProcess} is a virtual method, provided by the \texttt{AquaSimMac} class. In case of the \texttt{AquaSimBroadcastMac} class, it performs backoff or drops the packet if the device is not in \texttt{NIDLE} state. In \texttt{NIDLE} state, the MAC and AquaSim headers are added, the transmission time determined, and the \texttt{SendDown} method from the parent class is called. + +\subsubsection{\texttt{AquaSimMac::SendDown}} +The \texttt{SendDown} method either sends the packet directly to the Radio, via \texttt{AquaSimPhy}'s \texttt{Recv} (\texttt{IDLE} state), queues the packet (\texttt{RECV} state), or drops the packet (\texttt{SLEEP} state). The method also addds the \texttt{AquaSimPacketStamp} header and schedules the \texttt{SetTransmissionStatus} method call once the transmission is finished. + +\subsubsection{\texttt{AquaSimPhy::Recv}}\label{sssec:radio_recv} +In reality, the \texttt{Recv} method is implemented in the \texttt{AquaSimPhyCmn} class, derived from the \texttt{AquaSimPhy}. Depending on the direction encoded in the packet's AquaSim header, the packet is either handed to the \texttt{PktTransmit} method (\texttt{DOWN}), or after prevalidation detailed in \cref{sssec:prevalid}, queued into the \texttt{m\_sC} (\texttt{UP}). + +\subsubsection{\texttt{AquaSimPhy::PktTransmit}} +Similarly to the \texttt{Recv} method, the \texttt{PktTransmit} is also implemented in the \texttt{AquaSimPhyCmn} class. The method performs checks with regards to failure state, \texttt{SLEEP} state, and energy level. It substracts the power used to perform Tx from the battery. Stamps TX info, that is, \texttt{m\_pT}, \texttt{m\_lambda}, \texttt{m\_freq}, and \texttt{m\_transRange}. It also adjusts \texttt{EM}'s TX power accordingly. The method also schedules a timer to return to \texttt{NIDLE} state based on the delay, calculated based on modulation and size. Finally, the method notifies the corresponding channel, indicating the channel ID to the \texttt{Recv} method. + +One interesting thing is, that the \texttt{m\_channel} is a vector of channel pointers (smart). + +\subsubsection{\texttt{AquaSimChannel::Recv}} +The \texttt{Recv} method is just simply calling the \texttt{SendUp} method. Whereas the \texttt{Recv} returns a boolean value, it is not evaluated by the callee method, \texttt{PktTransmit}. + +\subsubsection{\texttt{AquaSimChannel::SendUp}} +The \texttt{SendUp} method first collects all devices that may receive the signal. It is down by calling the \texttt{{ReceivedCopies}} method, detailed in \cref{sssec:reccop}. The result is not a simple array of devices, it is also annotated with delay and received power. + +The method iterates over all recipients, calculates delay (once again, however it is already done by \texttt{ReceivedCopies} at this stage), and retrieves the stamp from the packet. Based on the recipient's annotated data, it adds the received power to the stamp, adds noise and distance-based propagation delay. Finally, it schedules each copy to arrive at the corresponding device's Radio, with the calculated delay. + +The noise is calculated by the \texttt{AquaSimNoiseGen::Noise} method. The method utilizes the noise model described in \cite{Stojanovic_2007}, in section II.B. Whereas the model uses \textit{dB}, prior to returning with the result, the method raises the result to the power of $10$. + +The behaviour of the Radio's \texttt{Recv} module is already explained in \cref{sssec:radio_recv}. + +\subsubsection{\texttt{AquaSimPropagation::ReceivedCopies}}\label{sssec:reccop} +The \texttt{RecievedCopies} inspects the stamp header to retrieve frequency and Tx power, calculates distance of the sender and all receivers and the Rx power and delay related to the Packet as it arrives to the receiver. Interestingly, no receivers are filtered based on the transmission range. + +\subsubsection{\texttt{AuqaSimPhy::PrevalidateIncomingPkt}}\label{sssec:prevalid} +The \texttt{PrevalidateIncomingPkt} method performs frequency matching and device failure check. If the device is in \texttt{RECV} mode or the received signal strength does not exceed the RX threshold, the packet is flagged with error (\texttt{SetErrorFlag}) and the collision flag is set on Radio level. Otherwise the device is set to \texttt{RECV} state (without any prior check), and a call to \texttt{SetTransmissionStatus} is scheduled. Quite ambiguously, the state change's timer is calculated via the \texttt{CalcTxTime}, utilizing the AquaSim header's \texttt{size} property. The method also takes the preamble length into account and the modulation. The time is calculated per bit. + +The method also updates the energy consumption, but in this case with the AquaSim header's getTxTime results. The question is: why? + +Finally, if the packet is not flagged with error, it schedules the \texttt{CollisionCheck} method, but returns with a null pointer. However, if the method identifies failure, it returns a pointer to the packet. + +Note: Both the \texttt{CollisionCheck} method and the \texttt{Recv} schedules the packet to \texttt{m\_sC} variable (signal cache) with the \texttt{AddNewPacket} method. + +\subsubsection{\texttt{AquaSimSignalCache::AddNewPacket}} +The \texttt{AddNewPacket} method performs check on the AquaSim header's error flag, and casts the packet as \texttt{IncomingPacket} with adding the information. The method calls the \texttt{AddNewSubmission} method, where based on AquaSim's header size the \texttt{Expire} method id scheduled, which calls the \texttt{SubmitPkt} method. + +The \texttt{AddNewPacket} method stores the packet in a linked list, as the first element. + +The method also adjusts the power strength (\textit{this is what (s)he said}) and calls the \texttt{UpdatePacketStatus} method. The aforementioned method iterates through the linked list of packets, and calculates the noise level, as $p_{noise} = p_{total} - p_{s}$, where $p_{total}$ is set to the value of the total RX power in the \texttt{AddNewSubmission} additively (\texttt{+=} operator), and the $p_{s}$ is also set to RX power, retrieved from the energy modul (model). The method calls the Radio's \texttt{Decodable}, that is just a guard method before calling the SINR checkerwith $\frac{p_{s}}{p_{noise}}$, evaluated against \texttt{m\_decThresh}, which is set to $0$. + +\subsubsection{\texttt{AquaSimSignalCache::SubmitPkt}} +The \texttt{SubmitPkt} method calls the \texttt{DeleteIncomingPacket} method, which removes the packet from the linked list. The total energy is also decreased with the TX energy, retrieved from the EM module. If the packet is not invalidated until now by the noise or by the energy level, the \texttt{SignalCacheCallback} is called. + +\subsubsection{\texttt{AquaSimPhy::SignalCacheCallback}} +The \texttt{SignalCacheCallback} updates the AquaSim header with TX time set to $0.1$ s and calls the \texttt{SendPktUp} method. + +\subsubsection{\texttt{AquaSimPhy::SendPktUp}} +The \texttt{SendPktUp} method dispatches the packet based on the MAC header's \texttt{m\_demuxPType}. The field is set to \texttt{UWPTYPE\_OTHER} as default, and the method calls the MAC layer's \texttt{RecvProcess} method. +\subsubsection{\texttt{AquaSimMac::RecvProcess}} +The \texttt{RecvProcess} method evaluates the AquaSim header's error flag, and either discards the packet or forwards to the upper layer (at least in case of Broadcast MAC). \printbibliography From 781d3761643f92c3cece7c7e8a4dbf20cae8ebdf Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Thu, 18 Dec 2025 13:01:21 +0100 Subject: [PATCH 5/7] documentation, thorp model, water-specific noise --- doc/uwsn/channel.tex | 26 ++++++- src/node/communication/radio/Radio.h | 1 + .../underwaterChannel/UnderWaterChannel.cc | 75 +++++++++++++++---- .../underwaterChannel/UnderWaterChannel.h | 40 ++++++---- .../underwaterChannel/UnderWaterChannel.ned | 6 ++ 5 files changed, 119 insertions(+), 29 deletions(-) diff --git a/doc/uwsn/channel.tex b/doc/uwsn/channel.tex index 42f8f09a..0fe43992 100644 --- a/doc/uwsn/channel.tex +++ b/doc/uwsn/channel.tex @@ -3,6 +3,7 @@ \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage{cleveref} +\usepackage{textcomp} \usepackage{graphicx} \usepackage[style=ieee]{biblatex} \addbibresource{channel.bib} @@ -27,6 +28,7 @@ \section{Underwater acoustic channel path loss model} According to \cite{Stojanovic_2007}, the narrowband \section{Castalia's parameters, bits and pieces} +\subsection{Parameters} defaultChannel: \begin{itemize} \item \texttt{signalDeliveryThreshold} -- threshold in dBm above which, wireless channel module is delivering signal messages to radio modules of individual nodes. @@ -35,12 +37,32 @@ \section{Castalia's parameters, bits and pieces} radio: \begin{itemize} \item \texttt{carrierFreq} -- The carrier frequency in MHz. - \item \texttt{rssiIntegrationTime} -- rssiIntegrationTime = symbolsForRSSI * RXmode->bitsPerSymbol / RXmode->datarate - \item \texttt{timeToTxPacket} -- Provided by popAndSendToWirelessChannel(), calculated as: double txTime = ((double)(end->getByteLength() * 8.0f)) / RXmode->datarate; (in seconds) + \item \texttt{rssiIntegrationTime} -- rssiIntegrationTime = symbolsForRSSI * RXmode\textrightarrow bitsPerSymbol / RXmode \textrightarrow datarate + \item \texttt{timeToTxPacket} -- Provided by popAndSendToWirelessChannel(), calculated as: double txTime = ((double)(end \textrightarrow getByteLength() * 8.0f)) / RXmode \textrightarrow datarate; (in seconds) \item \texttt{parameter file} -- Name, dataRate(kbps), modulationType, bitsPerSymbol, bandwidth(MHz), noiseBandwidth(KHz), noiseFloor(dBm), sensitivity(dBm), powerConsumed(mW) \item \texttt{SNR2BER} -- method used to calculate BER based on SNR and the actual modulation. \end{itemize} +\subsubsection{Packet traversal} +Castalia's packet path is relatively simple in terms of utilized objects: +MAC \textrightarrow Radio \textrightarrow Wireless Channel \textrightarrow Radio \textrightarrow MAC. + +\subsubsection{MAC} +Castalia's T-MAC implementation depends on the \texttt{TX\_TIME} function call when determining timeouts. The function is: \texttt{(phyLayerOverhead + x)*1/(1000 * phyDataRate/8.0)}, and is interpreted in seconds. + +\subsubsection{Radio} +The Radio module buffers incoming MAC packets, and schedules itself for sending. Each packet is broken into two parts: a \textit{begin} and an \textit{end} message. The begin message contains the output power in dBm, the frequency, bandwidth, modulation and encoding, whereas the end message contains the actual data and the physical frame overhead (as size?). The begin message is immediately sent to the wireless channel, whereas the end message is scheduled with \texttt{txTime} delay. The delay is calculated as \texttt{(double)(end->getByteLength() * 8.0f)) / RXmode->datarate;} + +\subsubsection{Physical Channel} +Once receiving the \texttt{WC\_SIGNAL\_START}, the physical channel module iterates over all cells, and collects those, which are affected by the sender based on the signal delivery threshold and the received signal strength attenuated by the path loss. A copy of the begin message is also sent with the calculated received signal strength. The \texttt{WC\_SIGNAL\_END} part of the handling iterates over the collected nodes, and sends the end message to each node. + +\noindent \textbf{Note:} contrary to AquaSim, in Castalia there is no delay on the wireless channel. However, a feasible solution would be to delay both the begin and the end message based on the distance between the sender and the receiver. + +\noindent \textbf{Note 2:} Castalia's major "weakness" is that the pathloss between each node is static for the simulation run. Whereas it is recommended do repeat a simulation scenario multiple times \cite{Ritter_2011}, a more "living" channel model would be more beneficial. A solution could be that the Gaussian noise and the asymmetric noise is recalculated in case of each \texttt{WC\_SIGNAL\_START} message in the physical channel. + +\subsubsection{Radio} +The Radio module calculates bit errors and iterates through all received signals since the last end signal. Each signal's bit error is additively updated based on BER. If bit errors are not exceeded based on encoding, the packet s forwarded to the MAC layer with \texttt{PROCESSING\_DELAY} set to $0.00001$. + \section{AquaSim's parameters, bits and pieces} \subsection{Packet traversal} diff --git a/src/node/communication/radio/Radio.h b/src/node/communication/radio/Radio.h index cdd9bfcc..d576ae7e 100644 --- a/src/node/communication/radio/Radio.h +++ b/src/node/communication/radio/Radio.h @@ -234,6 +234,7 @@ class Radio: public CastaliaModule { double readRSSI(); CCA_result isChannelClear(); PktBreakdown getStats() { return stats; }; + double getCarrierFrequency() { return carrierFreq;}; }; #endif //_RADIOMODULE_H_ diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc index 1a42bd50..be0bb5f9 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc @@ -104,6 +104,9 @@ void UnderWaterChannel::initialize(int stage) topo = new cTopology("topo"); topo->extractByNedTypeName(cStringTokenizer("node.Node").asVector()); + + Radio *radio = check_and_cast(topo->getNode(0)->getModule()->getSubmodule("Communcation")->getSubmodule("Radio")); + carrier_frequency=radio->getCarrierFrequency(); for (int i = 0; i < numOfNodes; i++) { VirtualMobilityManager *nodeMobilityModule = check_and_cast @@ -112,6 +115,8 @@ void UnderWaterChannel::initialize(int stage) nodeLocation[i].cell = i; if (!onlyStaticNodes) { + throw cRuntimeError("Mobility for underwater channel is not supported\n"); + /****************************************************************** * Compute the cell this node is in and initialize cellOccupation. * Cavaet in computing the XYZ indices: @@ -169,7 +174,7 @@ void UnderWaterChannel::initialize(int stage) * Allocate and initialize the pathLoss array. * This is the "propagation map" of our space. **********************************************/ - pathLoss = new list[numOfSpaceCells]; + pathLoss = new list[numOfSpaceCells]; if (pathLoss == NULL) throw cRuntimeError("Could not allocate array pathLoss\n"); @@ -190,9 +195,10 @@ void UnderWaterChannel::initialize(int stage) * speed up the filling of the pathLoss array, * especially for the mobile case. *******************************************************/ - float distanceThreshold = d0 * - pow(10.0,(maxTxPower - signalDeliveryThreshold - PLd0 + 3 * sigma) / - (10.0 * pathLossExponent)); + float distanceThreshold = 0; + // = d0 * +// pow(10.0,(maxTxPower - signalDeliveryThreshold - PLd0 + 3 * sigma) / +// (10.0 * pathLossExponent)); for (int i = 0; i < numOfSpaceCells; i++) { if (onlyStaticNodes) { @@ -206,7 +212,7 @@ void UnderWaterChannel::initialize(int stage) } /* Path loss to yourself is 0.0 */ - pathLoss[i].push_front(new PathLossElement(i, 0.0)); + pathLoss[i].push_front(new DistPathLossElement(i, 0.0, 0.0)); totalElements++; //keep track of pathLoss size for reporting purposes for (int j = i + 1; j < numOfSpaceCells; j++) { @@ -239,17 +245,28 @@ void UnderWaterChannel::initialize(int stage) bidirectionalPathLossJitter = 0; } else { - PLd = PLd0 + 10.0 * pathLossExponent * log10(dist / d0) + normal(0, sigma); + // + double d_km = dist / 1000; + double t1 = pow(d_km,spreading_factor); + double Af = calcThorp(carrier_frequency); + double A = pow(10.0,(Af/10.0)); + double t3 = pow(A,d_km); + + PLd = log10(t1 * t3); + + + + //PLd = PLd0 + 10.0 * pathLossExponent * log10(dist / d0) + normal(0, sigma); bidirectionalPathLossJitter = normal(0, bidirectionalSigma) / 2; } if (maxTxPower - PLd - bidirectionalPathLossJitter >= signalDeliveryThreshold) { - pathLoss[i].push_front(new PathLossElement(j,PLd + bidirectionalPathLossJitter)); + pathLoss[i].push_front(new DistPathLossElement(j,PLd + bidirectionalPathLossJitter, dist)); totalElements++; //keep track of pathLoss size for reporting purposes } if (maxTxPower - PLd + bidirectionalPathLossJitter >= signalDeliveryThreshold) { - pathLoss[j].push_front(new PathLossElement(i,PLd - bidirectionalPathLossJitter)); + pathLoss[j].push_front(new DistPathLossElement(i,PLd - bidirectionalPathLossJitter, dist)); totalElements++; //keep track of pathLoss size for reporting purposes } } @@ -378,8 +395,8 @@ void UnderWaterChannel::handleMessage(cMessage * msg) * by cellTx and check if there are nodes there. * Update the nodesAffectedByTransmitter array */ - list < PathLossElement * >::iterator it1; - for (it1 = pathLoss[cellTx].begin(); it1 != pathLoss[cellTx].end(); it1++) { +// list < PathLossElement * >::iterator it1; + for (auto it1 = pathLoss[cellTx].begin(); it1 != pathLoss[cellTx].end(); it1++) { /* If no nodes exist in this cell, move on. */ if (cellOccupation[(*it1)->cellID].empty()) continue; @@ -475,14 +492,13 @@ void UnderWaterChannel::finishSpecific() /* delete pathLoss */ for (int i = 0; i < numOfSpaceCells; i++) { - list ::iterator it1; y_out<cellID; @@ -529,6 +545,7 @@ void UnderWaterChannel::readIniFileParameters(void) bidirectionalSigma = par("bidirectionalSigma"); PLd0 = par("PLd0"); d0 = par("d0"); + spreading_factor = par("spreading_factor"); pathLossMapFile = par("pathLossMapFile"); temporalModelParametersFile = par("temporalModelParametersFile"); @@ -596,15 +613,17 @@ void UnderWaterChannel::parsePathLossMap(void) //If this pair is already defined in pathloss array, the old value is replaced, otherwise a new pathloss element is created void UnderWaterChannel::updatePathLossElement(int src, int dst, float pathloss_db) { + throw cRuntimeError("Not implemented\n"); + if (src >= numOfSpaceCells || dst >= numOfSpaceCells) return; - list ::iterator it1; + list ::iterator it1; for (it1 = pathLoss[src].begin(); it1 != pathLoss[src].end(); it1++) { if ((*it1)->cellID == dst) { (*it1)->avgPathLoss = pathloss_db; return; } } - pathLoss[src].push_front(new PathLossElement(dst, pathloss_db)); + pathLoss[src].push_front(new DistPathLossElement(dst, pathloss_db, 0.0)); } //wrapper function for atoi(...) call. returns 1 on error, 0 on success @@ -627,3 +646,31 @@ int UnderWaterChannel::parseFloat(const char *c, float *dst) return 1; return 0; } + +double UnderWaterChannel::calcThorp(double frequency) { + return (0.11 * pow(frequency,2) / (1 + pow(frequency,2) ) + + 44 * pow(frequency,2) / (4100 + pow(frequency,2) ) + + 0.000275 * pow(frequency,2) + 0.0003 ); +} + +double UnderWaterChannel::calcNoise(double frequency) { + double turbulence, wind, ship, thermal; + double turbulenceDb, windDb, shipDb, thermalDb; + + turbulenceDb = 17.0 - 30.0 * std::log10 (frequency); + turbulence = std::pow (10.0, turbulenceDb * 0.1); + + shipDb = 40.0 + 20.0 * (shipping_noise - 0.5) + 26.0 * + std::log10 (frequency) - 60.0 * std::log10 (frequency + 0.03); + ship = std::pow (10.0, (shipDb * 0.1)); + + windDb = 50.0 + 7.5 * std::pow (wind_noise, 0.5) + 20.0 * + std::log10 (frequency) - 40.0 * std::log10 (frequency + 0.4); + wind = std::pow (10.0, windDb * 0.1); + + thermalDb = -15 + 20 * std::log10 (frequency); + thermal = std::pow (10, thermalDb * 0.1); + + return (10 * std::log10 (turbulence + ship + wind + thermal) ); +} + diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h index a0d6bf0d..4ed7c384 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h @@ -1,14 +1,14 @@ -/**************************************************************************** - * Copyright: National ICT Australia, 2007 - 2010 * - * Developed at the ATP lab, Networked Systems research theme * - * Author(s): Athanassios Boulis, Yuriy Tselishchev * - * This file is distributed under the terms in the attached LICENSE file. * - * If you do not find this file, copies can be found by writing to: * - * * - * NICTA, Locked Bag 9013, Alexandria, NSW 1435, Australia * - * Attention: License Inquiry. * - * * - ****************************************************************************/ + /**************************************************************************** + * Copyright: National ICT Australia, 2007 - 2010 * + * Developed at the ATP lab, Networked Systems research theme * + * Author(s): Athanassios Boulis, Yuriy Tselishchev * + * This file is distributed under the terms in the attached LICENSE file. * + * If you do not find this file, copies can be found by writing to: * + * * + * NICTA, Locked Bag 9013, Alexandria, NSW 1435, Australia * + * Attention: License Inquiry. * + * * + ****************************************************************************/ #ifndef _UNDERWATERCHANNEL_H #define _UNDERWATERCHANNEL_H @@ -18,12 +18,19 @@ #include "wirelessChannel/defaultChannel/WirelessChannel.h" #include "node/mobilityManager/VirtualMobilityManager.h" #include "helpStructures/CastaliaModule.h" +#include "node/communication/radio/Radio.h" #include "time.h" #include #include -using namespace std; + using namespace std; + +class DistPathLossElement : public PathLossElement { + public: + float dist; + DistPathLossElement(int c, float PL, float dist) : PathLossElement(c,PL), dist(dist) {}; +}; class UnderWaterChannel: public CastaliaModule { private: @@ -58,7 +65,7 @@ class UnderWaterChannel: public CastaliaModule { int numOfSpaceCells; int xIndexIncrement, yIndexIncrement, zIndexIncrement; - list *pathLoss; // an array of lists (numOfSpaceCels long) + list *pathLoss; // an array of lists (numOfSpaceCels long) // holding info on path loss. Element i of the // array is a list elements that describe which // cells are affected (and how) when a @@ -77,6 +84,11 @@ class UnderWaterChannel: public CastaliaModule { bool temporalModelDefined; channelTemporalModel *temporalModel; bool serializePathLossData; + double spreading_factor; + double carrier_frequency; + double shipping_noise; + double wind_noise; + protected: virtual void initialize(int); @@ -90,6 +102,8 @@ class UnderWaterChannel: public CastaliaModule { void printRxSignalTable(void); void updatePathLossElement(int, int, float); float calculateProb(float, int); + double calcThorp(double); + double calcNoise(double frequency); int numInitStages() const; }; diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned index b6f6d795..992baf9b 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.ned @@ -46,8 +46,14 @@ simple UnderWaterChannel like wirelessChannel.iWirelessChannel { // threshold in dBm above which, wireless channel module // is delivering signal messages to radio modules of // individual nodes + bool serializePathLossData = default(false);// Serialize path loss data to yaml file + double spreading_factor = default(2.0); // Geometry of the propagation, 1.0 - cylindrical, 2.0 - spherical, + // 1.5 - practical + double shipping_noise = default(0.0); // Shipping noise, normalized + double wind_noise = default(1.0); // Wind (actually breaking waves due to wind) noise, m/s + gates: output toNode[]; input fromMobilityModule @ directIn; From c50642d33321a37e05cb4a228e99da484953e370 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Thu, 18 Dec 2025 16:58:01 +0100 Subject: [PATCH 6/7] delay added --- .../underwaterChannel/UnderWaterChannel.cc | 17 ++++++++++------- .../underwaterChannel/UnderWaterChannel.h | 10 +++++++++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc index be0bb5f9..4162abaf 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc @@ -252,7 +252,7 @@ void UnderWaterChannel::initialize(int stage) double A = pow(10.0,(Af/10.0)); double t3 = pow(A,d_km); - PLd = log10(t1 * t3); + PLd = log10(t1 * t3) + calcNoise(carrier_frequency); @@ -285,7 +285,7 @@ void UnderWaterChannel::initialize(int stage) * This makes the code more compact. We also have temporal variations * so the nodes that are affected are not necessarily the same. *********************************************************************/ - nodesAffectedByTransmitter = new list[numOfNodes]; + nodesAffectedByTransmitter = new list[numOfNodes]; if (nodesAffectedByTransmitter == NULL) throw cRuntimeError("Could not allocate array nodesAffectedByTransmitter\n"); @@ -437,8 +437,8 @@ void UnderWaterChannel::handleMessage(cMessage * msg) receptioncount++; WirelessChannelSignalBegin *signalMsgCopy = signalMsg->dup(); signalMsgCopy->setPower_dBm(currentSignalReceived); - send(signalMsgCopy, "toNode", *it2); - nodesAffectedByTransmitter[srcAddr].push_front(*it2); + sendDelayed(signalMsgCopy, calcDelay((*it1)->dist), "toNode", *it2); + nodesAffectedByTransmitter[srcAddr].push_front({*it2,(*it1)->dist}); } //for it2 } //for it1 @@ -456,11 +456,11 @@ void UnderWaterChannel::handleMessage(cMessage * msg) /* Go through the list of nodes that were affected * by this transmission. *it1 holds the node ID */ - list ::iterator it1; - for (it1 = nodesAffectedByTransmitter[srcAddr].begin(); + + for (auto it1 = nodesAffectedByTransmitter[srcAddr].begin(); it1 != nodesAffectedByTransmitter[srcAddr].end(); it1++) { WirelessChannelSignalEnd *signalMsgCopy = signalMsg->dup(); - send(signalMsgCopy, "toNode", *it1); + sendDelayed(signalMsgCopy, calcDelay(it1->dist),"toNode", it1->id); } //for it1 /* Now that we are done processing the msg we delete the whole list @@ -674,3 +674,6 @@ double UnderWaterChannel::calcNoise(double frequency) { return (10 * std::log10 (turbulence + ship + wind + thermal) ); } +double UnderWaterChannel::calcDelay(double dist) { + return dist / SOUND_SPEED_IN_WATER; +} diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h index 4ed7c384..a23a617d 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.h @@ -24,6 +24,8 @@ #include #include +#define SOUND_SPEED_IN_WATER 1500.0 + using namespace std; class DistPathLossElement : public PathLossElement { @@ -32,6 +34,11 @@ class DistPathLossElement : public PathLossElement { DistPathLossElement(int c, float PL, float dist) : PathLossElement(c,PL), dist(dist) {}; }; +struct AffectedNode { + int id; + double dist; +}; + class UnderWaterChannel: public CastaliaModule { private: @@ -71,7 +78,7 @@ class UnderWaterChannel: public CastaliaModule { // cells are affected (and how) when a // node in cell i transmits. - list *nodesAffectedByTransmitter; // an array of lists (numOfNodes long). The list + list *nodesAffectedByTransmitter; // an array of lists (numOfNodes long). The list // at array element i holds the node IDs that are // affected when node i transmits. @@ -104,6 +111,7 @@ class UnderWaterChannel: public CastaliaModule { float calculateProb(float, int); double calcThorp(double); double calcNoise(double frequency); + double calcDelay(double dist); int numInitStages() const; }; From 2e8b6b35331ecb7d986b0cab5c0c846c8969dd64 Mon Sep 17 00:00:00 2001 From: Balint Uveges Date: Fri, 19 Dec 2025 09:10:57 +0100 Subject: [PATCH 7/7] update some safety exception --- src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc index 4162abaf..781dcd72 100644 --- a/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc +++ b/src/wirelessChannel/underwaterChannel/UnderWaterChannel.cc @@ -49,6 +49,7 @@ void UnderWaterChannel::initialize(int stage) if (onlyStaticNodes) { numOfSpaceCells = numOfNodes; } else { + throw cRuntimeError("Mobility not implemented\n"); if (xFieldSize <= 0) { xFieldSize = 1; xCellSize = 1;