I am trying to solve the 1D Saint-Venant equation using DeepXDE. I am starting with uniform flow as an initial condition. The boundary condition at x=0 is a function of time. I wrote this code:
import deepxde as dde
import numpy as np
from deepxde.backend import tf
g = 9.81 #[m/s2]
n = 0.03 #[s/m(1/3)]
b = 1.0 #[m]
S_0 = 0.001
t_end = 1.0
def pde(x, y):
Recover dependant variables
u, h = y[:, 0:1], y[:, 1:2]
#We recall x as position is the first variable of the input of the function, and t as time is the second variable.
#Definition of partial derivatives
du_t = dde.grad.jacobian(y, x, i=0, j=1)
du_x = dde.grad.jacobian(y, x, i=0, j=0)
dh_x = dde.grad.jacobian(y, x, i=1, j=0)
S_f = (n*u)**2.0/h**(4.0/3.0)
return du_t + u * du_x + g * dh_x - g * S_0 + g * S_f
~\anaconda3\lib\site-packages\deepxde\model.py in outputs_losses(training, inputs, targets, losses_fn)
289 if targets is not None:
290 targets = torch.as_tensor(targets)
--> 291 losses = lossesfn(targets, outputs, loss_fn, inputs, self)
292 if not isinstance(losses, list):
293 losses = [losses]
~\anaconda3\lib\site-packages\deepxde\data\data.py in losses_train(self, targets, outputs, loss_fn, inputs, model, aux)
11 def losses_train(self, targets, outputs, loss_fn, inputs, model, aux=None):
12 """Return a list of losses for training dataset, i.e., constraints."""
---> 13 return self.losses(targets, outputs, loss_fn, inputs, model, aux=aux)
14
15 def losses_test(self, targets, outputs, loss_fn, inputs, model, aux=None):
~\anaconda3\lib\site-packages\deepxde\data\pde.py in losses(self, targets, outputs, loss_fn, inputs, model, aux)
154 beg, end = bcs_start[i], bcs_start[i + 1]
155 # The same BC points are used for training and testing.
--> 156 error = bc.error(self.train_x, inputs, outputs, beg, end)
157 losses.append(loss_fn[len(error_f) + i](bkd.zeros_like(error), error))
158 return losses
Hello,
I am trying to solve the 1D Saint-Venant equation using DeepXDE. I am starting with uniform flow as an initial condition. The boundary condition at x=0 is a function of time. I wrote this code:
import deepxde as dde import numpy as np from deepxde.backend import tf
g = 9.81 #[m/s2] n = 0.03 #[s/m(1/3)] b = 1.0 #[m] S_0 = 0.001
t_end = 1.0
def pde(x, y):
Recover dependant variables
def fun_u_bc0(x, y):
xx, tt = x[:, 0:1], x[:, 1:2]
def fun_u_ic(x, y): return 0.4183
def fun_h_ic(x, y): return 1.0
geom = dde.geometry.Interval(0, 1) timedomain = dde.geometry.TimeDomain(0, 1) geomtime = dde.geometry.GeometryXTime(geom, timedomain)
u_bc0 = dde.icbc.DirichletBC(geomtime, fun_ubc0, lambda , on_boundary: on_boundary, component=0) u_ic = dde.icbc.IC(geomtime, fun_uic, lambda , on_initial: on_initial, component=0) h_ic = dde.icbc.IC(geomtime, fun_hic, lambda , on_initial: on_initial, component=1)
data = dde.data.TimePDE( geomtime, pde, [u_bc0, u_ic, h_ic], num_domain=100, num_boundary=100, num_initial=100, num_test=10000, )
layer_size = [2] + [30] * 6 + [2] activation = "tanh" initializer = "Glorot uniform" net = dde.nn.FNN(layer_size, activation, initializer)
model = dde.Model(data, net) model.compile("adam", lr=1e-3, loss_weights=[0.1, 1, 1, 1]) losshistory, train_state = model.train(iterations=20000)
dde.saveplot(losshistory, train_state, issave=True, isplot=True)
And I get this error:
TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_5380\1268575135.py in
60 model = dde.Model(data, net)
61 model.compile("adam", lr=1e-3, loss_weights=[0.1, 1, 1, 1])
---> 62 losshistory, train_state = model.train(iterations=20000)
63
64 dde.saveplot(losshistory, train_state, issave=True, isplot=True)
~\anaconda3\lib\site-packages\deepxde\utils\internal.py in wrapper(*args, kwargs) 20 def wrapper(*args, *kwargs): 21 ts = timeit.default_timer() ---> 22 result = f(args, kwargs) 23 te = timeit.default_timer() 24 print("%r took %f s\n" % (f.name, te - ts))
~\anaconda3\lib\site-packages\deepxde\model.py in train(self, iterations, batch_size, display_every, disregard_previous_best, callbacks, model_restore_path, model_save_path, epochs) 603 self.train_state.set_data_train(self.data.train_next_batch(self.batch_size)) 604 self.train_state.set_data_test(self.data.test()) --> 605 self._test() 606 self.callbacks.on_train_begin() 607 if optimizers.is_external_optimizer(self.opt_name):
~\anaconda3\lib\site-packages\deepxde\model.py in _test(self) 790 self.train_state.y_pred_train, 791 self.train_state.loss_train, --> 792 ) = self._outputs_losses( 793 True, 794 self.train_state.X_train,
~\anaconda3\lib\site-packages\deepxde\model.py in _outputs_losses(self, training, inputs, targets, auxiliary_vars) 515 # TODO: auxiliary_vars 516 self.net.requiresgrad(requires_grad=False) --> 517 outs = outputs_losses(inputs, targets) 518 self.net.requiresgrad() 519 elif backend_name == "jax":
~\anaconda3\lib\site-packages\deepxde\model.py in outputs_losses_train(inputs, targets) 301 302 def outputs_losses_train(inputs, targets): --> 303 return outputs_losses(True, inputs, targets, self.data.losses_train) 304 305 def outputs_losses_test(inputs, targets):
~\anaconda3\lib\site-packages\deepxde\model.py in outputs_losses(training, inputs, targets, losses_fn) 289 if targets is not None: 290 targets = torch.as_tensor(targets) --> 291 losses = lossesfn(targets, outputs, loss_fn, inputs, self) 292 if not isinstance(losses, list): 293 losses = [losses]
~\anaconda3\lib\site-packages\deepxde\data\data.py in losses_train(self, targets, outputs, loss_fn, inputs, model, aux) 11 def losses_train(self, targets, outputs, loss_fn, inputs, model, aux=None): 12 """Return a list of losses for training dataset, i.e., constraints.""" ---> 13 return self.losses(targets, outputs, loss_fn, inputs, model, aux=aux) 14 15 def losses_test(self, targets, outputs, loss_fn, inputs, model, aux=None):
~\anaconda3\lib\site-packages\deepxde\data\pde.py in losses(self, targets, outputs, loss_fn, inputs, model, aux) 154 beg, end = bcs_start[i], bcs_start[i + 1] 155 # The same BC points are used for training and testing. --> 156 error = bc.error(self.train_x, inputs, outputs, beg, end) 157 losses.append(loss_fn[len(error_f) + i](bkd.zeros_like(error), error)) 158 return losses
~\anaconda3\lib\site-packages\deepxde\icbc\boundary_conditions.py in error(self, X, inputs, outputs, beg, end, aux_var) 72 73 def error(self, X, inputs, outputs, beg, end, aux_var=None): ---> 74 values = self.func(X, beg, end, aux_var) 75 if bkd.ndim(values) == 2 and bkd.shape(values)[1] != 1: 76 raise RuntimeError(
~\anaconda3\lib\site-packages\deepxde\icbc\boundary_conditions.py in wrapper_nocache_auxiliary(X, beg, end, aux_var) 305 @wraps(func) 306 def wrapper_nocache_auxiliary(X, beg, end, aux_var): --> 307 return func(X[beg:end], aux_var[beg:end]) 308 309 @wraps(func)
TypeError: 'NoneType' object is not subscriptable
It seems related to the way I set my boundary conditions, but I don't understand what I'm doing wrong.
Thank you in advance,