Hi there, I've managed to resolve the issues I was having. It came down to a problem with the type of the convection coefficient object. I was able to create a convection coefficient matrix by creating a list of size (1,Nvariables,Nvariables), and passing that as the coefficient. (Note that the same goes for diffusion coefficients in vector equations.)
The coupled diffusion example, [ http://www.ctcms.nist.gov/fipy/examples/diffusion/generated/examples.diffusion.coupled.html], gives an example of a diffusion coefficient that is specified that way. In the end, my new script looks like: --------------------8<------------------------- from fipy import * L = 0.50 nx = 10 dx = L/nx inlet_velocity = 0.1 m = Grid1D(nx=nx, Lx=L) # number of species nsp = 9 # molar concentration variable vector iv = [[0.0] for i in range(nsp)] c_i = CellVariable(mesh=m, hasOld=True, value=iv, elementshape=(nsp,)) # linear velocity # (should be a list of size (1,nsp,nsp)) u_x = [[ [0,]*nsp for n in range(nsp) ]] #type(u_x) # should return "list" #shape(u_x) # should return (1,nsp,nsp) for z in range(nsp): u_x[0][z][z] = 1.0 species_eqn = ConvectionTerm(coeff=u_x,var=c_i) == 0.2 species_eqn.solve(var=c_i) ---------------------8<---------------------------- While the script still results in an error (RuntimeError: Factor is exactly singular), it is at least a solution to the problem of how to specify coefficients. Charles On Tue, Jan 14, 2014 at 3:05 PM, Charles Reid <[email protected]>wrote: > Hi, > > I'm working on solving a set of coupled PDEs, simple convection equations > with the same velocity. However, when I write the equations in a vector > form, I have trouble with the convection term coefficient - trouble that > originates in the building of the linear system. > > *Short version:* > Does anyone have an example of solving a vector equation that contains a > convection term that is a variable on the mesh? > > *Long version:* > Here's a more precise description of the problem I'm running into. > > Suppose I'm solving for 9 species (9 equations) on a grid with 20 points. > Then I will need 20 velocities (a single velocity for all species, but > different at each point). Well, 21, since its actually a face-centered > component. > > If I try and pass a FaceVariable as a coefficient to the (vector) > ConvectionTerm, I see problems relating to the matrix system size: > > ----------------8<------------------ > > from fipy import * > > L = 0.50 > nx = 10 > dx = L/nx > inlet_velocity = 0.1 > > m = Grid1D(nx=nx, Lx=L) > > # number of species > nsp = 9 > > # molar concentration variable vector > iv = [[0.0] for i in range(nsp)] > c_i = CellVariable(mesh=m, hasOld=True, value=iv, elementshape=(nsp,)) > > # linear velocity variable > u_x = FaceVariable(mesh=m, value=inlet_velocity, rank=1) > > species_eqn = ConvectionTerm(coeff=u_x,var=c_i) == 0 > species_eqn.solve(var=c_i) > > -------------------8<------------------ > > (Note that while this example is trivial due to a constant velocity, my > problem of interest has a variable velocity.) > > The error I see when I run the solve() method relates to mismatched shapes > in the matrix system: > > IndexError: id1 does not have the same size as b > > I also tried specifying a velocity for each species, so that there are 9 > u_x variables, like this: > > u_x = FaceVariable(mesh=m, value=inlet_velocity, rank=1, > elementshape=(nsp,)) > > but saw the same error. > > I also tried specifying the velocity variable u_x as a cell centered > variable, and still saw the same error. > > I set a breakpoint where the error originates, which is in > fipy/terms/faceTerm.py in the _buildMatrix() method (line 165). The > variables id1 and id2, which contain interior points for the mesh, always > have size (nx-1), where nx is the number of mesh points in the x direction. > But the b vector always has size (nvar)*(nx-1), where nvar is the number of > unknown variables in the vector formulation. This leads to this mismatch > during the linear system construction process: > > -----------------------8<------------------------ > > (Pdb) where > [...] > > > /Library/Python/2.7/site-packages/FiPy-3.1-py2.7.egg/fipy/terms/faceTerm.py(174)_buildMatrix() > -> L = SparseMatrix(mesh=mesh) > > (Pdb) p id1.shape > (19,) > > (Pdb) p id2.shape > (19,) > > (Pdb) p b.shape > (180,) > > ------------------------8<------------------------- > > I don't see a way to construct the coefficient matrix in a way that will > get around this problem. Any advice or input on getting convection > coefficients working for vector equations would be greatly appreciated. > > Thanks! > > > > Charles >
_______________________________________________ fipy mailing list [email protected] http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
