[SCM] Gerris Flow Solver branch, upstream, updated. e8f73a07832050124d2b8bf6c6f35b33180e65a8

Stephane Popinet popinet at users.sf.net
Tue Nov 24 12:25:19 UTC 2009


The following commit has been merged in the upstream branch:
commit 48a36ec84012b0b10a2a6102ca57b71cf8bc7421
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Fri Oct 23 14:46:58 2009 +1100

    gfs_domain_cfl() takes metric into account
    
    darcs-hash:20091023034658-d4795-7bdecb7f5c2a6aa4a11cf9bdeb7830d6e236b19d.gz

diff --git a/src/domain.c b/src/domain.c
index 7022a62..eb07f1d 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -2533,13 +2533,21 @@ guint gfs_domain_size (GfsDomain * domain,
 typedef struct {
   gdouble cfl;
   GfsVariable ** v;
+  GfsDomain * domain;
 } CflData;
 
 static void minimum_mac_cfl (FttCellFace * face, CflData * p)
 {
   gdouble un = GFS_STATE (face->cell)->f[face->d].un;
+  gdouble length = ftt_cell_size (face->cell);
+  if (p->domain->cell_metric) {
+    gdouble fm = (* p->domain->face_metric) (p->domain, face, p->domain->metric_data);
+    if (fm <= 0.) /* e.g. Axi metric on the axis */
+      return;
+    length *= (* p->domain->cell_metric) (p->domain, face->cell, p->domain->metric_data)/fm;
+  }
   if (un != 0.) {
-    gdouble cflu = ftt_cell_size (face->cell)/fabs (un);
+    gdouble cflu = length/fabs (un);
     if (cflu*cflu < p->cfl)
       p->cfl = cflu*cflu;
   }
@@ -2554,7 +2562,7 @@ static void minimum_mac_cfl (FttCellFace * face, CflData * p)
       i = i->next;
     }
     if (g != 0.) {
-      gdouble cflg = 2.*ftt_cell_size (face->cell)/fabs (g);
+      gdouble cflg = 2.*length/fabs (g);
       if (cflg < p->cfl)
 	p->cfl = cflg;
     }
@@ -2563,12 +2571,25 @@ static void minimum_mac_cfl (FttCellFace * face, CflData * p)
 
 static void minimum_cfl (FttCell * cell, CflData * p)
 {
-  gdouble size = ftt_cell_size (cell);
-  FttComponent c;
+  gdouble length = ftt_cell_size (cell);
+  if (p->domain->cell_metric)
+    length *= (* p->domain->cell_metric) (p->domain, cell, p->domain->metric_data);
 
+  FttComponent c;
   for (c = 0; c < FTT_DIMENSION; c++) {
-    if (GFS_VARIABLE (cell, p->v[c]->i) != 0.) {
-      gdouble cflu = size/fabs (GFS_VARIABLE (cell, p->v[c]->i));
+    gdouble fm;
+    if (p->domain->face_metric) {
+      FttCellFace f;
+      f.cell = cell; f.d = 2*c;
+      gdouble fm1 = (* p->domain->face_metric) (p->domain, &f, p->domain->metric_data);
+      f.d = 2*c + 1;
+      gdouble fm2 = (* p->domain->face_metric) (p->domain, &f, p->domain->metric_data);
+      fm = MAX (fm1, fm2);
+    }
+    else
+      fm = 1.;
+    if (GFS_VALUE (cell, p->v[c]) != 0.) {
+      gdouble cflu = length/fabs (fm*GFS_VALUE (cell, p->v[c]));
 
       if (cflu*cflu < p->cfl)
 	p->cfl = cflu*cflu;
@@ -2577,7 +2598,7 @@ static void minimum_cfl (FttCell * cell, CflData * p)
       gdouble g = gfs_variable_mac_source (p->v[c], cell);
 
       if (g != 0.) {
-	gdouble cflg = 2.*size/fabs (g);
+	gdouble cflg = 2.*length/fabs (fm*g);
 
 	if (cflg < p->cfl)
 	  p->cfl = cflg;
@@ -2607,6 +2628,7 @@ gdouble gfs_domain_cfl (GfsDomain * domain,
 
   p.cfl = G_MAXDOUBLE;
   p.v = gfs_domain_velocity (domain);
+  p.domain = domain;
   gfs_domain_face_traverse (domain, FTT_XYZ, FTT_PRE_ORDER, flags, max_depth, 
 			    (FttFaceTraverseFunc) minimum_mac_cfl, &p);
   gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, flags, max_depth, 
diff --git a/test/axiadvection/axi.sh b/test/axiadvection/axi.sh
index f143a97..6472ca9 100644
--- a/test/axiadvection/axi.sh
+++ b/test/axiadvection/axi.sh
@@ -24,7 +24,7 @@ BEGIN { min = 1000.; max = -1000.; }{
 END {
   e = 2.*(max - min)/(max + min);
   print "VOF:", e;
-  if (e > 5e-4)
+  if (e > 4e-4)
     exit (1);
 }' < srt; then :
 else
@@ -39,7 +39,7 @@ BEGIN { min = 1000.; max = -1000.; }{
 END {
   e = 2.*(max - min)/(max + min);
   print "Standard:", e;
-  if (e > 2e-6)
+  if (e > 2.5e-6)
     exit (1);
 }' < srt1; then :
 else

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list