Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
[Michele Simionato]
* Backported fix to 64 bit poes critical for multifault sources
* Backported fix to workerpool critical for zmq clusters

python3-oq-engine (3.23.1-1~xenial01) xenial; urgency=low

[Marco Pagani]
Expand Down
30 changes: 19 additions & 11 deletions openquake/hazardlib/contexts.py
Original file line number Diff line number Diff line change
Expand Up @@ -1150,8 +1150,13 @@ def _gen_poes(self, ctx):
# split_by_mag=False because already contains a single mag
mean_stdt = self.get_mean_stds([ctx], split_by_mag=False)

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

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

# documented but not used in the engine
def get_pmap(self, ctxs, tom=None, rup_mutex={}):
Expand All @@ -1191,9 +1198,9 @@ def get_pmap(self, ctxs, tom=None, rup_mutex={}):
rup_indep = not rup_mutex
sids = numpy.unique(ctxs[0].sids)
pmap = MapArray(sids, size(self.imtls), len(self.gsims)).fill(rup_indep)
ptom = PoissonTOM(self.investigation_time)
self.tom = tom or PoissonTOM(self.investigation_time)
for ctx in ctxs:
self.update(pmap, ctx, tom or ptom, rup_mutex)
self.update(pmap, ctx, rup_mutex)
return ~pmap if rup_indep else pmap

def ratesNLG(self, srcgroup, sitecol):
Expand Down Expand Up @@ -1232,7 +1239,6 @@ def get_mean_stds(self, ctxs, split_by_mag=True):
N = sum(len(ctx) for ctx in ctxs)
M = len(self.imts)
G = len(self.gsims)
out = numpy.zeros((4, G, M, N))
if all(isinstance(ctx, numpy.recarray) for ctx in ctxs):
# contexts already vectorized
recarrays = ctxs
Expand All @@ -1242,6 +1248,7 @@ def get_mean_stds(self, ctxs, split_by_mag=True):
recarr = numpy.concatenate(
recarrays, dtype=recarrays[0].dtype).view(numpy.recarray)
recarrays = split_array(recarr, U32(numpy.round(recarr.mag*100)))
out = numpy.empty((4, G, M, N))
for g, gsim in enumerate(self.gsims):
out[:, g] = self.get_4MN(recarrays, gsim)
return out
Expand Down Expand Up @@ -1377,7 +1384,7 @@ def print_finite_size(rups):
def _get_poes(mean_std, loglevels, phi_b):
# returns a matrix of shape (N, L)
N = mean_std.shape[2] # shape (2, M, N)
out = numpy.zeros((loglevels.size, N), F32) # shape (L, N)
out = numpy.empty((loglevels.size, N), F32) # shape (L, N)
_set_poes(mean_std, loglevels, phi_b, out)
return out.T

Expand Down Expand Up @@ -1667,7 +1674,7 @@ def __eq__(self, other):
return False


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


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


# mock of a rupture used in the tests and in the SMT
# mock of a rupture used in the tests and in the module of the OQ-MBTK
class RuptureContext(BaseContext):
"""
Rupture calculation context for ground shaking intensity models.
Expand Down Expand Up @@ -1921,6 +1928,7 @@ def read_cmakers(dstore, csm=None):
oq.af = None
if csm is None:
csm = dstore['_csm']
if not hasattr(csm, 'full_lt'):
csm.full_lt = dstore['full_lt'].init()
cmakers = get_cmakers(csm.src_groups, csm.full_lt, oq)
if 'delta_rates' in dstore: # aftershock
Expand Down
44 changes: 24 additions & 20 deletions openquake/hazardlib/map_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,10 +167,6 @@ def check_hmaps(hcurves, imtls, poes):
if rel_err > .05:
raise ValueError(f'The {imt} hazard curve for {site_id=} cannot '
f'be inverted reliably around {poe=}')
elif rel_err > .01:
logging.warning(
f'The {imt} hazard curve for {site_id=} cannot be '
f'inverted reliably around {poe=}: {iml=}, {iml99=}')


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

t = numba.types
sig_i = t.void(t.float32[:, :, :], # pmap
t.float32[:, :, :], # poes
t.float64[:, :, :], # poes
t.float64[:], # rates
t.float64[:, :], # probs_occur
t.uint32[:], # sids
t.float64) # itime

sig_m = t.void(t.float32[:, :, :], # pmap
t.float32[:, :, :], # poes
t.float64[:, :, :], # poes
t.float64[:], # rates
t.float64[:, :], # probs_occur
t.float64[:], # weights
Expand All @@ -216,34 +212,37 @@ def get_lvl(hcurve, imls, poe):

@compile(sig_i)
def update_pmap_i(arr, poes, rates, probs_occur, sidxs, itime):
G = arr.shape[2]
_N, _L, G = arr.shape
for poe, rate, probs, sidx in zip(poes, rates, probs_occur, sidxs):
no_probs = len(probs) == 0
for g in range(G):
if no_probs:
arr[sidx, :, g] *= numpy.exp(-rate * poe[:, g] * itime)
else: # nonparametric rupture
arr[sidx, :, g] *= get_pnes(rate, probs, poe[:, g], itime) # shape L
arr[sidx, :, g] *= get_pnes(rate, probs, poe[:, g], itime)


@compile(sig_i)
def update_pmap_r(arr, poes, rates, probs_occur, sidxs, itime):
G = arr.shape[2]
_N, _L, G = arr.shape
for poe, rate, probs, sidx in zip(poes, rates, probs_occur, sidxs):
if len(probs) == 0:
for g in range(G):
arr[sidx, :, g] += rate * poe[:, g] * itime
else: # nonparametric rupture
for g in range(G):
arr[sidx, :, g] += -numpy.log(get_pnes(rate, probs, poe[:, g], itime))
arr[sidx, :, g] += - numpy.log(
get_pnes(rate, probs, poe[:, g], itime))


@compile(sig_m)
def update_pmap_m(arr, poes, rates, probs_occur, weights, sidxs, itime):
G = arr.shape[2]
for poe, rate, probs, w, sidx in zip(poes, rates, probs_occur, weights, sidxs):
_N, _L, G = arr.shape
for poe, rate, probs, w, sidx in zip(
poes, rates, probs_occur, weights, sidxs):
for g in range(G):
arr[sidx, :, g] += (1. - get_pnes(rate, probs, poe[:, g], itime)) * w
arr[sidx, :, g] += (1. - get_pnes(
rate, probs, poe[:, g], itime)) * w


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

def to_rates(self, itime=1.):
"""
Convert into a map containing rates unless the map already contains rates
Convert into a map of rates unless the map already contains rates
"""
if self.rates:
return self
Expand Down Expand Up @@ -406,7 +405,8 @@ def interp4D(self, imtls, poes):
# dangerous since it changes the shape by removing sites
def remove_zeros(self):
ok = self.array.sum(axis=(1, 2)) > 0
new = self.__class__(self.sids[ok], self.shape[1], self.shape[2], self.rates)
new = self.__class__(
self.sids[ok], self.shape[1], self.shape[2], self.rates)
new.array = self.array[ok]
return new

Expand All @@ -426,9 +426,11 @@ def update_indep(self, poes, ctxt, itime):
rates = ctxt.occurrence_rate
sidxs = self.sidx[ctxt.sids]
if self.rates:
update_pmap_r(self.array, poes, rates, ctxt.probs_occur, sidxs, itime)
update_pmap_r(self.array, poes, rates, ctxt.probs_occur,
sidxs, itime)
else:
update_pmap_i(self.array, poes, rates, ctxt.probs_occur, sidxs, itime)
update_pmap_i(self.array, poes, rates, ctxt.probs_occur,
sidxs, itime)

def update_mutex(self, poes, ctxt, itime, mutex_weight):
"""
Expand All @@ -437,9 +439,11 @@ def update_mutex(self, poes, ctxt, itime, mutex_weight):
rates = ctxt.occurrence_rate
probs_occur = fix_probs_occur(ctxt.probs_occur)
sidxs = self.sidx[ctxt.sids]
weights = numpy.array([mutex_weight[src_id, rup_id]
for src_id, rup_id in zip(ctxt.src_id, ctxt.rup_id)])
update_pmap_m(self.array, poes, rates, probs_occur, weights, sidxs, itime)
weights = numpy.array([
mutex_weight[src_id, rup_id]
for src_id, rup_id in zip(ctxt.src_id, ctxt.rup_id)])
update_pmap_m(self.array, poes, rates, probs_occur, weights,
sidxs, itime)

def __invert__(self):
return self.new(1. - self.array)
Expand Down
8 changes: 4 additions & 4 deletions openquake/hazardlib/tom.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def __init__(self, time_span, occurrence_rate):
self.occurrence_rate = occurrence_rate


@compile(["(float64, float64[:], float32[:], float64)",
@compile(["(float64, float64[:], float64[:], float64)",
"(float64, float64[:], float64[:,:,:], float64)"])
def get_pnes(rate, probs, poes, time_span):
"""
Expand All @@ -211,9 +211,9 @@ def get_pnes(rate, probs, poes, time_span):
"""
# NB: the NegativeBinomialTOM creates probs_occur with a rate not NaN
if time_span == 0.: # FatedTOM
return numpy.float32(1) - poes
return 1. - poes
elif len(probs) == 0: # poissonian
return numpy.exp(- numpy.float32(rate * time_span) * poes)
return numpy.exp(- rate * time_span * poes)
else:
# Uses the formula
#
Expand All @@ -226,7 +226,7 @@ def get_pnes(rate, probs, poes, time_span):
#
# `p(k|T)` is given by the attribute probs_occur and
# `p(X<x|rup)` is computed as ``1 - poes``.
pnes = numpy.full_like(poes, probs[0])
pnes = numpy.full(poes.shape, probs[0])
for p, prob in enumerate(probs[1:], 1):
pnes[:] += prob * (1 - poes) ** p
return pnes.clip(0., 1.) # avoid numeric issues
Expand Down
12 changes: 6 additions & 6 deletions openquake/qa_tests_data/disagg/case_5/expected/Dist-0.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#,,,,"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]"
#,,,,"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]"
imt,iml,poe,dist,rlz0
PGA,1.19961E-02,1.00000E-04,2.00000E+01,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.00000E+01,0.00000E+00
PGA,1.19961E-02,1.00000E-04,1.00000E+02,0.00000E+00
PGA,1.19961E-02,1.00000E-04,1.40000E+02,1.57830E-05
PGA,1.19961E-02,1.00000E-04,1.80000E+02,8.47581E-05
PGA,1.20339E-02,1.00000E-04,2.00000E+01,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.00000E+01,0.00000E+00
PGA,1.20339E-02,1.00000E-04,1.00000E+02,0.00000E+00
PGA,1.20339E-02,1.00000E-04,1.40000E+02,1.57727E-05
PGA,1.20339E-02,1.00000E-04,1.80000E+02,8.47002E-05
4 changes: 2 additions & 2 deletions openquake/qa_tests_data/disagg/case_5/expected/Lon_Lat-0.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#,,,,,"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]"
#,,,,,"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]"
imt,iml,poe,lon,lat,rlz0
PGA,1.19961E-02,1.00000E-04,-7.40000E+01,4.60000E+00,1.00540E-04
PGA,1.20339E-02,1.00000E-04,-7.40000E+01,4.60000E+00,1.00472E-04
4 changes: 2 additions & 2 deletions openquake/qa_tests_data/disagg/case_5/expected/Mag-0.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#,,,,"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]"
#,,,,"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]"
imt,iml,poe,mag,rlz0
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00540E-04
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00472E-04
12 changes: 6 additions & 6 deletions openquake/qa_tests_data/disagg/case_5/expected/Mag_Dist-0.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#,,,,,"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]"
#,,,,,"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]"
imt,iml,poe,mag,dist,rlz0
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,1.57830E-05
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,8.47581E-05
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,1.57727E-05
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,8.47002E-05
32 changes: 16 additions & 16 deletions openquake/qa_tests_data/disagg/case_5/expected/Mag_Dist_Eps-0.csv
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
#,,,,,,"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]"
#,,,,,,"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]"
imt,iml,poe,mag,dist,eps,rlz0
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,-2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,2.00000E+01,2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,-2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,6.00000E+01,2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,-2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.00000E+02,2.00000E+00,0.00000E+00
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,-2.00000E+00,1.56004E-06
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,0.00000E+00,1.14312E-05
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.40000E+02,2.00000E+00,2.79184E-06
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,-2.00000E+00,6.49051E-06
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,0.00000E+00,6.34976E-05
PGA,1.19961E-02,1.00000E-04,6.50000E+00,1.80000E+02,2.00000E+00,1.47714E-05
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,-2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,0.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,2.00000E+01,2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,-2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,0.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,6.00000E+01,2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,-2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,0.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.00000E+02,2.00000E+00,0.00000E+00
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,-2.00000E+00,1.55606E-06
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,0.00000E+00,1.14248E-05
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.40000E+02,2.00000E+00,2.79184E-06
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,-2.00000E+00,6.43750E-06
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,0.00000E+00,6.34927E-05
PGA,1.20339E-02,1.00000E-04,6.50000E+00,1.80000E+02,2.00000E+00,1.47714E-05
Loading