Skip to content

Commit

Permalink
Merge pull request #360 from mibillen/fix_slab_tip
Browse files Browse the repository at this point in the history
taper slab age at tip
  • Loading branch information
MFraters authored Nov 5, 2021
2 parents f0144eb + d00dfeb commit 053cde8
Show file tree
Hide file tree
Showing 9 changed files with 110 additions and 75 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Fixed
- Using slabs and faults beyond the -180 to 180 range gave issues. These are now fixed and it now works and is tested for the -380 to 380 range. \[Menno Fraters; 2021-10-22; [#338](https://github.com/GeodynamicWorldBuilder/WorldBuilder/issues/338), [#340](https://github.com/GeodynamicWorldBuilder/WorldBuilder/pull/340) and [#342](https://github.com/GeodynamicWorldBuilder/WorldBuilder/pull/342)\]
- The ridge coordinates for the mass conservative slab temperature model where not convered to radians interally. \[Menno Fraters; 2021-10-27; [#352](https://github.com/GeodynamicWorldBuilder/WorldBuilder/issues/352)\]
- Fixed the taper of temperature at the slab tip for the bottom part of the slab, and fixed issue with negative temperatures above slab when there is an existing overririding plate temperature. \[Magali Billen; 2021-11-02; [#353](https:https://github.com/GeodynamicWorldBuilder/WorldBuilder/issues/353)

## [0.4.0] - 2021-06-22
### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ namespace WorldBuilder
// Taper the heat_content and min temperature to create a smooth slab tip
const double start_taper_distance = total_segment_length - taper_distance;

if ((distance_along_plane >= start_taper_distance) )
if ((distance_along_plane > start_taper_distance) )
{
initial_heat_content = initial_heat_content * (total_segment_length - distance_along_plane)/taper_distance;

Expand All @@ -332,15 +332,20 @@ namespace WorldBuilder
// 3. Determine the heat content for side 1 (bottom) of the slab
// Comes from integrating the half-space cooling model temperature

const double time_since_subducting = (distance_along_plane / plate_velocity) * seconds_in_year; // m/(m/y) = y(seconds_in_year)
double effective_plate_age = plate_age_sec + (distance_along_plane / plate_velocity) * seconds_in_year; // m/(m/y) = y(seconds_in_year)
if (distance_along_plane > start_taper_distance)
{
effective_plate_age = effective_plate_age * (total_segment_length - distance_along_plane)/ (taper_distance);
}

const double bottom_heat_content = 2 * thermal_conductivity * (min_temperature - potential_mantle_temperature) *
std::sqrt((plate_age_sec + time_since_subducting) / (thermal_diffusivity * const_pi));
std::sqrt(effective_plate_age /(thermal_diffusivity * const_pi));

// 4. The difference in heat content goes into the temperature above where Tmin occurs.
double top_heat_content = initial_heat_content - bottom_heat_content;

// Also need to taper the top_heat_content otherwise slab top will continue to thicken to the tip.
if (distance_along_plane >= start_taper_distance)
if (distance_along_plane > start_taper_distance)
{
top_heat_content = top_heat_content * (total_segment_length - distance_along_plane)/ (taper_distance);
}
Expand All @@ -352,17 +357,25 @@ namespace WorldBuilder
double time_top_slab = (1/(const_pi*thermal_diffusivity))*pow(((2*top_heat_content)/
(2*density*specific_heat*(min_temperature - temperature_ + 1e-16))),2) + 1e-16;

// temperature = temperature_;
temperature = temperature_ + (2*top_heat_content/(2*density*specific_heat*std::sqrt(const_pi*thermal_diffusivity*time_top_slab)))*
std::exp(-(adjusted_distance*adjusted_distance)/(4*thermal_diffusivity*time_top_slab));
// for overriding plate region where plate temperature is less the minimum slab temperature
// need to set temperature = temperature_ otherwise end up with temperature less than surface temperature ;
if (temperature_ < min_temperature)
{
temperature = temperature_;
}
else
{
temperature = temperature_ + (2*top_heat_content/(2*density*specific_heat*std::sqrt(const_pi*thermal_diffusivity*time_top_slab)))*
std::exp(-(adjusted_distance*adjusted_distance)/(4*thermal_diffusivity*time_top_slab));
}
// temperature = temperature_ + (2 * top_heat_content / (2 * density * specific_heat * std::sqrt(const_pi * thermal_diffusivity * time_top_slab))) *
// std::exp(-(adjusted_distance * adjusted_distance) / (4 * thermal_diffusivity * time_top_slab));
}
else
{
// use half-space cooling model for the bottom (side 1) of the slab
temperature = background_temperature + (min_temperature - background_temperature) *
std::erfc(adjusted_distance / (2 * std::sqrt(thermal_diffusivity * (plate_age_sec + time_since_subducting))));
std::erfc(adjusted_distance / (2 * std::sqrt(thermal_diffusivity * effective_plate_age)));
}
}
else
Expand Down
46 changes: 15 additions & 31 deletions tests/app/mass_conserving_slab_temperature.dat
Original file line number Diff line number Diff line change
@@ -1,35 +1,19 @@
# Profiles across a vertical slab
# Profiles across a slab dipping at 30 degrees
# Now define parameters:
# dim = 2
# compositions = 0
# x z d g T
2420e3 0 50e3 10
2440e3 0 50e3 10
2460e3 0 50e3 10
2480e3 0 50e3 10
2500e3 0 50e3 10
2520e3 0 50e3 10
2540e3 0 50e3 10
2560e3 0 50e3 10
2580e3 0 50e3 10
2600e3 0 50e3 10
2420e3 0 150e3 10
2440e3 0 150e3 10
2460e3 0 150e3 10
2480e3 0 150e3 10
2500e3 0 150e3 10
2520e3 0 150e3 10
2540e3 0 150e3 10
2560e3 0 150e3 10
2580e3 0 150e3 10
2600e3 0 150e3 10
2420e3 0 600e3 10
2440e3 0 600e3 10
2460e3 0 600e3 10
2480e3 0 600e3 10
2500e3 0 600e3 10
2520e3 0 600e3 10
2540e3 0 600e3 10
2560e3 0 600e3 10
2580e3 0 600e3 10
2600e3 0 600e3 10
2490e3 0 5e3 10
2495e3 0 5e3 10
2460e3 0 25e3 10
2475e3 0 35e3 10
2495e3 0 55e3 10
2540e3 0 125e3 10
2365e3 0 125e3 10
2375e3 0 135e3 10
2395e3 0 160e3 10
2425e3 0 200e3 10
2085e3 0 395e3 10
2095e3 0 425e3 10
2125e3 0 445e3 10
2155e3 0 470e3 10
12 changes: 9 additions & 3 deletions tests/app/mass_conserving_slab_temperature.wb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@
"specific heat":1000, "thermal diffusivity":1.0e-6,
"features":
[
{ "model":"subducting plate", "name":"Slab",
{ "model":"oceanic plate", "name":"Overriding", "max depth":300e3,"min depth":0,
"coordinates":[[0,-100e3],[0,100e3],[2500e3,100e3],[2500e3,-100e3]],
"temperature models":[
{"model":"half space model", "min depth":-10e3, "max depth":300e3, "spreading velocity":0.0625,
"top temperature":273, "bottom temperature":-1,
"ridge coordinates": [[0,-100e3],[0,100e3]]}]},
{ "model":"subducting plate", "name":"Slab",
"coordinates":[[2500e3,-100e3],[2500e3,100e3]],
"dip point":[0,0],
"segments":[{"length":200e3,"thickness":[300e3],"top truncation":[-100e3],"angle":[90]},
{"length":460e3,"thickness":[300e3],"top truncation":[-300e3],"angle":[90]}],
"segments":[{"length":200e3,"thickness":[300e3],"top truncation":[-100e3],"angle":[45]},
{"length":460e3,"thickness":[300e3],"top truncation":[-300e3],"angle":[45]}],
"temperature models":[{"model":"mass conserving", "density":3300, "thermal conductivity":3.3,
"adiabatic heating":true,"plate velocity":0.125,
"ridge coordinates":[[12500e3,-100e3],[12500e3,100e3]],
Expand Down
44 changes: 14 additions & 30 deletions tests/app/mass_conserving_slab_temperature/screen-output.log
Original file line number Diff line number Diff line change
@@ -1,31 +1,15 @@
# x z d g T
2420e3 0 50e3 10 1699.13
2440e3 0 50e3 10 1699.13
2460e3 0 50e3 10 1699.13
2480e3 0 50e3 10 1699.13
2500e3 0 50e3 10 718.923
2520e3 0 50e3 10 608.515
2540e3 0 50e3 10 891.918
2560e3 0 50e3 10 1135.44
2580e3 0 50e3 10 1328.92
2600e3 0 50e3 10 1471.07
2420e3 0 150e3 10 1752.63
2440e3 0 150e3 10 1752.63
2460e3 0 150e3 10 1752.63
2480e3 0 150e3 10 1752.63
2500e3 0 150e3 10 844.342
2520e3 0 150e3 10 650.018
2540e3 0 150e3 10 929.275
2560e3 0 150e3 10 1171.94
2580e3 0 150e3 10 1367.07
2600e3 0 150e3 10 1512.28
2420e3 0 600e3 10 2015
2440e3 0 600e3 10 2015
2460e3 0 600e3 10 2014.86
2480e3 0 600e3 10 1991.33
2500e3 0 600e3 10 1602.21
2520e3 0 600e3 10 1271.86
2540e3 0 600e3 10 1439.21
2560e3 0 600e3 10 1591.74
2580e3 0 600e3 10 1720.8
2600e3 0 600e3 10 1822.18
2490e3 0 5e3 10 314.684
2495e3 0 5e3 10 280.275
2460e3 0 25e3 10 810.382
2475e3 0 35e3 10 407.808
2495e3 0 55e3 10 828.11
2540e3 0 125e3 10 1589.85
2365e3 0 125e3 10 1617.34
2375e3 0 135e3 10 469.316
2395e3 0 160e3 10 920.435
2425e3 0 200e3 10 1452.72
2085e3 0 395e3 10 1649.95
2095e3 0 425e3 10 1029.35
2125e3 0 445e3 10 1342.83
2155e3 0 470e3 10 1658.84
8 changes: 8 additions & 0 deletions tests/app/mass_conserving_slab_temperature_proto.dat
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Profiles across a slab dipping 30 degrees
# Now define parameters:
# dim = 2
# compositions = 0
# x z d g T
2435e3 0 5e3 10
2430e3 0 5e3 10
2425e3 0 5e3 10
35 changes: 35 additions & 0 deletions tests/app/mass_conserving_slab_temperature_proto.wb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"version":"0.5",
"coordinate system":{"model":"cartesian"},
"cross section":[[0,0],[1000e3,0]],"surface temperature":273, "force surface temperature":true,
"potential mantle temperature":1673, "thermal expansion coefficient":3.1e-5,
"specific heat":1000, "thermal diffusivity":1.0e-6,
"features":
[
{ "model":"oceanic plate", "name":"Overriding", "max depth":300e3,"min depth":0,
"coordinates":[[0,-100e3],[0,100e3],[2500e3,100e3],[2500e3,-100e3]],
"temperature models":[
{"model":"half space model", "min depth":-10e3, "max depth":300e3, "spreading velocity":0.0625,
"top temperature":273, "bottom temperature":-1,
"ridge coordinates": [[0,-100e3],[0,100e3]]}]},
{ "model":"oceanic plate", "name":"Subducting", "max depth":300e3,"min depth":0,
"coordinates" :[[2500e3,100e3],[2500e3,-100e3],[4500e3,-100e3],[4500e3,100e3]],
"temperature models":[
{"model":"half space model", "min depth":0, "max depth":300e3, "spreading velocity":0.05,
"top temperature":273, "bottom temperature":-1,
"ridge coordinates": [[4500e3,-100e3],[4500e3,100e3]]}],
"composition models":[
{"model":"uniform", "compositions":[0], "min depth":0, "max depth":100e3}]},
{ "model":"subducting plate", "name":"Slab",
"coordinates":[[2500e3,-100e3],[2500e3,100e3]],
"dip point":[0,0],"max depth":1000e3,
"segments":[{"length":350e3,"thickness":[300e3],"top truncation":[-200e3],"angle":[0, 90]}],
"temperature models":[{"model":"mass conserving", "density":3300, "thermal conductivity":3.3,
"adiabatic heating":true,"plate velocity":0.05,"ridge coordinates":[[4500e3,-100e3],[4500e3,100e3]],
"coupling depth":80e3, "shallow dip":30.0, "taper distance":50e3,
"min distance slab top":-50e3, "max distance slab top":300e3}],
"composition models":[
{"model":"uniform", "compositions":[0], "max distance slab top":100e3}]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# x z d g T
2435e3 0 5e3 10 385.65
2430e3 0 5e3 10 385.765
2425e3 0 5e3 10 385.881
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
5930600 -388800 533000 200000 10 1780.01
5930600 -388800 533000 300000 10 1836.05
5930600 -388800 533000 350000 10 2834
5930600 -388800 533000 400000 10 1815.6
5930600 -388800 533000 403817 10 1838.65
5930600 -388800 533000 405000 10 1844.76
5930600 -388800 533000 400000 10 1847.39
5930600 -388800 533000 403817 10 1867.04
5930600 -388800 533000 405000 10 1871.92
5930600 -388800 533000 500000 10 1953.49

0 comments on commit 053cde8

Please sign in to comment.