diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index f67ce4c..fb39569 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -20,4 +20,4 @@ add_example(ex7 OFF) add_example(ex8 OFF) add_example(ex9 OFF) add_example(ex10 OFF) -add_example(cfg_ex OFF) \ No newline at end of file +add_example(cfg_ex ON) \ No newline at end of file diff --git a/example/cfg_ex.cpp b/example/cfg_ex.cpp index 1e5192d..1a9cadd 100644 --- a/example/cfg_ex.cpp +++ b/example/cfg_ex.cpp @@ -1,43 +1,143 @@ /******************************************************** - * ██████╗ ███████╗████████╗██╗ - * ██╔════╝ ██╔════╝╚══██╔══╝██║ - * ██║ ███╗███████╗ ██║ ██║ - * ██║ ██║╚════██║ ██║ ██║ - * ╚██████╔╝███████║ ██║ ███████╗ - * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ - * Generic Scientific Template Library + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn) * - * The GSTL is distributed under a dual licensing scheme. You can redistribute + * GCTL is distributed under a dual licensing scheme. You can redistribute * it and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. You should have - * received a copy of the GNU Lesser General Public License (LGPL) along with - * this program. If not, see . + * received a copy of the GNU Lesser General Public License along with this + * program. If not, see . * * If the terms and conditions of the LGPL v.2. would prevent you from using - * the GSTL, please consider the option to obtain a commercial license for a - * fee. These licenses are offered by the GSTL's original author. As a rule, + * the GCTL, please consider the option to obtain a commercial license for a + * fee. These licenses are offered by the GCTL's original author. As a rule, * licenses are provided "as-is", unlimited in time for a one time fee. Please * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget * to include some description of your company and the realm of its activities. * Also add information on how to contact you by electronic and paper mail. ******************************************************/ -#include "../lib/optimization/cmn_grad.h" +#include "../lib/optimization.h" using namespace gctl; +class cfg : public lgd_solver +{ +private: + std::vector gs1_, gs2_; + array g1_, g2_; + + common_gradient cmg_; + + array x_; + array xm_; + array xs_; + +public: + cfg(/* args */){} + ~cfg(){} + + virtual double LGD_Evaluate(const array &x, array &g); + void read_gaussians(std::string file, std::vector &gs); + void routine(int argc, char *argv[]); +}; + +double cfg::LGD_Evaluate(const array &x, array &g) +{ + double f, fx = 0.0; + g1_.assign(0.0); + g2_.assign(0.0); + + f = 0.0; + for (int i = 0; i < gs1_.size(); i++) + { + f += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs1_[i]); + g1_[0] += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs1_[i], gctl::Dx); + g1_[1] += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs1_[i], gctl::Dy); + } + + cmg_.fill_model_gradient(0, f, g1_); + fx += f; + + f = 0.0; + for (int i = 0; i < gs2_.size(); i++) + { + f += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs2_[i]); + g2_[0] += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs2_[i], gctl::Dx); + g2_[1] += -1e+3*gctl::gaussian_dist2d(x[0], x[1], gs2_[i], gctl::Dy); + } + + cmg_.fill_model_gradient(1, f, g2_); + fx += f; + fx += 0.666027; // 目标值 + + g = cmg_.get_common_gradient(); + return fx; +} + +void cfg::read_gaussians(std::string file, std::vector &gs) +{ + gaussian_para2d tmp_p; + std::string tmp_str; + std::stringstream tmp_ss; + + std::ifstream infile; + gctl::open_infile(infile, file, ".txt"); + + while(getline(infile, tmp_str)) + { + if (tmp_str[0] == '#') continue; + else + { + gctl::str2ss(tmp_str, tmp_ss); + tmp_ss >> tmp_p.mu_x >> tmp_p.mu_y >> tmp_p.sigma_x >> tmp_p.sigma_y >> tmp_p.rho; + gs.push_back(tmp_p); + } + } + infile.close(); + return; +} + +void cfg::routine(int argc, char *argv[]) +{ + cmg_.init(2, 2); + g1_.resize(2); + g2_.resize(2); + + read_gaussians("example/data/gauss_model", gs1_); + read_gaussians("example/data/gauss_model2", gs2_); + + x_.resize(2, 20.0); + xm_.resize(2, 0.0); + xs_.resize(2, 0.0); + array low(2, 0.0); + array high(2, 100.0); + + lgd_para para = default_lgd_para(); + para.alpha = 0.01; + para.flight_times = 1000; + set_lgd_para(para); + + set_lgd_record_trace(); + LGD_Minimize(x_, xm_, xs_, low, high); + + save_lgd_trace("trace.txt"); + std::cout << "x = (" << x_[0] << ", " << x_[1] << ")\n"; + return; +} + int main(int argc, char *argv[]) try { - common_gradient cmg; - cmg.init(2, 2); - cmg.fill_model_gradient(0, _1d_array({1.0, 0.5})); - cmg.fill_model_gradient(1, _1d_array({-0.6, 1.0})); - - _1d_array x = cmg.get_common_gradient(false); - std::cout << "x = (" << x[0] << ", " << x[1] << ")\n"; + cfg c; + c.routine(argc, argv); return 0; } catch (const std::exception& e) diff --git a/example/data/forward.sh b/example/data/forward.sh new file mode 100755 index 0000000..77daddf --- /dev/null +++ b/example/data/forward.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# 系统里有一个隐藏的错误设置 不然不需要在这里手动设置动态库的地址 +export DYLD_LIBRARY_PATH=/usr/local/lib:$DYLD_LIBRARY_PATH + +#g++ gaussian2d.cpp -o gaussian2d -lgctl -lnetcdfcxx_legacy -std=c++17 -I/opt/homebrew/include +./gaussian2d gauss_model.txt \ No newline at end of file diff --git a/example/data/gauss_dist.nc b/example/data/gauss_dist.nc new file mode 100644 index 0000000..ceeadc7 Binary files /dev/null and b/example/data/gauss_dist.nc differ diff --git a/example/data/gauss_dist2.nc b/example/data/gauss_dist2.nc new file mode 100644 index 0000000..6479a0a Binary files /dev/null and b/example/data/gauss_dist2.nc differ diff --git a/example/data/gauss_model.txt b/example/data/gauss_model.txt new file mode 100644 index 0000000..b288265 --- /dev/null +++ b/example/data/gauss_model.txt @@ -0,0 +1,2 @@ +32.0 66.0 24.0 22.0 -0.1 +32.0 10.0 26.0 24.0 0.6 \ No newline at end of file diff --git a/example/data/gauss_model2.txt b/example/data/gauss_model2.txt new file mode 100644 index 0000000..180c1de --- /dev/null +++ b/example/data/gauss_model2.txt @@ -0,0 +1,2 @@ +75.0 25.0 22.0 28.0 0.5 +32.0 66.0 24.0 22.0 -0.1 \ No newline at end of file diff --git a/example/data/gaussian2d.cpp b/example/data/gaussian2d.cpp new file mode 100644 index 0000000..e3a3e6a --- /dev/null +++ b/example/data/gaussian2d.cpp @@ -0,0 +1,70 @@ +/** + * @defgroup MAIN main + * + * @brief 测试非线形最优化中的局部极小值问题 + * + * @author Zhangyi + * @date 2020 + */ + +#include "gctl/core.h" +#include "gctl/io.h" + +// 声明我们所使用的二维高斯分布的参数 +static std::vector p; + +int main(int argc, char *argv[]) +{ + std::ifstream infile; + gctl::open_infile(infile, argv[1], ""); + + gctl::gaussian_para2d tmp_p; + std::string tmp_str; + std::stringstream tmp_ss; + while(getline(infile, tmp_str)) + { + if (tmp_str[0] == '#') continue; + else + { + gctl::str2ss(tmp_str, tmp_ss); + tmp_ss >> tmp_p.mu_x >> tmp_p.mu_y >> tmp_p.sigma_x + >> tmp_p.sigma_y >> tmp_p.rho; + p.push_back(tmp_p); + } + } + + infile.close(); + + // 我们先来确认高斯分布的参数 生成解空间 + int m = 101, n = 101; + gctl::array gauss_dist(m*n, 0.0); + for (int t = 0; t < p.size(); t++) + { + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { + gauss_dist[j + i*m] += -1e+3*gctl::gaussian_dist2d(1.0*j, 1.0*i, p[t]); + } + } + } + + // 输出最小值及对应的解 + double f_min = 1e+30, x_min, y_min; + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { + if (gauss_dist[j + i*m] < f_min) + { + f_min = gauss_dist[j + i*m]; + x_min = j; y_min = i; + } + } + } + std::cout << "f_min(" << x_min << ", " << y_min << ") = " << std::setprecision(10) << f_min << std::endl; + + // 保存计算结果 + gctl::save_netcdf_grid("gauss_dist", gauss_dist, m, n, 0, 1, 0, 1); + return 0; +} \ No newline at end of file diff --git a/example/data/lgd_anim.mp4 b/example/data/lgd_anim.mp4 new file mode 100644 index 0000000..0ae58bf Binary files /dev/null and b/example/data/lgd_anim.mp4 differ diff --git a/example/data/lgd_anim2.mp4 b/example/data/lgd_anim2.mp4 new file mode 100644 index 0000000..c2d084e Binary files /dev/null and b/example/data/lgd_anim2.mp4 differ diff --git a/example/data/plot_movie.sh b/example/data/plot_movie.sh new file mode 100755 index 0000000..4db2db8 --- /dev/null +++ b/example/data/plot_movie.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# 1. Create files needed in the loop +cat << 'EOF' > pre.sh +gmt begin pre + gmt set FONT_ANNOT_PRIMARY=15p,Times-Roman,black + gmt set FONT_LABEL=15p,Times-Roman,black + gmt set MAP_GRID_CROSS_SIZE_PRIMARY=5p + gmt set MAP_FRAME_PEN=thinnest,black + gmt set MAP_TICK_LENGTH_PRIMARY=4p/2p + gmt grd2cpt gauss_dist.nc -Clapaz -R0/100/0/100 -Z -D + gmt grdimage gauss_dist.nc -R0/100/0/100 -Bxag+l"x (m)" -Byag+l"y (m)" -JX15c/15c -X4.5c -Y1.5c +gmt end +EOF + +# 2. Set up the main frame script +cat << 'EOF' > main.sh +gmt begin + # Plot smooth blue curve and dark red dots at all steps so far + gmt convert trace.txt -qi0:${MOVIE_FRAME} > data.txt + gmt plot data.txt -W0.05p,white -R0/100/0/100 -JX15c/15c -X4.5c -Y1.5c + gmt plot data.txt -Sc0.05i -Gred +gmt end +EOF + +# 3. Run the movie +gmt movie main.sh -Sbpre.sh -Cxga -Ttrace.txt -Vi -D24 -Zs -Nlgd_anim -Fmp4 \ No newline at end of file diff --git a/example/ex1.cpp b/example/ex1.cpp index 1a5dda3..b9676b8 100644 --- a/example/ex1.cpp +++ b/example/ex1.cpp @@ -1,24 +1,24 @@ /******************************************************** - * ██████╗ ███████╗████████╗██╗ - * ██╔════╝ ██╔════╝╚══██╔══╝██║ - * ██║ ███╗███████╗ ██║ ██║ - * ██║ ██║╚════██║ ██║ ██║ - * ╚██████╔╝███████║ ██║ ███████╗ - * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ - * Generic Scientific Template Library + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn) * - * The GSTL is distributed under a dual licensing scheme. You can redistribute + * GCTL is distributed under a dual licensing scheme. You can redistribute * it and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. You should have - * received a copy of the GNU Lesser General Public License (LGPL) along with - * this program. If not, see . + * received a copy of the GNU Lesser General Public License along with this + * program. If not, see . * * If the terms and conditions of the LGPL v.2. would prevent you from using - * the GSTL, please consider the option to obtain a commercial license for a - * fee. These licenses are offered by the GSTL's original author. As a rule, + * the GCTL, please consider the option to obtain a commercial license for a + * fee. These licenses are offered by the GCTL's original author. As a rule, * licenses are provided "as-is", unlimited in time for a one time fee. Please * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget * to include some description of your company and the realm of its activities. diff --git a/example/ex2.cpp b/example/ex2.cpp index 3a90eed..ea2695f 100644 --- a/example/ex2.cpp +++ b/example/ex2.cpp @@ -1,24 +1,24 @@ /******************************************************** - * ██████╗ ███████╗████████╗██╗ - * ██╔════╝ ██╔════╝╚══██╔══╝██║ - * ██║ ███╗███████╗ ██║ ██║ - * ██║ ██║╚════██║ ██║ ██║ - * ╚██████╔╝███████║ ██║ ███████╗ - * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ - * Generic Scientific Template Library + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn) * - * The GSTL is distributed under a dual licensing scheme. You can redistribute + * GCTL is distributed under a dual licensing scheme. You can redistribute * it and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. You should have - * received a copy of the GNU Lesser General Public License (LGPL) along with - * this program. If not, see . + * received a copy of the GNU Lesser General Public License along with this + * program. If not, see . * * If the terms and conditions of the LGPL v.2. would prevent you from using - * the GSTL, please consider the option to obtain a commercial license for a - * fee. These licenses are offered by the GSTL's original author. As a rule, + * the GCTL, please consider the option to obtain a commercial license for a + * fee. These licenses are offered by the GCTL's original author. As a rule, * licenses are provided "as-is", unlimited in time for a one time fee. Please * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget * to include some description of your company and the realm of its activities. diff --git a/example/ex9.cpp b/example/ex9.cpp index 0bdeb5e..7565e8f 100644 --- a/example/ex9.cpp +++ b/example/ex9.cpp @@ -1,24 +1,24 @@ /******************************************************** - * ██████╗ ███████╗████████╗██╗ - * ██╔════╝ ██╔════╝╚══██╔══╝██║ - * ██║ ███╗███████╗ ██║ ██║ - * ██║ ██║╚════██║ ██║ ██║ - * ╚██████╔╝███████║ ██║ ███████╗ - * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ - * Generic Scientific Template Library + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn) * - * The GSTL is distributed under a dual licensing scheme. You can redistribute + * GCTL is distributed under a dual licensing scheme. You can redistribute * it and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. You should have - * received a copy of the GNU Lesser General Public License (LGPL) along with - * this program. If not, see . + * received a copy of the GNU Lesser General Public License along with this + * program. If not, see . * * If the terms and conditions of the LGPL v.2. would prevent you from using - * the GSTL, please consider the option to obtain a commercial license for a - * fee. These licenses are offered by the GSTL's original author. As a rule, + * the GCTL, please consider the option to obtain a commercial license for a + * fee. These licenses are offered by the GCTL's original author. As a rule, * licenses are provided "as-is", unlimited in time for a one time fee. Please * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget * to include some description of your company and the realm of its activities. diff --git a/lib/optimization/cmn_grad.cpp b/lib/optimization/cmn_grad.cpp index 7d5798e..e65a1e7 100644 --- a/lib/optimization/cmn_grad.cpp +++ b/lib/optimization/cmn_grad.cpp @@ -41,6 +41,7 @@ gctl::common_gradient::~common_gradient(){} void gctl::common_gradient::LCG_Ax(const array &x, array &ax) { + // Ax product of the linear system matvec(t_, G_, x, NoTrans); vecmul(t_, t_, w_); matvec(ax, G_, t_, Trans); @@ -64,24 +65,18 @@ void gctl::common_gradient::set_weights(const _1d_array &w) return; } -void gctl::common_gradient::set_exp_weight(double T) -{ - T_ = T; - return; -} - void gctl::common_gradient::init(size_t Ln, size_t Mn) { + zero_iter_ = true; Ln_ = Ln; Mn_ = Mn; - T_ = 1.0; g_.resize(Mn_); B_.resize(Mn_); G_.resize(Ln_, Mn_); t_.resize(Ln_); gm_.resize(Ln_); - lx_.resize(Ln_); - lt_.resize(Ln_, 1.0); + fx_.resize(Ln_); + fx0_.resize(Ln_); w_.resize(Ln_, 1.0); x_.resize(Ln_, 1.0); filled_.resize(Ln_, false); @@ -95,13 +90,16 @@ void gctl::common_gradient::fill_model_gradient(size_t id, double fx, const _1d_ G_.fill_row(id, g); gm_[id] = g.module(); - lx_[id] = fx; + fx_[id] = fx; + if (zero_iter_) fx0_[id] = fx; filled_[id] = true; return; } const gctl::_1d_array &gctl::common_gradient::get_common_gradient(bool normalized, bool fixed_w) { + zero_iter_ = false; // set to false after the first evaluation. + for (size_t i = 0; i < Ln_; i++) { if (!filled_[i]) throw std::runtime_error("[gctl::common_gradient] Unfilled model gradient."); @@ -114,13 +112,15 @@ const gctl::_1d_array &gctl::common_gradient::get_common_gradient(bool normalize double a; for (size_t i = 0; i < Ln_; i++) { - a = abs(lx_[i] - lt_[i]); - w_[i] = 1.0/pow(1.0/(1.0 + exp(-0.05*a) + 0.5), 6); + // the bigger gradient module is, the bigger weight is + // the faster convergence is, the smaller weight is + a = gm_[i]*fx_[i]/fx0_[i]; + w_[i] = 1.0/a; } } rcd_wgts_.push_back(w_); - rcd_fxs_.push_back(lx_); + rcd_fxs_.push_back(fx_); G_.normalize(RowMajor); matvec(B_, G_, x_, Trans); @@ -130,19 +130,6 @@ const gctl::_1d_array &gctl::common_gradient::get_common_gradient(bool normalize LCG_Minimize(g_, B_, LCG_CG); if (normalized) g_.normalize(); - else - { - g_.normalize(); - matvec(t_, G_, g_, NoTrans); - - double tmod = t_.module(L1); - double gmod = 0.0; - for (size_t i = 0; i < Ln_; i++) - { - gmod += gm_[i]*abs(t_[i])/tmod; - } - g_.scale(gmod); - } return g_; } @@ -151,7 +138,7 @@ void gctl::common_gradient::save_records(std::string file) std::ofstream fout; open_outfile(fout, file, ".csv"); - fout << "Num"; + fout << "num"; for (size_t j = 0; j < Ln_; j++) { fout << ",l" << j; @@ -161,11 +148,10 @@ void gctl::common_gradient::save_records(std::string file) { fout << ",w" << j; } - fout << std::endl; for (size_t i = 0; i < rcd_wgts_.size(); i++) { - fout << i; + fout << std::endl << i; for (size_t j = 0; j < Ln_; j++) { fout << "," << rcd_fxs_[i][j]; @@ -175,7 +161,6 @@ void gctl::common_gradient::save_records(std::string file) { fout << "," << rcd_wgts_[i][j]; } - fout << std::endl; } fout.close(); return; diff --git a/lib/optimization/cmn_grad.h b/lib/optimization/cmn_grad.h index 0395afe..059f146 100644 --- a/lib/optimization/cmn_grad.h +++ b/lib/optimization/cmn_grad.h @@ -57,15 +57,14 @@ namespace gctl void set_solver(const lcg_para ¶); /** - * @brief Set the weights for the loss functions + * @brief Set the weights for the loss functions. + * + * The number of weights equal to the number of the loss functions. + * The bigger weights is the calculated gradient is more dependent + * on the corresponding gradients. */ void set_weights(const _1d_array &w); - /** - * @brief Set the weight for the exponential weighting function - */ - void set_exp_weight(double T); - /** * @brief Initialize the common_gradient object * @@ -100,15 +99,15 @@ namespace gctl void save_records(std::string file); private: - double T_; - size_t Ln_, Mn_; // lc: loss count, Ln_: loss_func number,Mn_: model number - _2d_matrix G_; - _1d_array B_, g_, t_, x_; - _1d_array gm_, w_; - _1d_array lx_, lt_; - array filled_; - std::vector > rcd_wgts_; - std::vector > rcd_fxs_; + bool zero_iter_; + size_t Ln_, Mn_; // Ln_: loss_func number,Mn_: model number + _2d_matrix G_; // kernel martix + _1d_array B_, g_, t_, x_; // variables of the linear system + _1d_array gm_, w_; // gradient module and functions' weight + _1d_array fx_, fx0_; // functions' value, initial functions' value + array filled_; // new gradient filled for the current round of evaluation + std::vector > rcd_wgts_; // weights records + std::vector > rcd_fxs_; // fx records }; }; diff --git a/tool/levy_planner/levy_planner.cpp b/tool/levy_planner/levy_planner.cpp index 61920ec..94088d7 100644 --- a/tool/levy_planner/levy_planner.cpp +++ b/tool/levy_planner/levy_planner.cpp @@ -1,24 +1,24 @@ /******************************************************** - * ██████╗ ███████╗████████╗██╗ - * ██╔════╝ ██╔════╝╚══██╔══╝██║ - * ██║ ███╗███████╗ ██║ ██║ - * ██║ ██║╚════██║ ██║ ██║ - * ╚██████╔╝███████║ ██║ ███████╗ - * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝ - * Generic Scientific Template Library + * ██████╗ ██████╗████████╗██╗ + * ██╔════╝ ██╔════╝╚══██╔══╝██║ + * ██║ ███╗██║ ██║ ██║ + * ██║ ██║██║ ██║ ██║ + * ╚██████╔╝╚██████╗ ██║ ███████╗ + * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ + * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn) * - * The GSTL is distributed under a dual licensing scheme. You can redistribute + * GCTL is distributed under a dual licensing scheme. You can redistribute * it and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. You should have - * received a copy of the GNU Lesser General Public License (LGPL) along with - * this program. If not, see . + * received a copy of the GNU Lesser General Public License along with this + * program. If not, see . * * If the terms and conditions of the LGPL v.2. would prevent you from using - * the GSTL, please consider the option to obtain a commercial license for a - * fee. These licenses are offered by the GSTL's original author. As a rule, + * the GCTL, please consider the option to obtain a commercial license for a + * fee. These licenses are offered by the GCTL's original author. As a rule, * licenses are provided "as-is", unlimited in time for a one time fee. Please * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget * to include some description of your company and the realm of its activities.