UncontrolledScenario.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import logging
  2. from bokeh.plotting import figure, output_file, show
  3. from case_study.units.ct_based.ObstacleFMU import ObstacleFMU
  4. from case_study.units.ct_based.PowerFMU import PowerFMU
  5. from case_study.units.ct_based.WindowFMU import WindowFMU
  6. l = logging.getLogger()
  7. l.setLevel(logging.DEBUG)
  8. def env_up(time):
  9. return 1.0
  10. def env_down(time):
  11. return 0.0
  12. cosim_step_size = 0.001
  13. num_internal_steps = 10
  14. stop_time = 6.0;
  15. power = PowerFMU("power", 1e-08, 1e-08, cosim_step_size/num_internal_steps,
  16. J=0.085,
  17. b=5,
  18. K=1.8,
  19. R=0.15,
  20. L=0.036,
  21. V_a=12)
  22. window_radius = 0.017
  23. window = WindowFMU("window", 1e-08, 1e-08, cosim_step_size/num_internal_steps,
  24. J=0.085,
  25. r=window_radius,
  26. b = 150,
  27. c = 1e3) # c = 1e5 makes this an unstable system.
  28. obstacle = ObstacleFMU("obstacle", 1e-08, 1e-08, cosim_step_size/num_internal_steps,
  29. c=1e5,
  30. fixed_x=0.45)
  31. power.enterInitMode()
  32. window.enterInitMode()
  33. obstacle.enterInitMode()
  34. # Solve initialisation.
  35. # Notice the order in which the FMUs can be given inputs and obtained outputs.
  36. power.setValues(0, 0, {power.i: 0.0,
  37. power.omega: 0.0,
  38. power.theta: 0.0,
  39. power.up: env_up(0.0),
  40. power.down: env_down(0.0)
  41. })
  42. pOut = power.getValues(0, 0, [power.omega, power.theta])
  43. window.setValues(0, 0, {window.omega_input: pOut[power.omega],
  44. window.theta_input: pOut[power.theta],
  45. window.theta: 0.0,
  46. window.omega: 0.0
  47. })
  48. wOut = window.getValues(0, 0, [window.tau, window.x])
  49. obstacle.setValues(0, 0, {obstacle.x: wOut[window.x]})
  50. oOut = obstacle.getValues(0, 0, [obstacle.F])
  51. # Coupling equation for power
  52. power_tau = - ( wOut[window.tau] + window_radius * oOut[obstacle.F])
  53. power.setValues(0, 0, {power.tau: power_tau})
  54. power.exitInitMode()
  55. window.exitInitMode()
  56. obstacle.exitInitMode()
  57. trace_i = [0.0]
  58. trace_omega = [0.0]
  59. trace_x = [0.0]
  60. trace_F = [0.0]
  61. times = [0.0]
  62. time = 0.0
  63. for step in range(1, int(stop_time / cosim_step_size) + 1):
  64. # set old values for window (this is not ideal)
  65. pOut = power.getValues(step-1, 0, [power.omega, power.theta, power.i])
  66. window.setValues(step, 0, {window.omega_input: pOut[power.omega],
  67. window.theta_input: pOut[power.theta]})
  68. window.doStep(time, step, 0, cosim_step_size)
  69. wOut = window.getValues(step, 0, [window.tau, window.x])
  70. obstacle.setValues(step, 0, {obstacle.x: wOut[window.x]})
  71. obstacle.doStep(time, step, 0, cosim_step_size)
  72. oOut = obstacle.getValues(step, 0, [obstacle.F])
  73. # Coupling equation
  74. power_tau = - ( wOut[window.tau] + window_radius * oOut[obstacle.F])
  75. power.setValues(step, 0, {power.tau: power_tau,
  76. power.up: env_up(time),
  77. power.down: env_down(time)})
  78. power.doStep(time, step, 0, cosim_step_size)
  79. pOut = power.getValues(step, 0, [power.omega, power.theta, power.i])
  80. trace_omega.append(pOut[power.omega])
  81. trace_i.append(pOut[power.i])
  82. trace_x.append(wOut[window.x])
  83. trace_F.append(oOut[obstacle.F])
  84. time += cosim_step_size
  85. times.append(time)
  86. color_pallete = [
  87. "#e41a1c",
  88. "#377eb8",
  89. "#4daf4a",
  90. "#984ea3",
  91. "#ff7f00",
  92. "#ffff33",
  93. "#a65628",
  94. "#f781bf"
  95. ]
  96. output_file("./results.html", title="Results")
  97. p = figure(title="Plot", x_axis_label='time', y_axis_label='')
  98. p.line(x=times, y=trace_omega, legend="trace_omega", color=color_pallete[0])
  99. p.line(x=times, y=trace_i, legend="trace_i", color=color_pallete[1])
  100. show(p)
  101. output_file("./results_x.html", title="Results")
  102. p = figure(title="Plot", x_axis_label='time', y_axis_label='')
  103. p.line(x=times, y=trace_x, legend="trace_x", color=color_pallete[2])
  104. show(p)
  105. output_file("./results_F.html", title="Results")
  106. p = figure(title="Plot", x_axis_label='time', y_axis_label='')
  107. p.line(x=times, y=trace_F, legend="trace_F", color=color_pallete[3])
  108. show(p)