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;