From dd69cb5544fec820ca82eb55f4058f82fd1aa339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Mee=C3=9Fen?= Date: Tue, 16 Jun 2020 11:20:24 +0200 Subject: [PATCH] T2rho (#2) * Unit display according to SI specs * Fix bug in argument -t * Printing XFe in rock composition tabel * Update binary location * Added T2Rho * Update README.md * Update travis badge URL * Update CHANGELOG --- .travis.yml | 4 +- CHANGELOG | 14 +- Example/Makefile | 6 +- Example/results.png | Bin 27659 -> 30535 bytes README.md | 4 +- T2Rho.md | 58 ++++++ VeloDT.pro | 2 +- include/T2Rho/T2Rho.h | 66 ++++++ include/common/PointClasses.h | 118 +++++------ src/T2Rho/T2Rho.cpp | 367 ++++++++++++++++++++++++++++++++++ src/T2Rho/T2Rho.pro | 29 +++ 11 files changed, 604 insertions(+), 64 deletions(-) create mode 100644 T2Rho.md create mode 100644 include/T2Rho/T2Rho.h create mode 100644 src/T2Rho/T2Rho.cpp create mode 100644 src/T2Rho/T2Rho.pro diff --git a/.travis.yml b/.travis.yml index 6bd35d3..d96fbda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,13 @@ script: - qmake - make after_success: -- tar -zcvf bin/bin-VeloDT-prerelease-ubuntu-qt${QT_BASE}-x86_64.tar.gz bin/V2RhoT +- tar -zcvf bin/bin-VeloDT-ubuntu-qt${QT_BASE}-x86_64.tar.gz bin/V2RhoT bin/V2T deploy: provider: releases api_key: secure: ORqoxcPCHo19J3npN9/lFvwYMOuz7qifGg8G75OKIj3p3LlFdidmAHvWD1hd0Q3+zPXzNxG/CiAuwALjWFQdLIcB0vsKeeOlUII8/eGhDkaPjyW/VOdQT5XxqSevvtRdTIqJO2WAxO80TdZ6YZoz7Q9lkxSnGkpBH569pIIC2OkgcC62HGXT3jGlJ8I82fVl32uKTh2954kRRT5eXv24rYuGhp+jarc5n2io02HLOHLdz0qg3OcemFYJfbGJ7uPjQUh3lFJd6VfLX1cdkRYBFedsWST3y7i2+SnVUpIY+mr/bEGgf2xrE8OLXw4ABA8PhFloqkiHiOrkZ6Xc4Az+cmhZjOLAT04yL1HBpXrpUb8bpJVIfH5eda8ORwey/RST8JF/eqFM7pu+AXJpG9Fs6lEm/GczuTxMOcF3cTyxM3/Q96VZq3ZEVe8REuLqqyyy5J7IMifWZPH3hkWHjTYM2NsWroG45duFW+w3ts9QrLPOOwoXYgPMQ9CJJoo5lOrlfM4rOBujbXk+tn6QoyRFhne2mxIrHE4pcyfIwDz5bsi7ZxpfFa7sWaAro/DY+OGCuneNI1DtFJHGG0QzoCNVZXBTUUgeqQQf3Sp3XOF/O++yJ804+QS+fIMaAGB/fAo6l4d13zCpWqqQBjf3a5CcBve0aovSQHntid7xfW5tBNs= - file: bin/bin-VeloDT-prerelease-ubuntu-qt${QT_BASE}-x86_64.tar.gz + file: bin/bin-VeloDT-ubuntu-qt${QT_BASE}-x86_64.tar.gz on: tags: true repo: cmeessen/VeloDT diff --git a/CHANGELOG b/CHANGELOG index e00442b..49918c8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## [1.1.0] - 2020-06-16 +## [v1.2.0] - 2020-06-16 + +### Added + +- T2Rho applies the equations of + [Goes et al. (2000)](https://doi.org/10.1029/1999JB900300) to compute + densities from a given mineral composition, temperature and pressure + +### Fixed + +- File name of binaries is not "prerelease" anymore + +## [v1.1.0] - 2020-06-16 ### Added diff --git a/Example/Makefile b/Example/Makefile index be61071..735c928 100644 --- a/Example/Makefile +++ b/Example/Makefile @@ -1,5 +1,6 @@ V2RhoT = ../bin/V2RhoT V2T = ../bin/V2T +T2Rho = ../bin/T2Rho # Plot properties FIGURE = results.ps ROI_T = 450/1450/-200/-50 @@ -31,13 +32,16 @@ plot: convert # GGV Rho Vs gmt psxy V2RhoT_Vs.dat -i5,2+s0.001 -J -R$(ROI_R) -W1p,red -X7 -BwSne+t'Density' -Bx+l'@~r@~ / kg/m@+3@+' -Baf -O -P -K >> $(FIGURE) # GGV Rho Vp - gmt psxy V2RhoT_Vp.dat -i5,2+s0.001 -J -R -W1p,blue -O -P >> $(FIGURE) + gmt psxy V2RhoT_Vp.dat -i5,2+s0.001 -J -R -W1p,blue -O -P -K >> $(FIGURE) + # Rho from PMK + gmt psxy T2Rho_V2T_Vs.dat -i5,2+s0.001 -J -R -W1p,red,. -O -P >> $(FIGURE) gmt psconvert -A -Tg -Z $(FIGURE) -E100 -Qt -Qg convert: createfiles Vs.dat Vp.dat $(V2RhoT) Vs.dat V2RhoT_Vs.dat -type S -ERM PREM -scaleZ -1000 -scaleV 1000 -compp 0 -xfe 0.086 $(V2RhoT) Vp.dat V2RhoT_Vp.dat -type P -ERM PREM -scaleZ -1000 -scaleV 1000 -compp 0 -xfe 0.086 $(V2T) Vs.dat V2T_Vs.dat -ERM PREM -scaleZ -1000 + $(V2RhoT) V2T_Vs.dat T2Rho_V2T_Vs.dat -ERM PREM createfiles: awk '{if(NR>3){print($$1,$$2,$$3,$$4)}}' PREM.dat > Vp.dat diff --git a/Example/results.png b/Example/results.png index b1acad5a57793e5a96cee10a0eea2825173d8bb7..b570c23ca6723937ec878909e3660ce30acbad2e 100644 GIT binary patch literal 30535 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 literal 27659 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 DR$hxV diff --git a/README.md b/README.md index 43844e2..507d953 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # VeloDT [![DOI](https://zenodo.org/badge/121383426.svg)](https://zenodo.org/badge/latestdoi/121383426) -[![Build Status](https://travis-ci.org/cmeessen/VeloDT.svg?branch=restructure-repo)](https://travis-ci.org/cmeessen/VeloDT) +[![Build Status](https://travis-ci.org/cmeessen/VeloDT.svg?branch=master)](https://travis-ci.org/cmeessen/VeloDT) *VeloDT* contains two C++ implementations of *Vp*- and/or *Vs*-conversions to temperature and/or density valid in the upper mantle. @@ -23,9 +23,9 @@ or download the [latest release](https://github.com/cmeessen/VeloDT/releases/lat - [**V2RhoT**](./V2RhoT.md) closely follows [Goes et al. (2000)](https://doi.org/10.1029/1999JB900300) to convert vp or vs to temperature and density assuming a mineral assemblage - - [**V2T**](./V2T.md) implements the method by [Priestley and McKenzie (2006)](https://doi.org/10.1016/j.epsl.2006.01.008) and converts *Vs* to temperature +- [**T2Rho**](./T2Rho.md) applies the equations of [Goes et al. (2000)](https://doi.org/10.1029/1999JB900300) to compute densities from a given mineral composition, temperature and pressure Please refer to the original publications for validity and pitfalls of the methods. diff --git a/T2Rho.md b/T2Rho.md new file mode 100644 index 0000000..760b731 --- /dev/null +++ b/T2Rho.md @@ -0,0 +1,58 @@ +# T2Rho + +This tool helps to directly compute densities from the output of [`V2T`](./V2T.md), using the equations given in [Goes et al. (2000)](https://doi.org/10.1029/1999JB900300). + +## Compilation + +Before compilation make sure to have Qt and qmake installed. Then go to this folder and run + +``` +qmake +make +``` + +This generates the `T2Rho` executable. + +## Using T2Rho + +Executing `T2Rho -h` displays the available console commands together with two examples. + +``` +usage: T2Rho File_In File_Out [options] + +T2Rho is designed to directly process output files from V2T in +order to obtain densities from temperatures assuming a specific +mantle composition. + + Required input parameters: + -------------------------- + File_In Path and name of grid file containing x y z Vs + File_Out Output file name and path + + Option Value Default Description + ------ ----- ------- ----------- + -h This information + -ERM string AK135 P calculation method AK135 or PREM + -compc vals Custom rock composition + -compc Ol Opx Cpx Sp Gnt + -compp val 0 Use predefined rock compositions: + 0 - Garnet Lherzolite after (Jordan, + 1979; Goes et al, 2000) + 1 - On-cratonic (Shapiro and Ritzwoller, 2004) + 2 - Off-cratonic (Shapiro and Ritzwoller, 2004) + 3 - Oceanic (Shapiro and Ritzwoller, 2004) + -xfe val 0.1 Define iron content of the rock in mole fraction +``` + +### Mandatory arguments + +`T2Rho` requires the input file `File_In`, containing x y z and vs, and the name of the output file `File_Out`. Input units for z is masl, for vs km/s. + +### Pressure calculation + +Standard calculation of **pressure** uses the earth reference model AK135. +- options are `AK135`, `PREM` or `simple` +- `-ERM PREM` activates pressure calculation with PREM +- `-ERM simple` uses the average density defined with `-ra` +- an experimental feature is the pressure calculation using topography and crustal thickness. This is activated by using `-t_crust FILENAME` and `-z_topo FILENAME`, which both require EarthVision formatted grids containing crustal thickness and topographic elevation. The pressure is then calculated assuming constant density for the crust (`-rc 2890`) and mantle (`-rm 3300`) +- `-ra` defines an average density which is then used to calculate the pressure diff --git a/VeloDT.pro b/VeloDT.pro index dc724bd..d63a62d 100644 --- a/VeloDT.pro +++ b/VeloDT.pro @@ -1,6 +1,6 @@ TEMPLATE = subdirs CONFIG -= app_bundle CONFIG += ordered -SUBDIRS += src/common src/V2RhoT src/V2T +SUBDIRS += src/common src/V2RhoT src/V2T src/T2Rho V2RhoT.depends = common V2T.depends = common diff --git a/include/T2Rho/T2Rho.h b/include/T2Rho/T2Rho.h new file mode 100644 index 0000000..18c657e --- /dev/null +++ b/include/T2Rho/T2Rho.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* Copyright (C) 2018 by Christian Meeßen * +* * +* This file is part of VeloDT. * +* * +* VeloDT is free software: you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation version 3 of the License. * +* * +* VeloDT is distributed in the hope that it will be useful, but * +* WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +* General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with VeloDT. If not, see . * +*******************************************************************************/ +#ifndef T2RHO_H_ +#define T2RHO_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PhysicalConstants.h" +#include "PointClasses.h" +#include "ERMs.h" + +class T2Rho { + QString PMethod; + QString file_in; + QString file_out; + EarthReferenceModel * ERM; + // Mineral properties + QList m_rho; + QList m_drhodX; + QList m_K; + QList m_dKdT; + QList m_dKdP; + QList m_dKdPdX; + QList m_dKdX; + QList m_alpha0; + QList data_out; + // Rock properties + double r_XFe; + QList r_comp; + // Functions + bool SetPMethod(QString method); + void argsError(QString val, bool ok); + void setComp(QList composition); + void setComp(int c); + + public: + T2Rho(); + void usage(); + void info(); + void readArgs(int &argc, char *argv[]); + void readFile(); + void writeFile(); +}; + +#endif // T2RHO_H_ diff --git a/include/common/PointClasses.h b/include/common/PointClasses.h index bed7e58..de20f7f 100644 --- a/include/common/PointClasses.h +++ b/include/common/PointClasses.h @@ -20,81 +20,85 @@ #define POINTCLASSES_H_ class Point2D { +private: QList Vals; - public: +public: Point2D(); Point2D(double x, double y); // Assigning properties - void setX(double x) {Vals[0] = x;} - void setY(double y) {Vals[1] = y;} + void setX(double x){Vals[0]=x;} + void setY(double y){Vals[1]=y;} // Retrieving properties - double x() {return Vals[0];} - double y() {return Vals[1];} + double x(){return Vals[0];} + double y(){return Vals[1];} // Operators double &operator[](int idx); }; class Point3D { - QList Vals; - public: - Point3D(); - Point3D(double x, double y, double z); - // Assigning properties - void setX(double x) {Vals[0] = x;} - void setY(double y) {Vals[1] = y;} - void setZ(double z) {Vals[2] = z;} - // Retrieving properties - double x() {return Vals[0];} - double y() {return Vals[1];} - double z() {return Vals[2];} - // Operators - double &operator[](int idx); - Point3D &operator=(Point3D p); + private: + QList Vals; + public: + Point3D(); + Point3D(double x, double y, double z); + // Assigning properties + void setX(double x){Vals[0]=x;} + void setY(double y){Vals[1]=y;} + void setZ(double z){Vals[2]=z;} + // Retrieving properties + double x(){return Vals[0];} + double y(){return Vals[1];} + double z(){return Vals[2];} + // Operators + double &operator[](int idx); + Point3D &operator=(Point3D p); }; class Point4D { - QList Vals; - public: - Point4D(); - Point4D(double x, double y, double z, double v); - // Assigning properties - void setX(double x) {Vals[0] = x;} - void setY(double y) {Vals[1] = y;} - void setZ(double z) {Vals[2] = z;} - void setV(double v) {Vals[3] = v;} - // Retrieving properties - double x() {return Vals[0];} - double y() {return Vals[1];} - double z() {return Vals[2];} - double v() {return Vals[3];} - double *p(int i) {return &Vals[i];} - // Operators - double &operator[](int idx); - Point4D &operator=(Point4D p); + private: + QList Vals; + public: + Point4D(); + Point4D(double x, double y, double z, double v); + // Assigning properties + void setX(double x){Vals[0]=x;} + void setY(double y){Vals[1]=y;} + void setZ(double z){Vals[2]=z;} + void setV(double v){Vals[3]=v;} + // Retrieving properties + double x(){return Vals[0];} + double y(){return Vals[1];} + double z(){return Vals[2];} + double v(){return Vals[3];} + double *p(int i){return &Vals[i];} + // Operators + double &operator[](int idx); + Point4D &operator=(Point4D p); }; class Point5D { - QList Vals; - public: - Point5D(); - Point5D(double x, double y, double z, double v, double prop); - // Assigning properties - void setX(double x) {Vals[0] = x;} - void setY(double y) {Vals[1] = y;} - void setZ(double z) {Vals[2] = z;} - void setV(double v) {Vals[3] = v;} - void setProp(double prop) {Vals[4] = prop;} - // Retrieving properties - double x() {return Vals[0];} - double y() {return Vals[1];} - double z() {return Vals[2];} - double v() {return Vals[3];} - double prop() {return Vals[4];} + private: + QList Vals; + public: + Point5D(); + Point5D(double x, double y, double z, double v, double prop); + // Assigning properties + void setX(double x){Vals[0]=x;} + void setY(double y){Vals[1]=y;} + void setZ(double z){Vals[2]=z;} + void setV(double v){Vals[3]=v;} + void setProp(double prop){Vals[4]=prop;} + // Retrieving properties + double x(){return Vals[0];} + double y(){return Vals[1];} + double z(){return Vals[2];} + double v(){return Vals[3];} + double prop(){return Vals[4];} - double &operator[](int idx); - Point5D &operator=(Point5D p); - double *p(int i){return &Vals[i];} + double &operator[](int idx); + Point5D &operator=(Point5D p); + double *p(int i){return &Vals[i];} }; #endif // POINTCLASSES_H_ diff --git a/src/T2Rho/T2Rho.cpp b/src/T2Rho/T2Rho.cpp new file mode 100644 index 0000000..cfc0ac0 --- /dev/null +++ b/src/T2Rho/T2Rho.cpp @@ -0,0 +1,367 @@ +/******************************************************************************* +* Copyright (C) 2018 by Christian Meeßen * +* * +* This file is part of VeloDT. * +* * +* VeloDT is free software: you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation version 3 of the License. * +* * +* VeloDT is distributed in the hope that it will be useful, but * +* WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +* General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with VeloDT. If not, see . * +*******************************************************************************/ +#include "T2Rho.h" + +using std::cout; +using std::endl; + +T2Rho::T2Rho() { + PMethod = "AK135"; + ERM = new EarthReferenceModel(PMethod); + + // Mineral properties Tab. A1 in Goes et al (2000) + m_rho.append(3222); + m_rho.append(3198); + m_rho.append(3280); + m_rho.append(3578); + m_rho.append(3565); + + m_drhodX.append(1182); + m_drhodX.append(804); + m_drhodX.append(377); + m_drhodX.append(702); + m_drhodX.append(758); + + m_K.append(1.29E+11); + m_K.append(1.11E+11); + m_K.append(1.05E+11); + m_K.append(1.98E+11); + m_K.append(1.73E+11); + + m_dKdT.append(-1.60E+07); + m_dKdT.append(-1.20E+07); + m_dKdT.append(-1.30E+07); + m_dKdT.append(-2.80E+07); + m_dKdT.append(-2.10E+07); + + m_dKdP.append(4.2); + m_dKdP.append(6); + m_dKdP.append(6.2); + m_dKdP.append(5.7); + m_dKdP.append(4.9); + + m_dKdPdX.append(0); + m_dKdPdX.append(0); + m_dKdPdX.append(-1.9); + m_dKdPdX.append(0); + m_dKdPdX.append(0); + + m_dKdX.append(0); + m_dKdX.append(-10E9); + m_dKdX.append(13E9); + m_dKdX.append(12E9); + m_dKdX.append(7E9); + + m_alpha0.append(2.01E-5); + m_alpha0.append(3.871E-5); + m_alpha0.append(3.206E-5); + m_alpha0.append(6.969E-5); + m_alpha0.append(9.91E-6); + + // Initiate rock properties + r_XFe = 0.1; + r_comp.append(0); + r_comp.append(0); + r_comp.append(0); + r_comp.append(0); + r_comp.append(0); + setComp(0); +} + +void T2Rho::usage() { + cout << endl + << "usage: T2Rho File_In File_Out [options]" << endl + << endl + << "T2Rho is designed to directly process output files from V2T in" << endl + << "order to obtain densities from temperatures assuming a specific" << endl + << "mantle composition." << endl + << endl + << " Required input parameters:" << endl + << " --------------------------" << endl + << " File_In Path and name of grid file containing x y z Vs" << endl + << " File_Out Output file name and path" << endl + << endl + << " Option Value Default Description" << endl + << " ------ ----- ------- -----------" << endl + << " -h This information" << endl + << " -ERM string AK135 P calculation method AK135 or PREM" << endl + << " -compc vals Custom rock composition" << endl + << " -compc Ol Opx Cpx Sp Gnt" << endl + << " -compp val 0 Use predefined rock compositions:" << endl + << " 0 - Garnet Lherzolite after (Jordan," << endl + << " 1979; Goes et al, 2000)" << endl + << " 1 - On-cratonic (Shapiro and Ritzwoller, 2004)" << endl + << " 2 - Off-cratonic (Shapiro and Ritzwoller, 2004)" << endl + << " 3 - Oceanic (Shapiro and Ritzwoller, 2004)" << endl + << " -xfe val 0.1 Define iron content of the rock in mole fraction" << endl + << endl; + exit(0); +} + +bool T2Rho::SetPMethod(QString method) { + if (ERM->set(method)) { + PMethod = method; + return true; + } else { + return false; + } +} + +void T2Rho::setComp(QList composition) { + // Check length + if (!(composition.length() == 5)) { + cout << PRINT_ERROR "Number of mineral phases must be equal to 5." << endl; + } + // Check sum + double compsum = 0; + for (int i=0; i < 5; i++) { + compsum += composition[i]; + } + if (!(compsum == 1)) { + cout << PRINT_ERROR "Sum of the phases is unequal to 1." << endl; + exit(1); + } else { + for (int i=0; i < 5; i++) { + r_comp[i] = composition[i]; + } + } +} + +void T2Rho::setComp(int c) { + switch (c) { + case 0: + // Default composition after Goes et al (2000) + r_comp[0] = 0.67; + r_comp[1] = 0.225; + r_comp[2] = 0.045; + r_comp[3] = 0; + r_comp[4] = 0.06; + break; + case 1: + // On-cratonic Shapiro and Ritzwoller (2004) + r_comp[0] = 0.83; + r_comp[1] = 0.15; + r_comp[2] = 0; + r_comp[3] = 0; + r_comp[4] = 0.02; + break; + case 2: + // Off-cratonic Shapiro and Ritzwoller (2004) + r_comp[0] = 0.68; + r_comp[1] = 0.18; + r_comp[2] = 0.11; + r_comp[3] = 0; + r_comp[4] = 0.03; + break; + case 3: + // Oceanic Shapiro and Ritzwoller (2004) + r_comp[0] = 0.75; + r_comp[1] = 0.21; + r_comp[2] = 0.035; + r_comp[3] = 0.005; + r_comp[4] = 0.0; + break; + default: + cout << PRINT_ERROR "Unknown composition " << c << "\n. Exit.\n"; + exit(1); + } +} + +void T2Rho::argsError(QString val, bool ok) { + if (!ok) { + cout << PRINT_ERROR "Invalid value in " << val.toUtf8().data() << endl; + exit(1); + } +} + +void T2Rho::readArgs(int &argc, char *argv[]) { + int i; + bool ok; + QStringList arg; + + for (i=0; i < argc; i++) + arg << argv[i]; + + if ( (argc > 1) && (arg[1] == "-h" || arg[1] == "-help") ) { + usage(); + } else if (argc < 3) { + cout << endl << endl << PRINT_ERROR "Not enough arguments!\n\n"; + usage(); + } else { + file_in = arg[1].toUtf8().data(); + file_out = arg[2].toUtf8().data(); + + for (i=3; i < argc; i++) { + if (arg[i] == "-ERM") { + ok = SetPMethod(arg[i+1]); + argsError(arg[i], ok); + i++; + } else if (arg[i] == "-h") { + usage(); + } else if (arg[i] == "-xfe") { + r_XFe = arg[i+1].toDouble(&ok); + argsError(arg[i], ok); + } else if (arg[i] == "-compc") { + QList compc; + for (int j=1; j < 6; j++) { + compc.append(arg[i+j].toDouble(&ok)); + argsError(arg[i+j], ok); + } + setComp(compc); + } else if (arg[i] == "-compp") { + int compp = arg[i+1].toInt(&ok); + argsError(arg[i], ok); + setComp(compp); + } + } + } +} + +void T2Rho::info() { + cout << "***********************************************************" << endl + << endl + << " Temperature to Density Conversion" << endl + << endl + << "***********************************************************" << endl + << endl + << "Settings" << endl + << "--------" << endl + << "Rock composition (ol,opx,cpx,gnt,sp):" << endl; + for (int i=0; i < 5; i++) + cout << r_comp[i] << " "; + cout << endl + << "Iron content XFe: " << r_XFe << endl + << "Earth reference model: " << ERM->type().toUtf8().data() << endl + << endl; +} + +void T2Rho::readFile() { + /** + * Basically everything happens in this function. This function reads the + * input file and directly computes the density. The result is written into + * the list data_out. + **/ + double x, y, z, T, P; + bool okx, oky, okz, okT; + double T0 = 293.5; // Reference temperature + double P0 = 0; // Reference pressure + QRegExp separator("(\\s)"); + + cout << "Reading file: " << file_in.toUtf8().data() << endl; + QFile file(file_in); + + if (file.open(QIODevice::ReadOnly)) { + QTextStream stream(&file); + + while (!stream.atEnd()) { + QString t = stream.readLine().simplified(); + + if (!t.startsWith("#")) { + QStringList vals = t.split(separator); + if (vals.count() != 4) { + file.close(); + cout << PRINT_ERROR "In header of " << file_in.toUtf8().data() + << ". Counting " << vals.count() << " entries instead of 4." + << endl; + exit(1); + } else { + x = vals[0].toDouble(&okx); + y = vals[1].toDouble(&oky); + z = vals[2].toDouble(&okz); + T = vals[3].toDouble(&okT); + // Directly compute density + P = ERM->pressure(z+1); + // Compute phase properties and density + double rho_avrg = 0; + for (int i=0; i < 5; i++) { + double dT = T - T0; + double dP = P - P0; + double m_K_PX = m_dKdP[i] + r_XFe*m_dKdPdX[i]; + double K_T = m_K[i] + dT*m_dKdT[i] + dP*m_K_PX; + double rho_PTX = m_rho[i]*(1 - m_alpha0[i]*dT + dP/K_T) + + m_drhodX[i]*r_XFe; + rho_avrg += r_comp[i]*rho_PTX; + } + // Add result to output data list + data_out.append(Point5D(x, y, z, T, rho_avrg)); + } + } + } + } +} + +void T2Rho::writeFile() { + QString header; + // Get timestamp + QDateTime CurrentTime = QDateTime::currentDateTime(); + QString timefmt = "yyyy-MM-dd hh:mm:ss"; + QString timestamp = CurrentTime.toString(timefmt); + // General information string + header = QString("# Created: %1\n").arg(timestamp); + header += QString("# Input: %1\n").arg(file_in); + header += QString("# Pressure calculation method: %1\n").arg(PMethod); + header += QString("# Mantle composition:\n"); + header += QString("# Ol - %1\n").arg(r_comp[0], 5, 'f', 2); + header += QString("# Opx - %1\n").arg(r_comp[1], 5, 'f', 2); + header += QString("# Cpx - %1\n").arg(r_comp[2], 5, 'f', 2); + header += QString("# Sp - %1\n").arg(r_comp[3], 5, 'f', 2); + header += QString("# Gnt - %1\n").arg(r_comp[4], 5, 'f', 2); + header += QString("# Iron content XFe: %1\n").arg(r_XFe, 3, 'f', 2); + header += QString("# Point data\n" + "# Columns:\n" + "# 1 - X\n" + "# 2 - Y\n" + "# 3 - Z / m\n" + "# 4 - T / degC\n" + "# 5 - Rho / kg/m3\n"); + + cout << "Writing output file " << file_out.toUtf8().data() << endl; + + QFile tmp(file_out); + if (!tmp.open(QIODevice::WriteOnly | QIODevice::Text)) { + cout << PRINT_ERROR "Could not open file " << file_out.toUtf8().data() + << endl; + exit(1); + } + + QTextStream out(&tmp); + out.setRealNumberPrecision(2); + out.setFieldAlignment(QTextStream::AlignRight); + out.setRealNumberNotation(QTextStream::FixedNotation); + out << header.toUtf8().data(); + for (int i=0; i < data_out.length(); i++) { + out << data_out[i][0] << "\t" + << data_out[i][1] << "\t" + << data_out[i][2] << "\t" + << data_out[i][3] << "\t" + << data_out[i][4] << "\n"; + } + tmp.close(); +} + +int main(int argc, char *argv[]) { + T2Rho converter; + if (argc > 0) { + converter.readArgs(argc, argv); + converter.info(); + converter.readFile(); + converter.writeFile(); + } else { + converter.usage(); + } +} \ No newline at end of file diff --git a/src/T2Rho/T2Rho.pro b/src/T2Rho/T2Rho.pro new file mode 100644 index 0000000..7b160d8 --- /dev/null +++ b/src/T2Rho/T2Rho.pro @@ -0,0 +1,29 @@ +################################################################################ +# Copyright (C) 2018 by Christian Meeßen # +# # +# This file is part of VeloDT. # +# # +# VeloDT is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation version 3 of the License. # +# # +# VeloDT is distributed in the hope that it will be useful, but # +# WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # +# General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with VeloDT. If not, see . # +################################################################################ +TEMPLATE = app +DESTDIR = ../../bin +TARGET = T2Rho +CONFIG -= app_bundle + +INCLUDEPATH += ../../include/common ../../include/T2Rho + +LIBS += -L../common -lcommon + +SOURCES += T2Rho.cpp + +HEADERS += ../../include/T2Rho/T2Rho.h