EPANET中讀取INPUT文件的函數文件——INPUT1.C/INPUT2.C/INPUT3.C

     首先介紹下這3個文件的關係:能夠說INPUT1.C的函數粒度最大,它的函數getdata()就完成了整個INPUT文件數據的讀入,該函數又調用了INPUT2.C中的部分函數,INPUT2.C文件中的函數分爲兩類,一類是解析INPUT文件的函數;另外一類是工具函數,包括將節點、管段數據存入哈希表中,構建哈希索引、字符串的匹配,從哈希表中查找數據等,該文件的粒度中等。而INPUT3.C的粒度是最細的,他是用於解析單行INPUT文件的對象內容並保存到內存中。INPUT3.C的組織結構也很簡單,各個函數具備較大的類似性,分別是對INPUT文件中的不一樣段落數據的處理。node

     其中INPUT2.C文件中的unlinked()函數是檢查孤立管點,這個數據檢查的算法比較高效值得借鑑,該算法的巧妙之處能夠參考代碼中的註釋:算法

 1 int  unlinked()
 2 /*
 3 **--------------------------------------------------------------
 4 ** Input:   none                                                ;輸入:無
 5 ** Output:  returns error code if any unlinked junctions found  ;輸出:若是存在孤立點則返回錯誤代碼
 6 ** Purpose: checks for unlinked junctions in network            ;目的:檢查管網中的孤立點
 7 **                                                              
 8 ** NOTE: unlinked tanks have no effect on computations.         ;注意:沒有鏈接的蓄水池對計算無效
 9 **--------------------------------------------------------------
10 */
11 {
12    char  *marked;
13    int   i,err, errcode;
14    errcode = 0;
15    err = 0;
16    marked   = (char *) calloc(Nnodes+1,sizeof(char));  //開闢連續的全部節點內存空間
17    ERRCODE(MEMCHECK(marked));
18    if (!errcode)
19    {
20       memset(marked,0,(Nnodes+1)*sizeof(char));//給這塊內存空間置0
21       for (i=1; i<=Nlinks; i++)            /* Mark end nodes of each link */
22       {
23          marked[Link[i].N1]++;//以marked的內存的邏輯地址從一、二、3...開始去一一對應管段節點在Node中的索引值,從而標記出全部被管段引用做爲始末節點的索引值,而全部未標記成功的就是孤立的點。
24          marked[Link[i].N2]++;
25       }
26       for (i=1; i<=Njuncs; i++)            /* Check each junction  */
27       {
28          if (marked[i] == 0)               /* If not marked then error */
29          {
30             err++;
31             sprintf(Msg,ERR233,Node[i].ID);
32             writeline(Msg);
33          }
34          if (err >= MAXERRS) break;
35       }
36       if (err > 0) errcode = 200;
37    }
38    free(marked);
39    return(errcode);
40 }                        /* End of unlinked */

 

 

     在INPUT1.C這個文件中,咱們重點看下getdata(),就知道了它的功能:函數

 1 int  getdata()
 2 /*
 3 **----------------------------------------------------------------
 4 **  Input:   none                                ;輸入:無
 5 **  Output:  returns error code                  ;輸出:錯誤編號(大於100表示嚴重錯誤)
 6 **  Purpose: reads in network data from disk file;做用:從磁盤文件(*.inp)中讀入管網模型數據
 7 **----------------------------------------------------------------
 8 */
 9 {
10    int errcode = 0;
11    setdefaults();                /* Assign default data values     ;給vars.h中的部分全局變量賦值*/
12    initreport();                 /* Initialize reporting options   ;初始化報表選項*/
13    rewind(InFile);               /* Rewind input file              ;將INPUT文件的指針指向文件的開始*/
14    ERRCODE(readdata());          /* Read in network data           ;讀取整個管網數據,該部分的具體實現是依賴INPUT2.C與INPUT3.C*/
15    if (!errcode) adjustdata();   /* Adjust data for default values ;調整數據的默認值,當INPUT文件對部分關鍵參數缺乏描述時,這裏將從新賦值*/
16    if (!errcode) initunits();    /* Initialize units on input data ;肯定單位轉換因子,EPANET中的單位體系就2種,一種是英美製US,一種是米制,根據肯定的單位體系,來設置各節點、管段等的字段的轉換參數*/
17    ERRCODE(inittanks());         /* Initialize tank volumes        ;初始化水庫的容積*/
18    if (!errcode) convertunits(); /* Convert units on input data    ;在進行水力解算前對管段、節點、水泵、閥門的相關字段的單位數據進行轉換*/
19    return(errcode);
20 }                       /*  End of getdata  */
相關文章
相關標籤/搜索