1 /*******************************************************************************
2  *
3  * ALBERTA:  an Adaptive multi Level finite element toolbox using
4  *           Bisectioning refinement and Error control by Residual
5  *           Techniques for scientific Applications
6  *
7  * www.alberta-fem.de
8  *
9  * file:     assemble_bndry.h
10  *
11  * description: assemblage of boundary integral contributions
12  *
13  *******************************************************************************
14  *
15  * This file's authors: Claus-Justus Heine
16  *                      Abteilung f�r Angewandte Mathematik
17  *                      Universit�t Freiburg
18  *                      Hermann-Herder-Stra�e 10
19  *                      79104 Freiburg, Germany
20  *
21  *  (c) by C.-J. Heine (2006-2009)
22  *
23  ******************************************************************************/
24 
25 #ifndef _ALBERTA_ASSEMBLE_BNDRY_H_
26 #define _ALBERTA_ASSEMBLE_BNDRY_H_
27 
28 #include "alberta.h"
29 
30 typedef void (*AI_BNDRY_EL_MAT_FCT)(const EL_INFO *el_info,
31 				    const void *fill_info,
32 				    EL_MATRIX *el_mat);
33 
34 typedef struct bndry_fill_info BNDRY_FILL_INFO;
35 struct bndry_fill_info
36 {
37   BNDRY_OPERATOR_INFO  op_info;
38 
39   /* the block-matrix type of the underlying integral kernel */
40   MATENT_TYPE          krn_blk_type;
41 
42   DBL_LIST_NODE row_chain;
43   DBL_LIST_NODE col_chain;
44 
45   const WALL_QUAD_FAST *row_wquad_fast[3]; /* rows, i.e. range */
46   const WALL_QUAD_FAST *col_wquad_fast[3]; /* cols, i.e. domain */
47 
48   /* if op_info->tangential == true, then we need to cache the trace
49    * mapping in order to assemble jump-contributions correctly
50    * (assemble_neigh.c). The column trace-map does not need caching,
51    * because potential per-element initializers are called on the
52    * neighbour element before calling the element function.
53    */
54   const int *row_fcts_trace_map[N_WALLS_MAX];
55   int n_trace_row_fcts[N_WALLS_MAX];
56 
57   /* The space of test-functions is always taken on the current
58    * element, but during assembling of jump contributions the space of
59    * ansatz functions has to be taken on the neighbour.
60    */
61   const QUAD_FAST      *col_quad_fast[3];
62   const EL             *cur_el;
63   const EL_INFO        *cur_el_info;
64 
65   EL_MATRIX            *el_mat;
66   /* temporary el-mat for vector valued bas-fcts. */
67   void                 *scl_el_mat;
68   int                  n_row_max, n_col_max;
69 
70   PARAMETRIC           *parametric;
71 
72   const AI_BNDRY_EL_MAT_FCT *el_matrix_fct;
73   const EL_MATRIX_FCT       *neigh_el_mat_fcts;
74 
75   void (*dflt_second_order[N_WALLS_MAX])(const EL_INFO *el_info,
76 					 const BNDRY_FILL_INFO *info,
77 					 void **el_mat);
78   void (*dflt_first_order[N_WALLS_MAX])(const EL_INFO *el_info,
79 					const BNDRY_FILL_INFO *info,
80 					void **el_mat);
81   void (*dflt_zero_order[N_WALLS_MAX])(const EL_INFO *el_info,
82 				       const BNDRY_FILL_INFO *info,
83 				       void **el_mat);
84   void (*fast_second_order[N_WALLS_MAX])(const EL_INFO *el_info,
85 					 const BNDRY_FILL_INFO *info,
86 					 void **el_mat);
87   void (*fast_first_order[N_WALLS_MAX])(const EL_INFO *el_info,
88 					const BNDRY_FILL_INFO *info,
89 					void **el_mat);
90   void (*fast_zero_order[N_WALLS_MAX])(const EL_INFO *el_info,
91 				       const BNDRY_FILL_INFO *info,
92 				       void **el_mat);
93 
94   BNDRY_FILL_INFO *next;
95 };
96 
97 typedef void (*AI_EL_WALL_FCT)(const EL_INFO *el_info,
98 			       const BNDRY_FILL_INFO *fill_info,
99 			       void **el_mat);
100 
101 /* for computing the offset into the el_wall_fcts table */
102 #define WALL_FCT_MIX (1 << 0)
103 #define WALL_FCT_SYM (1 << 1)
104 #define WALL_FCT_TAN (1 << 2)
105 #define WALL_FCT_PWC (1 << 3)
106 
107 /* Assembling over walls on a given element. */
108 extern AI_EL_WALL_FCT (*SS_el_wall_fcts[])[N_WALLS_MAX][5][16];
109 #if VECTOR_BASIS_FUNCTIONS
110 extern AI_EL_WALL_FCT (*SV_el_wall_fcts[])[N_WALLS_MAX][5][16];
111 extern AI_EL_WALL_FCT (*VS_el_wall_fcts[])[N_WALLS_MAX][5][16];
112 extern AI_EL_WALL_FCT (*CV_el_wall_fcts[])[N_WALLS_MAX][5][16];
113 extern AI_EL_WALL_FCT (*VC_el_wall_fcts[])[N_WALLS_MAX][5][16];
114 extern AI_EL_WALL_FCT (*VV_el_wall_fcts[])[N_WALLS_MAX][5][16];
115 #endif
116 
117 extern AI_EL_WALL_FCT
118 (**_AI_el_wall_fcts[N_OP_BLOCK_TYPES])[N_WALLS_MAX][5][16];
119 
120 extern AI_BNDRY_EL_MAT_FCT SS_el_mat_fct_table[256][N_WALLS_MAX];
121 #if VECTOR_BASIS_FUNCTIONS
122 extern AI_BNDRY_EL_MAT_FCT SV_el_mat_fct_table[256][N_WALLS_MAX];
123 extern AI_BNDRY_EL_MAT_FCT VS_el_mat_fct_table[256][N_WALLS_MAX];
124 extern AI_BNDRY_EL_MAT_FCT CV_el_mat_fct_table[256][N_WALLS_MAX];
125 extern AI_BNDRY_EL_MAT_FCT VC_el_mat_fct_table[256][N_WALLS_MAX];
126 extern AI_BNDRY_EL_MAT_FCT VV_el_mat_fct_table[256][N_WALLS_MAX];
127 #endif
128 
129 extern BNDRY_FILL_INFO *AI_get_bndry_fill_info(const BNDRY_OPERATOR_INFO *oinfo,
130 					       MATENT_TYPE kern_blk_type);
131 
132 /* Same for assembling jumps over walls (e.g. for DG) */
133 extern EL_MATRIX_FCT SS_neigh_el_mat_fct_table[256][N_WALLS_MAX];
134 #if VECTOR_BASIS_FUNCTIONS
135 extern EL_MATRIX_FCT SV_neigh_el_mat_fct_table[256][N_WALLS_MAX];
136 extern EL_MATRIX_FCT VS_neigh_el_mat_fct_table[256][N_WALLS_MAX];
137 extern EL_MATRIX_FCT CV_neigh_el_mat_fct_table[256][N_WALLS_MAX];
138 extern EL_MATRIX_FCT VC_neigh_el_mat_fct_table[256][N_WALLS_MAX];
139 extern EL_MATRIX_FCT VV_neigh_el_mat_fct_table[256][N_WALLS_MAX];
140 #endif
141 
142 extern BNDRY_FILL_INFO *AI_get_neigh_fill_info(const BNDRY_OPERATOR_INFO *oinfo,
143 					       MATENT_TYPE kern_blk_type);
144 
145 #endif
146 
147