w-geo 1.1.19 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,125 @@
1
+ import get from 'lodash-es/get.js'
2
+ import size from 'lodash-es/size.js'
3
+ import filter from 'lodash-es/filter.js'
4
+ import map from 'lodash-es/map.js'
5
+ import maxBy from 'lodash-es/maxBy.js'
6
+ import minBy from 'lodash-es/minBy.js'
7
+ import isnum from 'wsemi/src/isnum.mjs'
8
+ import isearr from 'wsemi/src/isearr.mjs'
9
+ import isestr from 'wsemi/src/isestr.mjs'
10
+ import cdbl from 'wsemi/src/cdbl.mjs'
11
+ import interp1 from 'wsemi/src/interp1.mjs'
12
+
13
+
14
+ function intrpPsdBySize(pfss, psizes, opt = {}) {
15
+
16
+ //keySize
17
+ let keySize = get(opt, 'keySize', '')
18
+ if (!isestr(keySize)) {
19
+ keySize = 'size'
20
+ }
21
+
22
+ //keyFraction
23
+ let keyFraction = get(opt, 'keyFraction', '')
24
+ if (!isestr(keyFraction)) {
25
+ keyFraction = 'fraction'
26
+ }
27
+
28
+ //check
29
+ let pfs0 = get(pfss, 0)
30
+ let size0 = get(pfs0, keySize, '')
31
+ let fraction0 = get(pfs0, keyFraction, '')
32
+ if (!isnum(size0)) {
33
+ throw new Error(`pfssp[0][${keySize}] is not an effective number`)
34
+ }
35
+ if (!isnum(fraction0)) {
36
+ throw new Error(`fraction0[0][${keyFraction}] is not an effective number`)
37
+ }
38
+
39
+ //check
40
+ if (!isnum(psizes) && !isearr(psizes)) {
41
+ console.log('psizes', psizes)
42
+ throw new Error('psizes is not a number or an effective array')
43
+ }
44
+
45
+ //one
46
+ let one = false
47
+ if (isnum(psizes)) {
48
+ one = true
49
+ psizes = [cdbl(psizes)]
50
+ }
51
+
52
+ //取粒徑size與fraction為數字, 且size大於0(因要轉log內插), fraction要大於等於0, 且無施篩孔時值為-1亦須剔除
53
+ let rs = filter(pfss, (v) => {
54
+ let bs = cdbl(v[keySize]) > 0
55
+ let bf = cdbl(v[keyFraction]) >= 0
56
+ // console.log('bs', bs, v[keySize])
57
+ // console.log('bf', bf, v[keyFraction])
58
+ return bs && bf
59
+ })
60
+ // console.log('rs', rs)
61
+
62
+ //check
63
+ if (size(rs) === 0) {
64
+ console.log('pfss', pfss)
65
+ throw new Error(`invalid rs`)
66
+ }
67
+
68
+ //lrs
69
+ let lrs = map(rs, (v) => {
70
+ v[keySize] = Math.log(v[keySize])
71
+ return v
72
+ })
73
+
74
+ //sizeLogMax, sizeLogMin
75
+ let sizeLogMax = maxBy(lrs, keySize)
76
+ let sizeLogMin = minBy(lrs, keySize)
77
+
78
+ //ifs
79
+ let ifs = map(psizes, (psize) => {
80
+
81
+ //sizeLog
82
+ let sizeLog = Math.log(psize)
83
+ // console.log('psize', psize)
84
+ // console.log('sizeLog', sizeLog)
85
+
86
+ //check
87
+ if (sizeLog >= sizeLogMax[keySize]) {
88
+ return sizeLogMax[keyFraction]
89
+ }
90
+ if (sizeLog <= sizeLogMin[keySize]) {
91
+ return sizeLogMin[keyFraction]
92
+ }
93
+
94
+ //interp1
95
+ let optP = {
96
+ keyX: keySize,
97
+ keyY: keyFraction,
98
+ }
99
+ let pfraction = interp1(lrs, sizeLog, optP)
100
+ // console.log('pfraction', pfraction)
101
+
102
+ //check
103
+ if (get(pfraction, 'err')) {
104
+ console.log('lrs', lrs)
105
+ console.log('sizeLog', sizeLog)
106
+ console.log('optP', optP)
107
+ console.log('pfraction', pfraction)
108
+ return null
109
+ }
110
+
111
+ return pfraction
112
+ })
113
+ // console.log('ifs', ifs)
114
+
115
+ //r
116
+ let r = ifs
117
+ if (one) {
118
+ r = ifs[0]
119
+ }
120
+
121
+ return r
122
+ }
123
+
124
+
125
+ export default intrpPsdBySize
@@ -0,0 +1,50 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import dtIntrpPsdBySize from '../src/dtIntrpPsdBySize.mjs'
5
+
6
+
7
+ describe(`dtIntrpPsdBySize`, function() {
8
+
9
+ let dt = {
10
+ GSD: `[101.6, 76.2, 50.8, 25.4, 19.0, 9.5, 4.75, 2.0, 0.85, 0.425, 0.25, 0.15, 0.106, 0.075, 0.027, 0.018, 0.011, 0.008, 0.006, 0.003, 0.001, 0.0, 0.0, 0.0]`,
11
+ GSP: `[100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, -1.0, 100.0, 99.0, 96.0, 86.0, 74.0, 61.0, 51.0, 32.0, 16.0, 0.0, 0.0, 0.0]`,
12
+ }
13
+
14
+ let psizes = [
15
+ 630,
16
+ 200,
17
+ 63,
18
+ 20,
19
+ 6.3,
20
+ 2,
21
+ 0.63,
22
+ 0.2,
23
+ 0.063,
24
+ 0.02,
25
+ 0.0063,
26
+ 0.002,
27
+ ]
28
+ // let fss = dtIntrpPsdBySize(dt, psizes)
29
+
30
+ let out1 = [
31
+ { size: 630, fraction: 100 },
32
+ { size: 200, fraction: 100 },
33
+ { size: 63, fraction: 99.99999999999999 },
34
+ { size: 20, fraction: 99.99999999999999 },
35
+ { size: 6.3, fraction: 100.00000000000001 },
36
+ { size: 2, fraction: 100 },
37
+ { size: 0.63, fraction: 100.00000000000001 },
38
+ { size: 0.2, fraction: 100 },
39
+ { size: 0.063, fraction: 98.4880247416152 },
40
+ { size: 0.02, fraction: 88.59851004564663 },
41
+ { size: 0.0063, fraction: 52.69597513510718 },
42
+ { size: 0.002, fraction: 26.094876057143324 }
43
+ ]
44
+ it(`should return ${out1} when dtIntrpPsdBySize(dt, ${psizes})`, function() {
45
+ let r = dtIntrpPsdBySize(dt, psizes)
46
+ let rr = out1
47
+ assert.strict.deepStrictEqual(r, rr)
48
+ })
49
+
50
+ })
@@ -0,0 +1,29 @@
1
+ import assert from 'assert'
2
+ import _ from 'lodash-es'
3
+ import w from 'wsemi'
4
+ import intrpPsdBySize from '../src/intrpPsdBySize.mjs'
5
+
6
+
7
+ describe(`intrpPsdBySize`, function() {
8
+
9
+ let psd = [101.6, 76.2, 50.8, 25.4, 19.0, 9.5, 4.75, 2.0, 0.85, 0.425, 0.25, 0.15, 0.106, 0.075, 0.027, 0.018, 0.011, 0.008, 0.006, 0.003, 0.001, 0.0, 0.0, 0.0]
10
+ let psf = [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, -1.0, 100.0, 99.0, 96.0, 86.0, 74.0, 61.0, 51.0, 32.0, 16.0, 0.0, 0.0, 0.0]
11
+ let pfss = _.map(psd, (_v, k) => {
12
+ let s = _.get(psd, k)
13
+ let f = _.get(psf, k)
14
+ return {
15
+ size: s,
16
+ fraction: f,
17
+ }
18
+ })
19
+ let psizes = 0.063
20
+ // let r = intrpPsdBySize(pfss, psizes)
21
+
22
+ let out1 = 98.4880247416152
23
+ it(`should return ${out1} when intrpPsdBySize(pfss, ${psizes})`, function() {
24
+ let r = intrpPsdBySize(pfss, psizes)
25
+ let rr = out1
26
+ assert.strict.deepStrictEqual(r, rr)
27
+ })
28
+
29
+ })