is a console application to solve scientific computing problems invoking partial differential equations. The numerical solution is based on the library. handles also the numerical solution of algebraic equations, ordinary differential equations and most basic numerical analysis problems.

can be either run interactively by typing a series of commands or by using a shell script file.
The latter option can be chosen either by executing
   rita script-file
or once in the execution by typing
   load script-file
The file script-file must contain all commands to be executed, one on each line.

The tutorial contains a series of examples of script files.

rita commands

Here is a list of available commands in the console application. These commands can be classified in categories:

  • Syntax Rules

    • Running consists in typing commands that use one are more arguments
    • A line starting with the character # is a comment line that is ignored by the application.
    • A line starting with the character ! defines a system shell command
    • The command exit (or quit) causes quitting the application, while pressing the Ctrl-D sequence interrupts the execution.
    • As they may be many levels of commands, the command end or < enables going to higher level
    • Some commands have a short version to simplify their usage in interactive mode. This one is shown in parenthesis in the present guide

  • Settings

    Here is the list of setting commands:
    • help (or ?): displays the list of available commands with a brief description.
    • license (or lic): displays the License agreement of the application.
    • set <argument> <value>
      Enables modifying default configuration parameters.
      • The argument verbosity (or verb) sets a value for verbosity parameter. Its default value is 1. The value can be chosen between 0 and 10, from a silent execution to extensive messaging.
      • The argument save-results (or save) is a toggle. The value can be any positive number to impose that all calculation results are stored in a dedicated file. The value 0 means that no saving is made, unless specified for a particular purpose.
      • history enables choosing a history file name rather than default name (.rita.his). The value is the file name. The history file echoes all typed commands in . It can be used, after possibly changing its name for a new execution.
      • log enables choosing a log file name rather than default name (.rita.log). The value is the file name. The log file contains all found errors while running .

  • Solver commands

    Here is the list of available solver commands:
    data, mesh, stationary, transient, algebraic, ode, pde, optim, eigen, integration, approximation.
    • Command data enables defining several types of data that can be used in solvers. Once this command is entered (without arguments) a submenu is available. These types are: fields, functions, tabulations, grids, meshes. For these ones the following commands are available: field, function, tabulation, grid, mesh.
      • Keyword field:
        field [name=nm] [size=n] [mesh=m] [grid=g]  [nbdof=d] [type=t]
        All arguments are optional but at least of of them is needed.
        • nm: Name of field.
        • n: Size of field. If this one is not defined through a mesh of a grid
        • m: Name of mesh associated to field. In this case, field size is determined by mesh.
        • g: Name of grid associated to field. In this case, field size is determined by grid.
        • d: Number of degrees of freedom for any degree of freedom support. e.g., for a field defined through a mesh associated to nodes, d is the number of field components at each node.
        • t is a string defined degrees of freedom support. This argument is useless if the field is not associated to a mesh. Its default value is nodes. Other possible values are elements, sides or edges.
      • Keyword function:
        function [name=nm] <var=v> [nb=n]  <definition=d>
        • nm: Name of function. This argument is optional, but a name of a function is the only way to retrieve it.
        • v: Name of variable. In the case of a multivariable function, the nume of variables is defined by v1, v2, ...
        • n: Number of variables. By default this value is 1.
        • d: String defining an expression of the function definition. If the string must contain blank spaces, it must enclosed in ". This argument is mandatory.
      • Keyword tabulation is under implementation
      • Keyword grid enables constructing a structured grid of an interval (in 1-D), a rectangle (in 2-D) or a cube (in 3-D):
        grid [name=nm] <min=mx,my,mz> <max=Mx,My,Mz>  [ne=nx,ny,nz]
        • nm: Name of grid. This argument is optional.
        • mx, my, mz: Minimal value of the intervals: The gridded domain is defined by (mx,Mx)*(my,My)*(mz,Mz). If the parameters my and mz are absent, the domain is the interval (mx,Mx) and if only m3 is absent, the domain is the rectangle (mx,Mx)*(my,My).
        • Mx, My, Mz: Maximal value of the intervals: The gridded domain is defined by (mx,Mx)*(my,My)*(mz,Mz). If the parameters My and Mz are absent, the domain is the interval (m1,M1) and if only Mz is absent, the domain is the rectangle (mx,Mx)*(my,My).
        • nx, ny, nz: Subdivision of the grid, nx (resp. ny, nz) is the number of intervals in the x (resp. y, z) direction. The default value of these parameters is 10.
      • Keyword mesh enables building a finite element mesh. This leads the user to the main menu with the command mesh.
    • Command mesh.
      A finite element mesh is the discretization of the physical domain where the process to study takes place. This means partitioning the domain (1-D, 2-D or 3-D) into specific subdomains. More commonly, intervals in 1-D, triangles or quadrilaterals in 2-D, and tetrahedra, hexahedra or pentahedra in 3-D.
      does not contain a powerful mesh generator. We use a simple 2-D generator issued from the OFELI library. For unstructuerd 2-D and 3-D meshes uses the open source mesh generator Gmsh. For this, it is highly recommended to install and Gmsh. The purpose of command mesh is to prepare data for Gmsh and generate the mesh. Once the command mesh is entered, the following subcommands are available:
      help or ?, 1d, rectangle, cube, point, curve, surface, volume, contour, code, generate, nbdof, list, plot, clear, save, read
      • Keyword 1d constructs a 1-D mesh of an interval:
        1d [domain=m,M] [ne=n] [codes=c1,c2] [nbdof=d] [save=file]
        • m, M are extremal coordinates of interval ends. The default values are 0., 1.
        • n is the number of elements in the interval. Its default value is 10.
        • c1, c2 are the codes associated to the first and the last node. These integer values are necessary to enforce boundary conditions. A code 0 (Default value) means no condition to prescribe.
        • d is the number of degrees of freedom associated to any generated node. Default value is 1.
        • file is the name of the file where the generated mesh will be stored. By default the mesh remains in memory but is not saved in file.
      • Keyword rectangle constructs a 2-D mesh of a rectangle:
        rectangle [min=mx,my] [max=Mx,My] [ne=nx,ny]  [codes=c1,c2,c3,c4] [nbdof=d] [save=file]
        • mx, my are the coordinates of the lower left corner of the rectangle. The default values are 0., 0.
        • Mx, My are the coordinates of the upper right corner of the rectangle. The default values are 1., 1.
        • nx, ny is the number of elements in x and y direction respectively. Their default value is 10.
        • c1, c2, c3, c4 are the codes associated to the nodes generated on the lines y=my, x=Mx, y=My, x=mx respectively. These integer values are necessary to enforce boundary conditions. A code 0 (Default value) means no condition to prescribe.
        • d is the number of degrees of freedom associated to any generated node. Default value is 1.
        • file is the name of the file where the generated mesh will be stored. By default the mesh remains in memory but is not saved in file.
      • Keyword cube constructs a 3-D mesh of a cube-like domain:
        cube [min=mx,my,mz] [max=Mx,My,Mz] [ne=nx,ny,nz]  [codes=cxm,cxM,cym,cyM,czm,czM] [nbdof=d] [save=file]
        • mx, my, mz are the minimal coordinates in each direction. The default values are 0., 0., 0.
        • Mx, My, Mz are the maximal coordinates in each direction. The default values are 1., 1., 1.
        • nx, ny, nz is the number of elements in x, y and z direction respectively. Their default values are 10.
        • cxm, cxM, cym, cyM, czm, czM are the codes associated to the nodes generated on the face x=mx, x=Mx, y=my, y=My, z=mz, z=Mz respectively. These integer values are necessary to enforce boundary conditions. A code 0 (Default value) means no condition to prescribe.
        • d is the number of degrees of freedom associated to any generated node. Default value is 1.
        • file is the name of the file where the generated mesh will be stored. By default the mesh remains in memory but is not saved in file.
      • Keyword point defines a point (vertex) in a polygonal or polyhedral domain: point label=n coord=x,y,z size=h
        • n is the point's label.
        • x, y, z are the point coordinates. If y and/or z are not given, their value is set to 0. This can be the case for 1-D and 2-D.
        • h is the mesh size around the point.
      • Keyword curve defines a curve (or line):
        curve label=n [line=n1,n2] [circle=n1,n2,n3]
        Here the second and the third argument are exclusive.
        • n is the curve's label.
        • n1, n2 are the labels of points defining a line.
        • n1, n2, n3 are the labels of points defining a circular arc, n1 and n2 are the two points defining the extremities of the arc and n3 is the point defining the center of the circular arc.
      • Keyword contour defines a contour as an assembly of curves:
        contour label=n curve=c1,c2,...
        • n is the contour's label.
        • c1, c2, ... are the labels of curves defining the contour.
      • Keyword surface defines a surface as delimited by curves:
        surface label=n contours=c1,c2,...
        • n is the surface's label.
        • c1, c2, ... are the labels of contours defining the surface.
      • Keyword volume is under development.
      • Keyword code enables assigning codes to various entities of the geometry, and then of the generated mesh:
        code value=v [points=p1,p2,...] [curves=c1,c2,...]  [surfaces=s1,s2,...] [volumes=v1,v2,...] 
        Here above, exactly one list must be given: points, curves, surfaces or volumes.
        • v is the code value (integer) to assign to an entity.
        • p1, p2, ... are the points to which the code v is assigned.
        • c1, c2, ... are the curves to which the code v is assigned.
        • s1, s2, ... are the surfaces to which the code v is assigned.
        • v1, v2, ... are the volumes to which the code v is assigned.
      • Keyword nbdof enables generating a finite element mesh using the constructed geometry:
        nbdof n
        where n is the number of degrees for freedom for each support of degrees of freedom (e.g. nodes). The default value is 1.
      • Keyword list outputs a list of all generated entities in mesh:
      • Keyword generate enables generating a finite element mesh using the constructed geometry.
      • Keyword clear erases all constructed material since the beginning of geometry description.
      • Keyword save saves the generated mesh in a file:
        save file
        where file is the name of the file in which the mesh is stored.
      • Keyword read reads an already existing mesh from a file:
        read file
        where file is the name of the file in which the mesh is read.
      • Keyword plot plots the generated mesh. The Gmsh executable is used.
    • Command stationary sets problem analysis as stationary (steady state). This is the default when the chosen equations (ode's or pde's) suggest it.
    • Command transient sets problem analysis as time dependent or transient:
    • transient [initial-time=it] [final-time=ft] [time-step=ts]  [scheme=s]
      All the arguments are optional.
      • it: Initial value of time. Default value is 0.
      • ft: Final (maximal) value of time. Default value is 1.
      • ts: Time step value. Default value is 0.1.
      • s: Time integration scheme. This is a string to choose among the values: forward-euler, backward-euler, crank-nicolson, heun, newmark, leap-frog, AB2 (Adams-Bashforth, 2nd Order), RK4 (Runge-Kutta, 4th Order), RK3-TVD (Runge-Kutta, 3rd order, TVD), BDF2 (Backward Difference Formula, 2nd Order), builtin (Any scheme built in the chosen PDE). The default value for this argument is backward-euler.

    • Command algebraic defines an algebraic equation (or system of equations) to solve by a numerical method. It can be given either by a short or an extended form.

      In its short version the command syntax is:
      algebraic [size=n] [function=f] [definition=d] [var=x] [nls=m]
      • n: Size of the system of algebraic equations. Default size is 1.
      • f: Name of an already defined function (Functions can be defined in data). For a system, this argument must be repeated as many times as the number of equations
      • d: Expression defining a function. For a system, this argument must be repeated as many times as the number of equations
      • x: Name of the variable. If the size is greater than 1 (a system), the unknowns are x1, x2, ...
      • m: Iterative method to solve the system. This is a string to choose among the values bisection, regula-falsi, secant, newton. Note that the methods bisection and regula-falsi are to be used for the case of a unique equation. The default method is newton.

      In its extended version, the command algebraic has no arguments, but rather, it initiates a submenu with the available keywords:
      size, function, definition, jacobian, init, variable, nls, summary, clear
      • size n
        where n is the algebraic system's size. The default value is n=1.
      • function s
        where s is a string giving the name of an existing function (Functions can be defined in data). For a system, this argument must be repeated as many times as the number of equations.
      • definition s
        where s is a string defining analytically a function. Note that if the string contains blank spaces it must be surrounded by ". For a system, this argument must be repeated as many times as the number of equations.
      • jacobian y1 y2 y3 ...
        where y1, y2, ... are the partial derivatives of a function of the system. The keyword jacobian must be called for each function of the system in their natural order. By default the values of the jacobian are computed analytically from the expression of the functions.
      • init y1 y2 y3 ...
        y1, y2, ... are initial guesses of the solution components.
      • variable x
        where x is the name of the variable (or field). This keyword is mandatory if the keyword definition is used. If the size of the system is greater than 1, the unknowns are necessarily x1, x2, ...
      • nls s
        where s is a string defining an iterative method to solve the nonlinear system. The default value is newton. The string s it to choose among the values bisection, regula-falsi, secant, newton. Note that the methods bisection and regula-falsi are to be used for the case of a unique equation.
      • summary
        to output a summary of prescribed options.
      • clear
        to clear all prescribed options.
    • Command ode defines an ordinary differential equation (or system of ordinary differential equations) to solve by a numerical method. It can be given either by a short or an extended form.

      In its short version the command syntax is:
      ode [size=n] [function=f] [definition=d] [var=x]  [initial=v1,v2,...] [final-time=ft] [time-step=ts] [scheme=s]
      • n: Size of the system of ode's. Default size is 1.
      • f: Name of an already defined function (Functions can be defined in data). For a system, this argument must be repeated as many times as the number of differential equations
      • d: Expression defining a function. For a system, this argument must be repeated as many times as the number of differential equations
      • y: Name of the variable, other than the time variable, which is necessarily t. If the size is greater than 1 (a system), the unknowns are y1, y2, ...
      • v1, v2, ...: Initial condition values.
      • ft: Final (or maximal) time value. The default value of this parameter is 1.
      • ts: Time step value. The default value of this parameter is 0.1.
      • s: Time integration scheme. This is a string to choose among the values: forward-euler, backward-euler, crank-nicolson, heun, newmark, leap-frog, AB2 (Adams-Bashforth, 2nd Order), RK4 (Runge-Kutta, 4th Order), RK3-TVD (Runge-Kutta, 3rd order, TVD), BDF2 (Backward Difference Formula, 2nd Order). The default value for this argument is backward-euler.

      In its extended version, the command ode has no arguments, but rather, it initiates a submenu with the available keywords:
      size, function, definition, variable, jacobian, initial, final-time, time-step, scheme, summary, clear
      • size n
        where n is the ode system's size. The default value is n=1.
      • function s
        where s is a string giving the name of an existing function. For a system, this argument must be repeated as many times as the number of equations.
      • definition s
        where s is a string defining analytically a function. Note that if the string contains blank spaces it must be surrounded by ". For a system, this argument must be repeated as many times as the number of equations.
      • jacobian y1 y2 y3 ...
        where y1, y2, ... are the partial derivatives of a function of the system. The keyword jacobian must be called for each function of the system in their natural order. By default the values of the jacobian are computed analytically from the expression of the functions.
      • initial y1 y2 y3 ...
        y1, y2, ... are initial guesses of the solution components.
      • variable y
        where y is the name of the variable (or field) other than the time variable, which is necessarily t. This keyword is mandatory if the keyword definition is used. If the size of the system is greater than 1, the unknowns are necessarily y1, y2, ...
      • scheme s
        where s is a string defining Time integration scheme. This is a string to choose among the values: forward-euler, backward-euler, crank-nicolson, heun, newmark, leap-frog, AB2 (Adams-Bashforth, 2nd Order), RK4 (Runge-Kutta, 4th Order), RK3-TVD (Runge-Kutta, 3rd order, TVD), BDF2 (Backward Difference Formula, 2nd Order). The default value for this argument is backward-euler.
      • summary
        to output a summary of prescribed options.
      • clear
        to clear all prescribed options.
    • Command pde defines a partial differential equation (or system of partial differential equations) to solve by a numerical method. Due to its long list of arguments, this command is available in an extended version only.
      The command pde has one argument:
      pde eq
      where eq is a string defining the pde to solve. In the current release, the following pde's are available:
      • laplace: For the Laplace equation, with a right-hand side, in 1-D, 2-D and 3-D.
      • heat: For the heat equation, in 1-D, 2-D and 3-D.
      • wave: For the wave equation, in 1-D, 2-D and 3-D.
      • linear-elasticity: For linearized elasticity equations, in 2-D and 3-D.
      • truss: For the planar truss problem in structural mechanics.
      • beam: For the 3-D beam problem in structural mechanics.
      • incompressible-navier-stokes: For 2-D and 3-D transient incompressible Navier-Stokes equations.
      Other equations are available but not sufficiently tested.
      Then a submenu is initialized with the available keywords:
      field, coef, init, bc, bf, sf, space, ls, clear
      • field u
        where u is a string defining a field (vector of unknowns) for the equation. If the field has been defined already, this one will be used. If not, the new field will be added to the list of fields. This argument has to be given as many times as the equation requires it (e.g. Incompressible Navier-Stokes equations need 2 fields: velocity and pressure).
      • coef c v
        To define various coefficients of the pde. These coefficients can be functions of position and time. Here c is the name of the coefficient and v is a regular expression defining a function of position x, y, z and time t. The coefficient are the physical properties involved in partial differential equations. These coefficients has to be chosen among the values:
        • density or rho: This is involved in various pde's like the heat equation, fluid dynamics, ...
        • Cp or specific-heat: Involved in thermal equations.
        • kappa or thermal-conductivity: Involved in thermal equations.
        • Mu or magnetic-permeability: Involved in electromagnetics.
        • sigma or electric-conductivity: Involved in electromagnetics.
        • mu or viscosity: Involved in fluid dynamics.
        • epsilon or electric-permittivity: Involved in electromagnetics.
        • omega or angular-frequency: Involved in time harmonic formulations.
        • beta or thermal-dilatation: Involved in fluid dynamics.
        • v or velocity: Involved in transport equations.
        • young: Involved in solid and structural mechanics.
        • poisson: Involved in solid and structural mechanics.
      • init value=v
        to prescribe an initial condition. Here v is either a constant real number to assign to initial solution or a string defining a regular expression as function of x, y, z, t, space and time coordinates.
      • bc code=c value=v
        to prescribe a (Dirichlet) boundary condition. Here c is the code for which the condition is prescribed, v is either a constant real number to prescribe or a string defining a regular expression as function of x, y, z, t, space and time coordinates.
      • bf value=v
        to define a source or body force term. Here v is either a constant real number to assign to the right-hand side of the pde or a string defining a regular expression as function of x, y, z, t, space and time coordinates.
      • sf code=c value=v
        to prescribe a surface force (or a traction or a flux) term. Here c is the code for which the condition on sides (edges or faces) is prescribed, v is either a constant real number to prescribe or a string defining a regular expression as function of x, y, z, t, space and time coordinates.
      • space m
        where m is the chosen space discretization method. This string is to be chosen among the values: fd (Finite Differences), feP1 (P1 Finite Elements), feP2 (P2 Finite Elements), feQ1 (Q1 Finite Elements), fv (Finite Volumes). An error will be issued if the chosen method is not implemented in .
      • ls s p
        where s is the solver of the resulting linear system. This string is to choose among the values direct, cg, cgs, bicg, bicg-stab, gmres. Moreover, p is the preconditioner if an iterative solver is chosen. This string is to pick among the values: ident, diag, dilu, ilu, ssor.
      • clear
        To clear entered data. This enables modifying interactively data without leaving the pde environment.
    • Command optim defines and solves an optimization problem.
      It can be given by a short or an extended form.

      In its short version the command syntax is:
      optim [size=n] [function=f] [objective=d] [lp] [gradient=g1,g2,...]  [low-bound=i,lb] [up-bound=j,ub] [variable=x] [algorithm=a]
      • n: Number of optimization variables. Default value is 1.
      • f: Name of an already defined function as the objective function to mimimize (Functions can be defined in data).
      • d: Expression defining the objective function to minimize.
      • The keyword lp is a toggle to say if we are dealing with the linear programming problem. By default, we are considering a nonlinear objective function.
      • g1, g2, ... are the partial derivatives of the objective function defined analytically. By default the partial derivatives are computed analytically from the expression of the objective function.
      • i, lb: This keyword enables prescribing a lower bound constraint, i.e., here we can impose x(i)≥lb. It must be used once for each bound constraint.
      • j, ub: This keyword enables prescribing an upper bound constraint, i.e., here we can impose x(j)≤ub. It must be used once for each bound constraint.
      • x: name of the variable (or field). This keyword is mandatory if the keyword definition is used. If the size of the system is greater than 1, the unknowns are necessarily x1, x2, ...
      • a: String defining the used optimization method. This string is to pick in the following values: gradient, truncated-newton, simulated annealing, nelder-mead, newton. The default value of this parameter is grad.
      It can be noticed that there is no way to impose other constraints than bound constraints in the short menu version. For this one must resort to the extended version.

      In its extended version, the command optim has no arguments, but rather, it initiates a submenu with the available keywords:
      • size n
        Number of optimization variables. Default value is 1.
      • function f
        f is the name of an already defined function as the objective function to mimimize (Functions can be defined in data).
      • objective f
        f is an expression defining the objective function to minimize.
      • lp
        This keyword is a toggle to say if we are dealing with the linear programming problem. By default, we are considering a nonlinear objective function
      • gradient g1 g2 ...
        g1, g2, ... are the partial derivatives of the objective function defined analytically. By default the partial derivatives are computed analytically from the expression of the objective function.
      • hessian h1 h2 ...
        h1, h2, ... are the partial derivatives of the gradient defined analytically. This keyword must be called once for each optimization variable. By default the hessian is computed analytically, if the optimization algorithm needs it, from the expression of the objective function.
      • low-bound i lb
        To prescribe a lower bound constraint, i.e., we can impose x(j)≥lb. It must be used once for each bound constraint.
      • up-bound j ub
        To prescribe an upper bound constraint, i.e., we can impose x(j)≤ub. It must be used once for each bound constraint.
      • ge-constraint arg
        This keyword is available in the linear programming case only. For this, arg is a list:
        v(1) v(2) ... v(n) v(n+1)
        to impose v(1)*x(1) + v(2)*x(2) + ... + v(n)*x(n) ≥ v(n+1)
      • le-constraint arg
        The arguments of this keyword depend on the case whether we have a linear programming problem or not.
        • In the linear programming case arg is a list:
          v(1) v(2) ... v(n) v(n+1)
          to impose v(1)*x(1) + v(2)*x(2) + ... + v(n)*x(n) ≤ v(n+1)
        • In other cases, the keyword has only one argument: the analytical expression of the function we want to impose to be nonpositive.
      • eq-constraint arg
        The arguments of this keyword depend on the case whether we have a linear programming problem or not.
        • In the linear programming case arg is a list:
          v(1) v(2) ... v(n) v(n+1)
          to impose v(1)*x(1) + v(2)*x(2) + ... + v(n)*x(n) = v(n+1)
        • In other cases, the keyword has only one argument: the analytical expression of the function we want to impose to be zero.
      • penalty p
        p is the value of the penalty parameter. Constraints are enforced by a penalty formulation except for linear programming problems.
      • variable x
        Name of the variable (or field). This keyword is mandatory if the keyword definition is used. If the size of the system is greater than 1, the unknowns are necessarily x1, x2, ...
      • initial x1 x2 ...
      • algorithm a
        a is a string defining the used optimization method. This string is to pick in the following values: gradient, truncated-newton, simulated annealing, nelder-mead, newton. The default value of this parameter is grad.
      • summary
        To display a summary of data of the optimization problem.
      • clear
        To clear all entered data of the optimization problem. This enables continuing without leaving the optimization command level.
    • eigen:
      Enters a menu to solve an eigenvalue problem.
      This command is under development.
    • integration
      The command integration performs numerical integration of a given function over a given domain.
      In the present release, only integrals over an interval are handled.
      integration [function=f] [definition=d]  [var=v] [interval=mx,Mx] [ne=n] [formula=m]
      • f: Name of an already defined function (Functions can be defined in data)
      • d: Expression defining a function.
      • v: Name of the variable.
      • mx, Mx: Values of extremities of the integration interval
      • n: Number of subdivisions of the integration interval. Default values are 0. and 1.
      • m: Numerical integration formula. The possible choices are left-rectangle, right-rectangle, mid-point, trapezoidal, simpson, gauss-legendre, gauss-lobatto. For the Gauss formulae, the number of points can be specified by typing gauss-legendre,2, for instance.
    • approximation
      Enters a menu to solve data approximation problems.
      This command is under development.

RITA License

is freely available under the GPL (Gnu Public License).
Copyright © 2021 Rachid Touzani

is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

Downloading and Installation

The latest stable release of (1.0.1) is available for download: