CArl
Code Arlequin / C++ implementation
weak_formulations.cpp
Go to the documentation of this file.
1 #include "weak_formulations.h"
2 
3 // --- Matrices
4 
5 void Mass( libMesh::DenseMatrix<libMesh::Number>& Mass,
6  unsigned int qp,
7  const std::vector<std::vector<libMesh::Real> >& phi,
8  const unsigned int n_dofs,
9  const std::vector<libMesh::Real>& JxW,
10  const libMesh::Number cte
11  )
12 {
13  for (unsigned int iii=0; iii< n_dofs; iii++)
14  {
15  for (unsigned int jjj=0; jjj< n_dofs; jjj++)
16  {
17  Mass(iii,jjj) += cte*JxW[qp]*phi[iii][qp]*phi[jjj][qp];
18  }
19  }
20 };
21 
22 // --- Vectors
23 
24 // --- Arlequin coupling matrices
25 void L2_Coupling( libMesh::DenseMatrix<libMesh::Number>& Coupl,
26  unsigned int qp,
27  const std::vector<std::vector<libMesh::Real> >& phi_sysA,
28  const std::vector<std::vector<libMesh::Real> >& phi_sysB,
29  const unsigned int n_dofs_sysA,
30  const unsigned int n_dofs_sysB,
31  const std::vector<libMesh::Real>& JxW,
32  const libMesh::Number cte
33  )
34 {
35  for (unsigned int iii=0; iii< n_dofs_sysA; iii++)
36  {
37  for (unsigned int jjj=0; jjj< n_dofs_sysB; jjj++)
38  {
39  Coupl(iii,jjj) += cte*JxW[qp]*phi_sysA[iii][qp]*phi_sysB[jjj][qp];
40  }
41  }
42 };
43 
44 void L2_Coupling( libMesh::DenseSubMatrix<libMesh::Number>& Coupl,
45  unsigned int qp,
46  const std::vector<std::vector<libMesh::Real> >& phi_sysA,
47  const std::vector<std::vector<libMesh::Real> >& phi_sysB,
48  const unsigned int n_dofs_sysA,
49  const unsigned int n_dofs_sysB,
50  const std::vector<libMesh::Real>& JxW,
51  const libMesh::Number cte
52  )
53 {
54  for (unsigned int iii=0; iii< n_dofs_sysA; iii++)
55  {
56  for (unsigned int jjj=0; jjj< n_dofs_sysB; jjj++)
57  {
58  Coupl(iii,jjj) += cte*JxW[qp]*phi_sysA[iii][qp]*phi_sysB[jjj][qp];
59  }
60  }
61 };
62 
63 void H1_Coupling_Extra_Term( libMesh::DenseSubMatrix<libMesh::Number>& Coupl,
64  unsigned int qp,
65  unsigned int C_i,
66  unsigned int C_k,
67  unsigned int n_components_A,
68  unsigned int n_components_B,
69  const std::vector<std::vector<libMesh::RealGradient> >& dphi_sysA,
70  const std::vector<std::vector<libMesh::RealGradient> >& dphi_sysB,
71  const unsigned int n_dofs_sysA,
72  const unsigned int n_dofs_sysB,
73  const std::vector<libMesh::Real>& JxW,
74  const libMesh::Number cte
75  )
76 {
77  int d_ik = kronecker_delta(C_i,C_k);
78  int d_jl = 0;
79  int d_il = 0;
80  int d_jk = 0;
81  double JW = JxW[qp];
82 
83  for (unsigned int iii=0; iii < n_dofs_sysA; iii++)
84  {
85  const libMesh::RealGradient& dphy_sysA_grad = dphi_sysA[iii][qp];
86  for (unsigned int jjj=0; jjj < n_dofs_sysB; jjj++)
87  {
88  const libMesh::RealGradient& dphy_sysB_grad = dphi_sysB[jjj][qp];
89  for(unsigned int C_j=0; C_j<n_components_A; C_j++)
90  {
91  d_jk = kronecker_delta(C_j,C_k);
92  for(unsigned int C_l=0; C_l<n_components_B; C_l++)
93  {
94  d_il = kronecker_delta(C_i,C_l);
95  d_jl = kronecker_delta(C_j,C_l);
96  Coupl(iii,jjj) += cte*JW* dphy_sysA_grad(C_j)*dphy_sysB_grad(C_l) * ( d_ik * d_jl + d_il * d_jk ) ;
97  }
98  }
99  }
100  }
101 };
int kronecker_delta(unsigned int i, unsigned int j)
void H1_Coupling_Extra_Term(libMesh::DenseSubMatrix< libMesh::Number > &Coupl, unsigned int qp, unsigned int C_i, unsigned int C_k, unsigned int n_components_A, unsigned int n_components_B, const std::vector< std::vector< libMesh::RealGradient > > &dphi_sysA, const std::vector< std::vector< libMesh::RealGradient > > &dphi_sysB, const unsigned int n_dofs_sysA, const unsigned int n_dofs_sysB, const std::vector< libMesh::Real > &JxW, const libMesh::Number cte)
void L2_Coupling(libMesh::DenseMatrix< libMesh::Number > &Coupl, unsigned int qp, const std::vector< std::vector< libMesh::Real > > &phi_sysA, const std::vector< std::vector< libMesh::Real > > &phi_sysB, const unsigned int n_dofs_sysA, const unsigned int n_dofs_sysB, const std::vector< libMesh::Real > &JxW, const libMesh::Number cte)
void Mass(libMesh::DenseMatrix< libMesh::Number > &Mass, unsigned int qp, const std::vector< std::vector< libMesh::Real > > &phi, const unsigned int n_dofs, const std::vector< libMesh::Real > &JxW, const libMesh::Number cte)