tmp update

This commit is contained in:
张壹 2022-05-30 17:52:17 +08:00
parent f3952ce5db
commit ec0510a1cd
6 changed files with 422370 additions and 73917 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"iosfwd": "cpp"
}
}

View File

@ -8,23 +8,22 @@
#include "algorithm" #include "algorithm"
#include "ctime" #include "ctime"
#include "gctl/gctl_stream.h" #include "gctl/core.h"
#include "gctl/gctl_heapsort.h" #include "gctl/geometry.h"
#include "gctl/gctl_geometry2d.h" #include "gctl/io.h"
#include "gctl/gctl_triangle_io.h"
using namespace std; using namespace std;
struct vertex; struct vertex;
struct ele; struct ele;
struct source : public gctl::point2d_c struct source : public gctl::point2dc
{ {
double rad; double rad;
double slow; double slow;
}; };
struct vertex : public gctl::vertex2d_c struct vertex : public gctl::vertex2dc
{ {
int tag = 0; //0 = far away, 1 = close, 2 = active int tag = 0; //0 = far away, 1 = close, 2 = active
double slow; // slow are constant within a element. a mean value must be set in local update double slow; // slow are constant within a element. a mean value must be set in local update
@ -152,14 +151,14 @@ int FMM_2D_TRIANGLE::ReadFiles(char* filename)
clog << "reading node file:\t" << full_name; clog << "reading node file:\t" << full_name;
getline(infile,temp_str); getline(infile,temp_str);
temp_ss = gctl::str2ss(temp_str); gctl::str2ss(temp_str, temp_ss);
temp_ss >> node_num_; temp_ss >> node_num_;
nodes_.resize(node_num_); nodes_.resize(node_num_);
for (int i = 0; i < node_num_; i++) for (int i = 0; i < node_num_; i++)
{ {
getline(infile,temp_str); getline(infile,temp_str);
temp_ss = gctl::str2ss(temp_str); gctl::str2ss(temp_str, temp_ss);
temp_ss >> nodes_[i].id >> nodes_[i].x >> nodes_[i].y; temp_ss >> nodes_[i].id >> nodes_[i].x >> nodes_[i].y;
} }
infile.close(); infile.close();
@ -182,14 +181,14 @@ int FMM_2D_TRIANGLE::ReadFiles(char* filename)
clog << "reading element file:\t" << full_name; clog << "reading element file:\t" << full_name;
getline(infile,temp_str); getline(infile,temp_str);
temp_ss = gctl::str2ss(temp_str); gctl::str2ss(temp_str, temp_ss);
temp_ss >> ele_num_; temp_ss >> ele_num_;
elements_.resize(ele_num_); elements_.resize(ele_num_);
for (int i = 0; i < ele_num_; i++) for (int i = 0; i < ele_num_; i++)
{ {
getline(infile,temp_str); getline(infile,temp_str);
temp_ss = gctl::str2ss(temp_str); gctl::str2ss(temp_str, temp_ss);
temp_ss >> elements_[i].id >> tmp_ids[0] >> tmp_ids[1] >> tmp_ids[2]; temp_ss >> elements_[i].id >> tmp_ids[0] >> tmp_ids[1] >> tmp_ids[2];
elements_[i].vec_ptr[0] = &nodes_[tmp_ids[0]]; elements_[i].vec_ptr[0] = &nodes_[tmp_ids[0]];
elements_[i].vec_ptr[1] = &nodes_[tmp_ids[1]]; elements_[i].vec_ptr[1] = &nodes_[tmp_ids[1]];
@ -201,7 +200,7 @@ int FMM_2D_TRIANGLE::ReadFiles(char* filename)
} }
// reorder the vertice sequence to anti-clockwise // reorder the vertice sequence to anti-clockwise
gctl::point2d_c v01, v02; gctl::point2dc v01, v02;
vertex *tmp_ptr; vertex *tmp_ptr;
for (int i = 0; i < ele_num_; i++) for (int i = 0; i < ele_num_; i++)
{ {
@ -226,7 +225,7 @@ int FMM_2D_TRIANGLE::ReadFiles(char* filename)
for (int j = 0; j < 3; j++) for (int j = 0; j < 3; j++)
{ {
// opposite edge length of vertex j // opposite edge length of vertex j
elements_[i].edge_l[j] = gctl::geometry2d::distance(elements_[i].vec_ptr[(j+1)%3], elements_[i].vec_ptr[(j+2)%3]); elements_[i].edge_l[j] = gctl::distance(*elements_[i].vec_ptr[(j+1)%3], *elements_[i].vec_ptr[(j+2)%3]);
} }
// calculate triangle's area // calculate triangle's area
@ -420,7 +419,7 @@ void FMM_2D_TRIANGLE::CalculateSolution()
//this calculation is only valid for testing when there is no abnormal slowness or obstacles. //this calculation is only valid for testing when there is no abnormal slowness or obstacles.
for (int i = 0; i < node_num_; i++) for (int i = 0; i < node_num_; i++)
{ {
nodes_[i].syn_time = gctl::geometry2d::distance(&nodes_[i], &init_source_) * init_source_.slow; nodes_[i].syn_time = gctl::distance(nodes_[i], init_source_) * init_source_.slow;
} }
//initialize source nodes and close nodes //initialize source nodes and close nodes
@ -428,10 +427,10 @@ void FMM_2D_TRIANGLE::CalculateSolution()
//and calculate node's time as direct arrival time //and calculate node's time as direct arrival time
for (int i = 0; i < node_num_; i++) for (int i = 0; i < node_num_; i++)
{ {
if (gctl::geometry2d::distance(&nodes_[i], &init_source_) <= init_source_.rad) if (gctl::distance(nodes_[i], init_source_) <= init_source_.rad)
{ {
nodes_[i].tag = 2; nodes_[i].tag = 2;
nodes_[i].time = gctl::geometry2d::distance(&nodes_[i], &init_source_) * init_source_.slow; nodes_[i].time = gctl::distance(nodes_[i], init_source_) * init_source_.slow;
} }
} }
@ -474,9 +473,8 @@ void FMM_2D_TRIANGLE::CalculateSolution()
while (!nodes_ptr_.empty()) while (!nodes_ptr_.empty())
{ {
// heap sort close nodes pointers to put a node at the first place if it has the smallest time // heap sort close nodes pointers to put a node at the first place if it has the smallest time
time_sorter.execute(&nodes_ptr_, [](vector<vertex*> *a, int l_id, int r_id)->bool{ std::sort(nodes_ptr_.begin(), nodes_ptr_.end(), [](vertex *a, vertex *b)->bool{
if (a->at(l_id)->time < a->at(r_id)->time) return true; if (a->time < b->time) return true; return false;
else return false;
}); });
//change the first node's tag to 2 and update it's neighbor's time if it is not active (tag != 2) //change the first node's tag to 2 and update it's neighbor's time if it is not active (tag != 2)
@ -554,11 +552,12 @@ int main(int argc, char* argv[])
double ab_slow, ab_xmin, ab_xmax, ab_ymin, ab_ymax; double ab_slow, ab_xmin, ab_xmax, ab_ymin, ab_ymax;
string all_ab_para, old_ab_para; string all_ab_para, old_ab_para;
string tmp_str; string tmp_str;
stringstream tmp_ss;
if (argc >= 5) if (argc >= 5)
{ {
old_ab_para = argv[4]; old_ab_para = argv[4];
gctl::replace_all(all_ab_para, old_ab_para, ",", " "); gctl::replace_all(all_ab_para, old_ab_para, ",", " ");
stringstream tmp_ss = gctl::str2ss(all_ab_para); gctl::str2ss(all_ab_para, tmp_ss);
while (tmp_ss >> tmp_str) while (tmp_ss >> tmp_str)
{ {
if (5 != sscanf(tmp_str.c_str(), "%lf/%lf/%lf/%lf/%lf", if (5 != sscanf(tmp_str.c_str(), "%lf/%lf/%lf/%lf/%lf",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff