Mercurial > fem-fenics-eugenio
changeset 31:74cbe97f55af
New class for treatment of BC
* boundarycondition.h: publicly derives from octave_base_value and the private
member is a vector of pointer to dolfin::DirichletBC
* fem_bc.cc: DLD functions which creates a boundarycondition object taking as
input a functionspace, a function_handler and the label of the
sides where the BC has to be applied
* fem_init_env.cc: load also the boundarycondition type
author | gedeone-octave <marco.vassallo@outlook.com> |
---|---|
date | Mon, 15 Jul 2013 17:07:28 +0200 |
parents | eaf8a1e8f377 |
children | fe36aa05d7e5 |
files | src/boundarycondition.h src/fem_bc.cc src/fem_init_env.cc |
diffstat | 3 files changed, 147 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/boundarycondition.h Mon Jul 15 17:07:28 2013 +0200 @@ -0,0 +1,66 @@ +/* + Copyright (C) 2013 Marco Vassallo + + 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 2 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/>. +*/ + +#ifndef _BOUNDARYCONDITION_OCTAVE_ +#define _BOUNDARYCONDITION_OCTAVE_ + +#include <memory> +#include <vector> +#include <dolfin.h> +#include <octave/oct.h> + +class boundarycondition : public octave_base_value +{ + + public: + + boundarycondition () : octave_base_value () {} + + void print (std::ostream& os, bool pr_as_read_syntax = false) const + { + for (int i = 0; i < bcu.size (); ++i) + os << "Boundary condition : " << bcu[i]->str (true) << std::endl; + } + + + ~boundarycondition (void) {} + + + bool is_defined (void) const { return true; } + + + const std::vector< boost::shared_ptr <const dolfin::DirichletBC> > & get_bc (void) const + { return bcu; } + + + void add_bc (const boost::shared_ptr <const dolfin::FunctionSpace> & V, + boost::shared_ptr<const dolfin::GenericFunction> f, std::size_t n) + { + boost::shared_ptr<const dolfin::DirichletBC> p (new dolfin::DirichletBC (V, f, n)); + bcu.push_back(p); + } + + private: + + std::vector<boost::shared_ptr <const dolfin::DirichletBC> > bcu; + + DECLARE_OCTAVE_ALLOCATOR; + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; + +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fem_bc.cc Mon Jul 15 17:07:28 2013 +0200 @@ -0,0 +1,70 @@ +/* + Copyright (C) 2013 Marco Vassallo + + 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 2 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/>. +*/ + +#include "boundarycondition.h" +#include "functionspace.h" +#include "expression.h" + +DEFUN_DLD (fem_bc, args, , "-*- texinfo -*-\n\ +@deftypefn {Function File} {[@var{bc}]} = \ +fem_get_mesh (@var{Functional Space}, @var{Functio handle}, \ +@var{Boundary}) \n\ +The input parameters are\n\ +@itemize @bullet \n\ +@item @var{Functional Space} is a fem-fenics functional space where\ +we want to apply the BC\n\ +@item @var{Functio handle} is a function handle which contains the expression\ +that we want to apply on the BC\n\ +@item @var{Boundary} is an Array which specify the label of the \ +sides where the BC is applied\n\ +The output @var{BC} is an object which contains the boundary conditions\n\ +@seealso{fem_init_mesh, fem_fs}\n\ +@end deftypefn") +{ + int nargin = args.length (); + octave_value retval=0; + + if (nargin < 3 || nargin > 3) + print_usage (); + else + { + if (args(0).type_id () == functionspace::static_type_id ()) + { + const functionspace & fspo = static_cast<const functionspace&> (args(0).get_rep ()); + octave_fcn_handle * fh = args(1).fcn_handle_value (); + Array<octave_idx_type> side = args(2).array_value (); + + if (!error_state) + { + const boost::shared_ptr <const dolfin::FunctionSpace> & V (fspo.get_pfsp ()); + const expression * pf = new expression (*fh); + boost::shared_ptr<const expression> f (pf); + boundarycondition * pbc = new boundarycondition (); + + for (octave_idx_type i = 0; i < side.length (); ++i) + { +// dolfin::DirichletBC my_bc (V, f, side(i)); +// pbc->add_bc (my_bc); + pbc->add_bc (V, f, side(i)); + } + + retval = octave_value (pbc); + } + } + } + return retval; +}
--- a/src/fem_init_env.cc Mon Jul 15 17:02:28 2013 +0200 +++ b/src/fem_init_env.cc Mon Jul 15 17:07:28 2013 +0200 @@ -18,6 +18,7 @@ #include "mesh.h" #include "functionspace.h" +#include "boundarycondition.h" DEFINE_OCTAVE_ALLOCATOR (mesh); @@ -26,7 +27,14 @@ DEFINE_OCTAVE_ALLOCATOR (functionspace); DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (functionspace, "functionspace", "functionspace"); -DEFUN_DLD (fem_init_env, args, , "initialize a fem-fenics environment") +DEFINE_OCTAVE_ALLOCATOR (boundarycondition); +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (boundarycondition, "boundarycondition", "boundarycondition"); + +DEFUN_DLD (fem_init_env, args, , "-*- texinfo -*-\n\ +@deftypefn {Function File} {[]} = \ +fem_init_env ( ) \n\ +Initialize the environment for fem-fenics\n\ +@end deftypefn") { int nargin = args.length (); octave_value retval; @@ -39,6 +47,8 @@ std::cout << "mesh_type_loaded" << std::endl; functionspace::register_type (); std::cout << "functionspace_type_loaded" << std::endl; + boundarycondition::register_type (); + std::cout << "boundarycondition_type_loaded" << std::endl; mlock (); } return retval;