Skip to content

Commit 3c89979

Browse files
committed
Fix bug for fully solid case
1 parent e31c3eb commit 3c89979

File tree

7 files changed

+145
-12
lines changed

7 files changed

+145
-12
lines changed

source/boundary_temperature/dynamic_core.cc

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -701,21 +701,29 @@ namespace aspect
701701
DynamicCore<dim>::
702702
get_heat_solution(const double Tc, const double r, const double X, double &Eh) const
703703
{
704-
double It = numbers::signaling_nan<double>();
705-
if (D>L)
704+
if (r==Rc)
706705
{
707-
const double B = std::sqrt(1./(1./Utilities::fixed_power<2>(L)-1./Utilities::fixed_power<2>(D)));
708-
It = 4*numbers::PI*Rho_cen/get_T(Tc,0)*(-Utilities::fixed_power<2>(B)*Rc/2*std::exp(-Utilities::fixed_power<2>(Rc/B))+Utilities::fixed_power<3>(B)/std::sqrt(numbers::PI)/4*std::erf(Rc/B));
709-
It -= 4*numbers::PI*Rho_cen/get_T(Tc,0)*(-Utilities::fixed_power<2>(B)*r/2*std::exp(-Utilities::fixed_power<2>(r/B))+Utilities::fixed_power<3>(B)/std::sqrt(numbers::PI)/4*std::erf(r/B));
706+
// No energy change rate if the inner core is fully frozen.
707+
Eh = 0.;
710708
}
711709
else
712710
{
713-
const double B = std::sqrt(1./(Utilities::fixed_power<-2>(D)-Utilities::fixed_power<-2>(L)));
714-
It = 4*numbers::PI*Rho_cen/get_T(Tc,0)*(Utilities::fixed_power<2>(B)*Rc/2*std::exp(Utilities::fixed_power<2>(Rc/B))-Utilities::fixed_power<2>(B)*fun_Sn(B,Rc,100)/2);
715-
It -= 4*numbers::PI*Rho_cen/get_T(Tc,0)*(Utilities::fixed_power<2>(B)*r/2*std::exp(Utilities::fixed_power<2>(r/B))-Utilities::fixed_power<2>(B)*fun_Sn(B,r,100)/2);
711+
double It = numbers::signaling_nan<double>();
712+
if (D>L)
713+
{
714+
const double B = std::sqrt(1./(1./Utilities::fixed_power<2>(L)-1./Utilities::fixed_power<2>(D)));
715+
It = 4*numbers::PI*Rho_cen/get_T(Tc,0)*(-Utilities::fixed_power<2>(B)*Rc/2*std::exp(-Utilities::fixed_power<2>(Rc/B))+Utilities::fixed_power<3>(B)/std::sqrt(numbers::PI)/4*std::erf(Rc/B));
716+
It -= 4*numbers::PI*Rho_cen/get_T(Tc,0)*(-Utilities::fixed_power<2>(B)*r/2*std::exp(-Utilities::fixed_power<2>(r/B))+Utilities::fixed_power<3>(B)/std::sqrt(numbers::PI)/4*std::erf(r/B));
717+
}
718+
else
719+
{
720+
const double B = std::sqrt(1./(Utilities::fixed_power<-2>(D)-Utilities::fixed_power<-2>(L)));
721+
It = 4*numbers::PI*Rho_cen/get_T(Tc,0)*(Utilities::fixed_power<2>(B)*Rc/2*std::exp(Utilities::fixed_power<2>(Rc/B))-Utilities::fixed_power<2>(B)*fun_Sn(B,Rc,100)/2);
722+
It -= 4*numbers::PI*Rho_cen/get_T(Tc,0)*(Utilities::fixed_power<2>(B)*r/2*std::exp(Utilities::fixed_power<2>(r/B))-Utilities::fixed_power<2>(B)*fun_Sn(B,r,100)/2);
723+
}
724+
const double Cc = 4*numbers::PI*Utilities::fixed_power<2>(r)*get_rho(r)*X/(Mc-get_mass(r));
725+
Eh = Rh*(It-(Mc-get_mass(r))/get_T(Tc,r))*Cc;
716726
}
717-
const double Cc = 4*numbers::PI*Utilities::fixed_power<2>(r)*get_rho(r)*X/(Mc-get_mass(r));
718-
Eh = Rh*(It-(Mc-get_mass(r))/get_T(Tc,r))*Cc;
719727
}
720728

721729

@@ -725,12 +733,12 @@ namespace aspect
725733
DynamicCore<dim>::
726734
get_gravity_heating(const double Tc, const double r, const double X, double &Qg, double &Eg) const
727735
{
728-
const double Cc = 4*numbers::PI*Utilities::fixed_power<2>(r)*get_rho(r)*X/(Mc-get_mass(r));
729-
const double C_2 = 3./16.*Utilities::fixed_power<2>(L) - 0.5*Utilities::fixed_power<2>(Rc)*(1.-3./10.*Utilities::fixed_power<2>(Rc/L));
730736
if (r==Rc)
731737
Qg = 0.;
732738
else
733739
{
740+
const double Cc = 4*numbers::PI*Utilities::fixed_power<2>(r)*get_rho(r)*X/(Mc-get_mass(r));
741+
const double C_2 = 3./16.*Utilities::fixed_power<2>(L) - 0.5*Utilities::fixed_power<2>(Rc)*(1.-3./10.*Utilities::fixed_power<2>(Rc/L));
734742
Qg = (8./3.*Utilities::fixed_power<2>(numbers::PI*Rho_cen)*constants::big_g*(
735743
((3./20.*Utilities::fixed_power<5>(Rc)-Utilities::fixed_power<2>(L)*Utilities::fixed_power<3>(Rc)/8.-C_2*Utilities::fixed_power<2>(L)*Rc)*std::exp(-Utilities::fixed_power<2>(Rc/L))
736744
+C_2/2.*Utilities::fixed_power<3>(L)*std::sqrt(numbers::PI)*std::erf(Rc/L))

tests/dynamic_core_fully_molten.prm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# A simple setup for Earth convection model in a 2d shell
2+
# where the core mantle boundary (CMB) temperature dynamically evolves through time.
3+
#
4+
# This is a variation of dynamic_core.prm with a fully molten core.
5+
6+
include $ASPECT_SOURCE_DIR/tests/dynamic_core.prm
7+
8+
subsection Boundary temperature model
9+
subsection Dynamic core
10+
set Inner temperature = 6000
11+
end
12+
end
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
Number of active cells: 768 (on 4 levels)
3+
Number of degrees of freedom: 10,656 (6,528+864+3,264)
4+
5+
Dynamic core initialized as:
6+
Tc(K) Ri(km) Xi dT/dt(K/year) dR/dt(km/year) dX/dt(1/year)
7+
6000 0 0.042 0 0 0
8+
*** Timestep 0: t=0 years, dt=0 years
9+
Solving temperature system... 0 iterations.
10+
Solving Stokes system (GMG)... 16+0 iterations.
11+
12+
Postprocessing:
13+
CMB heat flux out of the core 1.43 TW,
14+
15+
*** Timestep 1: t=598995 years, dt=598995 years
16+
Dynamic core data updated.
17+
Tc(K) Ri(km) Xi dT/dt(K/year) dR/dt(km/year) dX/dt(1/year)
18+
6000.07 0 0.042 1.12778e-07 0 0
19+
Solving temperature system... 14 iterations.
20+
Solving Stokes system (GMG)... 16+0 iterations.
21+
22+
Postprocessing:
23+
CMB heat flux out of the core 1.43 TW,
24+
25+
*** Timestep 2: t=1e+06 years, dt=401005 years
26+
Dynamic core data updated.
27+
Tc(K) Ri(km) Xi dT/dt(K/year) dR/dt(km/year) dX/dt(1/year)
28+
6000.11 0 0.042 1.14788e-07 0 0
29+
Solving temperature system... 17 iterations.
30+
Solving Stokes system (GMG)... 15+0 iterations.
31+
32+
Postprocessing:
33+
CMB heat flux out of the core 1.31 TW,
34+
35+
Termination requested by criterion: end time
36+
37+
38+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 1: Time step number
2+
# 2: Time (years)
3+
# 3: Time step size (years)
4+
# 4: Number of mesh cells
5+
# 5: Number of Stokes degrees of freedom
6+
# 6: Number of temperature degrees of freedom
7+
# 7: Iterations for temperature solver
8+
# 8: Iterations for Stokes solver
9+
# 9: Velocity iterations in Stokes preconditioner
10+
# 10: Schur complement iterations in Stokes preconditioner
11+
# 11: CMB heat flux out of the core (TW)
12+
# 12: CMB Temperature (K)
13+
# 13: Inner core radius (km)
14+
# 14: Light element concentration (%)
15+
# 15: Excess entropy (W/K)
16+
0 0.000000000000e+00 0.000000000000e+00 768 7392 3264 0 15 17 17 1.429e+00 6000.00 0.00 4.2000 -2.864e+07
17+
1 5.989948582733e+05 5.989948582733e+05 768 7392 3264 14 15 17 17 1.429e+00 6000.07 0.00 4.2000 -1.799e+08
18+
2 1.000000000000e+06 4.010051417267e+05 768 7392 3264 17 14 16 16 1.305e+00 6000.11 0.00 4.2000 -1.827e+08

tests/dynamic_core_fully_solid.prm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# A simple setup for Earth convection model in a 2d shell
2+
# where the core mantle boundary (CMB) temperature dynamically evolves through time.
3+
#
4+
# This is a variation of dynamic_core.prm with a fully frozen core.
5+
6+
include $ASPECT_SOURCE_DIR/tests/dynamic_core.prm
7+
8+
subsection Boundary temperature model
9+
subsection Dynamic core
10+
set Inner temperature = 1000
11+
end
12+
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
Number of active cells: 768 (on 4 levels)
3+
Number of degrees of freedom: 10,656 (6,528+864+3,264)
4+
5+
Dynamic core initialized as:
6+
Tc(K) Ri(km) Xi dT/dt(K/year) dR/dt(km/year) dX/dt(1/year)
7+
1000 3481 0.084 0 0 0
8+
*** Timestep 0: t=0 years, dt=0 years
9+
Solving temperature system... 0 iterations.
10+
Solving Stokes system (GMG)... 16+0 iterations.
11+
12+
Postprocessing:
13+
CMB heat flux out of the core 0.175 TW,
14+
15+
*** Timestep 1: t=1e+06 years, dt=1e+06 years
16+
Dynamic core data updated.
17+
Tc(K) Ri(km) Xi dT/dt(K/year) dR/dt(km/year) dX/dt(1/year)
18+
1000.13 3481 0.084 1.33889e-07 0 0
19+
Solving temperature system... 9 iterations.
20+
Solving Stokes system (GMG)... 16+0 iterations.
21+
22+
Postprocessing:
23+
CMB heat flux out of the core 0.175 TW,
24+
25+
Termination requested by criterion: end time
26+
27+
28+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 1: Time step number
2+
# 2: Time (years)
3+
# 3: Time step size (years)
4+
# 4: Number of mesh cells
5+
# 5: Number of Stokes degrees of freedom
6+
# 6: Number of temperature degrees of freedom
7+
# 7: Iterations for temperature solver
8+
# 8: Iterations for Stokes solver
9+
# 9: Velocity iterations in Stokes preconditioner
10+
# 10: Schur complement iterations in Stokes preconditioner
11+
# 11: CMB heat flux out of the core (TW)
12+
# 12: CMB Temperature (K)
13+
# 13: Inner core radius (km)
14+
# 14: Light element concentration (%)
15+
# 15: Excess entropy (W/K)
16+
0 0.000000000000e+00 0.000000000000e+00 768 7392 3264 0 15 17 17 1.755e-01 1000.00 3481.00 8.4000 8.412e+08
17+
1 1.000000000000e+06 1.000000000000e+06 768 7392 3264 9 15 17 17 1.755e-01 1000.13 3481.00 8.4000 -2.367e+08

0 commit comments

Comments
 (0)