add exprtk library
This commit is contained in:
parent
47ff15a9e2
commit
a3b16ecdf5
@ -10,6 +10,7 @@ option(GCTL_NETCDF "Use the NetCDF library" ON)
|
|||||||
option(GCTL_FFTW3 "Use the FFTW3 library" ON)
|
option(GCTL_FFTW3 "Use the FFTW3 library" ON)
|
||||||
option(GCTL_EEMD "Use the EEMD library" ON)
|
option(GCTL_EEMD "Use the EEMD library" ON)
|
||||||
option(GCTL_OPENBLAS "Use the Openblas library" OFF)
|
option(GCTL_OPENBLAS "Use the Openblas library" OFF)
|
||||||
|
option(GCTL_EXPRTK "Use the ExprTK library" ON)
|
||||||
option(GCTL_CHECK_BOUNDER "Check array's index" OFF)
|
option(GCTL_CHECK_BOUNDER "Check array's index" OFF)
|
||||||
option(GCTL_CHECK_SIZE "Check array's size" OFF)
|
option(GCTL_CHECK_SIZE "Check array's size" OFF)
|
||||||
# 传递安装地址给编译期宏变量
|
# 传递安装地址给编译期宏变量
|
||||||
@ -24,6 +25,7 @@ message(STATUS "[GCTL] Use the NetCDF library: " ${GCTL_NETCDF})
|
|||||||
message(STATUS "[GCTL] Use the FFTW3 library: " ${GCTL_FFTW3})
|
message(STATUS "[GCTL] Use the FFTW3 library: " ${GCTL_FFTW3})
|
||||||
message(STATUS "[GCTL] Use the EEMD library: " ${GCTL_EEMD})
|
message(STATUS "[GCTL] Use the EEMD library: " ${GCTL_EEMD})
|
||||||
message(STATUS "[GCTL] Use the Openblas library: " ${GCTL_OPENBLAS})
|
message(STATUS "[GCTL] Use the Openblas library: " ${GCTL_OPENBLAS})
|
||||||
|
message(STATUS "[GCTL] Use the ExprTK library: " ${GCTL_EXPRTK})
|
||||||
message(STATUS "[GCTL] Check Bounder: " ${GCTL_CHECK_BOUNDER})
|
message(STATUS "[GCTL] Check Bounder: " ${GCTL_CHECK_BOUNDER})
|
||||||
message(STATUS "[GCTL] Check Size: " ${GCTL_CHECK_SIZE})
|
message(STATUS "[GCTL] Check Size: " ${GCTL_CHECK_SIZE})
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ set(@PROJECT_NAME@_FFTW3 @GCTL_FFTW3@)
|
|||||||
set(@PROJECT_NAME@_EEMD @GCTL_EEMD@)
|
set(@PROJECT_NAME@_EEMD @GCTL_EEMD@)
|
||||||
set(@PROJECT_NAME@_OPENMP @GCTL_OPENMP@)
|
set(@PROJECT_NAME@_OPENMP @GCTL_OPENMP@)
|
||||||
set(@PROJECT_NAME@_OPENBLAS @GCTL_OPENBLAS@)
|
set(@PROJECT_NAME@_OPENBLAS @GCTL_OPENBLAS@)
|
||||||
|
set(@PROJECT_NAME@_EXPRTK @GCTL_EXPRTK@)
|
||||||
set(@PROJECT_NAME@_CHECK_BOUNDER @GCTL_CHECK_BOUNDER@)
|
set(@PROJECT_NAME@_CHECK_BOUNDER @GCTL_CHECK_BOUNDER@)
|
||||||
set(@PROJECT_NAME@_CHECK_SIZE @GCTL_CHECK_SIZE@)
|
set(@PROJECT_NAME@_CHECK_SIZE @GCTL_CHECK_SIZE@)
|
||||||
|
|
||||||
@ -23,6 +24,7 @@ message(STATUS "[GCTL] Use the FFTW3 library: " @GCTL_FFTW3@)
|
|||||||
message(STATUS "[GCTL] Use the EEMD library: " @GCTL_EEMD@)
|
message(STATUS "[GCTL] Use the EEMD library: " @GCTL_EEMD@)
|
||||||
message(STATUS "[GCTL] Use the OpenMP library: " @GCTL_OPENMP@)
|
message(STATUS "[GCTL] Use the OpenMP library: " @GCTL_OPENMP@)
|
||||||
message(STATUS "[GCTL] Use the Openblas library: " @GCTL_OPENBLAS@)
|
message(STATUS "[GCTL] Use the Openblas library: " @GCTL_OPENBLAS@)
|
||||||
|
message(STATUS "[GCTL] Use the ExprTK library: " @GCTL_EXPRTK@)
|
||||||
message(STATUS "[GCTL] Check Bounder: " @GCTL_CHECK_BOUNDER@)
|
message(STATUS "[GCTL] Check Bounder: " @GCTL_CHECK_BOUNDER@)
|
||||||
message(STATUS "[GCTL] Check Size: " @GCTL_CHECK_SIZE@)
|
message(STATUS "[GCTL] Check Size: " @GCTL_CHECK_SIZE@)
|
||||||
|
|
||||||
|
@ -4,5 +4,6 @@
|
|||||||
#cmakedefine GCTL_FFTW3
|
#cmakedefine GCTL_FFTW3
|
||||||
#cmakedefine GCTL_EEMD
|
#cmakedefine GCTL_EEMD
|
||||||
#cmakedefine GCTL_OPENBLAS
|
#cmakedefine GCTL_OPENBLAS
|
||||||
|
#cmakedefine GCTL_EXPRTK
|
||||||
#cmakedefine GCTL_CHECK_BOUNDER
|
#cmakedefine GCTL_CHECK_BOUNDER
|
||||||
#cmakedefine GCTL_CHECK_SIZE
|
#cmakedefine GCTL_CHECK_SIZE
|
@ -54,8 +54,8 @@ int main(int argc, char const *argv[]) try
|
|||||||
geodsv_io tc;
|
geodsv_io tc;
|
||||||
tc.load_text("tmp/topo", ".txt", ColumnHead);
|
tc.load_text("tmp/topo", ".txt", ColumnHead);
|
||||||
tc.set_column_names({"x (m)", "y (m)", "elev (m)"});
|
tc.set_column_names({"x (m)", "y (m)", "elev (m)"});
|
||||||
//tc.set_column_type(Float, "x (m)");
|
tc.set_column_type(Float, "x (m)");
|
||||||
//tc.set_column_type(Float, "y (m)");
|
tc.set_column_type(Float, "y (m)");
|
||||||
tc.set_column_type(Float, "elev (m)");
|
tc.set_column_type(Float, "elev (m)");
|
||||||
|
|
||||||
array<point3dc> topo;
|
array<point3dc> topo;
|
||||||
@ -76,8 +76,11 @@ int main(int argc, char const *argv[]) try
|
|||||||
tc.add_column(2, "elev_plus");
|
tc.add_column(2, "elev_plus");
|
||||||
tc.fill_column(elev, "elev_plus");
|
tc.fill_column(elev, "elev_plus");
|
||||||
|
|
||||||
|
tc.add_column(-1, "dist");
|
||||||
|
tc.cal_column("dist := sqrt(C1*C1 + C3*C3)", {"dist", "C1", "C3"});
|
||||||
|
|
||||||
tc.add_row(3);
|
tc.add_row(3);
|
||||||
tc.fill_row(array<double>{4.4, 3.3, 2.2, 1.1}, 3);
|
tc.fill_row(array<double>{5.5, 4.4, 3.3, 2.2, 1.1}, 3);
|
||||||
|
|
||||||
_1s_vector s = tc.get_tags();
|
_1s_vector s = tc.get_tags();
|
||||||
s.push_back("Elev = 1000");
|
s.push_back("Elev = 1000");
|
||||||
@ -89,7 +92,6 @@ int main(int argc, char const *argv[]) try
|
|||||||
std::clog << std::setprecision(12) << tc.cell<double>(2, 1) << "\n";
|
std::clog << std::setprecision(12) << tc.cell<double>(2, 1) << "\n";
|
||||||
|
|
||||||
tc.info();
|
tc.info();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
catch(std::exception &e)
|
catch(std::exception &e)
|
||||||
|
@ -4,5 +4,6 @@
|
|||||||
#define GCTL_FFTW3
|
#define GCTL_FFTW3
|
||||||
#define GCTL_EEMD
|
#define GCTL_EEMD
|
||||||
/* #undef GCTL_OPENBLAS */
|
/* #undef GCTL_OPENBLAS */
|
||||||
|
#define GCTL_EXPRTK
|
||||||
/* #undef GCTL_CHECK_BOUNDER */
|
/* #undef GCTL_CHECK_BOUNDER */
|
||||||
/* #undef GCTL_CHECK_SIZE */
|
/* #undef GCTL_CHECK_SIZE */
|
||||||
|
@ -433,22 +433,16 @@ int gctl::dsv_io::name_index(std::string name, bool iter_row)
|
|||||||
// 拾取行号或列号 格式为R<id>和C<id>
|
// 拾取行号或列号 格式为R<id>和C<id>
|
||||||
std::smatch ret;
|
std::smatch ret;
|
||||||
std::regex patr("R(\\d*)"), patc("C(\\d*)");
|
std::regex patr("R(\\d*)"), patc("C(\\d*)");
|
||||||
if (regex_search(name, ret, patr))
|
|
||||||
{
|
|
||||||
int r = atoi(std::string(ret[1]).c_str());
|
|
||||||
if (r >= 1 && r <= row_num_) return r;
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (regex_search(name, ret, patc))
|
|
||||||
{
|
|
||||||
int c = atoi(std::string(ret[1]).c_str());
|
|
||||||
if (c >= 1 && c <= col_num_) return c;
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iter_row)
|
if (iter_row)
|
||||||
{
|
{
|
||||||
|
if (regex_search(name, ret, patr))
|
||||||
|
{
|
||||||
|
int r = atoi(std::string(ret[1]).c_str());
|
||||||
|
if (r >= 1 && r <= row_num_) return r;
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 1; i <= row_num_; i++)
|
for (size_t i = 1; i <= row_num_; i++)
|
||||||
{
|
{
|
||||||
if (table_[i][0].str_ == name) return i;
|
if (table_[i][0].str_ == name) return i;
|
||||||
@ -458,6 +452,13 @@ int gctl::dsv_io::name_index(std::string name, bool iter_row)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (regex_search(name, ret, patc))
|
||||||
|
{
|
||||||
|
int c = atoi(std::string(ret[1]).c_str());
|
||||||
|
if (c >= 1 && c <= col_num_) return c;
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 1; i <= col_num_; i++)
|
for (size_t i = 1; i <= col_num_; i++)
|
||||||
{
|
{
|
||||||
if (table_[0][i].str_ == name) return i;
|
if (table_[0][i].str_ == name) return i;
|
||||||
@ -590,6 +591,54 @@ void gctl::dsv_io::add_row(std::string id_name, std::string name)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef GCTL_EXPRTK
|
||||||
|
|
||||||
|
void gctl::dsv_io::cal_column(std::string expr_str, const std::vector<std::string> &col_list, int p)
|
||||||
|
{
|
||||||
|
array<int> idx(col_list.size());
|
||||||
|
for (size_t i = 0; i < col_list.size(); i++)
|
||||||
|
{
|
||||||
|
idx[i] = name_index(col_list[i]);
|
||||||
|
|
||||||
|
if (table_[0][idx[i]].type_ != Int && table_[0][idx[i]].type_ != Float)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("[gctl::dsv_io] Invalid column type for numerical calculating.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exprtk::symbol_table<double> symbol_table;
|
||||||
|
array<double> var(col_list.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < var.size(); i++)
|
||||||
|
{
|
||||||
|
symbol_table.add_variable(col_list[i], var[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
exprtk::expression<double> expression;
|
||||||
|
expression.register_symbol_table(symbol_table);
|
||||||
|
|
||||||
|
exprtk::parser<double> parser;
|
||||||
|
if (!parser.compile(expr_str, expression))
|
||||||
|
{
|
||||||
|
throw std::runtime_error("[gctl::dsv_io] Fail to compile the math expression.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 1; i <= row_num_; i++)
|
||||||
|
{
|
||||||
|
// Remeber we put the output in the first element
|
||||||
|
for (size_t j = 1; j < var.size(); j++)
|
||||||
|
{
|
||||||
|
var[j] = table_[i][idx[j]].value<double>();
|
||||||
|
}
|
||||||
|
|
||||||
|
var[0] = expression.value();
|
||||||
|
table_[i][idx[0]].value(var[0], p);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GCTL_EXPRTK
|
||||||
|
|
||||||
gctl::geodsv_io::geodsv_io(){}
|
gctl::geodsv_io::geodsv_io(){}
|
||||||
|
|
||||||
gctl::geodsv_io::~geodsv_io(){}
|
gctl::geodsv_io::~geodsv_io(){}
|
||||||
|
@ -28,11 +28,16 @@
|
|||||||
#ifndef _GCTL_DSV_IO_H
|
#ifndef _GCTL_DSV_IO_H
|
||||||
#define _GCTL_DSV_IO_H
|
#define _GCTL_DSV_IO_H
|
||||||
|
|
||||||
|
#include "../gctl_config.h"
|
||||||
#include "../core.h"
|
#include "../core.h"
|
||||||
#include "../utility.h"
|
#include "../utility.h"
|
||||||
#include "../geometry.h"
|
#include "../geometry.h"
|
||||||
#include "regex.h"
|
#include "regex.h"
|
||||||
|
|
||||||
|
#ifdef GCTL_EXPRTK
|
||||||
|
#include "exprtk.hpp"
|
||||||
|
#endif // GCTL_EXPRTK
|
||||||
|
|
||||||
namespace gctl
|
namespace gctl
|
||||||
{
|
{
|
||||||
enum cell_type_e
|
enum cell_type_e
|
||||||
@ -51,7 +56,7 @@ namespace gctl
|
|||||||
table_cell()
|
table_cell()
|
||||||
{
|
{
|
||||||
str_ = "";
|
str_ = "";
|
||||||
type_ = String;
|
type_ = Float;
|
||||||
out_ok_ = true;
|
out_ok_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,6 +449,22 @@ namespace gctl
|
|||||||
*/
|
*/
|
||||||
void add_row(std::string id_name, std::string name = "");
|
void add_row(std::string id_name, std::string name = "");
|
||||||
|
|
||||||
|
#ifdef GCTL_EXPRTK
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 使用现有的表格数据计算新的列数据。使用时需要提供计算表达式,例如:C3 := C1 + C2
|
||||||
|
* 表示将C1与C2列数据的和保存到C3列,其中C<id>表示计算所使用数据的索引,你也可以使用具体的列名称。
|
||||||
|
*
|
||||||
|
* @note 只有单元格类型为float和Int类型的列数据才能用于计算。计算由exprtk库完成,支持的表达式见其说明文档。
|
||||||
|
*
|
||||||
|
* @param expr_str 计算表达式 如C3 := C1 + C2
|
||||||
|
* @param col_list 列索引列表 如C3 C1 C2 (注意保存计算结果的列要放在开头)
|
||||||
|
* @param p 浮点类数据保存时的有效数字位数
|
||||||
|
*/
|
||||||
|
void cal_column(std::string expr_str, const std::vector<std::string> &col_list, int p = 6);
|
||||||
|
|
||||||
|
#endif // GCTL_EXPRTK
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 填充表格
|
* @brief 填充表格
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user