1# http://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6import logging
7import os
8import signal
10import numpy as num
12from pyrocko import trace, gf
14guts_prefix = 'pf'
16logger = logging.getLogger('pyrocko.fomosto.dummy')
19class Interrupted(gf.store.StoreError):
20 def __str__(self):
21 return 'Interrupted.'
24class DummyGFBuilder(gf.builder.Builder):
25 def __init__(self, store_dir, step, shared, force=False):
26 self.store = gf.store.Store(store_dir, 'w')
27 gf.builder.Builder.__init__(
28 self, self.store.config, step, block_size=(1, 51), force=force)
30 def cleanup(self):
31 self.store.close()
33 def work_block(self, index):
34 (sz, firstx), (sz, lastx), (ns, nx) = \
35 self.get_block_extents(index)
37 logger.info(
38 'Starting block %i / %i' % (index+1, self.nblocks))
40 interrupted = []
42 def signal_handler(signum, frame):
43 interrupted.append(True)
45 original = signal.signal(signal.SIGINT, signal_handler)
46 self.store.lock()
47 duplicate_inserts = 0
48 try:
49 for x in num.linspace(firstx, lastx, nx):
50 for ig in range(self.store.config.ncomponents):
51 args = (sz, x, ig)
52 irec = self.store.config.irecord(*args)
53 tr = trace.Trace(
54 deltat=self.store.config.deltat,
55 ydata=num.zeros(10000)+float(irec))
57 gf_tr = gf.store.GFTrace.from_trace(tr)
59 try:
60 self.store.put(args, gf_tr)
61 except gf.store.DuplicateInsert:
62 duplicate_inserts += 1
64 finally:
65 if duplicate_inserts:
66 logger.warning(
67 '%i insertions skipped (duplicates)' % duplicate_inserts)
69 self.store.unlock()
70 signal.signal(signal.SIGINT, original)
72 if interrupted:
73 raise KeyboardInterrupt()
75 logger.info('Done with block %i / %i' % (index+1, self.nblocks))
78km = 1000.
81def init(store_dir, variant):
82 if variant is not None:
83 raise gf.store.StoreError('unsupported variant: %s' % variant)
85 store_id = os.path.basename(os.path.realpath(store_dir))
87 config = gf.meta.ConfigTypeA(
88 id=store_id,
89 ncomponents=2,
90 sample_rate=1.0,
91 receiver_depth=0*km,
92 source_depth_min=0*km,
93 source_depth_max=400*km,
94 source_depth_delta=4*km,
95 distance_min=4*km,
96 distance_max=400*km,
97 distance_delta=4*km,
98 modelling_code_id='dummy')
100 config.validate()
101 return gf.store.Store.create_editables(store_dir, config=config)
104def build(
105 store_dir,
106 force=False,
107 nworkers=None,
108 continue_=False,
109 step=None,
110 iblock=None):
112 return DummyGFBuilder.build(
113 store_dir, force=force, nworkers=nworkers, continue_=continue_,
114 step=step, iblock=iblock)