ProduceParamCalculator.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package com.hb.proj.analysis.service;
  2. import com.hb.proj.model.WellAnalysisParamPO;
  3. import com.hb.proj.model.WellMeasurePO;
  4. import com.hb.proj.model.WellPumpPO;
  5. public class ProduceParamCalculator {
  6. public static void calcPumpExtra(WellPumpPO pump) {
  7. /**
  8. * 泵理论排量=截面积*柱塞冲程*spm*24*60*泵系数*0.000001
  9. * 理论排量按每分钟1冲次,泵系数为1计算。
  10. * 新泵时为1,长期使用小于1,用于修正泵理论排量
  11. * spm 冲次频率(每分钟) 目前固定为1
  12. */
  13. if(isNotNull(pump.getBasicDiam(),pump.getStroke(),pump.getPumpCoeff())){
  14. pump.setSpm(1);
  15. double tempYield=pump.getPi()*Math.pow(pump.getBasicDiam()/2,2)*pump.getStroke()*pump.getPumpCoeff()*pump.getSpm()*24*60*0.000001;
  16. pump.setTheoryVolume(tempYield);
  17. }
  18. }
  19. public static WellAnalysisParamPO calc(WellMeasurePO measure,WellPumpPO pump,Double rtFreq) {
  20. WellAnalysisParamPO analyParam=new WellAnalysisParamPO();
  21. analyParam.setRefMeasureId(measure.getMeasureId());
  22. analyParam.setRefPumpId(pump.getPumpId());
  23. //含水率原值为百分数,计算时要*0.01
  24. Double waterRatio=measure.getWaterRatio()!=null?(measure.getWaterRatio().doubleValue()*0.01):null;
  25. /**
  26. * 计量油量=计量液量*(1-含水率)
  27. * 计量水量=计量液量*含水率
  28. */
  29. if(isNotNull(measure.getMeteredLiquidYield(),waterRatio)) {
  30. analyParam.setMeteredOilYield(measure.getMeteredLiquidYield()*(1-waterRatio));
  31. analyParam.setMeteredWaterYield(measure.getMeteredLiquidYield()*waterRatio);
  32. }
  33. /**
  34. * 测量油量=测量液量*(1-含水率)
  35. * 测量水量=测量液量*(1-含水率)
  36. */
  37. if(isNotNull(measure.getMeasureLiquidYield(),waterRatio)) {
  38. analyParam.setMeasureOilYield(measure.getMeasureLiquidYield()*(1-waterRatio));
  39. analyParam.setMeasureWaterYield(measure.getMeasureLiquidYield()*waterRatio);
  40. }
  41. /**
  42. * 泵理论排量=截面积*柱塞冲程*spm*24*60*泵系数*0.000001
  43. * 理论排量按每分钟1冲次,泵系数为1计算。
  44. * 新泵时为1,长期使用小于1,用于修正泵理论排量
  45. * spm 冲次频率(每分钟) 目前固定为1
  46. */
  47. if(isNotNull(pump.getBasicDiam(),pump.getStroke(),pump.getPumpCoeff())){
  48. pump.setSpm(1);
  49. double tempYield=pump.getPi()*Math.pow(pump.getBasicDiam()/2,2)*pump.getStroke()*pump.getPumpCoeff()*pump.getSpm()*24*60*0.000001;
  50. pump.setTheoryVolume(tempYield);
  51. }
  52. /**
  53. * 理论液量=泵理论排量*冲次
  54. */
  55. if(pump.getTheoryVolume()!=null) {
  56. analyParam.setTheoryLiquidYield(pump.getTheoryVolume()*rtFreq);
  57. }
  58. /**
  59. * 测量泵效=测量液量/理论液量
  60. * 校准泵效=计量液量/理论液量
  61. * 综合泵效=弹性伸缩*泵充满度*漏失系数*地表体积系数
  62. */
  63. if(isNotNull(measure.getMeasureLiquidYield(),measure.getMeteredLiquidYield(),analyParam.getTheoryLiquidYield())) {
  64. analyParam.setMeasuredPumpEff(measure.getMeasureLiquidYield()/analyParam.getTheoryLiquidYield());
  65. analyParam.setCorrectPumpEff(measure.getMeteredLiquidYield()/analyParam.getTheoryLiquidYield());
  66. }
  67. if(isNotNull(measure.getElasticCoeff(),pump.getFillDegree(),pump.getLeakCoeff(),measure.getSurfaceCompCoe())) {
  68. analyParam.setComPumpEff(measure.getElasticCoeff()*pump.getFillDegree()*pump.getLeakCoeff()*measure.getSurfaceCompCoe());
  69. }
  70. /**
  71. * 实际液量=校准泵效*理论液量 用于绘制IPR曲线
  72. * 实际油量=实际液量*(1-含水率),用于绘制IPR曲线
  73. * 实际水量=实际液量´含水率,用于绘制IPR曲线
  74. */
  75. if(isNotNull(analyParam.getCorrectPumpEff(),analyParam.getTheoryLiquidYield(),analyParam.getRealLiquidYield(),waterRatio)) {
  76. analyParam.setRealLiquidYield(analyParam.getCorrectPumpEff()*analyParam.getTheoryLiquidYield());
  77. analyParam.setRealOilYield(analyParam.getRealLiquidYield()*(1-waterRatio));
  78. analyParam.setRealWaterYield(analyParam.getRealLiquidYield()*waterRatio);
  79. }
  80. /**
  81. * 深度压差(m)=折算动液面深度-折算静液面深度
  82. * 流动压差(Mpa)=油藏压力-井底生产压力=深度压差*混液密度*g/1000
  83. */
  84. if(isNotNull(analyParam.getDiffPressDepth(),measure.getMixLiquidDensity(),measure.getGravity())) {
  85. analyParam.setDiffPressBtmflow(analyParam.getDiffPressDepth()*measure.getMixLiquidDensity()*measure.getGravity()/1000);
  86. }
  87. /**
  88. * 油指数_J=功图液量/流动压差
  89. * 油指数_K=功图液量/深度压差
  90. * 计量指数_J=计量液量/流动压差
  91. * 计量指数_K=计量液量/深度压差
  92. */
  93. if(isNotNull(analyParam.getDiagramLiquidYield(),analyParam.getDiffPressBtmflow(),analyParam.getDiffPressDepth())) {
  94. analyParam.setProductIndexJ(analyParam.getDiagramLiquidYield()/analyParam.getDiffPressBtmflow());
  95. analyParam.setProductIndexK(analyParam.getDiagramLiquidYield()/analyParam.getDiffPressDepth());
  96. }
  97. if(isNotNull(measure.getMeteredLiquidYield(),analyParam.getDiffPressBtmflow(),analyParam.getDiffPressDepth())) {
  98. analyParam.setMeteredProductIndexJ(measure.getMeteredLiquidYield()/analyParam.getDiffPressBtmflow());
  99. analyParam.setMeteredProductIndexK(measure.getMeteredLiquidYield()/analyParam.getDiffPressDepth());
  100. }
  101. return analyParam;
  102. }
  103. private static boolean isNotNull(Double... vals) {
  104. boolean rst=true;
  105. for(Double val : vals) {
  106. rst=val!=null && rst;
  107. }
  108. return rst;
  109. }
  110. }