[cig-commits] r15530 - mc/3D/CitcomS/trunk/lib

tan2 at geodynamics.org tan2 at geodynamics.org
Tue Aug 11 10:48:33 PDT 2009


Author: tan2
Date: 2009-08-11 10:48:33 -0700 (Tue, 11 Aug 2009)
New Revision: 15530

Modified:
   mc/3D/CitcomS/trunk/lib/Material_properties.c
Log:
Add Murnaghan's integrated linear EoS as reference_state=2


Modified: mc/3D/CitcomS/trunk/lib/Material_properties.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Material_properties.c	2009-08-11 17:47:46 UTC (rev 15529)
+++ mc/3D/CitcomS/trunk/lib/Material_properties.c	2009-08-11 17:48:33 UTC (rev 15530)
@@ -38,8 +38,10 @@
 
 static void read_refstate(struct All_variables *E);
 static void adams_williamson_eos(struct All_variables *E);
+static void murnaghan_eos(struct All_variables *E);
 
 int layers_r(struct All_variables *,float);
+void myerror(struct All_variables *E,char *message);
 
 void mat_prop_allocate(struct All_variables *E)
 {
@@ -85,6 +87,10 @@
         /* Adams-Williamson EoS */
         adams_williamson_eos(E);
         break;
+    case 2:
+        /* Murnaghan's integrated linear EoS + constant Gruneisen parameter */
+        murnaghan_eos(E);
+        break;
     default:
         if (E->parallel.me) {
             fprintf(stderr, "Unknown option for reference state\n");
@@ -177,3 +183,100 @@
 }
 
 
+static void murnaghan_eos(struct All_variables *E)
+{
+    /* Reference: Murnaghan (1967), Finite Deformation of an Elastic Solid.
+
+       Let K0' = dK/dP at P=0
+           beta = dissipation number / Gruniesen parameter
+
+       dP = rho * g * dr
+       rho = rho0 * (1 + P * K0' / K0)^(1/K0')
+
+       ==> non-dimensionalization
+       rho = rho0 * (1 + beta * P * K0')^(1/K0')
+
+       The non-linear ODE is intergated repeatedly to find
+       convergence solution.
+
+
+       Assuming Gruneisen parameter and Cp are constant:
+
+       alpha = gamma * Cp * rho / Ks
+    */
+
+    const double k0p = 3.5;
+    const double beta = E->control.disptn_number * E->control.inv_gruneisen;
+    double *r, *rho, *p;
+
+    const int gnoz = E->mesh.noz;
+
+    int count = 0;
+    int i, j;
+    double old_rho_cmb, diff;
+    const acc = 1e-8;
+
+
+    r = (double *) malloc((gnoz+1)*sizeof(double));
+    rho = (double *) malloc((gnoz+1)*sizeof(double));
+    p = (double *) malloc((gnoz+1)*sizeof(double));
+
+    if(r == NULL || rho == NULL || p == NULL) {
+        myerror(E, "allocating memory in murnaghan_eos()");
+    }
+
+    /* r[1 ... gnoz] will hold the global radial coordinates */
+    gather_r(E, r);
+
+    for(i=1; i<=gnoz; i++) {
+	rho[i] = 1;
+        p[i] = 0;
+    }
+
+    old_rho_cmb = 0;
+    do {
+        /* integrate downward from surface to CMB */
+        for(i=gnoz-1; i>0; i--) {
+            p[i] = p[i+1] + 0.5 * (rho[i] + rho[i+1]) * (r[i+1] - r[i]);
+            rho[i] = rho[gnoz] * pow(1 + beta * k0p * p[i], 1.0/k0p);
+        }
+
+        diff = fabs(rho[1] - old_rho_cmb);
+        old_rho_cmb = rho[1];
+        count ++;
+
+        /* The loop should converge within 50 iterations
+           with reasonable beta and K0p */
+        if(count > 50) myerror(E, "Murnaghan EoS cannot converge");
+    } while(diff > acc);
+
+    /*
+    if(E->parallel.me == 0) {
+        fprintf(stderr, "%d iterations\n", count);
+        for(i=gnoz; i>0; i--) {
+            fprintf(stderr, "%d %e %e %e\n", i, r[i], p[i], rho[i]);
+        }
+    }
+    */
+
+    for(i=1, j=E->lmesh.nzs; i<=E->lmesh.noz; i++, j++) {
+        double ks;
+	E->refstate.rho[i] = rho[j];
+	E->refstate.gravity[i] = 1;
+	E->refstate.heat_capacity[i] = 1;
+
+        ks = pow(rho[j]/rho[gnoz], k0p);
+	E->refstate.thermal_expansivity[i] = rho[j] / ks;
+
+	/*E->refstate.thermal_conductivity[i] = 1;*/
+	/*E->refstate.Tadi[i] = (E->control.adiabaticT0 + E->control.surface_temp) * exp(E->control.disptn_number * z) - E->control.surface_temp;*/
+    }
+
+
+
+    free(r);
+    free(rho);
+    free(p);
+
+    return;
+}



More information about the CIG-COMMITS mailing list