17 const std::vector<double> ¶ms,
18 const std::vector<size_t> &num_params_needed) {
20 std::ostringstream oss;
22 oss <<
"Error: Number of parameters needed to create geometry = "
23 << geom_type <<
" are "
25 <<
". But the number of parameters provided are "
27 <<
" and the parameters are "
38 if (geom_type ==
"line")
40 else if (geom_type ==
"triangle")
42 else if (geom_type ==
"square")
44 else if (geom_type ==
"rectangle")
46 else if (geom_type ==
"hexagon")
48 else if (geom_type ==
"drum2d")
50 else if (geom_type ==
"cube")
52 else if (geom_type ==
"cuboid")
54 else if (geom_type ==
"circle")
56 else if (geom_type ==
"ellipse")
58 else if (geom_type ==
"sphere")
60 else if (geom_type ==
"cylinder")
62 else if (geom_type ==
"angled_rectangle")
64 else if (geom_type ==
"angled_cuboid")
66 else if (geom_type ==
"rectangle_minus_rectangle")
68 else if (geom_type ==
"cuboid_minus_cuboid")
71 std::cerr <<
"Error: Invalid geometry type: " << geom_type << std::endl;
83 std::string geom_type,
84 std::vector<std::string> vec_type) {
87 for (
const auto &s: vec_type) {
91 num_params += nps[nps.size() - 1];
93 std::cerr <<
"Error: Geometry type = " << s
94 <<
" has zero number of parameters required. \n";
98 return n == num_params;
108 std::string geom_type,
109 std::vector<std::string> vec_type) {
117 const std::vector<double> ¶ms,
118 const std::vector<std::string> &vec_type,
119 const std::vector<std::string> &vec_flag,
120 std::shared_ptr<util::geometry::GeomObject> &obj,
122 bool perform_check) {
126 std::vector<std::string> no_default_obj = {
"cylinder",
"complex",
127 "rectangle_minus_rectangle",
128 "cuboid_minus_cuboid"};
131 if (type !=
"complex")
137 std::ostringstream oss;
139 oss <<
"Error: Data maybe invalid. Can not create geometrical object: "
148 std::cerr << oss.str();
154 if (type ==
"circle") {
158 obj = std::make_shared<util::geometry::Circle>(
159 params[0],
util::Point(params[1], params[2], params[3]));
162 if (params.size() < 1) {
164 std::cerr <<
"Error: need at least " << 1
165 <<
" parameters for creating circle. "
166 "Number of params provided = "
174 obj = std::make_shared<util::geometry::Circle>(params[0],
178 else if (type ==
"ellipse") {
182 obj = std::make_shared<util::geometry::Ellipse>(params[0], params[1],
187 if (params.size() < 2) {
189 std::cerr <<
"Error: need at least " << 2
190 <<
" parameters for creating ellipse. "
191 "Number of params provided = "
199 obj = std::make_shared<util::geometry::Ellipse>(params[0], params[1],
203 else if (type ==
"rectangle") {
207 obj = std::make_shared<util::geometry::Rectangle>(
208 params[0], params[1],
212 if (params.size() != 6 or params.size() != 5) {
214 std::cerr <<
"Error: need either 5 or 6"
215 <<
" parameters for creating Rectangle. "
216 "Number of params provided = "
224 if (params.size() == 6)
225 obj = std::make_shared<util::geometry::Rectangle>(
228 else if (params.size() == 5)
229 obj = std::make_shared<util::geometry::Rectangle>(
230 params[0], params[1],
234 else if (type ==
"square") {
238 obj = std::make_shared<util::geometry::Square>(
243 if (params.size() != 6) {
245 std::cerr <<
"Error: need " << 6
246 <<
" parameters for creating Square. "
247 "Number of params provided = "
255 obj = std::make_shared<util::geometry::Square>(
260 else if (type ==
"triangle") {
264 obj = std::make_shared<util::geometry::Triangle>(
265 params[0],
util::Point(params[1], params[2], params[3]),
269 if (params.size() != 4) {
271 std::cerr <<
"Error: need at least " << 4
272 <<
" parameters for creating triangle. "
273 "Number of params provided = "
281 obj = std::make_shared<util::geometry::Triangle>(
282 params[0],
util::Point(params[1], params[2], params[3]));
285 else if (type ==
"hexagon") {
289 obj = std::make_shared<util::geometry::Hexagon>(
290 params[0],
util::Point(params[1], params[2], params[3]),
294 if (params.size() != 4) {
296 std::cerr <<
"Error: need at least " << 4
297 <<
" parameters for creating hexagon. "
298 "Number of params provided = "
306 obj = std::make_shared<util::geometry::Hexagon>(
307 params[0],
util::Point(params[1], params[2], params[3]));
310 else if (type ==
"drum2d") {
314 obj = std::make_shared<util::geometry::Drum2D>(
315 params[0], params[1],
320 if (params.size() < 5) {
322 std::cerr <<
"Error: need at least " << 5
323 <<
" parameters for creating drum2d. "
324 "Number of params provided = "
332 obj = std::make_shared<util::geometry::Drum2D>(
333 params[0], params[1],
337 else if (type ==
"sphere") {
341 obj = std::make_shared<util::geometry::Sphere>(
342 params[0],
util::Point(params[1], params[2], params[3]));
345 if (params.size() < 1) {
347 std::cerr <<
"Error: need at least " << 1
348 <<
" parameters for creating sphere. "
349 "Number of params provided = "
357 obj = std::make_shared<util::geometry::Sphere>(params[0],
361 else if (type ==
"cuboid") {
365 obj = std::make_shared<util::geometry::Cuboid>(
366 params[0], params[1], params[2],
369 std::cerr <<
"Error: need at least " << 6
370 <<
" parameters for creating cuboid. "
371 "Number of params provided = "
378 else if (type ==
"cube") {
382 obj = std::make_shared<util::geometry::Cube>(
387 if (params.size() < 6) {
389 std::cerr <<
"Error: need " << 6
390 <<
" parameters for creating Cube. "
391 "Number of params provided = "
399 obj = std::make_shared<util::geometry::Cube>(
404 else if (type ==
"cylinder") {
408 obj = std::make_shared<util::geometry::Cylinder>(
409 params[0],
util::Point(params[1], params[2], params[3]),
412 std::cerr <<
"Error: need at least " << 7
413 <<
" parameters for creating Cylinder. "
414 "Number of params provided = "
421 else if (type ==
"rectangle_minus_rectangle") {
435 obj = std::make_shared<util::geometry::AnnulusGeomObject>
438 std::cerr <<
"Error: need at least " << 12
439 <<
" parameters for creating rectangle_minus_rectangle. "
440 "Number of params provided = "
447 else if (type ==
"cuboid_minus_cuboid") {
462 obj = std::make_shared<util::geometry::AnnulusGeomObject>
465 std::cerr <<
"Error: need at least " << 12
466 <<
" parameters for creating cuboid_minus_cuboid. "
467 "Number of params provided = "
474 else if (type ==
"complex") {
478 std::vector<std::shared_ptr<util::geometry::GeomObject>> vec_obj(
481 size_t param_start = 0;
482 for (
size_t i = 0; i < vec_type.size(); i++) {
483 auto geom_type = vec_type[i];
484 auto geom_flag = vec_flag[i];
488 auto p1 = params.begin() + param_start;
489 auto p2 = params.begin() + param_start + num_params;
490 auto geom_param = std::vector<double>(p1, p2);
494 std::vector<std::string>(), vec_obj[i], dim);
496 param_start += num_params;
501 obj = std::make_shared<util::geometry::ComplexGeomObject>(vec_obj,
506 std::cerr <<
"Error: Not enough parameters for creating complex. "
507 "Number of params provided = "
517 const std::vector<double> ¶ms,
518 const std::vector<std::string> &vec_type,
519 const std::vector<std::string> &vec_flag,
520 std::shared_ptr<util::geometry::GeomObject> &obj,
522 bool perform_check) {
524 std::vector<size_t> num_params_needed;
526 if (geom_type ==
"line") {
528 num_params_needed = {1, 4, 6};
530 for (
auto n: num_params_needed) {
531 if (params.size() == n) {
533 obj = std::make_shared<util::geometry::Line>(params[0]);
536 obj = std::make_shared<util::geometry::Line>(params[0],
544 obj = std::make_shared<util::geometry::Line>(
553 else if (geom_type ==
"triangle") {
555 num_params_needed = {1, 4, 7};
557 for (
auto n: num_params_needed) {
558 if (params.size() == n) {
560 obj = std::make_shared<util::geometry::Triangle>(params[0]);
563 obj = std::make_shared<util::geometry::Triangle>(
569 obj = std::make_shared<util::geometry::Triangle>(
579 else if (geom_type ==
"square") {
581 num_params_needed = {1, 4, 6};
583 for (
auto n: num_params_needed) {
584 if (params.size() == n) {
586 obj = std::make_shared<util::geometry::Square>(params[0]);
589 obj = std::make_shared<util::geometry::Square>(params[0],
596 obj = std::make_shared<util::geometry::Square>(
604 else if (geom_type ==
"rectangle") {
606 num_params_needed = {2, 5, 6};
608 for (
auto n: num_params_needed) {
609 if (params.size() == n) {
611 obj = std::make_shared<util::geometry::Rectangle>(params[0],
615 obj = std::make_shared<util::geometry::Rectangle>(
616 params[0], params[1],
620 obj = std::make_shared<util::geometry::Rectangle>(
628 else if (geom_type ==
"hexagon") {
630 num_params_needed = {1, 4, 7};
632 for (
auto n: num_params_needed) {
633 if (params.size() == n) {
635 obj = std::make_shared<util::geometry::Hexagon>(params[0]);
638 obj = std::make_shared<util::geometry::Hexagon>(
639 params[0],
util::Point(params[2], params[3], params[4]));
642 obj = std::make_shared<util::geometry::Hexagon>(
651 else if (geom_type ==
"drum2d") {
653 num_params_needed = {2, 5, 8};
655 for (
auto n: num_params_needed) {
656 if (params.size() == n) {
658 obj = std::make_shared<util::geometry::Drum2D>(
659 params[0], params[1]);
662 obj = std::make_shared<util::geometry::Drum2D>(
663 params[0], params[1],
667 obj = std::make_shared<util::geometry::Drum2D>(
668 params[0], params[1],
676 else if (geom_type ==
"cube") {
678 num_params_needed = {1, 4, 6};
680 for (
auto n: num_params_needed) {
681 if (params.size() == n) {
683 obj = std::make_shared<util::geometry::Cube>(params[0]);
686 obj = std::make_shared<util::geometry::Cube>(
691 obj = std::make_shared<util::geometry::Cube>(
699 else if (geom_type ==
"cuboid") {
701 num_params_needed = {3, 6};
703 for (
auto n: num_params_needed) {
704 if (params.size() == n) {
706 obj = std::make_shared<util::geometry::Cuboid>(
707 params[0], params[1], params[2]);
710 obj = std::make_shared<util::geometry::Cuboid>(
718 else if (geom_type ==
"circle") {
720 num_params_needed = {1, 4};
722 for (
auto n: num_params_needed) {
723 if (params.size() == n) {
725 obj = std::make_shared<util::geometry::Circle>(params[0]);
728 obj = std::make_shared<util::geometry::Circle>(
736 else if (geom_type ==
"ellipse") {
738 num_params_needed = {2, 5, 6};
740 for (
auto n: num_params_needed) {
741 if (params.size() == n) {
743 obj = std::make_shared<util::geometry::Ellipse>(params[0], params[1]);
746 obj = std::make_shared<util::geometry::Ellipse>(params[0], params[1],
750 obj = std::make_shared<util::geometry::Ellipse>(params[0], params[1],
758 else if (geom_type ==
"sphere") {
760 num_params_needed = {1, 4};
762 for (
auto n: num_params_needed) {
763 if (params.size() == n) {
765 obj = std::make_shared<util::geometry::Sphere>(params[0]);
768 obj = std::make_shared<util::geometry::Sphere>(
776 else if (geom_type ==
"cylinder") {
778 num_params_needed = {7, 8};
780 for (
auto n: num_params_needed) {
781 if (params.size() == n) {
783 obj = std::make_shared<util::geometry::Cylinder>(
789 obj = std::make_shared<util::geometry::Cylinder>(
790 params[0], params[1],
798 else if (geom_type ==
"angled_rectangle") {
800 num_params_needed = {6};
802 for (
auto n: num_params_needed) {
803 if (params.size() == n) {
805 obj = std::make_shared<util::geometry::Rectangle>(
814 else if (geom_type ==
"angled_cuboid") {
816 num_params_needed = {6};
818 for (
auto n: num_params_needed) {
819 if (params.size() == n) {
821 obj = std::make_shared<util::geometry::Cuboid>(
830 else if (geom_type ==
"rectangle_minus_rectangle") {
832 num_params_needed = {12};
834 for (
auto n: num_params_needed) {
835 if (params.size() == n) {
845 obj = std::make_shared<util::geometry::AnnulusGeomObject>
853 else if (geom_type ==
"cuboid_minus_cuboid") {
855 num_params_needed = {12};
857 for (
auto n: num_params_needed) {
858 if (params.size() == n) {
868 obj = std::make_shared<util::geometry::AnnulusGeomObject>
876 else if (geom_type ==
"complex") {
884 num_params_needed = {0};
885 std::vector<size_t> params_level(vec_type.size());
886 for (
size_t i = 0; i < vec_type.size(); i++) {
891 params_level[i] = nps[nps.size() - 1];
893 std::cerr <<
"Error: Geometry type = " << vec_type[i]
894 <<
" has zero number of parameters required. \n";
901 num_params_needed[0] += params_level[i];
904 std::vector<std::shared_ptr<util::geometry::GeomObject>> objs(vec_type.size());
905 std::vector<std::string> obj_flags(vec_type.size());
907 if (params.size() == num_params_needed[0]) {
910 size_t param_start = 0;
911 for (
size_t i = 0; i < vec_type.size(); i++) {
913 auto geom_type_temp = vec_type[i];
914 auto geom_flag_temp = vec_flag[i];
916 std::vector<std::string> vec_type_temp;
917 std::vector<std::string> vec_flag_temp;
920 std::vector<double> params_temp;
921 for (
size_t j=0; j<params_level[i]; j++)
922 params_temp.push_back(params[j + param_start]);
925 obj_flags[i] = vec_flag[i];
927 geom_type_temp, params_temp, vec_type_temp, vec_flag_temp,
928 objs[i], dim, perform_check);
930 param_start += params_level[i];
934 obj = std::make_shared<util::geometry::ComplexGeomObject>(objs, obj_flags, dim);
940 std::cerr <<
"Error: Invalid geometry type: " << geom_type << std::endl;
945 std::cerr <<
printErrMsg(geom_type, params, num_params_needed);
951 bool perform_check) {
956 geomData.
d_geom_p, dim, perform_check);
964 if (d_geom_p->d_name ==
"null") {
966 std::make_shared<util::geometry::NullGeomObject>(
967 d_geom_p->d_description);
968 }
else if (d_geom_p->d_name.empty()) {
970 std::make_shared<util::geometry::GeomObject>(
971 d_geom_p->d_name, d_geom_p->d_description);
978 std::vector<double> ¶ms,
979 std::pair<std::vector<std::string>, std::vector<std::string>> &complexInfo,
980 std::shared_ptr<util::geometry::GeomObject> &geom,
983 params = d_geomParams;
984 complexInfo = d_geomComplexInfo;
986 if (d_geom_p->d_name ==
"null") {
988 std::make_shared<util::geometry::NullGeomObject>(
989 d_geom_p->d_description);
990 }
else if (d_geom_p->d_name.empty()) {
992 std::make_shared<util::geometry::GeomObject>(
993 d_geom_p->d_name, d_geom_p->d_description);
std::string printErrMsg(const std::string &geom_type, const std::vector< double > ¶ms, const std::vector< size_t > &num_params_needed)
std::string printErrMsg(const std::string &geom_type, const std::vector< double > ¶ms, const std::vector< size_t > &num_params_needed)
bool isNumberOfParamForComplexGeometryValid(size_t n, std::string geom_type, std::vector< std::string > vec_type)
Ascertain if number of parameters are correct for the given geometry.
bool isNumberOfParamForGeometryValid(size_t n, std::string geom_type)
Ascertain if number of parameters are correct for the given geometry.
std::vector< size_t > getNumParamsRequired(std::string geom_type)
Get num params required for creation of object.
bool checkParamForGeometry(size_t n, std::string geom_type)
Check parameter data for validity.
void createGeomObjectOld(const std::string &type, const std::vector< double > ¶ms, const std::vector< std::string > &vec_type, const std::vector< std::string > &vec_flag, std::shared_ptr< util::geometry::GeomObject > &obj, const size_t &dim, bool perform_check=true)
Create geometrical object from the given data.
bool checkParamForComplexGeometry(size_t n, std::string geom_type, std::vector< std::string > vec_type)
Check parameter data for validity.
void createGeomObject(const std::string &geom_type, const std::vector< double > ¶ms, const std::vector< std::string > &vec_type, const std::vector< std::string > &vec_flag, std::shared_ptr< util::geometry::GeomObject > &obj, const size_t &dim, bool perform_check=true)
std::string printStr(const T &msg, int nt=print_default_tab)
Returns formatted string for output.
bool isInList(const T &i, const std::vector< T > &list)
Find if data is in the list.
bool isTagInList(const std::string &tag, const std::vector< std::string > &tags)
Returns true if tag is found in the list of tags.
Collection of methods useful in simulation.
A structure to represent 3d vectors.
Input data for geometrical objects.
void copyGeometry(GeomData &z, size_t dim)
Copies the geometry details.
std::shared_ptr< util::geometry::GeomObject > d_geom_p
Zone geometry.
std::pair< std::vector< std::string >, std::vector< std::string > > d_geomComplexInfo
Zone geometry info if it is a complex type.
std::string d_geomName
Zone type.
std::vector< double > d_geomParams
Zone parameters.