model.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env python
  2. import functools
  3. from wtforms import Form, FloatField, validators
  4. from math import pi
  5. def check_interval(form, field, min_value=None, max_value=None):
  6. """Form validation: failure if value is outside an interval"""
  7. if min_value is not None:
  8. failure = True if field.data < min_value else False
  9. if max_value is not None:
  10. failure = True if field.data > max_value else False
  11. if failure:
  12. raise validators.ValidationError(
  13. f"{field.name} = {field.data} not in [{'-infty' if min_value is None else min_value}, {'infty' if max_value is None else max_value}]")
  14. def interval(min_value=None, max_value=None):
  15. return functools.partial(check_interval, min_value=min_value, max_value=max_value)
  16. def check_T(form, field):
  17. """Form validation: failure if T > 30 periods"""
  18. w = form.w.data
  19. T = field.data
  20. period = 2*pi/w
  21. if T > 30*period:
  22. nperiod = int(round(T/period))
  23. raise validators.ValidationError(
  24. f"Cannot plot as much as {nperiod} period! T < {30*period:.0f}")
  25. class InputForm(Form):
  26. A = FloatField(
  27. label='amplitude (m)', default=1.0,
  28. validators=[validators.InputRequired(), interval(0, None)])
  29. b = FloatField(
  30. label='damping factor (kg/s)', default=0,
  31. validators=[validators.InputRequired(), interval(0, None)])
  32. w = FloatField(
  33. label='frequency (1/s)', default=2*pi,
  34. validators=[validators.InputRequired()])
  35. T = FloatField(
  36. label='time interval (s)', default=20,
  37. validators=[validators.InputRequired(), check_T])