Git Product home page Git Product logo

fvtool's Introduction

FVTool: Finite volume toolbox for Matlab/Octave

DOI

Tiny Documents 📘.

This is a finite volume (toy) toolbox for chemical/petroleum engineers and others interested in transport phenomena. Right now, it can solve a transient convection-diffusion equation with variable velocity field/diffusion coefficients. The discretization schemes include:

  • central difference diffusion term
  • central difference convection term
  • upwind convection term
  • TVD convection term with various flux limiters
  • transient term
  • Dirichlet, Neumann, Robin, and periodic boundary conditions

diffusion pde

Which equation do you solve?

You can solve the following PDE (or a subset of it):
advection diffusion

with the following boundary conditions:
boundary condition

Believe it or not, the above equations describe the majority of the transport phenomena in chemical and petroleum engineering and similar fields.

How to start

Download the package, start matlab, and run FVToolStartUp

Inspiration

I started writing this tool after playing with [FiPy] (http://www.ctcms.nist.gov/fipy/), an amazing python-based finite volume solver. This Matlab/Octave solver is not a clone, and indeed very limited compared to FiPy. I wrote it to have a very handy tool for testing new ideas (new mathematical models) by solving them in 1D uniform Cartesian grids. Then I extended the code to

  • 1D axisymmetric (radial)
  • 1D spherical (r)
  • 2D radial (r, theta)
  • 2D Cartesian
  • 3D Cartesian
  • 2D axisymmetric (cylindrical, r, z)
  • 3D cylindrical (r, theta, z)

I have overloaded some of the Matlab operators to simplify the switch from 1D codes to 2D and 3D.

A simple example

You can solve a diffusion equation, i.e., $ \nabla. (-D \nabla \phi) = 0 $ by running the following code in Matlab:

clc; clear;
L = 50;  % domain length
Nx = 20; % number of cells
m = createMesh1D(Nx, L);
BC = createBC(m); % all Neumann boundary condition structure
BC.left.a(:) = 0; BC.left.b(:)=1; BC.left.c(:)=1; % Dirichlet for the left boundary
BC.right.a(:) = 0; BC.right.b(:)=1; BC.right.c(:)=0; % right boundary
D_val = 1; % value of the diffusion coefficient
D = createCellVariable(m, D_val); % assign the diffusion coefficient to the cells
D_face = harmonicMean(D); % calculate harmonic average of the diffusion coef on the cell faces
Mdiff = diffusionTerm(D_face); % matrix of coefficients for the diffusion term
[Mbc, RHSbc] = boundaryCondition(BC); % matix of coefficients and RHS vector for the BC
M = Mdiff + Mbc; % matrix of cefficients for the PDE
c = solvePDE(m,M, RHSbc); % send M and RHS to the solver
visualizeCells(c); % visualize the results

change the third line to m = createMesh2D(Nx,Nx, L,L); or m = createMesh3D(Nx,Nx,Nx, L,L,L); and see the outcome for yourself.
diff 3D

Examples

There are a few simple examples in the Tutorial folder. You can also find a few more advanced examples (water injection into a heterogeneous oil field, two nonlinear PDE's, coupled fully implicit solution) in the Advanced folder.

Documents

Find some preliminary documents here.

But Matlab is not a free software?

You can use the code in Octave. The new (object oriented) version of the code works in Octave 4.0 (with the new classdef function).
I've re-written the code in Julia. It works fine, but the visualization on Windows OS has still some issues.

Questions and bug reports

You can ask your questions by creating a new issue here, or by writing a comment in [my blog] (http://fvt.simulkade.com). You can aslo ask your question in the [Matlab file exchange page] (http://www.mathworks.com/matlabcentral/fileexchange/46637-a-simple-finite-volume-solver-for-matlab) of this code. I truly appreciate your feedback and/or contribution.

How to cite:

If you have used the package in your work and you find it usefull, please cite it as:

@misc{ali_akbar_eftekhari_2015_32745,
  author       = {Ali Akbar Eftekhari and Kai Schüller and Ferran Brosa Planella},
  title        = {FVTool: a finite volume toolbox for Matlab},
  month        = oct,
  year         = 2015,
  doi          = {10.5281/zenodo.32745},
  url          = {https://doi.org/10.5281/zenodo.32745}
}

I will also appreciate it if you write me a couple of lines about how you have used it in your research. It encourages me to maintain the code.

fvtool's People

Contributors

kaischu avatar mhvwerts avatar simulkade avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.