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