首先介紹下這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 */