File size: 17,026 Bytes
10f2621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
/**
 *  @defgroup Re Re class
 *  @brief    A reference simplex element object.
 */

/**
 *  @file       re.h
 *  @ingroup    Re
 *  @brief      Class Re: a reference simplex element object.
 *  @author     Michael Holst
 *  @note       None
 *  @version    $Id: re.h,v 1.21 2010/08/12 05:18:23 fetk Exp $ 
 *
 *  @attention
 *  @verbatim
 *
 * MC = < Manifold Code >
 * Copyright (C) 1994-- Michael Holst
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *  @endverbatim
 */

#ifndef _RE_H_
#define _RE_H_

#include <mc/mc_base.h>

#include <mc/bam.h>

/**
 * @ingroup Re
 * @brief   Class Re: Parameters and datatypes. Class Re: Definition 
 * @author  Michael Holst
 */
struct sRe {

  /** @brief spatial dimension of the simplex */
    int dim;                  

  /** @brief number of i-simplices in element (v/e/f/s) */
    int dimIS[4];             
  /** @brief  degrees of freedom per i-simplex (v/e/f/s) */
    int numDF[4];             

  /** @brief order = requested quadrature order <= VMAXO */
    int qorder;              
  /** @brief numP  =  number of polys in volume element 
       =  numV * numVDF +  numE * numEDF +  numF * numFDF +  numS * numSDF
       <= VMAXP
   */
    int numP;  
  /** @brief numPS =  number of polys in surface elem
      =  numV * numVDF +  numE * numEDF +  numF * numFDF <= VMXP 
  */
    int numPS;   
  /** @brief i-simplex offsets in global numbering */
    int offIS[4];     

  /** @brief coefficients of the polynomials */
    double c[VMAXP][VMAXP];  
  /** @brief coefficients of the x-partial of polys */
    double cx[VMAXP][VMAXP]; 
  /** @brief coefficients of the y-partial of polys */
    double cy[VMAXP][VMAXP];  
  /** @brief coefficients of the y-partial of polys */
    double cz[VMAXP][VMAXP];  

  /** @brief number of volume quad pts */
    int q;  
  /** @brief number of surface quad pts */
    int qs; 

  /** @brief number of volume quad pts -- high accuracy */
    int qhi;  
  /** @brief number of surface quad pts -- high accuracy */     
    int qshi; 

  /** @brief volume quadrature point data */
    quadInfo v[VMAXQ];    
  /** @brief surface quadrature point data */    
    quadInfo s[VMAXQ][4]; 
  /** @brief permutations of surface quadrature points  
      describes how s. quad. pts transform with 
      permutations of face vertices (0,1,2)      
  */
    int spmt[6][VMAXQ]; 

  /** @brief volume quad pt data -- high accuracy */
    quadInfo vhi[VMAXQ];   
  /** @brief surface quad pt data -- high accuracy */
    quadInfo shi[VMAXQ][4];
  /** @brief permutations of hi-acc surface quad.points */ 
    int spmthi[6][VMAXQ];  

  /** @brief This is a function-pointer for a user-defined function */
    int (*simplexBasisInit)(int key, int dim, int comp,
        int *ndof, int dof[]);

  /** @brief This is a function-pointer for a user-defined function */
    void (*simplexBasisForm)(int key, int dim, int comp,
        int pdkey, double xq[], double basis[]);

};

/**
 * @ingroup Re
 * @brief   Declaration of the Re class as the Re structure 
 * @author  Michael Holst
 * @return None
 */
typedef struct sRe Re;

/*
 * ***************************************************************************
 * Class Re: Inlineable methods (re.c)
 * ***************************************************************************
 */

#if !defined(VINLINE_APRX)
#else /* if defined(VINLINE_APRX) */
#endif /* if !defined(VINLINE_APRX) */

/**
 * @brief   Class Re: Non-inlineable methods (Re.c) 
 * @ingroup Re
 * @author  Michael Holst
 */
VEXTERNC Re* Re_ctor(int key, int dim,
    int (*simplexBasisInit)(int key, int dim, int comp,
        int *ndof, int dof[]),
    void (*simplexBasisForm)(int key, int dim, int comp,
        int pdkey, double xq[], double basis[]),int qorder);

/**
 * @ingroup Re
 * @brief   Class Re: Non-inlineable methods (Re.c)
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  None
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC void Re_dtor(Re **thee);

/**
 * @ingroup Re
 * @brief   the dimension of Re class
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  the dimension of Re class
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_dim(Re *thee);

/**
 * @ingroup Re
 * @brief   Vertex number of i-simplices in element
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Vertex number of i-simplices in element
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_dimV(Re *thee);

/**
 * @ingroup Re
 * @brief   Edge number of i-simplices in element
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Edge number of i-simplices in element
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_dimE(Re *thee);

/**
 * @ingroup Re
 * @brief   Face number of i-simplices in element
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Face number of i-simplices in element
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_dimF(Re *thee);

/**
 * @ingroup Re
 * @brief   Simplex number of i-simplices in element
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Simplex number of i-simplices in element
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_dimS(Re *thee);

/**
 * @ingroup Re
 * @brief   Vertex degrees of freedom per i-simplex
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Vertex degrees of freedom per i-simplex
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_numVDF(Re *thee);

/**
 * @ingroup Re
 * @brief   Edge degrees of freedom per i-simplex
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Edge degrees of freedom per i-simplex
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_numEDF(Re *thee);

/**
 * @ingroup Re
 * @brief   Face degrees of freedom per i-simplex 
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Face degrees of freedom per i-simplex
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_numFDF(Re *thee);

/**
 * @ingroup Re
 * @brief   Simplex degrees of freedom per i-simplex
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Simplex degrees of freedom per i-simplex
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_numSDF(Re *thee);

/**
 * @ingroup Re
 * @brief   Requested quadrature order
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Requested quadrature order
 * @param   thee Pointer to a Re allocated memory location
 */
VEXTERNC int Re_qorder(Re *thee);

/**
 * @ingroup Re
 * @brief   number of polys in volume element
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  number of polys in volume element
 *          numP  =  numV * numVDF
 *                +  numE * numEDF                 
 *                +  numF * numFDF                    
 *                +  numS * numSDF                     
 *                <= VMAXP                            
 * @param   thee Pointer to a Re allocated memory location
 * @param   f    index for the face types
 */
VEXTERNC int Re_numP(Re *thee, int f);

/**
 * @ingroup Re
 * @brief   number of volume/surface quad pts
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  number of volume/surface quad pts
 * @param   thee Pointer to a Re allocated memory location
 * @param   f    index for the face types
 */
VEXTERNC int Re_numQ(Re *thee, int f);

/**
 * @ingroup Re
 * @brief   master element integration weight of volume/surface quadrature point data
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  master element integration weight of volume/surface quadrature point data
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   f    index for the face types
 */
VEXTERNC double Re_w(Re *thee, int m, int f);

/**
 * @ingroup Re
 * @brief   master element integration point coordinates of volume/surface quadrature
 *          point data
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  master element integration point coordinates of volume/surface quadrature
 *          point data
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_x(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   values of local basis funcs at integ pt 
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  values of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   x-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  x-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phix(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   y-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  y-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phiy(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   z-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  z-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of the xyz coordinates
 * @param   f    index for the face types
 */
VEXTERNC double Re_phiz(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   Derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  Derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   j    index of the xyz coordinates
 * @param   f    index for the face types
 */
VEXTERNC double Re_phix2(Re *thee, int m, int i, int j, int f);

/**
 * @ingroup Re
 * @brief   hi-acc number of volume/surface quad pts
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc number of volume/surface quad pts
 * @param   thee Pointer to a Re allocated memory location
 * @param   f    index for the face types
 */
VEXTERNC int Re_numQ_hi(Re *thee, int f);

/**
 * @ingroup Re
 * @brief   high defination master element integration weight of volume/surface 
 *          quadrature point data
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  high defination master element integration weight of volume/surface 
 *          quadrature point data
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   f    index for the face types
 */
VEXTERNC double Re_w_hi(Re *thee, int m, int f);

/**
 * @ingroup Re
 * @brief   hi-acc master element integration point coordinates of volume/surface quadrature
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc master element integration point coordinates of volume/surface quadrature
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_x_hi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc values of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phi_hi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   hi-acc x-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc x-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phix_hi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   hi-acc y-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc y-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phiy_hi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   hi-acc z-derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc z-derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   f    index for the face types
 */
VEXTERNC double Re_phiz_hi(Re *thee, int m, int i, int f);

/**
 * @ingroup Re
 * @brief   hi-acc derivs of local basis funcs at integ pt
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  hi-acc derivs of local basis funcs at integ pt
 * @param   thee Pointer to a Re allocated memory location
 * @param   m    index of the quadrature points
 * @param   i    index of polys/coefs
 * @param   j    index of the xyz coordinates
 * @param   f    index for the face types
 */
VEXTERNC double Re_phix2_hi(Re *thee, int m, int i, int j, int f);

/**
 * @ingroup Re
 * @brief   permutations of surface quadrature points
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  permutations of surface quadrature points
 * @param   thee     Pointer to a Re allocated memory location
 * @param   vxn_pmt  permutations of (0,1,2) to label rows in Re:
 * @param   m        index of the quadrature points
 */
VEXTERNC int Re_sqPmt(Re *thee, int vxn_pmt, int m);

/**
 * @ingroup Re
 * @brief   permutations of hi-acc surface quad.points
 * @author  Michael Holst
 * @note    Class Re: Non-inlineable methods (Re.c) 
 * @return  permutations of hi-acc surface quad.points
 * @param   thee     Pointer to a Re allocated memory location
 * @param   vxn_pmt  permutations of (0,1,2) to label rows in Re:
 * @param   m        index of the quadrature points
 */
VEXTERNC int Re_sqPmt_hi(Re *thee, int vxn_pmt, int m);



/**
 * RYAN -- NEED TO FILL THIS IN
 * A class for capturing a (vector) finite element space.
 */

struct sFES {

  /** @brief function domain dimension */
    int dim;

  /** @brief function range dimension */
    int dimV;

  /** @brief total DOF in an i-simplex */
    int numDF;

  /** @brief the reference elements */
    Re *re[MAXV];

};

/**
 * RYAN -- NEED TO FILL THIS IN
 */
typedef struct sFES FES;


#endif /* _RE_H_ */