Loading [MathJax]/extensions/tex2jax.js
NiHu  2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
helmholtz_bem_3d_matrices_gauss.mex.cpp
1 #include <mex.h>
2 
3 #include "library/quad_1_gauss_field.hpp"
5 #include "util/mex_matrix.hpp"
6 #include "library/helmholtz_3d.hpp"
7 
9 typedef Eigen::Matrix<unsigned, Eigen::Dynamic, Eigen::Dynamic> uMatrix;
10 typedef NiHu::mex::complex_matrix<double> cMatrix;
11 
12 void mexFunction(int nlhs, mxArray *lhs[], int nrhs, mxArray const *rhs[])
13 {
14  // input arguments
15  if (nrhs != 5)
16  mexErrMsgTxt("Usage: mex(surf_nodes, surf_elem, field_nodes, field_elem, k)");
17  dMatrix
18  surf_nodes(rhs[0]), surf_elem(rhs[1]),
19  field_nodes(rhs[2]), field_elem(rhs[3]);
20  double k = *mxGetPr(rhs[4]);
21 
22  // assemble field matrix
23  size_t nElements = surf_elem.rows();
24  uMatrix fields(nElements, 1+4+4);
25  for (size_t e = 0; e < nElements; ++e)
26  {
27  fields(e,0) = NiHu::quad_1_gauss_field::id;
28  for (size_t c = 0; c < 4; ++c)
29  fields(e,c+1) = surf_elem(e,c+1);
30  for (size_t c = 0; c < 4; ++c)
31  fields(e,c+1+4) = unsigned(4*e+c);
32  }
33 
34  // create function space
35  auto surf_sp = NiHu::create_function_space(surf_nodes, fields, NiHu::quad_1_gauss_field_tag());
36 
37  auto field_mesh = NiHu::create_mesh(field_nodes, field_elem,
39 
40  auto const &field_sp = NiHu::dirac(NiHu::constant_view(field_mesh));
41 
42  size_t n = surf_sp.get_num_dofs();
43  size_t m = field_sp.get_num_dofs();
44  cMatrix
45  L_surf(n, n, lhs[0]), M_surf(n, n, lhs[1]),
46  Mt_surf(n, n, lhs[2]), D_surf(n, n, lhs[3]),
47  L_field(m, n, lhs[4]), M_field(m, n, lhs[5]);
48 
53 
54 // #pragma omp parallel sections
55 // {
56  // #pragma omp section
57  // {
58  L_surf << NiHu::dirac(surf_sp) * L[surf_sp];
59  // }
60  // #pragma omp section
61  // {
62  M_surf << NiHu::dirac(surf_sp) * M[surf_sp];
63  // }
64  // #pragma omp section
65  // {
66  Mt_surf << NiHu::dirac(surf_sp) * Mt[surf_sp];
67  // }
68  // #pragma omp section
69  // {
70  D_surf << NiHu::dirac(surf_sp) * D[surf_sp];
71  // }
72 
73  // #pragma omp section
74  // {
75  L_field << field_sp * L[surf_sp];
76  // }
77  // #pragma omp section
78  // {
79  M_field << field_sp * M[surf_sp];
80  // }
81 // }
82 
83 }
84 
NiHu::create_integral_operator
integral_operator< Kernel > create_integral_operator(Kernel &&kernel)
factory function of an integral operator
Definition: integral_operator.hpp:421
NiHu::mex::complex_matrix
Container class of a complex matrix stored in Matlab format.
Definition: mex_matrix_separate.hpp:256
NiHu::create_mesh
mesh< tmp::vector< typename tag2type< Args >::type... > > create_mesh(nodes_t const &nodes, elements_t const &elements, Args...)
factory function to create a mesh from nodes and elements matrices
Definition: mesh.hpp:298
NiHu::type2tag
Metafunction assigning a tag to a type.
Definition: type2tag.hpp:17
weighted_residual.hpp
declaration of class NiHu::weighted_residual
NiHu::create_function_space
function_space< tmp::vector< typename tag2type< fields_t >::type... > > create_function_space(nodes_t const &nodes, elements_t const &elements, fields_t const &...fields)
factory function to create a function space from fields
Definition: function_space.hpp:664
mex_matrix.hpp
A Matlab mex matrix interface.
NiHu::mex::real_matrix
Definition: mex_matrix_separate.hpp:133
NiHu::dirac
const dirac_space< FuncSpace > & dirac(function_space_base< FuncSpace > const &space)
factory function to convert a function space into a dirac space
Definition: function_space.hpp:400
NiHu::normal_derivative_kernel
Normal derivative of a distance dependent kernel.
Definition: normal_derivative_kernel.hpp:26