Added mesh pointer fields for coarsen and refine
[charm.git] / src / libs / ck-libs / fem / fem_adapt_if.h
1 #ifndef __CHARM_FEM_ADAPT_IF_H
2 #define __CHARM_FEM_ADAPT_IF_H
3
4 #include "charm-api.h"
5 #include "fem_mesh_modify.h"
6 #include "fem_adapt_algs.h"
7
8 extern void _registerFEMMeshModify(void);
9
10 void FEM_ADAPT_Init(int meshID) {
11   _registerFEMMeshModify();
12   FEM_REF_INIT(meshID, 2);  // dim=2
13   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
14   CtvInitialize(FEM_Adapt_Algs *, _adaptAlgs);
15   CtvAccess(_adaptAlgs) = meshP->getfmMM()->getfmAdaptAlgs();
16   CtvAccess(_adaptAlgs)->FEM_Adapt_Algs_Init(FEM_DATA+0, FEM_BOUNDARY);
17 }
18 FDECL void FTN_NAME(FEM_ADAPT_INIT,fem_adapt_init)(int *meshID)
19 {
20   FEM_ADAPT_Init(*meshID);
21 }
22
23
24 void FEM_ADAPT_Refine(int meshID, int qm, int method, double factor,
25         double *sizes) {
26     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
27     mesh->getfmMM()->getfmAdaptAlgs()->FEM_Refine(qm, method, factor, sizes);
28 }
29 FDECL void FTN_NAME(FEM_ADAPT_REFINE,fem_adapt_refine)(int* meshID, 
30         int *qm, int *method, double *factor, double *sizes)
31 {
32   FEM_ADAPT_Refine(*meshID, *qm, *method, *factor, sizes);
33 }
34
35
36 void FEM_ADAPT_Coarsen(int meshID, int qm, int method, double factor, 
37         double *sizes) {
38     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
39     mesh->getfmMM()->getfmAdaptAlgs()->FEM_Coarsen(qm, method, factor, sizes);
40 }
41 FDECL void FTN_NAME(FEM_ADAPT_COARSEN,fem_adapt_coarsen)(int* meshID, 
42         int *qm, int *method, double *factor, double *sizes)
43 {
44   FEM_ADAPT_Coarsen(*meshID, *qm, *method, *factor, sizes);
45 }
46
47
48 void FEM_ADAPT_SetElementSizeField(int meshID, int elem, double size) {
49   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
50   meshP->elem[0].setMeshSizing(elem, size);
51 }
52 FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSIZEFIELD,fem_adapt_setelementsizefield)(int *meshID, int *elem, double *size)
53 {
54   FEM_ADAPT_SetElementSizeField(*meshID, *elem, *size);
55 }
56
57
58 void FEM_ADAPT_SetElementsSizeField(int meshID, double *sizes) {
59   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
60   int numElements = meshP->elem[0].size();
61   for (int i=0; i<numElements; i++) {
62     meshP->elem[0].setMeshSizing(i, sizes[i]);
63   }
64 }
65 FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSSIZEFIELD,fem_adapt_setelementssizefield)(int *meshID, double *sizes)
66 {
67   FEM_ADAPT_SetElementsSizeField(*meshID, sizes);
68 }
69
70
71 void FEM_ADAPT_SetReferenceMesh(int meshID) {
72     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
73     mesh->getfmMM()->getfmAdaptAlgs()->SetReferenceMesh();
74 }
75 FDECL void FTN_NAME(FEM_ADAPT_SETREFERENCEMESH, fem_adapt_setreferencemesh)(int* meshID)
76 {
77     FEM_ADAPT_SetReferenceMesh(*meshID);
78 }
79
80
81 void FEM_ADAPT_GradateMesh(int meshID, double smoothness)
82 {
83     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
84     mesh->getfmMM()->getfmAdaptAlgs()->GradateMesh(smoothness);
85 }
86 FDECL void FTN_NAME(FEM_ADAPT_GRADATEMESH, fem_adapt_gradatemesh)(int* meshID, double* smoothness)
87 {
88     FEM_ADAPT_GradateMesh(*meshID, *smoothness);
89 }
90
91 #endif