Skip to content

Commit 6cd2477

Browse files
authored
Merge pull request #10474 from gem/64bit
Backported fix to 64 bit poes
2 parents 66bba23 + 0b84971 commit 6cd2477

23 files changed

Lines changed: 880 additions & 864 deletions

debian/changelog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
[Michele Simionato]
2+
* Backported fix to 64 bit poes critical for multifault sources
3+
* Backported fix to workerpool critical for zmq clusters
4+
15
python3-oq-engine (3.23.1-1~xenial01) xenial; urgency=low
26

37
[Marco Pagani]

openquake/hazardlib/contexts.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,8 +1150,13 @@ def _gen_poes(self, ctx):
11501150
# split_by_mag=False because already contains a single mag
11511151
mean_stdt = self.get_mean_stds([ctx], split_by_mag=False)
11521152

1153-
# making plenty of slices so that the array `poes` is small
1154-
for slc in split_in_slices(len(ctx), 2*L1):
1153+
if len(ctx) < 1000:
1154+
# do not split in slices to make debugging easier
1155+
slices = [slice(0, len(ctx))]
1156+
else:
1157+
# making plenty of slices so that the array `poes` is small
1158+
slices = split_in_slices(len(ctx), 2*L1)
1159+
for slc in slices:
11551160
with self.poe_mon:
11561161
# this is allocating at most a few MB of RAM
11571162
poes = numpy.zeros((slc.stop-slc.start, M*L1, G), F32)
@@ -1164,7 +1169,7 @@ def _gen_poes(self, ctx):
11641169
else: # regular case
11651170
set_poes(gsim, ms, self, ctx, poes[:, :, g], slc)
11661171
yield poes, mean_stdt[0, :, :, slc], mean_stdt[1, :, :, slc], slc
1167-
#cs, ms, ps = ctx.nbytes/TWO20, mean_stdt.nbytes/TWO20, poes.nbytes/TWO20
1172+
#cs,ms,ps = ctx.nbytes/TWO20, mean_stdt.nbytes/TWO20, poes.nbytes/TWO20
11681173
#print('C=%.1fM, mean_stds=%.1fM, poes=%.1fM, G=%d' % (cs, ms, ps, G))
11691174

11701175
def gen_poes(self, ctx):
@@ -1178,7 +1183,9 @@ def gen_poes(self, ctx):
11781183
ctxt = ctx[ctx.mag == mag]
11791184
self.cfactor += [len(ctxt), 1]
11801185
for poes, mea, sig, slc in self._gen_poes(ctxt):
1181-
yield poes, mea, sig, ctxt[slc]
1186+
# NB: using directly 64 bit poes would be slower without reason
1187+
# since with astype(F64) the numbers are identical
1188+
yield poes.astype(F64), mea, sig, ctxt[slc]
11821189

11831190
# documented but not used in the engine
11841191
def get_pmap(self, ctxs, tom=None, rup_mutex={}):
@@ -1191,9 +1198,9 @@ def get_pmap(self, ctxs, tom=None, rup_mutex={}):
11911198
rup_indep = not rup_mutex
11921199
sids = numpy.unique(ctxs[0].sids)
11931200
pmap = MapArray(sids, size(self.imtls), len(self.gsims)).fill(rup_indep)
1194-
ptom = PoissonTOM(self.investigation_time)
1201+
self.tom = tom or PoissonTOM(self.investigation_time)
11951202
for ctx in ctxs:
1196-
self.update(pmap, ctx, tom or ptom, rup_mutex)
1203+
self.update(pmap, ctx, rup_mutex)
11971204
return ~pmap if rup_indep else pmap
11981205

11991206
def ratesNLG(self, srcgroup, sitecol):
@@ -1232,7 +1239,6 @@ def get_mean_stds(self, ctxs, split_by_mag=True):
12321239
N = sum(len(ctx) for ctx in ctxs)
12331240
M = len(self.imts)
12341241
G = len(self.gsims)
1235-
out = numpy.zeros((4, G, M, N))
12361242
if all(isinstance(ctx, numpy.recarray) for ctx in ctxs):
12371243
# contexts already vectorized
12381244
recarrays = ctxs
@@ -1242,6 +1248,7 @@ def get_mean_stds(self, ctxs, split_by_mag=True):
12421248
recarr = numpy.concatenate(
12431249
recarrays, dtype=recarrays[0].dtype).view(numpy.recarray)
12441250
recarrays = split_array(recarr, U32(numpy.round(recarr.mag*100)))
1251+
out = numpy.empty((4, G, M, N))
12451252
for g, gsim in enumerate(self.gsims):
12461253
out[:, g] = self.get_4MN(recarrays, gsim)
12471254
return out
@@ -1377,7 +1384,7 @@ def print_finite_size(rups):
13771384
def _get_poes(mean_std, loglevels, phi_b):
13781385
# returns a matrix of shape (N, L)
13791386
N = mean_std.shape[2] # shape (2, M, N)
1380-
out = numpy.zeros((loglevels.size, N), F32) # shape (L, N)
1387+
out = numpy.empty((loglevels.size, N), F32) # shape (L, N)
13811388
_set_poes(mean_std, loglevels, phi_b, out)
13821389
return out.T
13831390

@@ -1667,7 +1674,7 @@ def __eq__(self, other):
16671674
return False
16681675

16691676

1670-
# mock of a site collection used in the tests and in the SMT
1677+
# mock of a site collection used in the tests and in the SMT module of the OQ-MBTK
16711678
class SitesContext(BaseContext):
16721679
"""
16731680
Sites calculation context for ground shaking intensity models.
@@ -1726,7 +1733,7 @@ def get_dists(ctx):
17261733

17271734

17281735
# used to produce a RuptureContext suitable for legacy code, i.e. for calls
1729-
# to .get_mean_and_stddevs, like for instance in the SMT
1736+
# to .get_mean_and_stddevs, like for instance in the SMT module of the OQ-MBTK
17301737
def full_context(sites, rup, dctx=None):
17311738
"""
17321739
:returns: a full RuptureContext with all the relevant attributes
@@ -1766,7 +1773,7 @@ def get_mean_stds(gsim, ctx, imts, **kw):
17661773
return out[:, 0] if single else out
17671774

17681775

1769-
# mock of a rupture used in the tests and in the SMT
1776+
# mock of a rupture used in the tests and in the module of the OQ-MBTK
17701777
class RuptureContext(BaseContext):
17711778
"""
17721779
Rupture calculation context for ground shaking intensity models.
@@ -1921,6 +1928,7 @@ def read_cmakers(dstore, csm=None):
19211928
oq.af = None
19221929
if csm is None:
19231930
csm = dstore['_csm']
1931+
if not hasattr(csm, 'full_lt'):
19241932
csm.full_lt = dstore['full_lt'].init()
19251933
cmakers = get_cmakers(csm.src_groups, csm.full_lt, oq)
19261934
if 'delta_rates' in dstore: # aftershock

openquake/hazardlib/map_array.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,6 @@ def check_hmaps(hcurves, imtls, poes):
167167
if rel_err > .05:
168168
raise ValueError(f'The {imt} hazard curve for {site_id=} cannot '
169169
f'be inverted reliably around {poe=}')
170-
elif rel_err > .01:
171-
logging.warning(
172-
f'The {imt} hazard curve for {site_id=} cannot be '
173-
f'inverted reliably around {poe=}: {iml=}, {iml99=}')
174170

175171

176172
# not used right now
@@ -199,14 +195,14 @@ def get_lvl(hcurve, imls, poe):
199195

200196
t = numba.types
201197
sig_i = t.void(t.float32[:, :, :], # pmap
202-
t.float32[:, :, :], # poes
198+
t.float64[:, :, :], # poes
203199
t.float64[:], # rates
204200
t.float64[:, :], # probs_occur
205201
t.uint32[:], # sids
206202
t.float64) # itime
207203

208204
sig_m = t.void(t.float32[:, :, :], # pmap
209-
t.float32[:, :, :], # poes
205+
t.float64[:, :, :], # poes
210206
t.float64[:], # rates
211207
t.float64[:, :], # probs_occur
212208
t.float64[:], # weights
@@ -216,34 +212,37 @@ def get_lvl(hcurve, imls, poe):
216212

217213
@compile(sig_i)
218214
def update_pmap_i(arr, poes, rates, probs_occur, sidxs, itime):
219-
G = arr.shape[2]
215+
_N, _L, G = arr.shape
220216
for poe, rate, probs, sidx in zip(poes, rates, probs_occur, sidxs):
221217
no_probs = len(probs) == 0
222218
for g in range(G):
223219
if no_probs:
224220
arr[sidx, :, g] *= numpy.exp(-rate * poe[:, g] * itime)
225221
else: # nonparametric rupture
226-
arr[sidx, :, g] *= get_pnes(rate, probs, poe[:, g], itime) # shape L
222+
arr[sidx, :, g] *= get_pnes(rate, probs, poe[:, g], itime)
227223

228224

229225
@compile(sig_i)
230226
def update_pmap_r(arr, poes, rates, probs_occur, sidxs, itime):
231-
G = arr.shape[2]
227+
_N, _L, G = arr.shape
232228
for poe, rate, probs, sidx in zip(poes, rates, probs_occur, sidxs):
233229
if len(probs) == 0:
234230
for g in range(G):
235231
arr[sidx, :, g] += rate * poe[:, g] * itime
236232
else: # nonparametric rupture
237233
for g in range(G):
238-
arr[sidx, :, g] += -numpy.log(get_pnes(rate, probs, poe[:, g], itime))
234+
arr[sidx, :, g] += - numpy.log(
235+
get_pnes(rate, probs, poe[:, g], itime))
239236

240237

241238
@compile(sig_m)
242239
def update_pmap_m(arr, poes, rates, probs_occur, weights, sidxs, itime):
243-
G = arr.shape[2]
244-
for poe, rate, probs, w, sidx in zip(poes, rates, probs_occur, weights, sidxs):
240+
_N, _L, G = arr.shape
241+
for poe, rate, probs, w, sidx in zip(
242+
poes, rates, probs_occur, weights, sidxs):
245243
for g in range(G):
246-
arr[sidx, :, g] += (1. - get_pnes(rate, probs, poe[:, g], itime)) * w
244+
arr[sidx, :, g] += (1. - get_pnes(
245+
rate, probs, poe[:, g], itime)) * w
247246

248247

249248
def fix_probs_occur(probs_occur):
@@ -354,7 +353,7 @@ def convert(self, imtls, nsites, idx=0):
354353

355354
def to_rates(self, itime=1.):
356355
"""
357-
Convert into a map containing rates unless the map already contains rates
356+
Convert into a map of rates unless the map already contains rates
358357
"""
359358
if self.rates:
360359
return self
@@ -406,7 +405,8 @@ def interp4D(self, imtls, poes):
406405
# dangerous since it changes the shape by removing sites
407406
def remove_zeros(self):
408407
ok = self.array.sum(axis=(1, 2)) > 0
409-
new = self.__class__(self.sids[ok], self.shape[1], self.shape[2], self.rates)
408+
new = self.__class__(
409+
self.sids[ok], self.shape[1], self.shape[2], self.rates)
410410
new.array = self.array[ok]
411411
return new
412412

@@ -426,9 +426,11 @@ def update_indep(self, poes, ctxt, itime):
426426
rates = ctxt.occurrence_rate
427427
sidxs = self.sidx[ctxt.sids]
428428
if self.rates:
429-
update_pmap_r(self.array, poes, rates, ctxt.probs_occur, sidxs, itime)
429+
update_pmap_r(self.array, poes, rates, ctxt.probs_occur,
430+
sidxs, itime)
430431
else:
431-
update_pmap_i(self.array, poes, rates, ctxt.probs_occur, sidxs, itime)
432+
update_pmap_i(self.array, poes, rates, ctxt.probs_occur,
433+
sidxs, itime)
432434

433435
def update_mutex(self, poes, ctxt, itime, mutex_weight):
434436
"""
@@ -437,9 +439,11 @@ def update_mutex(self, poes, ctxt, itime, mutex_weight):
437439
rates = ctxt.occurrence_rate
438440
probs_occur = fix_probs_occur(ctxt.probs_occur)
439441
sidxs = self.sidx[ctxt.sids]
440-
weights = numpy.array([mutex_weight[src_id, rup_id]
441-
for src_id, rup_id in zip(ctxt.src_id, ctxt.rup_id)])
442-
update_pmap_m(self.array, poes, rates, probs_occur, weights, sidxs, itime)
442+
weights = numpy.array([
443+
mutex_weight[src_id, rup_id]
444+
for src_id, rup_id in zip(ctxt.src_id, ctxt.rup_id)])
445+
update_pmap_m(self.array, poes, rates, probs_occur, weights,
446+
sidxs, itime)
443447

444448
def __invert__(self):
445449
return self.new(1. - self.array)

openquake/hazardlib/tom.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def __init__(self, time_span, occurrence_rate):
197197
self.occurrence_rate = occurrence_rate
198198

199199

200-
@compile(["(float64, float64[:], float32[:], float64)",
200+
@compile(["(float64, float64[:], float64[:], float64)",
201201
"(float64, float64[:], float64[:,:,:], float64)"])
202202
def get_pnes(rate, probs, poes, time_span):
203203
"""
@@ -211,9 +211,9 @@ def get_pnes(rate, probs, poes, time_span):
211211
"""
212212
# NB: the NegativeBinomialTOM creates probs_occur with a rate not NaN
213213
if time_span == 0.: # FatedTOM
214-
return numpy.float32(1) - poes
214+
return 1. - poes
215215
elif len(probs) == 0: # poissonian
216-
return numpy.exp(- numpy.float32(rate * time_span) * poes)
216+
return numpy.exp(- rate * time_span * poes)
217217
else:
218218
# Uses the formula
219219
#
@@ -226,7 +226,7 @@ def get_pnes(rate, probs, poes, time_span):
226226
#
227227
# `p(k|T)` is given by the attribute probs_occur and
228228
# `p(X<x|rup)` is computed as ``1 - poes``.
229-
pnes = numpy.full_like(poes, probs[0])
229+
pnes = numpy.full(poes.shape, probs[0])
230230
for p, prob in enumerate(probs[1:], 1):
231231
pnes[:] += prob * (1 - poes) ** p
232232
return pnes.clip(0., 1.) # avoid numeric issues
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#,,,,"generated_by='OpenQuake engine 3.21.0-git507bc4b13a', start_date='2024-08-10T07:05:51', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
1+
#,,,,"generated_by='OpenQuake engine 3.23.1-git66bba23c11', start_date='2025-03-26T16:25:10', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
22
imt,iml,poe,dist,rlz0
3-
PGA,1.19961E-02,1.00000E-04,2.00000E+01,0.00000E+00
4-
PGA,1.19961E-02,1.00000E-04,6.00000E+01,0.00000E+00
5-
PGA,1.19961E-02,1.00000E-04,1.00000E+02,0.00000E+00
6-
PGA,1.19961E-02,1.00000E-04,1.40000E+02,1.57830E-05
7-
PGA,1.19961E-02,1.00000E-04,1.80000E+02,8.47581E-05
3+
PGA,1.20339E-02,1.00000E-04,2.00000E+01,0.00000E+00
4+
PGA,1.20339E-02,1.00000E-04,6.00000E+01,0.00000E+00
5+
PGA,1.20339E-02,1.00000E-04,1.00000E+02,0.00000E+00
6+
PGA,1.20339E-02,1.00000E-04,1.40000E+02,1.57727E-05
7+
PGA,1.20339E-02,1.00000E-04,1.80000E+02,8.47002E-05
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
#,,,,,"generated_by='OpenQuake engine 3.21.0-git507bc4b13a', start_date='2024-08-10T07:05:51', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
1+
#,,,,,"generated_by='OpenQuake engine 3.23.1-git66bba23c11', start_date='2025-03-26T16:25:10', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
22
imt,iml,poe,lon,lat,rlz0
3-
PGA,1.19961E-02,1.00000E-04,-7.40000E+01,4.60000E+00,1.00540E-04
3+
PGA,1.20339E-02,1.00000E-04,-7.40000E+01,4.60000E+00,1.00472E-04
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
#,,,,"generated_by='OpenQuake engine 3.21.0-git507bc4b13a', start_date='2024-08-10T07:05:51', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
1+
#,,,,"generated_by='OpenQuake engine 3.23.1-git66bba23c11', start_date='2025-03-26T16:25:10', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
22
imt,iml,poe,mag,rlz0
3-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00540E-04
3+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00472E-04
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#,,,,,"generated_by='OpenQuake engine 3.21.0-git507bc4b13a', start_date='2024-08-10T07:05:51', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
1+
#,,,,,"generated_by='OpenQuake engine 3.23.1-git66bba23c11', start_date='2025-03-26T16:25:10', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
22
imt,iml,poe,mag,dist,rlz0
3-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00
4-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00
5-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00
6-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,1.57830E-05
7-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,8.47581E-05
3+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00
4+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00
5+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00
6+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,1.57727E-05
7+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,8.47002E-05
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
#,,,,,,"generated_by='OpenQuake engine 3.21.0-git507bc4b13a', start_date='2024-08-10T07:05:51', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
1+
#,,,,,,"generated_by='OpenQuake engine 3.23.1-git66bba23c11', start_date='2025-03-26T16:25:10', checksum=154257206, investigation_time=1.0, mag_bin_edges=[6.0, 7.0], dist_bin_edges=[0.0, 40.0, 80.0, 120.0, 160.0, 200.0], lon_bin_edges=[-75.80445236037271, -72.19554763962729], lat_bin_edges=[2.80136, 6.398639999999999], eps_bin_edges=[-3.0, -1.0, 1.0, 3.0], tectonic_region_types=['Deep Seismicity'], lon=-74.0, lat=4.6, weights=[1.0], rlz_ids=[0]"
22
imt,iml,poe,mag,dist,eps,rlz0
3-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,-2.00000E+00,0.00000E+00
4-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00,0.00000E+00
5-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,2.00000E+00,0.00000E+00
6-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,-2.00000E+00,0.00000E+00
7-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00,0.00000E+00
8-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,2.00000E+00,0.00000E+00
9-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,-2.00000E+00,0.00000E+00
10-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00,0.00000E+00
11-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,2.00000E+00,0.00000E+00
12-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,-2.00000E+00,1.56004E-06
13-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,0.00000E+00,1.14312E-05
14-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,2.00000E+00,2.79184E-06
15-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,-2.00000E+00,6.49051E-06
16-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,0.00000E+00,6.34976E-05
17-
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,2.00000E+00,1.47714E-05
3+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,-2.00000E+00,0.00000E+00
4+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00,0.00000E+00
5+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,2.00000E+00,0.00000E+00
6+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,-2.00000E+00,0.00000E+00
7+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00,0.00000E+00
8+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,2.00000E+00,0.00000E+00
9+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,-2.00000E+00,0.00000E+00
10+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00,0.00000E+00
11+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,2.00000E+00,0.00000E+00
12+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,-2.00000E+00,1.55606E-06
13+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,0.00000E+00,1.14248E-05
14+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,2.00000E+00,2.79184E-06
15+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,-2.00000E+00,6.43750E-06
16+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,0.00000E+00,6.34927E-05
17+
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,2.00000E+00,1.47714E-05

0 commit comments

Comments
 (0)