de061371e595510cff5d7814f39bb454d2b73da8
[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 qm, int method, double factor, double *sizes) {
25   CtvAccess(_adaptAlgs)->FEM_Refine(qm, method, factor, sizes);
26 }
27 FDECL void FTN_NAME(FEM_ADAPT_REFINE,fem_adapt_refine)(int *qm, int *method, double *factor, double *sizes)
28 {
29   FEM_ADAPT_Refine(*qm, *method, *factor, sizes);
30 }
31
32
33 void FEM_ADAPT_Coarsen(int qm, int method, double factor, double *sizes) {
34   CtvAccess(_adaptAlgs)->FEM_Coarsen(qm, method, factor, sizes);
35 }
36 FDECL void FTN_NAME(FEM_ADAPT_COARSEN,fem_adapt_coarsen)(int *qm, int *method, double *factor, double *sizes)
37 {
38   FEM_ADAPT_Coarsen(*qm, *method, *factor, sizes);
39 }
40
41
42 void FEM_ADAPT_SetElementSizeField(int meshID, int elem, double size) {
43   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
44   meshP->elem[0].setMeshSizing(elem, size);
45 }
46 FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSIZEFIELD,fem_adapt_setelementsizefield)(int *meshID, int *elem, double *size)
47 {
48   FEM_ADAPT_SetElementSizeField(*meshID, *elem, *size);
49 }
50
51
52 void FEM_ADAPT_SetElementsSizeField(int meshID, double *sizes) {
53   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
54   int numElements = meshP->elem[0].size();
55   for (int i=0; i<numElements; i++) {
56     meshP->elem[0].setMeshSizing(i, sizes[i]);
57   }
58 }
59 FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSSIZEFIELD,fem_adapt_setelementssizefield)(int *meshID, double *sizes)
60 {
61   FEM_ADAPT_SetElementsSizeField(*meshID, sizes);
62 }
63
64
65 void FEM_ADAPT_SetReferenceMesh(int meshID) {
66     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
67     mesh->getfmMM()->getfmAdaptAlgs()->SetReferenceMesh();
68 }
69 FDECL void FTN_NAME(FEM_ADAPT_SETREFERENCEMESH, fem_adapt_setreferencemesh)(int* meshID)
70 {
71     FEM_ADAPT_SetReferenceMesh(*meshID);
72 }
73
74
75 void FEM_ADAPT_GradateMesh(int meshID, double smoothness)
76 {
77     FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
78     mesh->getfmMM()->getfmAdaptAlgs()->GradateMesh(smoothness);
79 }
80 FDECL void FTN_NAME(FEM_ADAPT_GRADATEMESH, fem_adapt_gradatemesh)(int* meshID, double* smoothness)
81 {
82     FEM_ADAPT_GradateMesh(*meshID, *smoothness);
83 }
84
85 #endif