Coverage for /usr/local/lib/python3.11/dist-packages/grond/problems/rectangular/problem.py: 89%

54 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-10-26 15:57 +0000

1import numpy as num 

2import logging 

3 

4from pyrocko import gf, util 

5from pyrocko.guts import String, Float, Dict, Int 

6 

7from grond.meta import expand_template, Parameter, has_get_plot_classes 

8 

9from ..base import Problem, ProblemConfig 

10 

11guts_prefix = 'grond' 

12logger = logging.getLogger('grond.problems.rectangular.problem') 

13km = 1e3 

14as_km = dict(scale_factor=km, scale_unit='km') 

15 

16 

17class RectangularProblemConfig(ProblemConfig): 

18 

19 ranges = Dict.T(String.T(), gf.Range.T()) 

20 decimation_factor = Int.T(default=1) 

21 distance_min = Float.T(default=0.) 

22 

23 def get_problem(self, event, target_groups, targets): 

24 self.check_deprecations() 

25 

26 if self.decimation_factor != 1: 

27 logger.warning( 

28 'Decimation factor for rectangular source set to %i. Results ' 

29 'may be inaccurate.' % self.decimation_factor) 

30 

31 base_source = gf.RectangularSource.from_pyrocko_event( 

32 event, 

33 anchor='top', 

34 decimation_factor=self.decimation_factor) 

35 

36 subs = dict( 

37 event_name=event.name, 

38 event_time=util.time_to_str(event.time)) 

39 

40 problem = RectangularProblem( 

41 name=expand_template(self.name_template, subs), 

42 base_source=base_source, 

43 distance_min=self.distance_min, 

44 target_groups=target_groups, 

45 targets=targets, 

46 ranges=self.ranges, 

47 norm_exponent=self.norm_exponent) 

48 

49 return problem 

50 

51 

52@has_get_plot_classes 

53class RectangularProblem(Problem): 

54 

55 problem_parameters = [ 

56 Parameter('east_shift', 'm', label='Easting', **as_km), 

57 Parameter('north_shift', 'm', label='Northing', **as_km), 

58 Parameter('depth', 'm', label='Depth', **as_km), 

59 Parameter('length', 'm', label='Length', optional=False, **as_km), 

60 Parameter('width', 'm', label='Width', optional=False, **as_km), 

61 Parameter('slip', 'm', label='Slip', optional=False), 

62 Parameter('strike', 'deg', label='Strike'), 

63 Parameter('dip', 'deg', label='Dip'), 

64 Parameter('rake', 'deg', label='Rake') 

65 ] 

66 

67 problem_waveform_parameters = [ 

68 Parameter('nucleation_x', 'offset', label='Nucleation X'), 

69 Parameter('nucleation_y', 'offset', label='Nucleation Y'), 

70 Parameter('time', 's', label='Time'), 

71 Parameter('velocity', 'm/s', label='Rupture Velocity') 

72 ] 

73 

74 dependants = [] 

75 

76 distance_min = Float.T(default=0.0) 

77 

78 def pack(self, source): 

79 arr = self.get_parameter_array(source) 

80 for ip, p in enumerate(self.parameters): 

81 if p.name == 'time': 

82 arr[ip] -= self.base_source.time 

83 return arr 

84 

85 def get_source(self, x): 

86 d = self.get_parameter_dict(x) 

87 p = {} 

88 for k in self.base_source.keys(): 

89 if k in d: 

90 p[k] = float( 

91 self.ranges[k].make_relative(self.base_source[k], d[k])) 

92 

93 source = self.base_source.clone(**p) 

94 

95 return source 

96 

97 def random_uniform(self, xbounds, rstate, fixed_magnitude=None): 

98 x = num.zeros(self.nparameters) 

99 for i in range(self.nparameters): 

100 x[i] = rstate.uniform(xbounds[i, 0], xbounds[i, 1]) 

101 

102 return x 

103 

104 def preconstrain(self, x): 

105 # source = self.get_source(x) 

106 # if any(self.distance_min > source.distance_to(t) 

107 # for t in self.targets): 

108 # raise Forbidden() 

109 return x 

110 

111 @classmethod 

112 def get_plot_classes(cls): 

113 plots = super(RectangularProblem, cls).get_plot_classes() 

114 return plots 

115 

116 

117__all__ = ''' 

118 RectangularProblem 

119 RectangularProblemConfig 

120'''.split()