Changeset 3623
- Timestamp:
- 04/27/10 08:27:35 (15 years ago)
- Location:
- issm/trunk/src/c/objects
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Pengrid.cpp
r3621 r3623 34 34 /*}}}1*/ 35 35 /*FUNCTION Pengrid::Pengrid(int id, int node_ids int matpar_id){{{1*/ 36 Pengrid::Pengrid(int pengrid_id,int pengrid_node_id, int pengrid_matpar_id): 37 hnode(pengrid_node_ids,1), 36 Pengrid::Pengrid(int pengrid_id,int pengrid_node_id, int pengrid_element_id,int pengrid_matpar_id): 37 hnode(pengrid_node_id,1), 38 helement(pengrid_element_id,1), 38 39 hmatice(&pengrid_matice_id,1), 39 40 hmatpar(&pengrid_matpar_id,1) … … 52 53 /*}}}*/ 53 54 /*FUNCTION Pengrid::Pengrid(int id, Hook* hnodes, Hook* hmatice, Hook* hmatpar, DataSet* parameters, Inputs* pengrid_inputs) {{{1*/ 54 Pengrid::Pengrid(int pengrid_id,Hook* pengrid_hnode, Hook* pengrid_h matpar, Parameters* pengrid_parameters, Inputs* pengrid_inputs):55 Pengrid::Pengrid(int pengrid_id,Hook* pengrid_hnode, Hook* pengrid_helement,Hook* pengrid_hmatpar, Parameters* pengrid_parameters, Inputs* pengrid_inputs): 55 56 hnode(pengrid_hnode), 57 helement(pengrid_helement), 56 58 hmatpar(pengrid_hmatpar) 57 59 { … … 94 96 } 95 97 /*}}}1*/ 96 /*FUNCTION Pengrid::Pengrid(int i , IoModel* iomodel){{{1*/97 Pengrid::Pengrid(int i ndex, IoModel* iomodel){ //i is the element index98 /*FUNCTION Pengrid::Pengrid(int index, int id, IoModel* iomodel){{{1*/ 99 Pengrid::Pengrid(int id, int index, IoModel* iomodel){ //i is the element index 98 100 99 101 int i,j; 100 int tria_node_ids[3]; 101 int tria_matice_id; 102 int tria_matpar_id; 103 double nodeinputs[3]; 102 int pengrid_node_id; 103 int pengrid_matpar_id; 104 int pengrid_element_id; 104 105 105 106 /*id: */ 106 this->id=i ndex+1;107 this->id=id; 107 108 108 109 /*hooks: */ 109 //go recover node ids, needed to initialize the node hook. 110 if (iomodel->analysis_type==Prognostic2AnalysisEnum || iomodel->analysis_type==Balancedthickness2AnalysisEnum){ 111 /*Discontinuous Galerkin*/ 112 tria_node_ids[0]=3*index+1; 113 tria_node_ids[1]=3*index+2; 114 tria_node_ids[2]=3*index+3; 115 } 116 else{ 117 /*Continuous Galerkin*/ 118 for(i=0;i<3;i++){ 119 tria_node_ids[i]=(int)*(iomodel->elements+3*index+i); //ids for vertices are in the elements array from Matlab 120 } 121 } 122 tria_matice_id=index+1; //refers to the corresponding ice material object 123 tria_matpar_id=iomodel->numberofelements+1; //refers to the constant material parameters object 124 125 this->hnodes.Init(tria_node_ids,3); 126 this->hmatice.Init(&tria_matice_id,1); 127 this->hmatpar.Init(&tria_matpar_id,1); 128 129 //intialize inputs, and add as many inputs per element as requested: 110 pengrid_node_id=index+1; 111 pengrid_element_id=iomodel->singlenodetoelementconnectivity[index]; 112 pengrid_matpar_id=iomodel->numberofelements+1; //refers to the constant material parameters object 113 114 this->hnode.Init(pengrid_node_ids,1); 115 this->helement.Init(pengrid_element_id,1); 116 this->hmatpar.Init(&pengrid_matpar_id,1); 117 118 //initialize inputs: none needed 130 119 this->inputs=new Inputs(); 131 132 if (iomodel->thickness) {133 for(i=0;i<3;i++)nodeinputs[i]=iomodel->thickness[tria_node_ids[i]-1];134 this->inputs->AddInput(new PengridVertexInput(ThicknessEnum,nodeinputs));135 }136 if (iomodel->surface) {137 for(i=0;i<3;i++)nodeinputs[i]=iomodel->surface[tria_node_ids[i]-1];138 this->inputs->AddInput(new PengridVertexInput(SurfaceEnum,nodeinputs));139 }140 if (iomodel->bed) {141 for(i=0;i<3;i++)nodeinputs[i]=iomodel->bed[tria_node_ids[i]-1];142 this->inputs->AddInput(new PengridVertexInput(BedEnum,nodeinputs));143 }144 if (iomodel->drag_coefficient) {145 for(i=0;i<3;i++)nodeinputs[i]=iomodel->drag_coefficient[tria_node_ids[i]-1];146 this->inputs->AddInput(new PengridVertexInput(DragCoefficientEnum,nodeinputs));147 148 if (iomodel->drag_p) this->inputs->AddInput(new DoubleInput(DragPEnum,iomodel->drag_p[index]));149 if (iomodel->drag_q) this->inputs->AddInput(new DoubleInput(DragQEnum,iomodel->drag_q[index]));150 this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));151 152 }153 if (iomodel->melting_rate) {154 for(i=0;i<3;i++)nodeinputs[i]=iomodel->melting_rate[tria_node_ids[i]-1];155 this->inputs->AddInput(new PengridVertexInput(MeltingRateEnum,nodeinputs));156 }157 if (iomodel->accumulation_rate) {158 for(i=0;i<3;i++)nodeinputs[i]=iomodel->accumulation_rate[tria_node_ids[i]-1];159 this->inputs->AddInput(new PengridVertexInput(AccumulationRateEnum,nodeinputs));160 }161 if (iomodel->geothermalflux) {162 for(i=0;i<3;i++)nodeinputs[i]=iomodel->geothermalflux[tria_node_ids[i]-1];163 this->inputs->AddInput(new PengridVertexInput(GeothermalFluxEnum,nodeinputs));164 }165 166 if (iomodel->elementoniceshelf) this->inputs->AddInput(new BoolInput(ElementOnIceShelfEnum,(IssmBool)iomodel->elementoniceshelf[index]));167 if (iomodel->elementonbed) this->inputs->AddInput(new BoolInput(ElementOnBedEnum,(IssmBool)iomodel->elementonbed[index]));168 if (iomodel->elementonwater) this->inputs->AddInput(new BoolInput(ElementOnWaterEnum,(IssmBool)iomodel->elementonwater[index]));169 if (iomodel->elementonsurface) this->inputs->AddInput(new BoolInput(ElementOnSurfaceEnum,(IssmBool)iomodel->elementonsurface[index]));170 120 171 121 //this->parameters: we still can't point to it, it may not even exist. Configure will handle this. 172 122 this->parameters=NULL; 173 123 124 //let's not forget internals 125 this->active=0; 126 this->zigzag_counter=0; 174 127 175 128 } … … 181 134 /*}}}1*/ 182 135 183 /*Object marshall*/ 184 /*FUNCTION Pengrid::Marshall {{{1*/ 185 void Pengrid::Marshall(char** pmarshalled_dataset){ 136 /*Object management*/ 137 /*FUNCTION Pengrid::Configure {{{1*/ 138 void Pengrid::Configure(DataSet* elementsin, DataSet* nodesin, DataSet* materialsin, Parameters* parametersin){ 139 140 /*Take care of hooking up all objects for this load, ie links the objects in the hooks to their respective 141 * datasets, using internal ids and offsets hidden in hooks: */ 142 hnode.configure(nodesin); 143 helement.configure(elementsin); 144 hmatpar.configure(materialsin); 145 146 /*point parameters to real dataset: */ 147 this->parameters=parametersin; 148 } 149 /*}}}1*/ 150 /*FUNCTION Pengrid::copy {{{1*/ 151 Object* Pengrid::copy() { 152 return new Pengrid(this->id,&this->hnode,&this->helement,&this->hmatpar,this->parameters,this->inputs); 153 } 154 /*}}}1*/ 155 /*FUNCTION Pengrid::DeepEcho{{{1*/ 156 void Pengrid::DeepEcho(void){ 157 158 printf("Pengrid:\n"); 159 printf(" id: %i\n",id); 160 hnode.DeepEcho(); 161 helement.DeepEcho(); 162 hmatpar.DeepEcho(); 163 printf(" active %i\n",this->active); 164 printf(" zigzag_counter %i\n",this->zigzag_counter); 165 printf(" parameters\n"); 166 parameters->DeepEcho(); 167 printf(" inputs\n"); 168 inputs->DeepEcho(); 169 } 170 /*}}}*/ 171 /*FUNCTION Pengrid::Demarshall {{{1*/ 172 void Pengrid::Demarshall(char** pmarshalled_dataset){ 186 173 187 174 char* marshalled_dataset=NULL; 188 int enum_type=0;175 int i; 189 176 190 177 /*recover marshalled_dataset: */ 191 178 marshalled_dataset=*pmarshalled_dataset; 192 179 193 /*get enum type of Pengrid: */194 enum_type=PengridEnum;195 196 /*marshall enum: */197 memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);198 199 /*marshall Pengrid data: */200 memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);201 memcpy(marshalled_dataset,&mparid,sizeof(mparid));marshalled_dataset+=sizeof(mparid);202 memcpy(marshalled_dataset,&dof,sizeof(dof));marshalled_dataset+=sizeof(dof);203 memcpy(marshalled_dataset,&active,sizeof(active));marshalled_dataset+=sizeof(active);204 memcpy(marshalled_dataset,&penalty_offset,sizeof(penalty_offset));marshalled_dataset+=sizeof(penalty_offset);205 memcpy(marshalled_dataset,&thermal_steadystate,sizeof(thermal_steadystate));marshalled_dataset+=sizeof(thermal_steadystate);206 memcpy(marshalled_dataset,&node_id,sizeof(node_id));marshalled_dataset+=sizeof(node_id);207 memcpy(marshalled_dataset,&node_offset,sizeof(node_offset));marshalled_dataset+=sizeof(node_offset);208 memcpy(marshalled_dataset,&matpar,sizeof(matpar));marshalled_dataset+=sizeof(matpar);209 memcpy(marshalled_dataset,&matpar_offset,sizeof(matpar_offset));marshalled_dataset+=sizeof(matpar_offset);210 memcpy(marshalled_dataset,&stabilize_constraints,sizeof(stabilize_constraints));marshalled_dataset+=sizeof(stabilize_constraints);211 memcpy(marshalled_dataset,&zigzag_counter,sizeof(zigzag_counter));marshalled_dataset+=sizeof(zigzag_counter);212 213 *pmarshalled_dataset=marshalled_dataset;214 return;215 }216 /*}}}1*/217 /*FUNCTION Pengrid::MarshallSize {{{1*/218 int Pengrid::MarshallSize(){219 220 return sizeof(id)+221 sizeof(mparid)+222 sizeof(dof)+223 sizeof(active)+224 sizeof(penalty_offset)+225 sizeof(thermal_steadystate)+226 sizeof(node_id)+227 sizeof(node_offset)+228 sizeof(matpar)+229 sizeof(matpar_offset)+230 sizeof(stabilize_constraints)+231 sizeof(zigzag_counter)+232 sizeof(int); //sizeof(int) for enum type233 }234 /*}}}1*/235 /*FUNCTION Pengrid::Demarshall {{{1*/236 void Pengrid::Demarshall(char** pmarshalled_dataset){237 238 char* marshalled_dataset=NULL;239 240 /*recover marshalled_dataset: */241 marshalled_dataset=*pmarshalled_dataset;242 243 180 /*this time, no need to get enum type, the pointer directly points to the beginning of the 244 181 *object data (thanks to DataSet::Demarshall):*/ 245 182 246 183 memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id); 247 memcpy(&mparid,marshalled_dataset,sizeof(mparid));marshalled_dataset+=sizeof(mparid);248 memcpy(&dof,marshalled_dataset,sizeof(dof));marshalled_dataset+=sizeof(dof);249 184 memcpy(&active,marshalled_dataset,sizeof(active));marshalled_dataset+=sizeof(active); 250 memcpy(&penalty_offset,marshalled_dataset,sizeof(penalty_offset));marshalled_dataset+=sizeof(penalty_offset);251 memcpy(&thermal_steadystate,marshalled_dataset,sizeof(thermal_steadystate));marshalled_dataset+=sizeof(thermal_steadystate);252 memcpy(&node_id,marshalled_dataset,sizeof(node_id));marshalled_dataset+=sizeof(node_id);253 memcpy(&node_offset,marshalled_dataset,sizeof(node_offset));marshalled_dataset+=sizeof(node_offset);254 memcpy(&matpar,marshalled_dataset,sizeof(matpar));marshalled_dataset+=sizeof(matpar);255 memcpy(&matpar_offset,marshalled_dataset,sizeof(matpar_offset));marshalled_dataset+=sizeof(matpar_offset);256 memcpy(&stabilize_constraints,marshalled_dataset,sizeof(stabilize_constraints));marshalled_dataset+=sizeof(stabilize_constraints);257 185 memcpy(&zigzag_counter,marshalled_dataset,sizeof(zigzag_counter));marshalled_dataset+=sizeof(zigzag_counter); 258 186 259 node=NULL; 260 matpar=NULL; 187 /*demarshall hooks: */ 188 hnode.Demarshall(&marshalled_dataset); 189 helement.Demarshall(&marshalled_dataset); 190 hmatpar.Demarshall(&marshalled_dataset); 191 192 /*demarshall inputs: */ 193 inputs=(Inputs*)DataSetDemarshallRaw(&marshalled_dataset); 194 195 /*parameters: may not exist even yet, so let Configure handle it: */ 196 this->parameters=NULL; 261 197 262 198 /*return: */ … … 264 200 return; 265 201 } 266 /*}}}1*/ 267 268 /*Object functions*/ 269 /*FUNCTION Pengrid::copy {{{1*/ 270 Object* Pengrid::copy() { 271 return new Pengrid(*this); 272 } 273 /*}}}1*/ 274 /*FUNCTION Pengrid::Configure {{{1*/ 275 276 void Pengrid::Configure(void* pelementsin,void* pnodesin,void* pmaterialsin){ 277 278 DataSet* nodesin=NULL; 279 DataSet* materialsin=NULL; 280 281 /*Recover pointers :*/ 282 nodesin=(DataSet*)pnodesin; 283 materialsin=(DataSet*)pmaterialsin; 284 285 /*Link this load with its nodes: */ 286 ResolvePointers((Object**)&node,&node_id,&node_offset,1,nodesin); 287 ResolvePointers((Object**)&matpar,&mparid,&matpar_offset,1,materialsin); 288 } 289 /*}}}1*/ 290 /*FUNCTION Pengrid::CreateKMatrix {{{1*/ 291 292 void Pengrid::CreateKMatrix(Mat Kgg,int analysis_type,int sub_analysis_type){ 293 294 /*No loads applied, do nothing: */ 295 return; 296 297 } 298 /*}}}1*/ 299 /*FUNCTION Pengrid::CreatePVector {{{1*/ 300 void Pengrid::CreatePVector(Vec pg, int analysis_type,int sub_analysis_type){ 301 302 /*No loads applied, do nothing: */ 303 return; 304 305 } 306 /*}}}1*/ 307 /*FUNCTION Pengrid::DeepEcho {{{1*/ 308 void Pengrid::DeepEcho(void){ 309 310 printf("Pengrid:\n"); 311 printf(" id: %i\n",id); 312 printf(" mparid: %i\n",mparid); 313 printf(" dof: %i\n",dof); 314 printf(" active: %i\n",active); 315 printf(" penalty_offset: %g\n",penalty_offset); 316 printf(" thermal_steadystate: %i\n",thermal_steadystate); 317 printf(" node_id: [%i]\n",node_id); 318 printf(" node_offset: [%i]\n",node_offset); 319 printf(" matpar_offset=%i\n",matpar_offset); 320 321 if(node)node->Echo(); 322 if(matpar)matpar->Echo(); 323 return; 324 } 325 /*}}}1*/ 326 /*FUNCTION Pengrid::DistributenumDofs {{{1*/ 327 void Pengrid::DistributeNumDofs(int* numdofpernode,int analysis_type,int sub_analysis_type){return;} 328 /*}}}1*/ 202 /*}}}*/ 329 203 /*FUNCTION Pengrid::Echo {{{1*/ 330 204 void Pengrid::Echo(void){ 331 332 printf("Pengrid:\n"); 333 printf(" id: %i\n",id); 334 printf(" mparid: %i\n",mparid); 335 printf(" dof: %i\n",dof); 336 printf(" active: %i\n",active); 337 printf(" penalty_offset: %g\n",penalty_offset); 338 printf(" thermal_steadystate: %i\n",thermal_steadystate); 339 printf(" node_id: [%i]\n",node_id); 340 printf(" node_offset: [%i]\n",node_offset); 341 printf(" matpar_offset=%i\n",matpar_offset); 342 343 return; 205 this->DeepEcho(); 344 206 } 345 207 /*}}}1*/ … … 348 210 349 211 return PengridEnum; 350 }351 /*}}}1*/352 /*FUNCTION Pengrid::GetDofList {{{1*/353 void Pengrid::GetDofList(int* doflist,int* pnumberofdofspernode){354 355 int j;356 int doflist_per_node[MAXDOFSPERNODE];357 int numberofdofspernode;358 359 node->GetDofList(&doflist_per_node[0],&numberofdofspernode);360 for(j=0;j<numberofdofspernode;j++){361 doflist[j]=doflist_per_node[j];362 }363 364 /*Assign output pointers:*/365 *pnumberofdofspernode=numberofdofspernode;366 212 } 367 213 /*}}}1*/ … … 374 220 } 375 221 /*}}}1*/ 222 /*FUNCTION Pengrid::Marshall {{{1*/ 223 void Pengrid::Marshall(char** pmarshalled_dataset){ 224 225 char* marshalled_dataset=NULL; 226 int enum_type=0; 227 char* marshalled_inputs=NULL; 228 int marshalled_inputs_size; 229 230 /*recover marshalled_dataset: */ 231 marshalled_dataset=*pmarshalled_dataset; 232 233 /*get enum type of Tria: */ 234 enum_type=PengridEnum; 235 236 /*marshall enum: */ 237 memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type); 238 239 /*marshall Tria data: */ 240 memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id); 241 memcpy(marshalled_dataset,&active,sizeof(active));marshalled_dataset+=sizeof(active); 242 memcpy(marshalled_dataset,&zigzag_counter,sizeof(zigzag_counter));marshalled_dataset+=sizeof(zigzag_counter); 243 244 /*Marshall hooks: */ 245 hnode.Marshall(&marshalled_dataset); 246 helement.Marshall(&marshalled_dataset); 247 hmatpar.Marshall(&marshalled_dataset); 248 249 /*Marshall inputs: */ 250 marshalled_inputs_size=inputs->MarshallSize(); 251 marshalled_inputs=inputs->Marshall(); 252 memcpy(marshalled_dataset,marshalled_inputs,marshalled_inputs_size*sizeof(char)); 253 marshalled_dataset+=marshalled_inputs_size; 254 255 /*parameters: don't do anything about it. parameters are marshalled somewhere else!*/ 256 257 xfree((void**)&marshalled_inputs); 258 259 *pmarshalled_dataset=marshalled_dataset; 260 return; 261 } 262 /*}}}*/ 263 /*FUNCTION Pengrid::MarshallSize {{{1*/ 264 int Pengrid::MarshallSize(){ 265 266 return sizeof(id) 267 +sizeof(active) 268 +sizeof(zigzag_counter) 269 +hnode.MarshallSize() 270 +helement.MarshallSize() 271 +hmatpar.MarshallSize() 272 +inputs->MarshallSize() 273 +sizeof(int); //sizeof(int) for enum type 274 } 275 /*}}}*/ 376 276 /*FUNCTION Pengrid::MyRank {{{1*/ 377 277 int Pengrid::MyRank(void){ … … 380 280 } 381 281 /*}}}1*/ 282 283 /*Object functions*/ 284 /*FUNCTION Pengrid::CreateKMatrix {{{1*/ 285 286 void Pengrid::CreateKMatrix(Mat Kgg,int analysis_type,int sub_analysis_type){ 287 288 /*No loads applied, do nothing: */ 289 return; 290 291 } 292 /*}}}1*/ 293 /*FUNCTION Pengrid::CreatePVector {{{1*/ 294 void Pengrid::CreatePVector(Vec pg, int analysis_type,int sub_analysis_type){ 295 296 /*No loads applied, do nothing: */ 297 return; 298 299 } 300 /*}}}1*/ 301 /*FUNCTION Pengrid::DistributenumDofs {{{1*/ 302 void Pengrid::DistributeNumDofs(int* numdofpernode,int analysis_type,int sub_analysis_type){return;} 303 /*}}}1*/ 304 /*FUNCTION Pengrid::GetDofList {{{1*/ 305 void Pengrid::GetDofList(int* doflist,int* pnumberofdofspernode){ 306 307 int i,j; 308 int doflist_per_node[MAXDOFSPERNODE]; 309 int numberofdofspernode; 310 311 /*dynamic objects pointed to by hooks: */ 312 Node node=NULL; 313 314 /*recover objects from hooks: */ 315 node=(Node**)hnode.deliverp(); 316 317 node->GetDofList(&doflist_per_node[0],&numberofdofspernode); 318 for(j=0;j<numberofdofspernode;j++){ 319 doflist[j]=doflist_per_node[j]; 320 } 321 322 /*Assign output pointers:*/ 323 *pnumberofdofspernode=numberofdofspernode; 324 325 } 326 /*}}}*/ 382 327 /*FUNCTION Pengrid::PenaltyConstrain {{{1*/ 383 328 void Pengrid::PenaltyConstrain(int* punstable,int analysis_type,int sub_analysis_type){ … … 432 377 return; 433 378 } 434 435 /*recover pointers: */436 inputs=(ParameterInputs*)vinputs;437 379 438 380 //First recover beta, pressure and temperature vectors; … … 764 706 } 765 707 /*}}}1*/ 766 /*FUNCTION Pengrid::UpdateFromInputs {{{1*/ 767 void Pengrid::UpdateFromInputs(void* inputs){ 768 769 } 770 /*}}}1*/ 708 709 /*Updates: */ 710 /*FUNCTION Pengrid::UpdateFromDakota {{{1*/ 711 void Pengrid::UpdateFromDakota(void* inputs){ 712 ISSMERROR("not supported yet!"); 713 } 714 /*}}}1*/ 715 /*FUNCTION Pengrid::UpdateInputs {{{1*/ 716 void Pengrid::UpdateInputs(double* solution, int analysis_type, int sub_analysis_type){ 717 ISSMERROR("not supported yet!"); 718 } 719 /*}}}1*/ -
issm/trunk/src/c/objects/Pengrid.h
r3621 r3623 18 18 19 19 Hook hnode; //hook to 1 node 20 Hook helement; //hook to 1 element 20 21 Hook hmatpar; //hook to 1 matpar 21 22 … … 31 32 /*FUNCTION constructors, destructors {{{1*/ 32 33 Pengrid(); 33 Pengrid(int pengrid_id,int pengrid_node_id 34 Pengrid(int pengrid_id,Hook* pengrid_hnode, Hook* pengrid_h matpar, Parameters* pengrid_parameters, Inputs* pengrid_inputs);35 Pengrid(int i , IoModel* iomodel);34 Pengrid(int pengrid_id,int pengrid_node_id, int pengrid_element_id,int pengrid_matpar_id); 35 Pengrid(int pengrid_id,Hook* pengrid_hnode, Hook* pengrid_helement,Hook* pengrid_hmatpar, Parameters* pengrid_parameters, Inputs* pengrid_inputs); 36 Pengrid(int index, int id, IoModel* iomodel); 36 37 ~Pengrid(); 37 38 /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.