view inst/private/generate_mf_constructor.m @ 260:1e2a9be8083a

Support template dolfin::MeshFunction
author Eugenio Gianniti <eugenio.gianniti@mail.polimi.it>
date Wed, 06 Aug 2014 19:52:03 +0200
parents
children f22588ae37af
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 -*-
## function for internal usage only
## @end deftypefn

function output = generate_mf_constructor (typename)

STRING ="\n\
#include <dolfin.h>\n\
#include <fem-fenics/mesh.h>\n\
#include ""meshfunction_@@TYPENAME@@.h""\n\
#include <fem-fenics/dolfin_compat.h>\n\
\n\
DEFUN_DLD (MeshFunction_@@TYPENAME@@, args, nargout, ""MF = MeshFunction_@@TYPENAME@@ (MESH, FILENAME)"")\n\
{\n\
\n\
  int nargin = args.length ();\n\
  octave_value retval;\n\
\n\
  if (nargin < 2 || nargin > 2 || nargout > 1)\n\
    print_usage ();\n\
  else\n\
    {\n\
      if (! mesh_type_loaded)\n\
        {\n\
          mesh::register_type ();\n\
          mesh_type_loaded = true;\n\
          mlock ();\n\
        }\n\
\n\
      if (! meshfunction_@@TYPENAME@@_type_loaded)\n\
        {\n\
          meshfunction_@@TYPENAME@@::register_type ();\n\
          meshfunction_@@TYPENAME@@_type_loaded = true;\n\
          mlock ();\n\
        }\n\
\n\
      if (args(0).type_id () == mesh::static_type_id ()\n\
          && args(1).is_string ())\n\
        {\n\
          std::string filename = args(1).string_value ();\n\
          mesh const & msh_arg =\n\
            static_cast<mesh const &> (args(0).get_rep ());\n\
\n\
          if (!error_state)\n\
            {\n\
              SHARED_PTR <dolfin::Mesh const> const &\n\
                pmsh = msh_arg.get_pmsh ();\n\
              filename += "".xdmf"";\n\
\n\
              try\n\
                { retval = new meshfunction_@@TYPENAME@@ (pmsh, filename); }\n\
              catch (std::runtime_error &)\n\
                { error (""error reading file""); }\n\
            }\n\
        }\n\
      else\n\
        error (""invalid input arguments"");\n\
    }\n\
\n\
  return retval;\n\
}";

STRING =  strrep (STRING, "@@TYPENAME@@", typename);

fid = fopen (["MeshFunction_", typename, ".cc"], "w");
if (is_valid_file_id (fid))
  fputs (fid, STRING);
  output = fclose (fid);
else
  error ("cannot open file");
  output = 1;
endif

endfunction