add exprtk library

This commit is contained in:
张壹 2025-01-02 12:58:13 +08:00
parent 47ff15a9e2
commit a3b16ecdf5
7 changed files with 96 additions and 18 deletions

View File

@ -10,6 +10,7 @@ option(GCTL_NETCDF "Use the NetCDF library" ON)
option(GCTL_FFTW3 "Use the FFTW3 library" ON)
option(GCTL_EEMD "Use the EEMD library" ON)
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_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 EEMD library: " ${GCTL_EEMD})
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 Size: " ${GCTL_CHECK_SIZE})

View File

@ -15,6 +15,7 @@ set(@PROJECT_NAME@_FFTW3 @GCTL_FFTW3@)
set(@PROJECT_NAME@_EEMD @GCTL_EEMD@)
set(@PROJECT_NAME@_OPENMP @GCTL_OPENMP@)
set(@PROJECT_NAME@_OPENBLAS @GCTL_OPENBLAS@)
set(@PROJECT_NAME@_EXPRTK @GCTL_EXPRTK@)
set(@PROJECT_NAME@_CHECK_BOUNDER @GCTL_CHECK_BOUNDER@)
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 OpenMP library: " @GCTL_OPENMP@)
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 Size: " @GCTL_CHECK_SIZE@)

View File

@ -4,5 +4,6 @@
#cmakedefine GCTL_FFTW3
#cmakedefine GCTL_EEMD
#cmakedefine GCTL_OPENBLAS
#cmakedefine GCTL_EXPRTK
#cmakedefine GCTL_CHECK_BOUNDER
#cmakedefine GCTL_CHECK_SIZE

View File

@ -54,8 +54,8 @@ int main(int argc, char const *argv[]) try
geodsv_io tc;
tc.load_text("tmp/topo", ".txt", ColumnHead);
tc.set_column_names({"x (m)", "y (m)", "elev (m)"});
//tc.set_column_type(Float, "x (m)");
//tc.set_column_type(Float, "y (m)");
tc.set_column_type(Float, "x (m)");
tc.set_column_type(Float, "y (m)");
tc.set_column_type(Float, "elev (m)");
array<point3dc> topo;
@ -76,8 +76,11 @@ int main(int argc, char const *argv[]) try
tc.add_column(2, "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.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();
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";
tc.info();
return 0;
}
catch(std::exception &e)

View File

@ -4,5 +4,6 @@
#define GCTL_FFTW3
#define GCTL_EEMD
/* #undef GCTL_OPENBLAS */
#define GCTL_EXPRTK
/* #undef GCTL_CHECK_BOUNDER */
/* #undef GCTL_CHECK_SIZE */

View File

@ -433,22 +433,16 @@ int gctl::dsv_io::name_index(std::string name, bool iter_row)
// 拾取行号或列号 格式为R<id>和C<id>
std::smatch ret;
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 (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++)
{
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
{
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++)
{
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;
}
#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(){}

View File

@ -28,11 +28,16 @@
#ifndef _GCTL_DSV_IO_H
#define _GCTL_DSV_IO_H
#include "../gctl_config.h"
#include "../core.h"
#include "../utility.h"
#include "../geometry.h"
#include "regex.h"
#ifdef GCTL_EXPRTK
#include "exprtk.hpp"
#endif // GCTL_EXPRTK
namespace gctl
{
enum cell_type_e
@ -51,7 +56,7 @@ namespace gctl
table_cell()
{
str_ = "";
type_ = String;
type_ = Float;
out_ok_ = true;
}
@ -444,6 +449,22 @@ namespace gctl
*/
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
*