增加压裂直井、多段压裂水平井参数显示

feature/nm-para-property-20260615
lvjunjie 1 week ago
parent dcb4db2dfb
commit 45400e409f

@ -1 +1 @@
77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAg5pys5paH5qGj55qE55uu55qE5piv5bu656uLV1RBSeaVsOWAvOinoyhOTSnmqKHlnZfnmoTlj4LmlbDlrprkuYkgICAgICAgICAgICAgICAgLS0+DQo8IS0tICAgIOS7heWMheWQq1BFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlj4LmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSAgICBEYXRlOiAyMDI2MDYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQo8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KDQo8IS0tDQogICAg5Y+C5pWw6IyD5Zu077yaaOOAgVBp44CBS+OAgXBoaeOAgUN0aeOAgUNm44CBU29p44CBU3dpDQogICAg5a+55bqUIEhYX05XVE1fTU9ERUxfSU5QVVQ6OkJhc2Ug57uT5p6E5L2T5a2X5q61DQogICAg6YCa6L+HIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSDliqDovb3vvIxzS2V5IOagh+ivhuS4uiBzX05tX1NlcmllDQotLT4NCg0KPFJvb3Q+DQoNCiAgPFBhcmFHcm91cCBOYW1lPSIiIEFsaWFzPSLlgqjlsYLlj4LmlbAiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSLlgqjlsYLljprluqYiICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iNiIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IuWIneWni+WOi+WKmyIgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9Iua4l+mAj+eOhyIgICAgICAgICBVbml0PSJtRCIgICAgRGVmYXVsdD0iMSIgICAgIE1heD0iMTAwMDAiICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJwZXJtZWFiaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9InBoaSIgQWxpYXM9IuWtlOmameW6piIgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjYiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0i57u85ZCI5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0i5bKp55+z5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMDEiIE1heD0iMTAiICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InJvY2sgY29tcHJlc3NpYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTb2kiIEFsaWFzPSLliJ3lp4vlkKvmsrnppbHlkozluqYiIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjgiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgb2lsIHNhdHVyYXRpb24iIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlN3aSIgQWxpYXM9IuWIneWni+WQq+awtOmlseWSjOW6piIgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuMiIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCB3YXRlciBzYXR1cmF0aW9uIiAvPg0KICA8L1BhcmFHcm91cD4NCg0KICA8UGFyYUdyb3VwIE5hbWU9IiIgQWxpYXM9IuS6leWPguaVsCI+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWCIgICAgQWxpYXM9IljlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBYIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWSIgICAgQWxpYXM9IlnlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBZIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfUnciICAgQWxpYXM9IuS6leetkuWNiuW+hCIgICAgVW5pdD0ibSIgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMTAiICAgICBNaW49IjAuMDAxIiAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSByYWRpdXMiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfU2tpbiIgQWxpYXM9IuihqOearuezu+aVsCIgICAgVW5pdD0iIiAgICAgRGVmYXVsdD0iMCIgICAgIE1heD0iMTAwMCIgICBNaW49Ii0xMDAiICAgRGlnaXQ9IjYiICBEZXNjPSJza2luIGZhY3RvciIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iV19DIiAgICBBbGlhcz0i5LqV562S5YKo6ZuG57O75pWwIiBVbml0PSJtMy9NUGEiIERlZmF1bHQ9IjAiIE1heD0iMTAwMCIgICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSBzdG9yYWdlIGNvZWZmaWNpZW50IiAvPg0KICA8L1BhcmFHcm91cD4NCg0KPC9Sb290Pg0K 77u/PD94bWwgcup_mpadmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCg0KPCEtLSoqKioqKioqKiwzyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCjwhLS0gICAg5pys5paH5qGj55qE55uu55qE5piv5bu656uLV1RBSeaVsOWAvOinoyhOTSnmqKHlnZfnmoTlj4LmlbDlrprkuYkgICAgICAgICAgICAgICAgLS0+DQo8IS0tICAgIOS7heWMheWQq1BFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlkozkupXlj4LmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CjwhLS0gICAgRGF0ZTogMjAyNjA2MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCg0KPCEtLQ0KICAgIOWPguaVsOiMg+WbtO+8mlBFQknmsYLop6PlmajmiYDpnIDnmoTlgqjlsYLlj4LmlbDlkozkupXlj4LmlbAKICAgIOWvueW6lCBIWF9OV1RNX01PREVMX0lOUFVUIOe7k+aehOS9k+Wtl+autQogICAg6YCa6L+HIF9wYXJhSGVscGVyLT5sb2FkUGFyYURlZmluZXMoKSDliqDovb3vvIxzS2V5IOagh+ivhuS4uiBzX05tX1NlcmllDQotLT4NCg0KPFJvb3Q+DQoNCiAgPFBhcmFHcm91cCBOYW1lPSIiIEFsaWFzPSLlgqjlsYLlj4LmlbAiPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJoIiAgIEFsaWFzPSLlgqjlsYLljprluqYiICAgICAgIFVuaXQ9Im0iICAgICBEZWZhdWx0PSIxMCIgICAgTWF4PSIxMDAwMCIgIE1pbj0iMWUtMDUiICBEaWdpdD0iNiIgIERlc2M9InJlc2Vydm9pciB0aGlja25lc3MiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlBpIiAgQWxpYXM9IuWIneWni+WOi+WKmyIgICAgICAgVW5pdD0iTVBhIiAgIERlZmF1bHQ9IjQwIiAgICBNYXg9IjUwMCIgICAgTWluPSIwLjEiICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCBmb3JtYXRpb24gcHJlc3N1cmUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IksiICAgQWxpYXM9Iua4l+mAj+eOhyIgICAgICAgICBVbml0PSJtRCIgICAgRGVmYXVsdD0iMSIgICAgIE1heD0iMTAwMDAiICBNaW49IjAiICAgICAgRGlnaXQ9IjYiICBEZXNjPSJwZXJtZWFiaWxpdHkiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9InBoaSIgQWxpYXM9IuWtlOmameW6piIgICAgICAgICBVbml0PSIiICAgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMSIgICAgICBNaW49IjFlLTA1IiAgRGlnaXQ9IjYiICBEZXNjPSJwb3Jvc2l0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ3RpIiBBbGlhcz0i57u85ZCI5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMSIgTWF4PSIxMCIgICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InRvdGFsIGNvbXByZXNzaWJpbGl0eSIgLz4NCiAgICA8UGFyYUl0ZW0gTmFtZT0iQ2YiICBBbGlhcz0i5bKp55+z5Y6L57yp57O75pWwIiAgIFVuaXQ9IjEvTVBhIiBEZWZhdWx0PSIwLjAwMDEiIE1heD0iMTAiICAgIE1pbj0iMWUtMzAiICBEaWdpdD0iMTAiIFNjaWVudGlmaWM9IjEiIERlc2M9InJvY2sgY29tcHJlc3NpYmlsaXR5IiAvPg0KICAgIDxQYXJhSXRlbSBOYW1lPSJTb2kiIEFsaWFzPSLliJ3lp4vlkKvmsrnppbHlkozluqYiIFVuaXQ9IiIgICAgICBEZWZhdWx0PSIwLjgiICAgTWF4PSIxIiAgICAgIE1pbj0iMCIgICAgICBEaWdpdD0iNiIgIERlc2M9ImluaXRpYWwgb2lsIHNhdHVyYXRpb24iIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IlN3aSIgQWxpYXM9IuWIneWni+WQq+awtOmlseWSjOW6piIgVW5pdD0iIiAgICAgIERlZmF1bHQ9IjAuMiIgICBNYXg9IjEiICAgICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0iaW5pdGlhbCB3YXRlciBzYXR1cmF0aW9uIiAvPg0KICA8L1BhcmFHcm91cD4NCg0KICA8UGFyYUdyb3VwIE5hbWU9IiIgQWxpYXM9IuS6leWPguaVsCI+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWCIgICAgQWxpYXM9IljlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBYIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfWSIgICAgQWxpYXM9IlnlnZDmoIciICAgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjAiICAgICBNYXg9IjEwMDAwIiAgTWluPSItMTAwMDAiIERpZ2l0PSI2IiAgRGVzYz0id2VsbCBZIGNvb3JkaW5hdGUiIC8+DQogICAgPFBhcmFJdGVtIE5hbWU9IldfUnciICAgQWxpYXM9IuS6leetkuWNiuW+hCIgICAgVW5pdD0ibSIgICAgRGVmYXVsdD0iMC4xIiAgIE1heD0iMTAiICAgICBNaW49IjAuMDAxIiAgRGlnaXQ9IjYiICBEZXNjPSJ3ZWxsYm9yZSByYWRpdXMiIC8+CiAgICA8UGFyYUl0ZW0gTmFtZT0iV19Ta2luIiBBbGlhcz0i6KGo55qu57O75pWwIiAgICBVbml0PSIiICAgICBEZWZhdWx0PSIwIiAgICAgTWF4PSIxMDAwIiAgIE1pbj0iLTEwMCIgICBEaWdpdD0iNiIgIERlc2M9InNraW4gZmFjdG9yIiAvPgogICAgPFBhcmFJdGVtIE5hbWU9IldfQyIgICAgQWxpYXM9IuS6leetkuWCqOmbhuezu+aVsCIgVW5pdD0ibTMvTVBhIiBEZWZhdWx0PSIwIiBNYXg9IjEwMDAiICAgTWluPSIwIiAgICAgIERpZ2l0PSI2IiAgRGVzYz0id2VsbGJvcmUgc3RvcmFnZSBjb2VmZmljaWVudCIgLz4KICAgIDxQYXJhSXRlbSBOYW1lPSJXX1dlbGxMZW5ndGgiICAgICAgICAgQWxpYXM9IuawtOW5s+autemVv+W6piIgICBVbml0PSJtIiAgICBEZWZhdWx0PSIyMDAiICBNYXg9IjEwMDAwIiBNaW49IjFlLTA1IiBEaWdpdD0iNiIgRGVzYz0iaG9yaXpvbnRhbCB3ZWxsIGxlbmd0aCIgLz4KICAgIDxQYXJhSXRlbSBOYW1lPSJXX0RyYWluQW5nbGUiICAgICAgICAgQWxpYXM9IuaOkuawtOinkuW6piIgICAgIFVuaXQ9Im8iICAgIERlZmF1bHQ9IjAiICAgIE1heD0iMzYwIiAgIE1pbj0iLTM2MCIgIERpZ2l0PSI2IiBEZXNjPSJob3Jpem9udGFsIHdlbGwgZHJhaW4gYW5nbGUiIC8+CiAgICA8UGFyYUl0ZW0gTmFtZT0iV19OdW1iZXJPZkZyYWN0dXJlcyIgIEFsaWFzPSLoo4LnvJ3mlbDph48iICAgICBVbml0PSIiICAgICBEZWZhdWx0PSIxNSIgICBNYXg9IjEwMDAiICBNaW49IjIiICAgICBEaWdpdD0iMCIgRGVzYz0ibnVtYmVyIG9mIGZyYWN0dXJlcyIgLz4KICAgIDxQYXJhSXRlbSBOYW1lPSJXX0ZyYWN0dXJlSGFsZkxlbmd0aCIgQWxpYXM9Iuijgue8neWNiumVvyIgICAgIFVuaXQ9Im0iICAgIERlZmF1bHQ9IjUwIiAgIE1heD0iMTAwMDAiIE1pbj0iMWUtMDUiIERpZ2l0PSI2IiBEZXNjPSJmcmFjdHVyZSBoYWxmLWxlbmd0aCIgLz4KICAgIDxQYXJhSXRlbSBOYW1lPSJXX0ZyYWN0dXJlQW5nbGUiICAgICAgQWxpYXM9Iuijgue8neinkuW6piIgICAgIFVuaXQ9Im8iICAgIERlZmF1bHQ9IjkwIiAgIE1heD0iMzYwIiAgIE1pbj0iLTM2MCIgIERpZ2l0PSI2IiBEZXNjPSJmcmFjdHVyZSBhbmdsZSIgLz4KICAgIDxQYXJhSXRlbSBOYW1lPSJXX0RmYyIgICAgICAgICAgICAgICAgQWxpYXM9Iuijgue8neWvvOa1geiDveWKmyIgVW5pdD0ibWQubSIgRGVmYXVsdD0iMTAwMCIgTWF4PSIxZSszMCIgTWluPSIwIiAgICAgRGlnaXQ9IjYiIERlc2M9ImZyYWN0dXJlIGNvbmR1Y3Rpdml0eSIgLz4KICA8L1BhcmFHcm91cD4KDQo8L1Jvb3Q+DQo=

File diff suppressed because one or more lines are too long

@ -2,13 +2,13 @@
<!--****************************************************************--> <!--****************************************************************-->
<!-- 本文档的目的是建立WTAI数值解(NM)模块的参数定义 --> <!-- 本文档的目的是建立WTAI数值解(NM)模块的参数定义 -->
<!-- 仅包含PEBI求解器所需的储层参数 --> <!-- 仅包含PEBI求解器所需的储层和井参数 -->
<!-- Date: 20260615 --> <!-- Date: 20260615 -->
<!--****************************************************************--> <!--****************************************************************-->
<!-- <!--
参数范围:h、Pi、K、phi、Cti、Cf、Soi、Swi 参数范围:PEBI求解器所需的储层参数和井参数
对应 HX_NWTM_MODEL_INPUT::Base 结构体字段 对应 HX_NWTM_MODEL_INPUT 结构体字段
通过 _paraHelper->loadParaDefines() 加载sKey 标识为 s_Nm_Serie 通过 _paraHelper->loadParaDefines() 加载sKey 标识为 s_Nm_Serie
--> -->
@ -31,6 +31,12 @@
<ParaItem Name="W_Rw" Alias="井筒半径" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" /> <ParaItem Name="W_Rw" Alias="井筒半径" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" />
<ParaItem Name="W_Skin" Alias="表皮系数" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" /> <ParaItem Name="W_Skin" Alias="表皮系数" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" />
<ParaItem Name="W_C" Alias="井筒储集系数" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" /> <ParaItem Name="W_C" Alias="井筒储集系数" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" />
<ParaItem Name="W_WellLength" Alias="水平段长度" Unit="m" Default="200" Max="10000" Min="1e-05" Digit="6" Desc="horizontal well length" />
<ParaItem Name="W_DrainAngle" Alias="排水角度" Unit="o" Default="0" Max="360" Min="-360" Digit="6" Desc="horizontal well drain angle" />
<ParaItem Name="W_NumberOfFractures" Alias="裂缝数量" Unit="" Default="15" Max="1000" Min="2" Digit="0" Desc="number of fractures" />
<ParaItem Name="W_FractureHalfLength" Alias="裂缝半长" Unit="m" Default="50" Max="10000" Min="1e-05" Digit="6" Desc="fracture half-length" />
<ParaItem Name="W_FractureAngle" Alias="裂缝角度" Unit="o" Default="90" Max="360" Min="-360" Digit="6" Desc="fracture angle" />
<ParaItem Name="W_Dfc" Alias="裂缝导流能力" Unit="md.m" Default="1000" Max="1e+30" Min="0" Digit="6" Desc="fracture conductivity" />
</ParaGroup> </ParaGroup>
</Root> </Root>

@ -2,13 +2,14 @@
<!--****************************************************************--> <!--****************************************************************-->
<!-- This file defines parameters for the WTAI Numerical (NM) --> <!-- This file defines parameters for the WTAI Numerical (NM) -->
<!-- module. Only PEBI solver reservoir parameters are included. --> <!-- module. Only parameters required by the PEBI solver are -->
<!-- included. -->
<!-- Date: 20260615 --> <!-- Date: 20260615 -->
<!--****************************************************************--> <!--****************************************************************-->
<!-- <!--
Parameter scope: h, Pi, K, phi, Cti, Cf, Soi, Swi Parameter scope: reservoir and well parameters required by the PEBI solver
Corresponds to HX_NWTM_MODEL_INPUT::Base struct fields Corresponds to HX_NWTM_MODEL_INPUT struct fields
Loaded via _paraHelper->loadParaDefines(), sKey = s_Nm_Serie Loaded via _paraHelper->loadParaDefines(), sKey = s_Nm_Serie
--> -->
@ -31,6 +32,12 @@
<ParaItem Name="W_Rw" Alias="Wellbore Radius" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" /> <ParaItem Name="W_Rw" Alias="Wellbore Radius" Unit="m" Default="0.1" Max="10" Min="0.001" Digit="6" Desc="wellbore radius" />
<ParaItem Name="W_Skin" Alias="Skin Factor" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" /> <ParaItem Name="W_Skin" Alias="Skin Factor" Unit="" Default="0" Max="1000" Min="-100" Digit="6" Desc="skin factor" />
<ParaItem Name="W_C" Alias="Wellbore Storage Coeff" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" /> <ParaItem Name="W_C" Alias="Wellbore Storage Coeff" Unit="m3/MPa" Default="0" Max="1000" Min="0" Digit="6" Desc="wellbore storage coefficient" />
<ParaItem Name="W_WellLength" Alias="Horizontal Well Length" Unit="m" Default="200" Max="10000" Min="1e-05" Digit="6" Desc="horizontal well length" />
<ParaItem Name="W_DrainAngle" Alias="Drain Angle" Unit="o" Default="0" Max="360" Min="-360" Digit="6" Desc="horizontal well drain angle" />
<ParaItem Name="W_NumberOfFractures" Alias="Number of Fractures" Unit="" Default="15" Max="1000" Min="2" Digit="0" Desc="number of fractures" />
<ParaItem Name="W_FractureHalfLength" Alias="Fracture Half-Length" Unit="m" Default="50" Max="10000" Min="1e-05" Digit="6" Desc="fracture half-length" />
<ParaItem Name="W_FractureAngle" Alias="Fracture Angle" Unit="o" Default="90" Max="360" Min="-360" Digit="6" Desc="fracture angle" />
<ParaItem Name="W_Dfc" Alias="Fracture Conductivity" Unit="md.m" Default="1000" Max="1e+30" Min="0" Digit="6" Desc="fracture conductivity" />
</ParaGroup> </ParaGroup>
</Root> </Root>

@ -75,6 +75,7 @@
// 井基参数名 → 数据成员访问器的映射描述 // 井基参数名 → 数据成员访问器的映射描述
struct WellParaDesc { struct WellParaDesc {
const char* sName; // 参数基名,如 "W_X" const char* sName; // 参数基名,如 "W_X"
NM_WELL_MODEL eWellType; // Unknow_Well 表示公用参数
nmDataAttribute* (*getAttr)(nmDataWellBase&); // 访问器函数指针 nmDataAttribute* (*getAttr)(nmDataWellBase&); // 访问器函数指针
}; };
@ -86,16 +87,39 @@ static nmDataAttribute* getParaSkin(nmDataWellBase& w)
{ {
return w.getPerforationCount() > 0 ? &w.getPerforation(0)->getSkin() : NULL; return w.getPerforationCount() > 0 ? &w.getPerforation(0)->getSkin() : NULL;
} }
static nmDataAttribute* getParaWellLength(nmDataWellBase& w) { return &w.getWellLength(); }
static nmDataAttribute* getParaHfDrainAngle(nmDataWellBase& w) { return &static_cast<nmDataHorizontalFracturedWell&>(w).getDrainAngle(); }
static nmDataAttribute* getParaHfNumberOfFractures(nmDataWellBase& w) { return &static_cast<nmDataHorizontalFracturedWell&>(w).getNumberOfFractures(); }
static nmDataAttribute* getParaVfFractureHalfLength(nmDataWellBase& w) { return &static_cast<nmDataVerticalFracturedWell&>(w).getFractureHalfLength(); }
static nmDataAttribute* getParaVfFractureAngle(nmDataWellBase& w) { return &static_cast<nmDataVerticalFracturedWell&>(w).getFractureAngle(); }
static nmDataAttribute* getParaVfDfc(nmDataWellBase& w) { return &static_cast<nmDataVerticalFracturedWell&>(w).getDfc(); }
static nmDataAttribute* getParaHfFractureHalfLength(nmDataWellBase& w) { return &static_cast<nmDataHorizontalFracturedWell&>(w).getFractureHalfLength(); }
static nmDataAttribute* getParaHfFractureAngle(nmDataWellBase& w) { return &static_cast<nmDataHorizontalFracturedWell&>(w).getFractureAngle(); }
static nmDataAttribute* getParaHfDfc(nmDataWellBase& w) { return &static_cast<nmDataHorizontalFracturedWell&>(w).getDfc(); }
static const WellParaDesc WELL_PARA_DESCS[] = { static const WellParaDesc WELL_PARA_DESCS[] = {
{"W_X", &getParaX}, {"W_X", NM_WELL_MODEL::Unknow_Well, &getParaX},
{"W_Y", &getParaY}, {"W_Y", NM_WELL_MODEL::Unknow_Well, &getParaY},
{"W_Rw", &getParaRw}, {"W_Rw", NM_WELL_MODEL::Unknow_Well, &getParaRw},
{"W_C", &getParaC}, {"W_C", NM_WELL_MODEL::Unknow_Well, &getParaC},
{"W_Skin", &getParaSkin}, {"W_Skin", NM_WELL_MODEL::Unknow_Well, &getParaSkin},
{"W_FractureHalfLength", NM_WELL_MODEL::Vertical_Fractured_Well, &getParaVfFractureHalfLength},
{"W_FractureAngle", NM_WELL_MODEL::Vertical_Fractured_Well, &getParaVfFractureAngle},
{"W_Dfc", NM_WELL_MODEL::Vertical_Fractured_Well, &getParaVfDfc},
{"W_WellLength", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaWellLength},
{"W_DrainAngle", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaHfDrainAngle},
{"W_NumberOfFractures", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaHfNumberOfFractures},
{"W_FractureHalfLength", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaHfFractureHalfLength},
{"W_FractureAngle", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaHfFractureAngle},
{"W_Dfc", NM_WELL_MODEL::Horizontal_Fractured_Well, &getParaHfDfc},
}; };
static const int WELL_PARA_DESC_COUNT = sizeof(WELL_PARA_DESCS) / sizeof(WELL_PARA_DESCS[0]); static const int WELL_PARA_DESC_COUNT = sizeof(WELL_PARA_DESCS) / sizeof(WELL_PARA_DESCS[0]);
static bool isWellParaOf(const WellParaDesc& desc, NM_WELL_MODEL eWellType)
{
return desc.eWellType == NM_WELL_MODEL::Unknow_Well || desc.eWellType == eWellType;
}
static bool isWellParaAttrName(const QString& name) static bool isWellParaAttrName(const QString& name)
{ {
for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) { for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) {
@ -673,6 +697,9 @@ bool nmDataAnalyzeManager::removeWell(nmDataWellBase* pWellData)
// 先从 registry 清理该井的所有属性,避免野指针 // 先从 registry 清理该井的所有属性,避免野指针
if (m_pAttrRegistry) { if (m_pAttrRegistry) {
for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) { for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) {
if (!isWellParaOf(WELL_PARA_DESCS[i], pWellData->getWellType())) {
continue;
}
QString name = removedCode + "_" + WELL_PARA_DESCS[i].sName; QString name = removedCode + "_" + WELL_PARA_DESCS[i].sName;
m_pAttrRegistry->unregAttr(name); m_pAttrRegistry->unregAttr(name);
} }
@ -1349,9 +1376,12 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData)
QString code = pWellData->getCode(); QString code = pWellData->getCode();
QString name = pWellData->getName(); QString name = pWellData->getName();
QStringList paras; QStringList paras;
nmDataWellBase* pAddedWell = findWellByName(name);
for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) { for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) {
if (pAddedWell != nullptr && isWellParaOf(WELL_PARA_DESCS[i], pAddedWell->getWellType())) {
paras << WELL_PARA_DESCS[i].sName; paras << WELL_PARA_DESCS[i].sName;
} }
}
emit sigWellAdded(code, name, paras); emit sigWellAdded(code, name, paras);
if (m_pAttrRegistry) if (m_pAttrRegistry)
m_pAttrRegistry->refreshAll(); m_pAttrRegistry->refreshAll();
@ -1374,8 +1404,10 @@ void nmDataAnalyzeManager::appendNmWellData(nmDataWellBase* pWellData)
QString name = pWellData->getWellName(); QString name = pWellData->getWellName();
QStringList paras; QStringList paras;
for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) { for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) {
if (isWellParaOf(WELL_PARA_DESCS[i], pWellData->getWellType())) {
paras << WELL_PARA_DESCS[i].sName; paras << WELL_PARA_DESCS[i].sName;
} }
}
emit sigWellAdded(code, name, paras); emit sigWellAdded(code, name, paras);
if (m_pAttrRegistry) if (m_pAttrRegistry)
m_pAttrRegistry->refreshAll(); m_pAttrRegistry->refreshAll();
@ -1481,6 +1513,9 @@ void nmDataAnalyzeManager::syncWellAttrs()
for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i) for (int i = 0; i < WELL_PARA_DESC_COUNT; ++i)
{ {
if (!isWellParaOf(WELL_PARA_DESCS[i], pWell->getWellType())) {
continue;
}
nmDataAttribute* pAttr = WELL_PARA_DESCS[i].getAttr(*pWell); nmDataAttribute* pAttr = WELL_PARA_DESCS[i].getAttr(*pWell);
if (pAttr != NULL) if (pAttr != NULL)
{ {

@ -26,7 +26,7 @@ QStringList reservoirParas()
<< "Cti" << "Cf" << "Soi" << "Swi"; << "Cti" << "Cf" << "Soi" << "Swi";
} }
QStringList wellParasOf(const QString& wellCode, bool hasPerforation) QStringList wellParasOf(const QString& wellCode, bool hasPerforation, NM_WELL_MODEL wellType)
{ {
QStringList paras; QStringList paras;
paras << wellCode + "_W_X" paras << wellCode + "_W_X"
@ -37,6 +37,23 @@ QStringList wellParasOf(const QString& wellCode, bool hasPerforation)
paras << wellCode + "_W_Skin"; paras << wellCode + "_W_Skin";
} }
paras << wellCode + "_W_C"; paras << wellCode + "_W_C";
if (wellType == NM_WELL_MODEL::Vertical_Fractured_Well)
{
paras << wellCode + "_W_FractureHalfLength"
<< wellCode + "_W_FractureAngle"
<< wellCode + "_W_Dfc";
}
else if (wellType == NM_WELL_MODEL::Horizontal_Fractured_Well)
{
paras << wellCode + "_W_WellLength"
<< wellCode + "_W_DrainAngle"
<< wellCode + "_W_NumberOfFractures"
<< wellCode + "_W_FractureHalfLength"
<< wellCode + "_W_FractureAngle"
<< wellCode + "_W_Dfc";
}
return paras; return paras;
} }
@ -248,7 +265,9 @@ void nmWxParaPropertyPebi::rebuildAllParas()
addedWellCodes.insert(sCode); addedWellCodes.insert(sCode);
mapWellNames[sCode] = pWell->getWellName(); mapWellNames[sCode] = pWell->getWellName();
listParas << wellParasOf(sCode, pWell->getPerforationCount() > 0); listParas << wellParasOf(sCode,
pWell->getPerforationCount() > 0,
pWell->getWellType());
} }
refreshUIs(listParas, false, mapWellNames); refreshUIs(listParas, false, mapWellNames);

Loading…
Cancel
Save