view inst/ufl.m @ 226:043120f071de

Correct help message for ufl
author Eugenio Gianniti <eugenio.gianniti@mail.polimi.it>
date Fri, 23 May 2014 11:41:17 +0200
parents 72af6354bf02
children 8db0b8583615
line wrap: on
line source

## Copyright (C) 2014 Eugenio Gianniti <eugenio.gianniti@mail.polimi.it>
##
## This program 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.
##
## This program 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.
##
## You should have received a copy of the GNU General Public License along with
## this program; if not, see <http://www.gnu.org/licenses/>.

## -*- texinfo -*-
## @deftypefn {Function File} ufl [command] line
##
## Writes the given line to a ufl file. Optional commands are:
## @itemize @bullet
## @item start: opens an ufl file. It is possible to specify a name for it,
## otherwise 'default.ufl' will be used.
## @item end: closes the ufl file and compiles it. It is possible to 
## specify its @var{content}, otherwise a complete problem is assumed.
## Possible options are: BilinearForm, Functional, FunctionSpace, LinearForm
## and Problem.
## @end itemize
##
## @example
## @code{ufl start linform}
## @code{ufl element = FiniteElement ("Lagrange", triangle, 1)}
## @code{ufl v = TestFunction (element)}
## @code{ufl f = Coefficient (element)}
## @code{ufl L = f*v*dx}
## @code{ufl end LinearForm}
## @end example
##
## This way you can write a ufl file and compile it obtaining a LinearForm.
##
## @seealso{import_ufl_Problem, import_ufl_BilinearForm, import_ufl_Functional,
## import_ufl_FunctionSpace, import_ufl_LinearForm} 
## @end deftypefn

function ufl (varargin)

  persistent fid = -1;
  persistent filename = "default.ufl";
  persistent opts = {"BilinearForm",
                     "Functional",
                     "FunctionSpace",
                     "LinearForm",
                     "Problem"};

  if (numel (varargin) < 1)
    if (! is_valid_file_id (fid))
      print_usage ();
    endif
  elseif (! all (cellfun ("ischar", varargin)))
    error ("ufl: all arguments should be strings");
  elseif (strcmpi (varargin{1}, "start"))
    if (is_valid_file_id (fid))
      error ("ufl: a file is already open");
    else
      if (numel (varargin) > 1)
        filename = varargin{2};
        if (isempty (regexpi (filename, ".ufl$", "match")))
          filename = [filename, ".ufl"];
        else
          filename = [filename(1:end-4), ".ufl"];
        endif
      endif
      [~, err, ~] = stat (filename);
      if (err == 0)
        error (["ufl: a file named ", filename, " already exists"]);
      else
        fid = fopen (filename, "w");
      endif
    endif
    if (! is_valid_file_id (fid))
      error (["ufl: could not open file ", filename]);
    endif
  elseif (strcmpi (varargin{1}, "end"))
    if (! is_valid_file_id (fid))
      error ("ufl: no open file");
    else
      fclose (fid);
      fid = -1;
    endif
    compile = "Problem";
    if (numel (varargin) > 1)
      compile = validatestring (varargin{2}, opts, "ufl", "content");
    endif
    eval (["import_ufl_", compile, "(\"", filename(1:end-4), "\");"]);
    filename = "default.ufl";
  elseif (! is_valid_file_id (fid))
    error ("ufl: no open file");
  else
    if (is_valid_file_id (fid))
      fprintf (fid, "%s ", varargin{:});
      fprintf (fid, "\n");
    else
      error ("ufl: no open file");
    endif
  endif

endfunction