- Timestamp:
- 08/10/09 17:16:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp
r786 r1628 16 16 void CreateLoadsDiagnosticHoriz(DataSet** ploads, Model* model,ConstDataHandle model_handle){ 17 17 18 int i ,j,counter;18 int i; 19 19 int element; 20 20 … … 24 24 DataSet* loads = NULL; 25 25 Icefront* icefront = NULL; 26 Penpair* penpair= NULL;26 Riftfront* riftfront= NULL; 27 27 28 28 int segment_width; … … 30 30 int i1,i2,i3,i4; 31 31 int i0,range; 32 int grid1,grid2; 33 34 /*rift penpair: */ 35 double normal[2]; 36 double length; 37 double friction; 38 int fill; 32 39 33 40 34 /*icefront intermediary data: */ … … 48 42 double icefront_b[MAX_ICEFRONT_GRIDS]; 49 43 50 /*penpair intermediary data: */ 51 int penpair_id; 52 int penpair_node_ids[2]; 53 double penpair_penalty_offset; 54 int penpair_numdofs; 55 int penpair_dof; 56 int penpair_penalty_lock; 57 int penpair_element_ids[2]; 58 double penpair_friction; 59 int penpair_fill; 60 double penpair_normal[2]; 61 double penpair_length; 62 63 /*Rifts:*/ 64 int* riftsnumpenaltypairs=NULL; 65 double** riftspenaltypairs=NULL; 66 int* riftsfill=NULL; 67 int* riftsfriction=NULL; 68 double* riftpenaltypairs=NULL; 44 /*rifts: */ 45 char riftfront_type[RIFTFRONTSTRING]; 46 int riftfront_id; 47 int riftfront_node_ids[2]; 48 int riftfront_mparid; 49 double riftfront_h[2]; 50 double riftfront_b[2]; 51 double riftfront_s[2]; 52 double riftfront_normal[2]; 53 double riftfront_length; 54 int riftfront_fill; 55 double riftfront_friction; 56 bool riftfront_shelf; 57 double riftfront_penalty_offset; 58 int riftfront_penalty_lock; 59 bool riftfront_active; 60 int riftfront_counter; 61 bool riftfront_prestable; 69 62 int el1,el2; 63 int grid1,grid2; 64 double normal[2]; 65 double length; 66 int fill; 67 double friction; 70 68 71 69 /*Create loads: */ … … 153 151 xfree((void**)&model->bed); 154 152 155 counter=0;156 157 153 /*Create penpair loads also for rift grids, so that they don't penetrate one another, if needed: */ 158 154 /*First fetch rifts: */ 155 ModelFetchData((void**)&model->riftinfo,&model->numrifts,NULL,model_handle,"riftinfo","Matrix","Mat"); 156 ModelFetchData((void**)&model->thickness,NULL,NULL,model_handle,"thickness","Matrix","Mat"); 157 ModelFetchData((void**)&model->bed,NULL,NULL,model_handle,"bed","Matrix","Mat"); 158 ModelFetchData((void**)&model->surface,NULL,NULL,model_handle,"surface","Matrix","Mat"); 159 ModelFetchData((void**)&model->gridoniceshelf,NULL,NULL,model_handle,"gridoniceshelf","Matrix","Mat"); 160 159 161 if(model->numrifts){ 160 161 162 for(i=0;i<model->numrifts;i++){ 162 riftpenaltypairs=model->riftspenaltypairs[i];163 for(j=0;j<model->riftsnumpenaltypairs[i];j++){164 165 el1=(int)*(riftpenaltypairs+7*j+2);166 #ifdef _PARALLEL_167 if (model->epart[el1-1]!=my_rank){168 /*This load does not belong to this cluster node, as it references an element169 *that does not belong to this node's partition. Drop this 'j':*/170 continue;171 }172 #endif173 174 /*Ok, retrieve all the data needed to add a penalty between the two grids: */175 el2=(int)*(riftpenaltypairs+7*j+3);176 grid1=(int)*(riftpenaltypairs+7*j+0);177 grid2=(int)*(riftpenaltypairs+7*j+1);178 normal[0]=*(riftpenaltypairs+7*j+4);179 normal[1]=*(riftpenaltypairs+7*j+5);180 length=*(riftpenaltypairs+7*j+6);181 friction=model->riftsfriction[i];182 fill=model->riftsfill[i];183 184 penpair_id=counter+1; //matlab indexing185 penpair_node_ids[0]=grid1;186 penpair_node_ids[1]=grid2;187 penpair_element_ids[0]=el1;188 penpair_element_ids[1]=el2;189 penpair_penalty_offset=model->penalty_offset;190 penpair_penalty_lock=model->penalty_lock;191 penpair_numdofs=2;192 penpair_normal[0]=normal[0];193 penpair_normal[1]=normal[1];194 penpair_length=length;195 penpair_friction=friction;196 penpair_fill=fill;197 198 penpair= new Penpair(penpair_id,penpair_penalty_offset,penpair_penalty_lock,penpair_numdofs,penpair_node_ids,penpair_dof,199 penpair_element_ids,penpair_friction,penpair_fill,penpair_normal,penpair_length);200 163 201 loads->AddObject(penpair); 202 203 counter++; 164 el1=(int)*(model->riftinfo+9*i+2); 165 #ifdef _PARALLEL_ 166 if (model->epart[el1-1]!=my_rank){ 167 /*This load does not belong to this cluster node, as it references an element 168 *that does not belong to this node's partition. Drop this 'j':*/ 169 continue; 204 170 } 171 #endif 172 173 /*Ok, retrieve all the data needed to add a penalty between the two grids: */ 174 el2=(int)*(model->riftinfo+9*i+3); 175 176 grid1=(int)*(model->riftinfo+9*i+0); 177 grid2=(int)*(model->riftinfo+9*i+1); 178 179 normal[0]=*(model->riftinfo+9*i+4); 180 normal[1]=*(model->riftinfo+9*i+5); 181 length=*(model->riftinfo+9*i+6); 182 183 fill = (int)*(model->riftinfo+9*i+7); 184 friction=*(model->riftinfo+9*i+8); 185 186 strcpy(riftfront_type,"2d"); 187 riftfront_id=i+1; //matlab indexing 188 riftfront_node_ids[0]=grid1; 189 riftfront_node_ids[1]=grid2; 190 riftfront_mparid=model->numberofelements+1; //matlab indexing 191 192 riftfront_h[0]=model->thickness[grid1-1]; 193 riftfront_h[1]=model->thickness[grid2-1]; 194 195 riftfront_b[0]=model->bed[grid1-1]; 196 riftfront_b[1]=model->bed[grid2-1]; 197 198 riftfront_s[0]=model->surface[grid1-1]; 199 riftfront_s[1]=model->surface[grid2-1]; 200 201 riftfront_normal[0]=normal[0]; 202 riftfront_normal[1]=normal[1]; 203 riftfront_length=length; 204 205 riftfront_fill=fill; 206 riftfront_friction=friction; 207 riftfront_shelf=(bool)model->gridoniceshelf[grid1-1]; 208 209 riftfront_penalty_offset=model->penalty_offset; 210 riftfront_penalty_lock=model->penalty_lock; 211 212 riftfront_active=0; 213 riftfront_counter=0; 214 riftfront_prestable=0; 215 216 riftfront=new Riftfront(riftfront_type,riftfront_id, riftfront_node_ids, riftfront_mparid, riftfront_h,riftfront_b,riftfront_s,riftfront_normal,riftfront_length,riftfront_fill,riftfront_friction, riftfront_penalty_offset, riftfront_penalty_lock, riftfront_active,riftfront_counter,riftfront_prestable,riftfront_shelf); 217 218 loads->AddObject(riftfront); 205 219 } 206 220 } 221 222 /*free ressources: */ 223 xfree((void**)&model->riftinfo); 224 xfree((void**)&model->thickness); 225 xfree((void**)&model->bed); 226 xfree((void**)&model->surface); 227 xfree((void**)&model->gridoniceshelf); 228 229 cleanup_and_return: 207 230 208 231 /*All our datasets are already order by ids. Set presort flag so that later on, when sorting is requested on these … … 210 233 loads->Presort(); 211 234 212 213 /*Free ressources:*/214 xfree((void**)&riftsnumpenaltypairs);215 for(i=0;i<model->numrifts;i++){216 double* temp=riftspenaltypairs[i];217 xfree((void**)&temp);218 }219 xfree((void**)&riftspenaltypairs);220 xfree((void**)&riftsfill);221 xfree((void**)&riftsfriction);222 223 cleanup_and_return:224 225 235 /*Assign output pointer: */ 226 236 *ploads=loads;
Note:
See TracChangeset
for help on using the changeset viewer.