lululxvi / deepxde

A library for scientific machine learning and physics-informed learning
https://deepxde.readthedocs.io
GNU Lesser General Public License v2.1
2.64k stars 739 forks source link

Problem solving the 1D Saint-Venant equation #1159

Open Giamy98 opened 1 year ago

Giamy98 commented 1 year ago

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

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

def fun_u_bc0(x, y):

xx, tt = x[:, 0:1], x[:, 1:2]

#u, h = y[:, 0:1], y[:, 1:2]
#qq = 1.0 + np.sin(tt*np.pi/t_end)
#return qq/(b*h)
return 1.0

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,

lululxvi commented 1 year ago

Your code format is hard to read.