⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklayermodel.java

📁 tinyos-2.0源代码!转载而已!要的尽管拿!
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        outVar.nodePosX[i] = (i%nodesX) * cellLength + rand.nextDouble()*cellLength;        outVar.nodePosY[i] = (i/nodesX) * cellLength + rand.nextDouble()*cellLength;        wrongPlacement = true;        while ( wrongPlacement ) {          for (j = 0; j < i; j = j+1) {            Xdist = outVar.nodePosX[i] - outVar.nodePosX[j];            Ydist = outVar.nodePosY[i] - outVar.nodePosY[j];            // distance between a given pair of nodes            dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5);            if (dist < inVar.d0) {              outVar.nodePosX[i] = (i%nodesX) * cellLength + rand.nextDouble()*cellLength;              outVar.nodePosY[i] = (i/nodesX) * cellLength + rand.nextDouble()*cellLength;              wrongPlacement = true;              break;            }          }          if ( j == i ) {            wrongPlacement = false;          }        }      }      break;    case 3: // RANDOM      if ( (inVar.Xterr <= 0) | (inVar.Yterr <= 0) ) {        System.out.println("\nError: values of TERRAIN_DIMENSIONS must be positive");        System.exit(1);      }      cellLength = Math.sqrt ( inVar.area / inVar.numNodes );         if ( cellLength < (inVar.d0*1.4) ) {        System.out.println ("\nError: on RANDOM topology, density is too high, increase physical terrain");        System.exit(1);      }      for (i = 0; i < inVar.numNodes; i = i+1) {        outVar.nodePosX[i] = rand.nextDouble() * inVar.Xterr;        outVar.nodePosY[i] = rand.nextDouble() * inVar.Yterr;        wrongPlacement = true;        while ( wrongPlacement ) {          for (j = 0; j < i; j = j+1) {            Xdist = outVar.nodePosX[i] - outVar.nodePosX[j];            Ydist = outVar.nodePosY[i] - outVar.nodePosY[j];            // distance between a given pair of nodes            dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5);            if (dist < inVar.d0) {              outVar.nodePosX[i] = rand.nextDouble() * inVar.Xterr;              outVar.nodePosY[i] = rand.nextDouble() * inVar.Yterr;              wrongPlacement = true;              break;            }          }          if ( j == i ) {            wrongPlacement = false;          }        }      }      break;    case 4: // FILE (user-defined topology)      readTopologyFile(inVar.topFile, outVar);      correctTopology (inVar, outVar);      break;    default:      System.out.println("\nError: topology is not correct, please check TOPOLOGY in the configuration file");      System.exit(1);    }    return true;  }  /**   * Checks that user-defined topology does not have inter-node distances less than D0 meter,    * where D0 is the reference distance in the channel model (specified in configuration file)   *   * @param inVar class that stores input parameters from configuration file   * @param outVar class that stores link gains, noise floors and x/y coordinates   * @return true if x/y coordinates provided by user satisfy the condition that no internode distance is lesss than D0   */  protected static boolean correctTopology ( InputVariables  inVar,                                              OutputVariables outVar )  {    Random rand = new Random();    int i, j;    double Xdist, Ydist, dist, avgDecay;    for (i = 0; i < inVar.numNodes; i = i+1) {      for (j = i+1; j < inVar.numNodes; j = j+1 ) {        Xdist = outVar.nodePosX[i] - outVar.nodePosX[j];        Ydist = outVar.nodePosY[i] - outVar.nodePosY[j];        // distance between a given pair of nodes        dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5);        if (dist < inVar.d0) {          System.out.println("\nError: file " + inVar.topFile + " contains inter-node distances less than one.");          System.exit(1);        }      }    }    return true;  }  /**   * Obtains output power and noise floor for all nodes in the network   *   * @param inVar class that contains radio parameters   * @param outVar class that stores output powers and noise floors   * @return true if all output powers and noise floors were obtained correctly   */  protected static boolean obtainRadioPtPn ( InputVariables  inVar,                                              OutputVariables outVar )  {    Random rand = new Random();    int i, j;    double t11, t12, t21, t22;    double rn1, rn2;    t11 = 0;    t12 = 0;    t21 = 0;    t22 = 0;    if ( (inVar.s11 == 0) && (inVar.s22 == 0) ) { // symmetric links do nothing    }    else if ( (inVar.s11 == 0) && (inVar.s22 != 0) ) { // both S11 and S22 must be 0 for symmetric links      System.out.println("\nError: symmetric links require both, S11 and S22 to be 0, not only S11.");      System.exit(1);    }    else {      if ( (inVar.s12 != inVar.s21) ) { // check that S is symmetric        System.out.println("\nError: S12 and S21 must have the same value.");        System.exit(1);      }      if ( Math.abs(inVar.s12) > Math.sqrt(inVar.s11*inVar.s22) ) { // check that correlation is within [-1,1]        System.out.println("\nError: S12 (and S21) must be less than sqrt(S11xS22).");        System.exit(1);      }      t11 = Math.sqrt(inVar.s11);      t12 = inVar.s12/Math.sqrt(inVar.s11);      t21 = 0;      t22 = Math.sqrt( (inVar.s11*inVar.s22 - Math.pow( inVar.s12, 2)) / inVar.s11 );    }    for (i = 0; i < inVar.numNodes; i = i+1) {      rn1 = rand.nextGaussian();      rn2 = rand.nextGaussian();      outVar.noisefloor[i]  = inVar.pn + t11 * rn1;      outVar.outputpowervar[i] = t12 * rn1 + t22 * rn2;    }    return true;  }  /**   * Obtains gain for all links in the network. The link gain between nodes A and B    * is defined as the output power of A minus the pathloss between A and B.   *   * @param inVar class that contains channel parameters from configuration file   * @param outVar class that stores link gains   * @return true if all link gains were obtained correctly   */  protected static boolean obtainLinkGain ( InputVariables  inVar,                                             OutputVariables outVar )  {    Random rand = new Random();    int i, j;    double Xdist, Ydist, dist, pathloss;    for (i = 0; i < inVar.numNodes; i = i+1) {      for (j = i+1; j < inVar.numNodes; j = j+1 ) {        Xdist = outVar.nodePosX[i] - outVar.nodePosX[j];        Ydist = outVar.nodePosY[i] - outVar.nodePosY[j];        // distance between a given pair of nodes        dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5);        // mean decay dependent on distance        pathloss = - inVar.pld0 - 10*inVar.n*(Math.log(dist/inVar.d0)/Math.log(10.0)) + ( rand.nextGaussian()*inVar.sigma );        // assymetric links are given by running two different        // R.V.s for each unidirectional link (output power variance).        outVar.linkGain[i][j] = outVar.outputpowervar[i] + pathloss;        outVar.linkGain[j][i] = outVar.outputpowervar[j] + pathloss;        }    }    return true;  }  /**   * Provides link gain and noise floor in file linkgain.out, and the   * X/Y coordinates in file topology.out.   *   * @param inVar class that contains input parameters from configuration file   * @param outVar class that stores link gains, noise floors and x/y coordinates   * @return true if files linkgain.out and topology.out were printed correctly   */  protected static boolean printFile( InputVariables  inVar,                                       OutputVariables outVar )  {    int i, j;    DecimalFormat posFormat = new DecimalFormat("##0.00");    /*     * Output file for xy coordinates.     */    try{      FileOutputStream fout =  new FileOutputStream("topology.out");      try {        PrintStream myOutput = new PrintStream(fout);        for (i = 0; i < inVar.numNodes; i = i+1) {          myOutput.print( i + "\t" + posFormat.format(outVar.nodePosX[i]) + "\t"+ posFormat.format(outVar.nodePosY[i]) + "\n");        }      }      catch (Exception e) {        System.out.println("\nError : Failed to open a print stream to the linkgain file" + e);      }    }    catch (Exception e) {      System.out.println("\nError : Failed to open the link gain file linkgains.out:" + e);    }       /*     * Output file for link gains.     */    try{      FileOutputStream fout =  new FileOutputStream("linkgain.out");      try {        PrintStream myOutput = new PrintStream(fout);        for (i = 0; i < inVar.numNodes; i = i+1) {          for (j = (i+1); j < inVar.numNodes; j = j+1 ) {            if ( i != j) {              myOutput.print( "gain\t" + i + "\t" + j + "\t" + posFormat.format(outVar.linkGain[i][j]) + "\n");              myOutput.print( "gain\t" + j + "\t" + i + "\t" + posFormat.format(outVar.linkGain[j][i]) + "\n");            }          }        }        for (i = 0; i < inVar.numNodes; i = i+1) {          myOutput.print( "noise\t" + i + "\t" + posFormat.format(outVar.noisefloor[i]) + "\t" + posFormat.format(inVar.wgn) + "\n");        }      }      catch (Exception e) {        System.out.println("\nError : Failed to open a print stream to the linkgain file" + e);      }    }    catch (Exception e) {      System.out.println("\nError : Failed to open the link gain file linkgains.out:" + e);    }    return true;  }  /**   * Obtains nodes coordinates for user-defined topology.   *     * @param inputTopoFile topology file provided by user   * @param outVar class that contains variables to store x/y coordinates of nodes   * @return true if x/y coordinates of user-defined topology file were read correctly.   */  protected static boolean readTopologyFile ( String inputTopoFile,                                              OutputVariables outVar )  {    String thisLine;    StringTokenizer st;    int counter = 0;    try {      FileInputStream fin =  new FileInputStream(inputTopoFile);      try {        BufferedReader myInput = new BufferedReader(new InputStreamReader(fin));        try {          while ((thisLine = myInput.readLine()) != null) {            if ( !thisLine.equals("")  && !thisLine.startsWith("%") &&                  !thisLine.startsWith(" ") ) {              st = new StringTokenizer(thisLine, " \t");              int node = Integer.parseInt(st.nextToken());              double x = Double.valueOf(st.nextToken()).doubleValue();              double y = Double.valueOf(st.nextToken()).doubleValue();              outVar.nodePosX[node] = x;              outVar.nodePosY[node] = y;              counter++;            }          }        } // end try        catch (Exception e) {          System.out.println("Error4: " + e);          System.exit(1);        }      } // end try      catch (Exception e) {        System.out.println("Error5: " + e);        System.exit(1);      }    } // end try    catch (Exception e) {      System.out.println("Error: Failed to Open TOPOLOGY_FILE " + inputTopoFile + e);      System.exit(1);    }    return true;  }  /**   * Obtains number of nodes in network when user defines the topology.   *   * @param inputTopoFile topology file provided by user   * @param inVar class that contains variable for number of nodes   * @return true if number of nodes from user-defined topology file were obtained correctly   */  protected static boolean obtainNumNodes ( String inputTopoFile,                                            InputVariables inVar )  {    String thisLine;    StringTokenizer st;    int counter = 0;    try {      FileInputStream fin =  new FileInputStream(inputTopoFile);      try {        BufferedReader myInput = new BufferedReader(new InputStreamReader(fin));        try {          while ((thisLine = myInput.readLine()) != null) {            if ( !thisLine.equals("")  && !thisLine.startsWith("%") &&                  !thisLine.startsWith(" ") ) {              counter++;            }          }          inVar.numNodes = counter;         } // end try        catch (Exception e) {          System.out.println("Error4: " + e);          System.exit(1);        }      } // end try      catch (Exception e) {        System.out.println("Error5: " + e);        System.exit(1);      }    } // end try    catch (Exception e) {      System.out.println("Error: Failed to Open TOPOLOGY_FILE " + inputTopoFile + e);      System.exit(1);    }    return true;  }  private static void usage() {    System.err.println("usage: net.tinyos.sim.LinkLayerModel <config file>");  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -