diff --git a/hydrogym/core.py b/hydrogym/core.py index ed58e2b..9b9eee1 100644 --- a/hydrogym/core.py +++ b/hydrogym/core.py @@ -34,7 +34,9 @@ class PDEBase(metaclass=abc.ABCMeta): any information about solving the time-varying equations """ - MAX_CONTROL = np.inf + # MAX_CONTROL = np.inf + MAX_CONTROL_LOW = -np.inf + MAX_CONTROL_UP = np.inf DEFAULT_MESH = "" DEFAULT_DT = np.inf @@ -406,8 +408,8 @@ def __init__(self, env_config: dict): dtype=float, ) self.action_space = gym.spaces.Box( - low=-self.flow.MAX_CONTROL, - high=self.flow.MAX_CONTROL, + low=self.flow.MAX_CONTROL_LOW, + high=self.flow.MAX_CONTROL_UP, shape=(self.flow.num_inputs,), dtype=float, ) diff --git a/hydrogym/firedrake/envs/cavity/flow.py b/hydrogym/firedrake/envs/cavity/flow.py index 9fe0251..b5caa7c 100644 --- a/hydrogym/firedrake/envs/cavity/flow.py +++ b/hydrogym/firedrake/envs/cavity/flow.py @@ -41,8 +41,9 @@ class Cavity(FlowConfig): FUNCTIONS = ("q", "qB" ) # This flow needs a base flow to compute fluctuation KE - MAX_CONTROL = 1.0 - CONTROL_SCALING = 0.1 + MAX_CONTROL_LOW = 0.0 + MAX_CONTROL_UP = 0.03 + CONTROL_SCALING = 1.0 TAU = 0.075 # Time constant for controller damping (0.01*instability frequency) # Domain labels diff --git a/hydrogym/firedrake/envs/cylinder/flow.py b/hydrogym/firedrake/envs/cylinder/flow.py index b842176..c58bbf6 100644 --- a/hydrogym/firedrake/envs/cylinder/flow.py +++ b/hydrogym/firedrake/envs/cylinder/flow.py @@ -232,7 +232,8 @@ def render(self, mode="human", clim=None, levels=None, cmap="RdBu", **kwargs): class RotaryCylinder(CylinderBase): - MAX_CONTROL = 1.0 + MAX_CONTROL_LOW = -1.0 + MAX_CONTROL_UP = 1.0 CONTROL_SCALING = 5.0 DEFAULT_DT = 1e-2 @@ -246,7 +247,8 @@ def cyl_velocity_field(self): class Cylinder(CylinderBase): - MAX_CONTROL = 0.1 + MAX_CONTROL_LOW = -0.1 + MAX_CONTROL_UP = 0.1 CONTROL_SCALING = 1.0 DEFAULT_DT = 1e-2 diff --git a/hydrogym/firedrake/envs/pinball/flow.py b/hydrogym/firedrake/envs/pinball/flow.py index c29b602..8319d40 100644 --- a/hydrogym/firedrake/envs/pinball/flow.py +++ b/hydrogym/firedrake/envs/pinball/flow.py @@ -58,10 +58,11 @@ class Pinball(FlowConfig): x0 = [0.0, rad * 1.5 * 1.866, rad * 1.5 * 1.866] y0 = [0.0, 1.5 * rad, -1.5 * rad] - MAX_CONTROL = 1.0 #0.5 * np.pi + MAX_CONTROL_LOW = -1.0 + MAX_CONTROL_UP = 1.0 CONTROL_SCALING = 5.0 - # TAU = 0.5 # TODO: Tune this based on vortex shedding period - TAU = 0.04 # Time constant for controller damping (0.01*vortex shedding period) + TAU = 0.5 # TODO: Tune this based on vortex shedding period + # TAU = 0.04 # Time constant for controller damping (0.01*vortex shedding period) MESH_DIR = os.path.abspath(f"{__file__}/..") @@ -155,7 +156,8 @@ def evaluate_objective(self, q: fd.Function = None, averaged_objective_values=No else: CL, CD = averaged_objective_values[:3], averaged_objective_values[3:] # print('pinball lambda', self.reward_lambda, CD, sum(np.square(CD)), flush=True) - return sum(np.square(CD)) + self.reward_lambda * sum(np.square(CL)) + # return sum(np.square(CD)) + self.reward_lambda * sum(np.square(CL)) + return sum(CD) # return -(1.5 - (sum(CD) + self.reward_lambda * np.abs(sum(CL)))) def render(self, mode="human", clim=None, levels=None, cmap="RdBu", **kwargs): diff --git a/hydrogym/firedrake/envs/step/flow.py b/hydrogym/firedrake/envs/step/flow.py index 713afde..4b9ed26 100644 --- a/hydrogym/firedrake/envs/step/flow.py +++ b/hydrogym/firedrake/envs/step/flow.py @@ -48,7 +48,8 @@ class Step(FlowConfig): FUNCTIONS = ("q", "qB" ) # This flow needs a base flow to compute fluctuation KE - MAX_CONTROL = 1.0 + MAX_CONTROL_LOW = -1.0 + MAX_CONTROL_UP = 1.0 CONTROL_SCALING = 0.1 # Arbitrary... should tune this TAU = 0.005 # Time constant for controller damping (0.01*instability frequency) diff --git a/hydrogym/firedrake/flow.py b/hydrogym/firedrake/flow.py index cdf1e81..95441a8 100644 --- a/hydrogym/firedrake/flow.py +++ b/hydrogym/firedrake/flow.py @@ -315,8 +315,8 @@ def set_control(self, act: ArrayLike = None): if hasattr(self, "bcu_actuation"): for i in range(self.num_inputs): - u = np.clip(self.actuators[i].state, -self.MAX_CONTROL, - self.MAX_CONTROL) + u = np.clip(self.actuators[i].state, self.MAX_CONTROL_LOW, + self.MAX_CONTROL_UP) self.bcu_actuation[i].set_scale(u) def inner_product(