ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ConstraintAlgorithm.cpp
Revision: 1232
Committed: Thu Jun 3 21:51:55 2004 UTC (20 years, 3 months ago) by tim
File size: 4761 byte(s)
Log Message:
new implementation of constraint

File Contents

# User Rev Content
1 tim 1232 #include "ConstraintAlgorithm.hpp"
2     #include "ConstraintPair.hpp"
3     #include "SimInfo.hpp"
4     #include "ConstraintManager.hpp"
5    
6     ////////////////////////////////////////////////////////////////////////////////
7     //Implementation of ConstraintAlgorithm
8     ////////////////////////////////////////////////////////////////////////////////
9     ConstraintAlgorithm::ConstraintAlgorithm(SimInfo* rhs){
10     info = rhs;
11     cpIter = info->consMan->creatPairIterator();
12     ceIter = info->consMan->creatElementIterator();
13     }
14    
15     ConstraintAlgorithm::~ConstraintAlgorithm(){
16     map<TypeInfo, CallbackFunctor*>::iterator callbackIter;
17    
18     //destroy callbackMap
19     for(callbackIter = callbackMap.begin(); callbackIter != callbackMap.end(); ++callbackIter){
20     delete callbackIter->second;
21     }
22     callbackMap.erase(callbackMap.begin(), callbackMap.end());
23    
24     //destroy iterators of constraint element and constraint pair
25     delete cpIter;
26     delete ceIter;
27     }
28    
29     void ConstraintAlgorithm::doConstrain(){
30     const int maxConsIteration = 30;
31     bool done;
32     int iteration;
33     int maxIteration;
34     double tolerance;
35     ConstraintElement* consElem;
36     ConstraintPair* consPair;
37     int exeStatus;
38    
39    
40    
41     for(ceIter->first(); !ceIter->isEnd(); ceIter->next()){
42     consElem = ceIter->currentItem();
43     consElem->setMoved(true);
44     consElem->setMoving(false);
45     }
46    
47     done = false;
48     iteration = 0;
49    
50     //main loop of constraint algorithm
51     while(!done && iteration < maxConsIteration){
52     done = true;
53    
54     //loop over every constraint pair
55     for(cpIter->first(); !cpIter->isEnd(); cpIter->next()){
56    
57     consPair = cpIter->currentItem();
58    
59     //dispatch constraint algorithm
60     if(consPair->isMoved())
61     exeStatus = doConstrainPair(consPair);
62    
63     switch(exeStatus){
64     case consFail:
65     cerr << "ConstraintAlgorithm::doConstrain() Error: Constraint Fail" << endl;
66     break;
67     case consSuccess:
68     //constrain the pair by moving two elements
69     done = false;
70     consPair->firstElem->setMoving(true);
71     consPair->secondElem->setMoving(true);
72     break;
73     case consAlready:
74     //current pair is already constrained, do not need to move the elements
75     break;
76     case consPairHandlerFail:
77     //can not found call back functor for constraint pair
78     cerr << "ConstraintAlgorithm::doConstrain() Error: can not found callback functor for constraint pair " << endl;
79     break;
80     case consElemHandlerFail:
81     //can not found callback functor for constraint element
82     cerr << "ConstraintAlgorithm::doConstrain() Error: can not found callback functor for constraint element " << endl;
83     break;
84     default:
85     cerr << "ConstraintAlgorithm::doConstrain() Error: unrecognized status" << endl;
86     break;
87     }
88     }//end for(iter->first())
89    
90     for(ceIter->first(); !ceIter->isEnd(); ceIter->next()){
91     consElem = ceIter->currentItem();
92     consElem->setMoved(consElem->getMoving());
93     consElem->setMoving(false);
94     }
95    
96     iteration++;
97     }//end while
98    
99     }
100    
101    
102     int ConstraintAlgorithm::doConstrainPair(ConstraintPair* consPair){
103     map<TypeInfo, CallbackFunctor*>::iterator foundResult;
104     CallbackFunctor* functor;
105    
106     foundResult = callbackMap.find(typeid(consPair));
107     if (foundResult != callbackMap.end()){
108     functor = foundResult->second;
109     return (*functor)(consPair);
110     }
111     else{
112     //can not found appropriate functor to handle constraint pair in callbackMap
113     return consPairHandlerFail;
114     }
115    
116     }
117    
118     void ConstraintAlgorithm::registerCallback(const TypeInfo& ti, CallbackFunctor* functor){
119     map<TypeInfo, CallbackFunctor*>::iterator foundResult;
120    
121     foundResult = callbackMap.find(ti);
122     if (foundResult == callbackMap.end())
123     callbackMap[ti] = functor;
124     else{
125     delete foundResult->second;
126     foundResult->second = functor;
127     }
128    
129     }
130     void ConstraintAlgorithm::unRegister(TypeInfo& ti){
131     map<TypeInfo, CallbackFunctor*>::iterator foundResult;
132    
133     foundResult = callbackMap.find(ti);
134     if (foundResult != callbackMap.end()){
135     delete foundResult->second;
136     callbackMap.erase(foundResult);
137     }
138     }
139    
140     ////////////////////////////////////////////////////////////////////////////////
141     //Implementation of ConsAlgoFramework
142     ////////////////////////////////////////////////////////////////////////////////
143     ConsAlgoFramework::ConsAlgoFramework(SimInfo* rhs){
144     ceIter = rhs->consMan->creatElementIterator();
145     }
146    
147     ConsAlgoFramework::~ConsAlgoFramework(){
148     delete ceIter;
149     }
150     void ConsAlgoFramework::doPreConstraint(){
151     ConstraintElement* consElem;
152    
153     for(ceIter->first(); !ceIter->isEnd(); ceIter->next()){
154     consElem = ceIter->currentItem();
155     consElem->saveOldState();
156     }
157     }

Properties

Name Value
svn:executable *