00001 /*** 00002 basic structure for vertex in frame, used for contructing spatial-temporal constraints. 00003 ***/ 00004 #include "tensor_field_nav_core/VertTimeList.h" 00005 VertTimeList::VertTimeList(int nverts, int initsize) 00006 { 00007 if(initsize == 0) 00008 { 00009 vertsTime = NULL; 00010 nvertsTime = curMaxNum = 0; 00011 total_notconstraint_verts = 0; 00012 nvertsPerFrame = nverts; 00013 return; 00014 } 00015 00016 vertsTime = (OneVertAtTime**)malloc(sizeof(OneVertAtTime*)*initsize); 00017 if(vertsTime == NULL) exit(-1); 00018 00019 int i; 00020 for(i=0; i<initsize; i++) 00021 vertsTime[i]=NULL; 00022 00023 nvertsTime = 0; 00024 curMaxNum = initsize; 00025 total_notconstraint_verts = 0; 00026 nvertsPerFrame = nverts; 00027 } 00028 00029 /* destructor */ 00030 VertTimeList::~VertTimeList() 00031 { 00032 if(vertsTime == NULL) 00033 return; 00034 00035 int i; 00036 for(i=0; i<curMaxNum; i++) 00037 { 00038 if(vertsTime[i]== NULL) 00039 continue; 00040 00041 free(vertsTime[i]); 00042 vertsTime[i]=NULL; 00043 } 00044 00045 free(vertsTime); 00046 vertsTime = NULL; 00047 } 00048 00049 /* list operations */ 00050 void VertTimeList::add_new(int time_step, int which_vert, bool isConstraint) 00051 { 00052 /* allocate space for new element */ 00053 if(isFull()) 00054 { 00055 if(!extend()) 00056 exit(-1); 00057 } 00058 00059 vertsTime[nvertsTime]=(OneVertAtTime*)malloc(sizeof(OneVertAtTime)); 00060 vertsTime[nvertsTime]->time_step = time_step; 00061 vertsTime[nvertsTime]->which_vert = which_vert; 00062 vertsTime[nvertsTime]->isConstraint = isConstraint; 00063 vertsTime[nvertsTime]->variableID = -1; 00064 00065 nvertsTime++; 00066 } 00067 00068 void VertTimeList::add_new(OneVertAtTime *oneVert) 00069 { 00070 /* allocate space for new element */ 00071 if(isFull()) 00072 { 00073 if(!extend()) 00074 exit(-1); 00075 } 00076 00077 vertsTime[nvertsTime]=oneVert; 00078 nvertsTime++; 00079 } 00080 00081 bool VertTimeList::isFull() 00082 { 00083 if(nvertsTime >= curMaxNum) return true; 00084 return false; 00085 } 00086 00087 bool VertTimeList::extend(int step) 00088 { 00089 OneVertAtTime **temp=vertsTime; 00090 00091 vertsTime=(OneVertAtTime**)malloc(sizeof(OneVertAtTime*)*(curMaxNum+step)); 00092 00093 if(vertsTime == NULL) return false; 00094 00095 int i; 00096 for(i=0; i<curMaxNum; i++) 00097 vertsTime[i]=temp[i]; 00098 00099 for(i=curMaxNum; i<curMaxNum+step; i++) 00100 vertsTime[i]=NULL; 00101 00102 free(temp); 00103 curMaxNum += step; 00104 00105 return true; 00106 } 00107 00108 void VertTimeList::set_constraint_at_vert(int time_step, int which_vert) 00109 { 00110 vertsTime[time_step*nvertsPerFrame+which_vert]->isConstraint = true; 00111 } 00112 00113 void VertTimeList::reset_all_constraints() 00114 { 00115 int i; 00116 for(i=0; i<nvertsTime; i++) 00117 vertsTime[i]->isConstraint = false; 00118 } 00119 00120 /* return the slice index given the index of a variable */ 00121 int VertTimeList::get_sliceID_given_varID(int variableID) 00122 { 00123 int i; 00124 for(i=0; i<nvertsTime; i++) 00125 { 00126 if(vertsTime[i]->variableID == variableID) 00127 return vertsTime[i]->time_step; 00128 } 00129 00130 return -1; 00131 }