00001 #ifndef DOFT_IS_INCLUDED
00002 #define DOFT_IS_INCLUDED
00003
00004
00005 #include <map>
00006 #include <vector>
00007 #include <iterator>
00008 #include <iostream>
00009
00010
00011 using namespace std;
00012
00013
00014 template <class D, class C>
00015 class DofT {
00016 protected:
00017 bool create_index2dof, create_dof2loc;
00018 int counter;
00019
00020
00021
00022
00023 map<pair<int,int>, int> loc2dof;
00024
00025 map<D,int,C> dof2index;
00026 typename map<D,int,C>:: iterator iter;
00027
00028
00029 map<int,D> index2dof;
00030
00031 map <int, vector<pair<int,int> > > dof2loc;
00032
00033 public:
00034 DofT( bool create_index2dof_ = false, bool create_dof2loc_ = false ) {
00035 counter = -1;
00036 create_index2dof = create_index2dof_;
00037 create_dof2loc = create_dof2loc;
00038 }
00039 ~DofT() {}
00040 int insert_dof(int e, int i, D Li);
00041
00042
00043
00044 int glob_dof(int e, int i);
00045 int glob_dof(D Lj);
00046 D glob_dof(int j);
00047 int size();
00048 vector<pair<int, int> > glob2loc(int j);
00049 void clear();
00050 };
00051
00052
00053
00054
00055 template <class D, class C>
00056 int
00057 DofT<D, C> :: size() {
00058 return counter+1;
00059 }
00060
00061 template <class D, class C>
00062 int
00063 DofT<D, C>:: insert_dof(int e, int i, D Li){
00064
00065 pair<int,int> index;
00066 index.first = e;
00067 index.second = i;
00068 int return_dof;
00069
00070
00071
00072
00073 iter = dof2index.find(Li);
00074 if ( iter == dof2index.end() ) {
00075 counter++;
00076 return_dof = counter;
00077 dof2index[Li] = counter;
00078 loc2dof[index] = counter;
00079 if ( create_index2dof) {
00080 index2dof[counter] = Li;
00081 }
00082 if ( create_dof2loc ) {
00083 vector<pair<int,int> > v;
00084 dof2loc[counter] = v;
00085 }
00086 } else {
00087 loc2dof[index] = (*iter).second;
00088 return_dof = (*iter).second;
00089 }
00090
00091
00092 if (create_dof2loc) {
00093 dof2loc[counter].push_back(index);
00094 }
00095
00096 return return_dof;
00097 }
00098
00099 template <class D, class C>
00100 int
00101 DofT<D, C>:: glob_dof(int e, int i) {
00102 pair<int,int> index;
00103 index.first = e;
00104 index.second = i;
00105 if ( loc2dof.find(index) != loc2dof.end()) {
00106 return (*(loc2dof.find(index))).second;
00107 } else {
00108 return -1;
00109 }
00110 }
00111
00112 template <class D, class C>
00113 int
00114 DofT<D, C>:: glob_dof(D Lj) {
00115 if ( dof2index.find(Lj) != dof2index.end()) {
00116 return (*(dof2index.find(Lj))).second;
00117 } else {
00118 return -1;
00119 }
00120 }
00121
00122 template <class D, class C>
00123 D
00124 DofT<D, C>:: glob_dof(int j) {
00125 if ( create_index2dof) {
00126 if ( index2dof.find(j) != index2dof.end() ) {
00127 return (*(index2dof.find(j))).second;
00128 } else {
00129 std::cout <<"not found "<<std::endl;
00130 return D();
00131 }
00132 } else {
00133 std::cout <<"This structure has not been created "<<std::endl;
00134 std::cout <<"You must turn on the create_index2dof flag before initialization!"<<std::endl;
00135 return D();
00136 }
00137 }
00138
00139 template <class D, class C>
00140 vector<pair<int, int> >
00141 DofT<D, C>:: glob2loc(int j){
00142 if ( create_dof2loc) {
00143 return dof2loc[j];
00144 } else {
00145 std::cout <<"This structure has not been created "<<std::endl;
00146 std::cout <<"You must turn on the create_dof2loc lag before initialization!"<<std::endl;
00147 return vector<pair<int,int> >();
00148 }
00149
00150 }
00151
00152 template <class D, class C>
00153 void
00154 DofT<D,C>:: clear() {
00155 counter = -1;
00156 loc2dof.clear();
00157 dof2index.clear();
00158 index2dof.clear();
00159 dof2loc.clear();
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 #endif
00172