Added a mesh sizing attribute for mesh adaptivity.
authorTerry L. Wilmarth <wilmarth@uiuc.edu>
Fri, 9 Sep 2005 20:51:46 +0000 (20:51 +0000)
committerTerry L. Wilmarth <wilmarth@uiuc.edu>
Fri, 9 Sep 2005 20:51:46 +0000 (20:51 +0000)
Task: FEM

src/libs/ck-libs/fem/fem.h
src/libs/ck-libs/fem/fem_adapt_algs.C
src/libs/ck-libs/fem/fem_mesh.C
src/libs/ck-libs/fem/fem_mesh.h
src/libs/ck-libs/fem/femf.h

index 9f8527673842204a8c2cf075ef00b230b1845644..640119a868f47fa96f2d00053d892a78d057ea35 100644 (file)
@@ -122,7 +122,8 @@ to mark the chunk to which a ghost node or element belongs datatype=FEM_INDEX*/
                                                                                   exists or is valid. It may be 0 whenever a mesh modification occurs that deletes the 
                                                                                   corresponding node or element */
 
-#define FEM_ATTRIB_LAST (FEM_ATTRIB_FIRST+15) /*This is the last valid attribute code*/
+#define FEM_MESH_SIZING (FEM_ATTRIB_FIRST+15) /* Target edge length attr. */
+#define FEM_ATTRIB_LAST (FEM_ATTRIB_FIRST+16) /*This is the last valid attribute code*/
 
   /* Specialized routines: */
   void FEM_Mesh_set_conn(int fem_mesh,int entity,
index f167848c246f0ef3fb55c994f99b2035076031a6..317e039bec40264235fc40e71cc34e5fdd199298 100644 (file)
@@ -58,7 +58,7 @@ int FEM_Adapt_Algs::Refine(int qm, int method, double factor, double *sizes)
        tmpLen = length(eConn[2], eConn[0]);
        if (tmpLen > maxEdgeLength) maxEdgeLength = tmpLen;
        if (maxEdgeLength > (regional_sizes[i]*REFINE_TOL)) {
-         double qFactor=1.0;//getAreaQuality(i);
+         double qFactor=getAreaQuality(i);
          Insert(i, qFactor, 0);
        }
       }
index c0a9402d61b847b784457f22dd821957f9c18629..5eeb0344d99722318c0612efb6009c9ad8529d50 100644 (file)
@@ -1328,6 +1328,29 @@ void FEM_Entity::allocateGlobalno(void) {
        globalno->setWidth(1);
 }
 
+void FEM_Entity::allocateMeshSizing(void) {
+  if (meshSizing) 
+    CkAbort("FEM_Entity::allocateMeshSizing called, but already allocated");
+  meshSizing=new FEM_DataAttribute(this,FEM_MESH_SIZING);
+  add(meshSizing); // globalno will be deleted via attributes list now
+  meshSizing->setWidth(1);
+  meshSizing->setDatatype(FEM_DOUBLE);
+}
+
+void FEM_Entity::setMeshSizing(int r,double s)
+{
+  if (!meshSizing) allocateMeshSizing();
+  meshSizing->getDouble()(r,0)=s;
+}
+
+void FEM_Entity::setMeshSizing(double *sf)
+{
+  if (!meshSizing) allocateMeshSizing();
+  int len = size();
+  for (int i=0; i<len; i++)
+    meshSizing->getDouble()(i,0)=sf[i];
+}
+
 void FEM_Entity::allocateBoundary(){
        FEM_DataAttribute *bound = new FEM_DataAttribute(this,FEM_BOUNDARY);
        add(bound);
index 7e604e5b15b457e2dab8c9376ea3caee22a6d053..e2675d431969fa327d8099feaa60bcc3c5ef6803 100644 (file)
@@ -648,6 +648,12 @@ class FEM_Entity {
        */
        void allocateBoundary();
 
+       /// Mesh sizing attribute for elements
+       /** Specifies a double edge length target for the mesh at each 
+           element; used in adaptivity algorithms */
+       FEM_DataAttribute *meshSizing;
+       void allocateMeshSizing(void);
+
        /*
            used to allocate the char array for storing whether each entity is valid
                When a node/element is deleted the flag in the valid table is set to 0.
@@ -792,6 +798,15 @@ protected:
        void setAscendingGlobalno(void);
        void setAscendingGlobalno(int base);
        void copyOldGlobalno(const FEM_Entity &e);
+
+       // Mesh sizing array access
+       bool hasMeshSizing(void) const {return meshSizing!=0;}
+       double getMeshSizing(int r) const {
+         if (meshSizing==0) return -1; // Unknown mesh sizing
+         return meshSizing->getDouble()(r,0);
+       }
+       void setMeshSizing(int r,double s);
+       void setMeshSizing(double *sf);
        
        //Ghost comm. list access
        FEM_Comm &setGhostSend(void) { return ghostSend; }
@@ -1190,6 +1205,7 @@ class FEM_Mesh : public CkNoncopyable {
   int getEntities(int *entites);
   
   
+  
   /********** New methods ***********/
   /*
     This method creates the mapping from a node to all the elements that are 
index acafb5913b709de477515b6cbad0ae69ef254c9c..e78e28252730d47ffd850b0fa6286674944a7c8a 100644 (file)
@@ -44,6 +44,7 @@
        integer, parameter :: FEM_NODE_PRIMARY=(FEM_ATTRIB_FIRST+7)
        integer, parameter :: FEM_CHUNK=(FEM_ATTRIB_FIRST+8)
        integer, parameter :: FEM_BOUNDARY=(FEM_ATTRIB_FIRST+9)
+       integer, parameter :: FEM_MESH_SIZING=(FEM_ATTRIB_FIRST+15)
        integer, parameter :: FEM_INDEX_0=IDXL_INDEX_0
        integer, parameter :: FEM_INDEX_1=IDXL_INDEX_1