lx
2025-07-11 05946b151e7010b2b1a851892152e6b5d34151b3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using ErrorAnalysis.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
 
namespace ErrorAnalysis.Service
{
    public class COMergeCalcService
    {
        //Ncoef=1e8*2.54*2.54*2*6*11*2*77*0.2/0.6*speed;
        //Fcoef=1e8*2.54*2.54*4*6*2*11*77*0.2/0.6*speed;
 
        const double _gg = (9.0 - 0.0) / 255.0;//0.03529
        const double _offset = 0.0;
 
        const int _cWinStartIndex = (int)(3.3 / _gg + _offset); //C窗口index
        const int _cWinEndIndex = (int)(4.78 / _gg + _offset); // width= 4.78-3.3  = 1.48
 
        const int _oWinStartIndex = (int)(4.88 / _gg + _offset); // org
        const int _oWinEndIndex = (int)(6.36 / _gg + _offset); // width = 6.36-4.88=1.48
 
        private static double GetFarInterplolateResult(string modelId, double porosity, double sw, int readSw, double speed, double depth)
        {
            double result = 0;
            var cResult = RepositoryInstance.Instance.COFarResultRepository?.GetCOFarResult(modelId, (int)porosity, readSw);
            if (cResult == null)
                throw new InvalidDataException("COFarResult not found");
            var cArr = cResult.InelasticSpec?.Split(',').Select(v => Convert.ToDouble(v)).ToArray();
            if (cArr == null)
                throw new InvalidDataException("COFarResult InelasticSpec is null");
 
            var length = readSw == 0 ? _cWinEndIndex - _cWinStartIndex + 1 : _oWinEndIndex - _oWinStartIndex + 1;
            var originC = cArr.Skip(readSw == 0 ? _cWinStartIndex : _oWinStartIndex).Take(length).Sum();
            var coef = originC * 1e8 * 2.54 * 2.54 * 4 * 6 * 2 * 11 * 77 * 0.2 / 0.6 * speed * depth * 0.07;
            result = coef;
            if (sw > 0 && sw < 100)
            {
                if (readSw == 0)
                    result = Utility.Interpolate(sw, 100, 0, 0, coef);
                else
                    result = Utility.Interpolate(sw, 0, 0, 100, coef);
            }
            return result;
        }
 
        private static double GetNearInterplolateResult(string modelId, double porosity, double sw, int readSw, double speed, double depth)
        {
            double result = 0;
            var cResult = RepositoryInstance.Instance.CONearResultRepository?.GetCONearResult(modelId, (int)porosity, readSw);
            if (cResult == null)
                throw new InvalidDataException("CONearResult not found");
            var cArr = cResult.InelasticSpec?.Split(',').Select(v => Convert.ToDouble(v)).ToArray();
            if (cArr == null)
                throw new InvalidDataException("CONearResult InelasticSpec is null");
 
            var length = readSw == 0 ? _cWinEndIndex - _cWinStartIndex + 1 : _oWinEndIndex - _oWinStartIndex + 1;
            var originC = cArr.Skip(readSw == 0 ? _cWinStartIndex : _oWinStartIndex).Take(length).Sum();
            var coef = originC * 1e8 * 2.54 * 2.54 * 2 * 6 * 11 * 2 * 77 * 0.2 / 0.6 * speed * depth * 0.07;
            result = coef;
            if (sw > 0 && sw < 100)
            {
                if (readSw == 0)
                    result = Utility.Interpolate(sw, 100, 0, 0, coef);
                else
                    result = Utility.Interpolate(sw, 0, 0, 100, coef);
            }
            return result;
        }
 
        /// <summary>
        /// 获取远探头C或O值
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <param name="modelId">管柱ID</param>
        /// <param name="porosity">孔隙度</param>
        /// <param name="sw">含水饱和度</param>
        /// <param name="readSw">读取含水饱和度(0为碳,100为氧)</param>
        /// <param name="speed">测速</param>
        /// <param name="depth">深度</param>
        /// <returns>碳或氧值</returns>
        /// <exception cref="InvalidDataException">孔隙度超过范围</exception>
        public static double GetFarMergeCOResult(string modelId, double porosity, double sw, int readSw, double speed, double depth)
        {
            if (porosity > 40)
                throw new InvalidDataException("Porosity value out of range!");
 
            double result = 0;
            if (porosity % 5 == 0)
            {
                result = GetFarInterplolateResult(modelId, porosity, sw, readSw, speed, depth);
            }
            else
            {
                double ceilingResult = 0;
                var ceilingPorosity = Math.Ceiling(porosity / 5) * 5;
                ceilingResult = GetFarInterplolateResult(modelId, ceilingPorosity, sw, readSw, speed, depth);
 
 
                double floorResult = 0;
                var floorPorosity = Math.Floor(porosity / 5) * 5;
                floorResult = GetFarInterplolateResult(modelId, floorPorosity, sw, readSw, speed, depth);
 
                result = Utility.Interpolate(porosity, floorPorosity, floorResult, ceilingPorosity, ceilingResult);
            }
            return result;
        }
 
        /// <summary>
        /// 获取近探头C或O值
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <param name="modelId">管柱ID</param>
        /// <param name="porosity">孔隙度</param>
        /// <param name="sw">含水饱和度</param>
        /// <param name="readSw">读取含水饱和度(0为碳,100为氧)</param>
        /// <param name="speed">测速</param>
        /// <param name="depth">深度</param>
        /// <returns>碳或氧值</returns>
        /// <exception cref="InvalidDataException">孔隙度超过范围</exception>
        public static double GetNearMergeCOResult(string modelId, double porosity, double sw, int readSw, double speed, double depth)
        {
            if (porosity > 40)
                throw new InvalidDataException("Porosity value out of range!");
 
            double result = 0;
            if (porosity % 5 == 0)
            {
                result = GetNearInterplolateResult(modelId, porosity, sw, readSw, speed, depth);
            }
            else
            {
                double ceilingResult = 0;
                var ceilingPorosity = Math.Ceiling(porosity / 5) * 5;
                ceilingResult = GetNearInterplolateResult(modelId, ceilingPorosity, sw, readSw, speed, depth);
 
 
                double floorResult = 0;
                var floorPorosity = Math.Floor(porosity / 5) * 5;
                floorResult = GetNearInterplolateResult(modelId, floorPorosity, sw, readSw, speed, depth);
 
                result = Utility.Interpolate(porosity, floorPorosity, floorResult, ceilingPorosity, ceilingResult);
            }
            return result;
        }
    }
}