Added FEM_ADAPT_SetReferenceMesh
authorAaron Becker <abecker3@illinois.edu>
Mon, 17 Oct 2005 06:16:48 +0000 (06:16 +0000)
committerAaron Becker <abecker3@illinois.edu>
Mon, 17 Oct 2005 06:16:48 +0000 (06:16 +0000)
Task: FEM

src/libs/ck-libs/fem/fem_adapt_if.h

index fdbf0fe59214bd20cf8c1b71ff54680fbb1e30f7..3512c690e3039005a9cdf1ea3bb26a204699e9e6 100644 (file)
@@ -20,6 +20,7 @@ FDECL void FTN_NAME(FEM_ADAPT_INIT,fem_adapt_init)(int *meshID)
   FEM_ADAPT_Init(*meshID);
 }
 
+
 void FEM_ADAPT_Refine(int qm, int method, double factor, double *sizes) {
   CtvAccess(_adaptAlgs)->FEM_Refine(qm, method, factor, sizes);
 }
@@ -28,6 +29,7 @@ FDECL void FTN_NAME(FEM_ADAPT_REFINE,fem_adapt_refine)(int *qm, int *method, dou
   FEM_ADAPT_Refine(*qm, *method, *factor, sizes);
 }
 
+
 void FEM_ADAPT_Coarsen(int qm, int method, double factor, double *sizes) {
   CtvAccess(_adaptAlgs)->FEM_Coarsen(qm, method, factor, sizes);
 }
@@ -36,6 +38,7 @@ FDECL void FTN_NAME(FEM_ADAPT_COARSEN,fem_adapt_coarsen)(int *qm, int *method, d
   FEM_ADAPT_Coarsen(*qm, *method, *factor, sizes);
 }
 
+
 void FEM_ADAPT_SetElementSizeField(int meshID, int elem, double size) {
   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
   meshP->elem[0].setMeshSizing(elem, size);
@@ -45,9 +48,11 @@ FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSIZEFIELD,fem_adapt_setelementsizefield)
   FEM_ADAPT_SetElementSizeField(*meshID, *elem, *size);
 }
 
+
 void FEM_ADAPT_SetElementsSizeField(int meshID, double *sizes) {
   FEM_Mesh *meshP = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
-  for (int i=0; i<meshP->elem[0].size(); i++) {
+  int numElements = meshP->elem[0].size();
+  for (int i=0; i<numElements; i++) {
     meshP->elem[0].setMeshSizing(i, sizes[i]);
   }
 }
@@ -56,4 +61,33 @@ FDECL void FTN_NAME(FEM_ADAPT_SETELEMENTSSIZEFIELD,fem_adapt_setelementssizefiel
   FEM_ADAPT_SetElementsSizeField(*meshID, sizes);
 }
 
+
+void FEM_ADAPT_SetReferenceMesh(int meshID) {
+    FEM_Mesh* mesh = FEM_Mesh_lookup(meshID, "FEM_ADAPT_Init");
+
+    // for each element, set its size to its average edge length
+    // TODO: do we need to run this loop for element types other than 0?
+    
+    double avgLength;
+    int width = mesh->elem[0].getConn().width();
+    int* eConn = (int*)malloc(width*sizeof(int));
+    int numElements = mesh->elem[0].size();
+    
+    for (int i=0; i<numElements; ++i, avgLength=0) {
+        mesh->e2n_getAll(i, eConn);
+        
+        for (int j=0; j<width-1; ++j) {
+            avgLength += CtvAccess(_adaptAlgs)->length(eConn[j], eConn[j+1]);
+        }
+        avgLength += CtvAccess(_adaptAlgs)->length(eConn[0], eConn[width-1]);
+        avgLength /= width;
+        mesh->elem[0].setMeshSizing(i, avgLength);      
+    }
+    free(eConn);
+}
+FDECL void FTN_NAME(FEM_ADAPT_SETREFERENCEMESH, fem_adapt_setreferencemesh)(int* meshID)
+{
+    FEM_ADAPT_SetReferenceMesh(*meshID);
+}
+
 #endif