OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
EndFieldModel.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017, Chris Rogers
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  * 1. Redistributions of source code must retain the above copyright notice,
7  * this list of conditions and the following disclaimer.
8  * 2. Redistributions in binary form must reproduce the above copyright notice,
9  * this list of conditions and the following disclaimer in the documentation
10  * and/or other materials provided with the distribution.
11  * 3. Neither the name of STFC nor the names of its contributors may be used to
12  * endorse or promote products derived from this software without specific
13  * prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include <algorithm>
29 #include <sstream>
30 
33 
34 namespace endfieldmodel {
35 
36 bool GreaterThan(std::vector<int> v1, std::vector<int> v2) {
37  size_t n1(v1.size()), n2(v2.size());
38  for (size_t i = 0; i < n1 && i < n2; ++i) {
39  if (v1[n1-1-i] > v2[n2-1-i]) return true;
40  if (v1[n1-1-i] < v2[n2-1-i]) return false;
41  }
42  return false;
43 }
44 
45 std::vector< std::vector<int> > CompactVector(
46  std::vector< std::vector<int> > vec) {
47  // first sort the list
48  std::sort(vec.begin(), vec.end(), GreaterThan);
49  // now look for n = n+1
50  for (size_t j = 0; j < vec.size()-1; ++j) {
51  while (j < vec.size()-1 && IterableEquality(
52  vec[j].begin()+1, vec[j].end(),
53  vec[j+1].begin()+1, vec[j+1].end()) ) {
54  vec[j][0] += vec[j+1][0];
55  vec.erase(vec.begin()+j+1);
56  }
57  }
58  return vec;
59 }
60 
61 std::map<std::string, std::shared_ptr<EndFieldModel> > EndFieldModel::efm_map;
62 
63 std::shared_ptr<EndFieldModel> EndFieldModel::getEndFieldModel(std::string name) {
64  try {
65  return efm_map.at(name);
66  } catch (std::exception& exc) {
67  throw GeneralClassicException("EndFieldModel::getEndFieldModel",
68  "Could not find EndFieldModel with name '"+name+"'");
69  }
70 }
71 
73  std::shared_ptr<EndFieldModel> efm) {
74  efm_map[name] = efm;
75 }
76 
77 std::string EndFieldModel::getName(std::shared_ptr<EndFieldModel> efm) {
78  typedef std::map<std::string, std::shared_ptr<EndFieldModel> > EfmMap;
79  for (EfmMap::iterator it = efm_map.begin(); it != efm_map.end(); ++it) {
80  if (it->second == efm) {
81  return it->first;
82  }
83  }
84  std::stringstream ss;
85  ss << efm;
86  throw GeneralClassicException("EndFieldModel::getName",
87  "Could not find EndFieldModel with address "+ss.str());
88 }
89 
90 
91 }
92 
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two distribute and or modify the software for each author s protection and we want to make certain that everyone understands that there is no warranty for this free software If the software is modified by someone else and passed we want its recipients to know that what they have is not the so that any problems introduced by others will not reflect on the original authors reputations any free program is threatened constantly by software patents We wish to avoid the danger that redistributors of a free program will individually obtain patent in effect making the program proprietary To prevent we have made it clear that any patent must be licensed for everyone s free use or not licensed at all The precise terms and conditions for distribution and modification follow GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR DISTRIBUTION AND MODIFICATION This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License The refers to any such program or and a work based on the Program means either the Program or any derivative work under copyright a work containing the Program or a portion of it
Definition: LICENSE:43
std::vector< std::vector< int > > CompactVector(std::vector< std::vector< int > > vec)
clearpage the user may choose between constant or variable radius This model includes fringe fields begin
Definition: multipole_t.tex:6
std::string::iterator iterator
Definition: MSLang.h:15
bool GreaterThan(std::vector< int > v1, std::vector< int > v2)
CompactVector helper function, used for sorting.
Definition: Vec.h:21
const std::string name
c Accompany it with the information you received as to the offer to distribute corresponding source complete source code means all the source code for all modules it plus any associated interface definition plus the scripts used to control compilation and installation of the executable as a special exception
Definition: LICENSE:157
static std::string getName(std::shared_ptr< EndFieldModel > efm)
static std::map< std::string, std::shared_ptr< EndFieldModel > > efm_map
static void setEndFieldModel(std::string name, std::shared_ptr< EndFieldModel > efm)
bool IterableEquality(TEMP_ITER a_begin, TEMP_ITER a_end, TEMP_ITER b_begin, TEMP_ITER b_end)
static std::shared_ptr< EndFieldModel > getEndFieldModel(std::string name)
end
Definition: multipole_t.tex:9