Changeset 23612
- Timestamp:
- 01/08/19 21:31:29 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 2 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r23602 r23612 77 77 ./classes/Constraints/SpcTransient.cpp\ 78 78 ./classes/DependentObject.cpp\ 79 ./classes/DofIndexing.cpp\80 79 ./classes/Contours.cpp\ 81 80 ./classes/Vertices.cpp\ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r23540 r23612 2970 2970 switch(set2_enum){ 2971 2971 case FsetEnum: 2972 if(nodes[i]-> indexing.fsize){2972 if(nodes[i]->fsize){ 2973 2973 if(this->nodes[i]->IsClone()) 2974 2974 o_nz += 1; … … 2978 2978 break; 2979 2979 case GsetEnum: 2980 if(nodes[i]-> indexing.gsize){2980 if(nodes[i]->gsize){ 2981 2981 if(this->nodes[i]->IsClone()) 2982 2982 o_nz += 1; … … 2986 2986 break; 2987 2987 case SsetEnum: 2988 if(nodes[i]-> indexing.ssize){2988 if(nodes[i]->ssize){ 2989 2989 if(this->nodes[i]->IsClone()) 2990 2990 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Moulin.cpp
r23588 r23612 272 272 switch(set2_enum){ 273 273 case FsetEnum: 274 if(node-> indexing.fsize){274 if(node->fsize){ 275 275 if(this->node->IsClone()) 276 276 o_nz += 1; … … 280 280 break; 281 281 case GsetEnum: 282 if(node-> indexing.gsize){282 if(node->gsize){ 283 283 if(this->node->IsClone()) 284 284 o_nz += 1; … … 288 288 break; 289 289 case SsetEnum: 290 if(node-> indexing.ssize){290 if(node->ssize){ 291 291 if(this->node->IsClone()) 292 292 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Neumannflux.cpp
r23588 r23612 305 305 switch(set2_enum){ 306 306 case FsetEnum: 307 if(nodes[i]-> indexing.fsize){307 if(nodes[i]->fsize){ 308 308 if(this->nodes[i]->IsClone()) 309 309 o_nz += 1; … … 313 313 break; 314 314 case GsetEnum: 315 if(nodes[i]-> indexing.gsize){315 if(nodes[i]->gsize){ 316 316 if(this->nodes[i]->IsClone()) 317 317 o_nz += 1; … … 321 321 break; 322 322 case SsetEnum: 323 if(nodes[i]-> indexing.ssize){323 if(nodes[i]->ssize){ 324 324 if(this->nodes[i]->IsClone()) 325 325 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
r23588 r23612 404 404 switch(set2_enum){ 405 405 case FsetEnum: 406 if(nodes[i]-> indexing.fsize){406 if(nodes[i]->fsize){ 407 407 if(this->nodes[i]->IsClone()) 408 408 o_nz += 1; … … 412 412 break; 413 413 case GsetEnum: 414 if(nodes[i]-> indexing.gsize){414 if(nodes[i]->gsize){ 415 415 if(this->nodes[i]->IsClone()) 416 416 o_nz += 1; … … 420 420 break; 421 421 case SsetEnum: 422 if(nodes[i]-> indexing.ssize){422 if(nodes[i]->ssize){ 423 423 if(this->nodes[i]->IsClone()) 424 424 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp
r23588 r23612 317 317 switch(set2_enum){ 318 318 case FsetEnum: 319 if(node-> indexing.fsize){319 if(node->fsize){ 320 320 if(this->node->IsClone()) 321 321 o_nz += 1; … … 325 325 break; 326 326 case GsetEnum: 327 if(node-> indexing.gsize){327 if(node->gsize){ 328 328 if(this->node->IsClone()) 329 329 o_nz += 1; … … 333 333 break; 334 334 case SsetEnum: 335 if(node-> indexing.ssize){335 if(node->ssize){ 336 336 if(this->node->IsClone()) 337 337 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Penpair.cpp
r23588 r23612 240 240 switch(set2_enum){ 241 241 case FsetEnum: 242 if(nodes[i]-> indexing.fsize){242 if(nodes[i]->fsize){ 243 243 if(this->nodes[i]->IsClone()) 244 244 o_nz += 1; … … 248 248 break; 249 249 case GsetEnum: 250 if(nodes[i]-> indexing.gsize){250 if(nodes[i]->gsize){ 251 251 if(this->nodes[i]->IsClone()) 252 252 o_nz += 1; … … 256 256 break; 257 257 case SsetEnum: 258 if(nodes[i]-> indexing.ssize){258 if(nodes[i]->ssize){ 259 259 if(this->nodes[i]->IsClone()) 260 260 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp
r23588 r23612 401 401 switch(set2_enum){ 402 402 case FsetEnum: 403 if(nodes[i]-> indexing.fsize){403 if(nodes[i]->fsize){ 404 404 if(this->nodes[i]->IsClone()) 405 405 o_nz += 1; … … 409 409 break; 410 410 case GsetEnum: 411 if(nodes[i]-> indexing.gsize){411 if(nodes[i]->gsize){ 412 412 if(this->nodes[i]->IsClone()) 413 413 o_nz += 1; … … 417 417 break; 418 418 case SsetEnum: 419 if(nodes[i]-> indexing.ssize){419 if(nodes[i]->ssize){ 420 420 if(this->nodes[i]->IsClone()) 421 421 o_nz += 1; -
issm/trunk-jpl/src/c/classes/Node.cpp
r23602 r23612 19 19 Node::Node(){/*{{{*/ 20 20 this->approximation=0; 21 } 22 /*}}}*/ 23 Node::Node(int node_id,int node_sid,int node_lid,int node_pid,int io_index,bool isclone,IoModel* iomodel,int analysis_enum,int in_approximation,bool isamr){/*{{{*/ 24 25 /*Intermediary*/ 26 int k,l; 27 int *doftypes = NULL; 21 22 this->gsize = -1; 23 this->fsize = -1; 24 this->ssize = -1; 25 this->clone = false; 26 this->active = true; 27 this->freeze = false; 28 this->f_set = NULL; 29 this->s_set = NULL; 30 this->svalues = NULL; 31 this->doftype = NULL; 32 this->gdoflist = NULL; 33 this->fdoflist = NULL; 34 this->sdoflist = NULL; 35 } 36 /*}}}*/ 37 Node::Node(int node_id,int node_sid,int node_lid,int node_pid,int io_index,bool node_clone,IoModel* iomodel,int node_analysis,int in_approximation,bool isamr){/*{{{*/ 28 38 29 39 /*id: */ … … 32 42 this->lid = node_lid; 33 43 this->pid = node_pid; 34 this->analysis_enum = analysis_enum; 44 this->analysis_enum = node_analysis; 45 this->clone = node_clone; 35 46 36 47 /*Initialize coord_system: Identity matrix by default*/ 37 for(k=0;k<3;k++) for(l=0;l<3;l++) this->coord_system[k][l]=0.0; 38 for(k=0;k<3;k++) this->coord_system[k][k]=1.0; 48 for(int k=0;k<3;k++) for(int l=0;l<3;l++) this->coord_system[k][l]=0.0; 49 for(int k=0;k<3;k++) this->coord_system[k][k]=1.0; 50 51 this->gsize = -1; 52 this->fsize = -1; 53 this->ssize = -1; 54 this->active = true; 55 this->freeze = false; 56 this->f_set = NULL; 57 this->s_set = NULL; 58 this->svalues = NULL; 59 this->doftype = NULL; 60 this->gdoflist = NULL; 61 this->fdoflist = NULL; 62 this->sdoflist = NULL; 39 63 40 64 /*indexing:*/ 41 65 this->indexingupdate = true; 42 43 Analysis* analysis = EnumToAnalysis(analysis_enum); 44 int numdofs = analysis->DofsPerNode(&doftypes,iomodel->domaintype,in_approximation); 45 indexing.Init(numdofs,isclone,doftypes); 46 xDelete<int>(doftypes); 66 Analysis *analysis = EnumToAnalysis(analysis_enum); 67 int *doftypes = NULL; 68 this->gsize = analysis->DofsPerNode(&this->doftype,iomodel->domaintype,in_approximation); 69 if(this->gsize>0){ 70 this->f_set = xNew<bool>(this->gsize); 71 this->s_set = xNew<bool>(this->gsize); 72 this->svalues = xNew<IssmDouble>(this->gsize); 73 this->gdoflist = xNew<int>(this->gsize); 74 } 75 76 /*Assign values assuming no Dirichlet at this point*/ 77 for(int i=0;i<this->gsize;i++){ 78 this->f_set[i] = true; 79 this->s_set[i] = false; 80 this->svalues[i] = 0.; 81 this->gdoflist[i] = -1; 82 } 47 83 delete analysis; 48 84 … … 80 116 if(in_approximation==SSAFSApproximationEnum && reCast<int>(iomodel->Data("md.flowequation.borderSSA")[io_index])){ 81 117 if(!reCast<int>(iomodel->Data("md.mesh.vertexonbase")[io_index])){ 82 for( k=0;k<=1;k++) this->FreezeDof(k);118 for(int k=0;k<=1;k++) this->FreezeDof(k); 83 119 } 84 120 } … … 124 160 /*}}}*/ 125 161 Node::~Node(){/*{{{*/ 162 163 if(this->f_set) xDelete<bool>(f_set); 164 if(this->s_set) xDelete<bool>(s_set); 165 if(this->svalues) xDelete<IssmDouble>(svalues); 166 if(this->doftype) xDelete<int>(doftype); 167 if(this->gdoflist) xDelete<int>(gdoflist); 168 if(this->fdoflist) xDelete<int>(fdoflist); 169 if(this->sdoflist) xDelete<int>(sdoflist); 126 170 return; 127 171 } 128 172 /*}}}*/ 129 173 Object* Node::copy(void){/*{{{*/ 130 131 int k,l;132 174 133 175 /*output: */ … … 146 188 147 189 /*Initialize coord_system: */ 148 for( k=0;k<3;k++) for(l=0;l<3;l++) output->coord_system[k][l]=this->coord_system[k][l];190 for(int k=0;k<3;k++) for(int l=0;l<3;l++) output->coord_system[k][l]=this->coord_system[k][l]; 149 191 150 192 /*indexing:*/ 151 193 output->indexingupdate = this->indexingupdate; 152 output->indexing.copy(this->indexing); 194 output->gsize = this->gsize; 195 output->fsize = this->fsize; 196 output->ssize = this->ssize; 197 output->clone = this->clone; 198 output->active = this->active; 199 output->freeze = this->freeze; 200 if(output->gsize>0){ 201 output->f_set=xNew<bool>(output->gsize); 202 output->s_set=xNew<bool>(output->gsize); 203 output->svalues=xNew<IssmDouble>(output->gsize); 204 if(this->doftype) output->doftype=xNew<int>(output->gsize); 205 output->gdoflist=xNew<int>(output->gsize); 206 } 207 if(output->fsize>0)output->fdoflist=xNew<int>(output->fsize); 208 if(output->ssize>0)output->sdoflist=xNew<int>(output->ssize); 209 210 if(output->gsize>0){ 211 memcpy(output->f_set,this->f_set,output->gsize*sizeof(bool)); 212 memcpy(output->s_set,this->s_set,output->gsize*sizeof(bool)); 213 xMemCpy<IssmDouble>(output->svalues,this->svalues,output->gsize); 214 if(output->doftype)memcpy(output->doftype,this->doftype,output->gsize*sizeof(int)); 215 memcpy(output->gdoflist,this->gdoflist,output->gsize*sizeof(int)); 216 } 217 if(output->fsize>0)memcpy(output->fdoflist,this->fdoflist,output->fsize*sizeof(int)); 218 if(output->ssize>0)memcpy(output->sdoflist,this->sdoflist,output->ssize*sizeof(int)); 153 219 154 220 return (Object*)output; … … 163 229 MARSHALLING(pid); 164 230 MARSHALLING(indexingupdate); 165 indexing.Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);231 Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction); 166 232 MARSHALLING(analysis_enum); 167 233 MARSHALLING_ARRAY(coord_system,IssmDouble,9); 168 234 169 } 170 /*}}}*/ 235 MARSHALLING(gsize); 236 MARSHALLING(fsize); 237 MARSHALLING(ssize); 238 MARSHALLING(clone); 239 MARSHALLING(active); 240 MARSHALLING(freeze); 241 MARSHALLING_DYNAMIC(f_set,bool,gsize); 242 MARSHALLING_DYNAMIC(s_set,bool,gsize); 243 MARSHALLING_DYNAMIC(svalues,IssmDouble,gsize); 244 MARSHALLING_DYNAMIC(doftype,int,gsize); 245 MARSHALLING_DYNAMIC(gdoflist,int,gsize); 246 MARSHALLING_DYNAMIC(fdoflist,int,fsize); 247 MARSHALLING_DYNAMIC(sdoflist,int,ssize); 248 } /*}}}*/ 171 249 172 250 /*Object virtual functions definitions:*/ 173 251 void Node::DeepEcho(void){/*{{{*/ 174 252 253 int i; 175 254 _printf_("Node:\n"); 176 255 _printf_(" id: " << id << "\n"); … … 179 258 _printf_(" approximation: " << EnumToStringx(approximation) << "\n"); 180 259 _printf_(" indexingupdate: " << indexingupdate << "\n"); 181 indexing.DeepEcho(); 260 _printf_(" gsize: " << gsize << "\n"); 261 _printf_(" fsize: " << fsize << "\n"); 262 _printf_(" ssize: " << ssize << "\n"); 263 _printf_(" clone: " << clone << "\n"); 264 _printf_(" active: " << active << "\n"); 265 _printf_(" freeze: " << freeze << "\n"); 266 _printf_(" f_set = [ "); 267 for(i=0;i<gsize;i++) _printf_((f_set[i]?1:0)<< " "); 268 _printf_("]\n"); 269 _printf_(" s_set = [ "); 270 for(i=0;i<gsize;i++) _printf_((s_set[i]?1:0)<< " "); 271 _printf_("]\n"); 272 _printf_(" svalues (" << this->ssize << "): |"); 273 for(i=0;i<this->gsize;i++){ 274 if(this->s_set[i])_printf_(" " << svalues[i] << " |"); 275 } 276 _printf_("\n"); 277 if(doftype){ 278 _printf_(" doftype: |"); 279 for(i=0;i<gsize;i++){ 280 _printf_(" " << doftype[i] << " |"); 281 } 282 _printf_("\n"); 283 } 284 else _printf_(" doftype: NULL\n"); 285 286 _printf_(" g_doflist (" << this->gsize << "): |"); 287 for(i=0;i<this->gsize;i++){ 288 _printf_(" " << gdoflist[i] << " |"); 289 } 290 _printf_("\n"); 291 292 _printf_(" f_doflist (" << this->fsize << "): |"); 293 for(i=0;i<this->fsize;i++){ 294 _printf_(" " << fdoflist[i] << " |"); 295 } 296 _printf_("\n"); 297 298 _printf_(" s_doflist (" << this->ssize << "): |"); 299 for(i=0;i<this->ssize;i++){ 300 _printf_(" " << sdoflist[i] << " |"); 301 } 302 _printf_("\n"); 182 303 183 304 } … … 193 314 _printf_(" approximation: " << EnumToStringx(approximation) << "\n"); 194 315 _printf_(" indexingupdate: " << indexingupdate << "\n"); 195 indexing.Echo(); 196 316 _printf_(" gsize: " << gsize << "\n"); 317 _printf_(" fsize: " << fsize << "\n"); 318 _printf_(" ssize: " << ssize << "\n"); 319 _printf_(" clone: " << clone << "\n"); 320 _printf_(" active: " << active << "\n"); 321 _printf_(" freeze: " << freeze << "\n"); 197 322 } 198 323 /*}}}*/ … … 218 343 _assert_(!this->indexingupdate); 219 344 if(setenum==GsetEnum){ 220 _assert_(dofindex>=0 && dofindex< indexing.gsize);221 return indexing.gdoflist[dofindex];345 _assert_(dofindex>=0 && dofindex<gsize); 346 return gdoflist[dofindex]; 222 347 } 223 348 else if(setenum==FsetEnum){ 224 _assert_(dofindex>=0 && dofindex< indexing.fsize);225 return indexing.fdoflist[dofindex];349 _assert_(dofindex>=0 && dofindex<fsize); 350 return fdoflist[dofindex]; 226 351 } 227 352 else if(setenum==SsetEnum){ 228 _assert_(dofindex>=0 && dofindex< indexing.ssize);229 return indexing.sdoflist[dofindex];353 _assert_(dofindex>=0 && dofindex<ssize); 354 return sdoflist[dofindex]; 230 355 } 231 356 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); … … 240 365 241 366 if(approximation_enum==NoneApproximationEnum){ 242 if(setenum==GsetEnum)for(i=0;i<this-> indexing.gsize;i++) outdoflist[i]=indexing.gdoflist[i];243 if(setenum==FsetEnum)for(i=0;i<this-> indexing.fsize;i++) outdoflist[i]=indexing.fdoflist[i];244 if(setenum==SsetEnum)for(i=0;i<this-> indexing.ssize;i++) outdoflist[i]=indexing.sdoflist[i];367 if(setenum==GsetEnum)for(i=0;i<this->gsize;i++) outdoflist[i]=gdoflist[i]; 368 if(setenum==FsetEnum)for(i=0;i<this->fsize;i++) outdoflist[i]=fdoflist[i]; 369 if(setenum==SsetEnum)for(i=0;i<this->ssize;i++) outdoflist[i]=sdoflist[i]; 245 370 } 246 371 else{ 247 372 248 373 if(setenum==GsetEnum){ 249 if( indexing.doftype){374 if(doftype){ 250 375 count=0; 251 for(i=0;i<this-> indexing.gsize;i++){252 if( indexing.doftype[i]==approximation_enum){253 outdoflist[count]= indexing.gdoflist[i];376 for(i=0;i<this->gsize;i++){ 377 if(doftype[i]==approximation_enum){ 378 outdoflist[count]=gdoflist[i]; 254 379 count++; 255 380 } … … 257 382 _assert_(count); //at least one dof should be the approximation requested 258 383 } 259 else for(i=0;i<this-> indexing.gsize;i++) outdoflist[i]=indexing.gdoflist[i];384 else for(i=0;i<this->gsize;i++) outdoflist[i]=gdoflist[i]; 260 385 } 261 386 else if(setenum==FsetEnum){ 262 if( indexing.doftype){387 if(doftype){ 263 388 count=0; 264 389 count2=0; 265 for(i=0;i<this-> indexing.gsize;i++){266 if( indexing.f_set[i]){267 if( indexing.doftype[i]==approximation_enum){268 outdoflist[count]= indexing.fdoflist[count2];390 for(i=0;i<this->gsize;i++){ 391 if(f_set[i]){ 392 if(doftype[i]==approximation_enum){ 393 outdoflist[count]=fdoflist[count2]; 269 394 count++; 270 395 } … … 273 398 } 274 399 } 275 else for(i=0;i<this-> indexing.fsize;i++) outdoflist[i]=indexing.fdoflist[i];400 else for(i=0;i<this->fsize;i++) outdoflist[i]=fdoflist[i]; 276 401 } 277 402 else if(setenum==SsetEnum){ 278 if( indexing.doftype){403 if(doftype){ 279 404 count=0; 280 405 count2=0; 281 for(i=0;i<this-> indexing.gsize;i++){282 if( indexing.s_set[i]){283 if( indexing.doftype[i]==approximation_enum){284 outdoflist[count]= indexing.sdoflist[count2];406 for(i=0;i<this->gsize;i++){ 407 if(s_set[i]){ 408 if(doftype[i]==approximation_enum){ 409 outdoflist[count]=sdoflist[count2]; 285 410 count++; 286 411 } … … 289 414 } 290 415 } 291 else for(i=0;i<this-> indexing.ssize;i++) outdoflist[i]=indexing.sdoflist[i];416 else for(i=0;i<this->ssize;i++) outdoflist[i]=sdoflist[i]; 292 417 } 293 418 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); … … 303 428 304 429 if(approximation_enum==NoneApproximationEnum){ 305 if(setenum==GsetEnum)for(i=0;i<this-> indexing.gsize;i++) outdoflist[i]=i;430 if(setenum==GsetEnum)for(i=0;i<this->gsize;i++) outdoflist[i]=i; 306 431 else if(setenum==FsetEnum){ 307 432 count=0; 308 for(i=0;i<this-> indexing.gsize;i++){309 if( indexing.f_set[i]){433 for(i=0;i<this->gsize;i++){ 434 if(f_set[i]){ 310 435 outdoflist[count]=i; 311 436 count++; … … 315 440 else if(setenum==SsetEnum){ 316 441 count=0; 317 for(i=0;i<this-> indexing.gsize;i++){318 if( indexing.s_set[i]){442 for(i=0;i<this->gsize;i++){ 443 if(s_set[i]){ 319 444 outdoflist[count]=i; 320 445 count++; … … 327 452 328 453 if(setenum==GsetEnum){ 329 if( indexing.doftype){454 if(doftype){ 330 455 count=0; 331 for(i=0;i<this-> indexing.gsize;i++){332 if( indexing.doftype[i]==approximation_enum){456 for(i=0;i<this->gsize;i++){ 457 if(doftype[i]==approximation_enum){ 333 458 outdoflist[count]=count; 334 459 count++; … … 337 462 _assert_(count); 338 463 } 339 else for(i=0;i<this-> indexing.gsize;i++) outdoflist[i]=i;464 else for(i=0;i<this->gsize;i++) outdoflist[i]=i; 340 465 } 341 466 else if(setenum==FsetEnum){ 342 467 343 if( indexing.doftype){468 if(doftype){ 344 469 count=0; 345 470 count2=0; 346 for(i=0;i<this-> indexing.gsize;i++){347 if( indexing.doftype[i]==approximation_enum){348 if( indexing.f_set[i]){471 for(i=0;i<this->gsize;i++){ 472 if(doftype[i]==approximation_enum){ 473 if(f_set[i]){ 349 474 outdoflist[count]=count2; 350 475 count++; … … 358 483 359 484 count=0; 360 for(i=0;i<this-> indexing.gsize;i++){361 if( indexing.f_set[i]){485 for(i=0;i<this->gsize;i++){ 486 if(f_set[i]){ 362 487 outdoflist[count]=i; 363 488 count++; … … 367 492 } 368 493 else if(setenum==SsetEnum){ 369 if( indexing.doftype){494 if(doftype){ 370 495 count=0; 371 496 count2=0; 372 for(i=0;i<this-> indexing.gsize;i++){373 if( indexing.doftype[i]==approximation_enum){374 if( indexing.s_set[i]){497 for(i=0;i<this->gsize;i++){ 498 if(doftype[i]==approximation_enum){ 499 if(s_set[i]){ 375 500 outdoflist[count]=count2; 376 501 count++; … … 383 508 else{ 384 509 count=0; 385 for(i=0;i<this-> indexing.gsize;i++){386 if( indexing.s_set[i]){510 for(i=0;i<this->gsize;i++){ 511 if(s_set[i]){ 387 512 outdoflist[count]=i; 388 513 count++; … … 407 532 void Node::Activate(void){/*{{{*/ 408 533 409 if(!IsActive() && !this-> indexing.freeze){534 if(!IsActive() && !this->freeze){ 410 535 this->indexingupdate = true; 411 indexing.Activate(); 536 this->active = true; 537 for(int i=0;i<this->gsize;i++){ 538 this->f_set[i] = true; 539 this->s_set[i] = false; 540 this->svalues[i] = 0.; 541 } 412 542 } 413 543 … … 419 549 * dofs are constrained to a certain value (dirichlet boundary condition*/ 420 550 DofInSSet(dof); 421 this-> indexing.svalues[dof]=value;551 this->svalues[dof]=value; 422 552 } 423 553 /*}}}*/ … … 429 559 430 560 /*Recover values for s set and plug them in constraints vector: */ 431 if(this-> indexing.ssize){432 values=xNew<IssmDouble>(this-> indexing.ssize);561 if(this->ssize){ 562 values=xNew<IssmDouble>(this->ssize); 433 563 count=0; 434 for(i=0;i<this-> indexing.gsize;i++){435 if(this-> indexing.s_set[i]){436 values[count]=this-> indexing.svalues[i];564 for(i=0;i<this->gsize;i++){ 565 if(this->s_set[i]){ 566 values[count]=this->svalues[i]; 437 567 _assert_(!xIsNan<IssmDouble>(values[count])); 438 568 count++; … … 441 571 442 572 /*Add values into constraint vector: */ 443 ys->SetValues(this-> indexing.ssize,this->indexing.sdoflist,values,INS_VAL);573 ys->SetValues(this->ssize,this->sdoflist,values,INS_VAL); 444 574 } 445 575 … … 451 581 void Node::Deactivate(void){/*{{{*/ 452 582 453 if(IsActive() && !this-> indexing.freeze){583 if(IsActive() && !this->freeze){ 454 584 this->indexingupdate = true; 455 indexing.Deactivate(); 456 } 457 458 } 459 /*}}}*/ 585 this->active = false; 586 /*Constrain to 0. at this point*/ 587 for(int i=0;i<this->gsize;i++){ 588 this->f_set[i] = false; 589 this->s_set[i] = true; 590 this->svalues[i] = 0.; 591 } 592 } 593 } /*}}}*/ 460 594 void Node::DofInFSet(int dof){/*{{{*/ 461 595 462 596 /*Put dof for this node into the f set (ie, this dof will NOT be constrained 463 597 * to a fixed value during computations. Only do this for active nodes. */ 464 _assert_(dof<this-> indexing.gsize);465 _assert_(this-> indexing.active);466 467 if(this-> indexing.f_set[dof] == 0){468 if(this-> indexing.freeze) _error_("Cannot change dof of frozen node");598 _assert_(dof<this->gsize); 599 _assert_(this->active); 600 601 if(this->f_set[dof] == 0){ 602 if(this->freeze) _error_("Cannot change dof of frozen node"); 469 603 this->indexingupdate = true; 470 this-> indexing.f_set[dof]=1;471 this-> indexing.s_set[dof]=0;604 this->f_set[dof]=1; 605 this->s_set[dof]=0; 472 606 } 473 607 } … … 477 611 /*Put dof for this node into the s set (ie, this dof will be constrained 478 612 * to a fixed value during computations. */ 479 _assert_(dof<this-> indexing.gsize);480 481 if(this-> indexing.f_set[dof] == 1){482 //if(this-> indexing.freeze) _error_("Cannot change dof of frozen node");613 _assert_(dof<this->gsize); 614 615 if(this->f_set[dof] == 1){ 616 //if(this->freeze) _error_("Cannot change dof of frozen node"); 483 617 this->indexingupdate = true; 484 this-> indexing.f_set[dof]=0; //n splits into f (for which we solve) and s (single point constraints)485 this-> indexing.s_set[dof]=1;618 this->f_set[dof]=0; //n splits into f (for which we solve) and s (single point constraints) 619 this->s_set[dof]=1; 486 620 } 487 621 } … … 491 625 DofInSSet(dof); //with 0 displacement for this dof. 492 626 //FIXME: for now we don't want this element to change so we use freeze 493 this-> indexing.freeze =true;627 this->freeze =true; 494 628 495 629 } … … 514 648 515 649 if(approximation_enum==NoneApproximationEnum){ 516 if (setenum==GsetEnum) numdofs=this-> indexing.gsize;517 else if (setenum==FsetEnum) numdofs=this-> indexing.fsize;518 else if (setenum==SsetEnum) numdofs=this-> indexing.ssize;650 if (setenum==GsetEnum) numdofs=this->gsize; 651 else if (setenum==FsetEnum) numdofs=this->fsize; 652 else if (setenum==SsetEnum) numdofs=this->ssize; 519 653 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); 520 654 } 521 655 else{ 522 656 if(setenum==GsetEnum){ 523 if(this-> indexing.doftype){657 if(this->doftype){ 524 658 numdofs=0; 525 for(i=0;i<this-> indexing.gsize;i++){526 if(this-> indexing.doftype[i]==approximation_enum) numdofs++;527 } 528 } 529 else numdofs=this-> indexing.gsize;659 for(i=0;i<this->gsize;i++){ 660 if(this->doftype[i]==approximation_enum) numdofs++; 661 } 662 } 663 else numdofs=this->gsize; 530 664 } 531 665 else if (setenum==FsetEnum){ 532 if(this-> indexing.doftype){666 if(this->doftype){ 533 667 numdofs=0; 534 for(i=0;i<this-> indexing.gsize;i++){535 if((this-> indexing.doftype[i]==approximation_enum) && (this->indexing.f_set[i])) numdofs++;536 } 537 } 538 else numdofs=this-> indexing.fsize;668 for(i=0;i<this->gsize;i++){ 669 if((this->doftype[i]==approximation_enum) && (this->f_set[i])) numdofs++; 670 } 671 } 672 else numdofs=this->fsize; 539 673 } 540 674 else if (setenum==SsetEnum){ 541 if(this-> indexing.doftype){675 if(this->doftype){ 542 676 numdofs=0; 543 for(i=0;i<this-> indexing.gsize;i++){544 if((this-> indexing.doftype[i]==approximation_enum) && (this->indexing.s_set[i])) numdofs++;545 } 546 } 547 else numdofs=this-> indexing.ssize;677 for(i=0;i<this->gsize;i++){ 678 if((this->doftype[i]==approximation_enum) && (this->s_set[i])) numdofs++; 679 } 680 } 681 else numdofs=this->ssize; 548 682 } 549 683 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); … … 554 688 void Node::HardDeactivate(void){/*{{{*/ 555 689 556 this-> indexing.Deactivate();557 this-> indexing.freeze =true;690 this->Deactivate(); 691 this->freeze =true; 558 692 559 693 } … … 561 695 bool Node::IsActive(void){/*{{{*/ 562 696 563 return indexing.active;697 return active; 564 698 565 699 } … … 567 701 int Node::IsClone(){/*{{{*/ 568 702 569 return indexing.clone;703 return clone; 570 704 571 705 } … … 581 715 /*Dof should be added to the f-set, and taken out of the s-set:*/ 582 716 DofInFSet(dof); 583 this-> indexing.svalues[dof]=0.;717 this->svalues[dof]=0.; 584 718 } 585 719 /*}}}*/ … … 599 733 int ind_ys = *pindex_ys; 600 734 601 if(this-> indexing.fsize){602 int* indices = xNew<int>(this-> indexing.fsize);603 IssmDouble* values = xNew<IssmDouble>(this-> indexing.fsize);735 if(this->fsize){ 736 int* indices = xNew<int>(this->fsize); 737 IssmDouble* values = xNew<IssmDouble>(this->fsize); 604 738 605 739 int count = 0; 606 for(int i=0;i<this-> indexing.gsize;i++){607 if(this-> indexing.f_set[i]){740 for(int i=0;i<this->gsize;i++){ 741 if(this->f_set[i]){ 608 742 _assert_(local_uf); 609 _assert_(this-> indexing.fdoflist[count]==indices_uf[ind_uf]);743 _assert_(this->fdoflist[count]==indices_uf[ind_uf]); 610 744 611 745 values[count]=local_uf[ind_uf]; 612 indices[count]=this-> indexing.gdoflist[i];746 indices[count]=this->gdoflist[i]; 613 747 count++; 614 748 ind_uf++; 615 749 } 616 750 } 617 ug->SetValues(this-> indexing.fsize,indices,values,INS_VAL);751 ug->SetValues(this->fsize,indices,values,INS_VAL); 618 752 /*Free ressources:*/ 619 753 xDelete<IssmDouble>(values); 620 754 xDelete<int>(indices); 621 755 } 622 if(this-> indexing.ssize){623 int* indices = xNew<int>(this-> indexing.ssize);624 IssmDouble* values = xNew<IssmDouble>(this-> indexing.ssize);756 if(this->ssize){ 757 int* indices = xNew<int>(this->ssize); 758 IssmDouble* values = xNew<IssmDouble>(this->ssize); 625 759 626 760 int count = 0; 627 for(int i=0;i<this-> indexing.gsize;i++){628 if(this-> indexing.s_set[i]){761 for(int i=0;i<this->gsize;i++){ 762 if(this->s_set[i]){ 629 763 _assert_(local_ys); 630 _assert_(this-> indexing.sdoflist[count]==indices_ys[ind_ys]);764 _assert_(this->sdoflist[count]==indices_ys[ind_ys]); 631 765 632 766 values[count]=local_ys[ind_ys]; 633 indices[count]=this-> indexing.gdoflist[i];767 indices[count]=this->gdoflist[i]; 634 768 count++; 635 769 ind_ys++; 636 770 } 637 771 } 638 ug->SetValues(this-> indexing.ssize,indices,values,INS_VAL);772 ug->SetValues(this->ssize,indices,values,INS_VAL); 639 773 /*Free ressources:*/ 640 774 xDelete<IssmDouble>(values); … … 654 788 655 789 if(setenum==FsetEnum){ 656 if(this-> indexing.fsize){657 values=xNew<IssmDouble>(this-> indexing.fsize);658 659 for(i=0;i<this-> indexing.gsize;i++){660 if(this-> indexing.f_set[i]){790 if(this->fsize){ 791 values=xNew<IssmDouble>(this->fsize); 792 793 for(i=0;i<this->gsize;i++){ 794 if(this->f_set[i]){ 661 795 _assert_(ug_serial); 662 values[count]=ug_serial[this-> indexing.gdoflist[i]];796 values[count]=ug_serial[this->gdoflist[i]]; 663 797 count++; 664 798 } … … 666 800 667 801 /*Add values into ug: */ 668 vector->SetValues(this-> indexing.fsize,this->indexing.fdoflist,values,INS_VAL);802 vector->SetValues(this->fsize,this->fdoflist,values,INS_VAL); 669 803 } 670 804 } 671 805 else if(setenum==SsetEnum){ 672 if(this-> indexing.ssize){673 values=xNew<IssmDouble>(this-> indexing.ssize);674 675 for(i=0;i<this-> indexing.gsize;i++){676 if(this-> indexing.s_set[i]){806 if(this->ssize){ 807 values=xNew<IssmDouble>(this->ssize); 808 809 for(i=0;i<this->gsize;i++){ 810 if(this->s_set[i]){ 677 811 _assert_(ug_serial); 678 values[count]=ug_serial[this-> indexing.gdoflist[i]];812 values[count]=ug_serial[this->gdoflist[i]]; 679 813 count++; 680 814 } … … 682 816 683 817 /*Add values into ug: */ 684 vector->SetValues(this-> indexing.ssize,this->indexing.sdoflist,values,INS_VAL);818 vector->SetValues(this->ssize,this->sdoflist,values,INS_VAL); 685 819 } 686 820 } … … 701 835 702 836 /*Initialize: */ 703 if(setenum==FsetEnum) this->indexing.InitSet(setenum); 704 if(setenum==SsetEnum) this->indexing.InitSet(setenum); 837 int size=0; 838 if(setenum==FsetEnum){ 839 for(i=0;i<this->gsize;i++) if(f_set[i])size++; 840 this->fsize=size; 841 xDelete<int>(this->fdoflist); 842 843 if(this->fsize) 844 this->fdoflist=xNew<int>(size); 845 else 846 this->fdoflist=NULL; 847 } 848 if(setenum==SsetEnum){ 849 for(i=0;i<this->gsize;i++) if(s_set[i])size++; 850 this->ssize=size; 851 xDelete<int>(this->sdoflist); 852 853 if(this->ssize) 854 this->sdoflist=xNew<int>(size); 855 else 856 this->sdoflist=NULL; 857 } 705 858 706 859 /*For clone nodfs, don't distribute dofs, we will get them from another cpu in UpdateCloneDofs!*/ 707 if(indexing.clone){ 708 return; 709 } 860 if(clone) return; 710 861 711 862 /*This node should distribute dofs for setenum set (eg, f_set or s_set), go ahead: */ 712 863 if(setenum==GsetEnum){ 713 for(i=0;i<this-> indexing.gsize;i++){714 indexing.gdoflist[i]=dofcount+i;715 } 716 dofcount+=this-> indexing.gsize;864 for(i=0;i<this->gsize;i++){ 865 gdoflist[i]=dofcount+i; 866 } 867 dofcount+=this->gsize; 717 868 } 718 869 else if(setenum==FsetEnum){ 719 for(i=0;i<this-> indexing.fsize;i++){720 indexing.fdoflist[i]=dofcount+i;721 } 722 dofcount+=this-> indexing.fsize;870 for(i=0;i<this->fsize;i++){ 871 fdoflist[i]=dofcount+i; 872 } 873 dofcount+=this->fsize; 723 874 } 724 875 else if(setenum==SsetEnum){ 725 for(i=0;i<this-> indexing.ssize;i++){726 indexing.sdoflist[i]=dofcount+i;727 } 728 dofcount+=this-> indexing.ssize;876 for(i=0;i<this->ssize;i++){ 877 sdoflist[i]=dofcount+i; 878 } 879 dofcount+=this->ssize; 729 880 } 730 881 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); … … 738 889 int i; 739 890 740 if( indexing.clone){891 if(clone){ 741 892 /*This node is a clone, don't off_set the dofs!: */ 742 893 return; … … 745 896 /*This node should off_set the dofs, go ahead: */ 746 897 if(setenum==GsetEnum){ 747 for(i=0;i<this-> indexing.gsize;i++) indexing.gdoflist[i]+=dofcount;898 for(i=0;i<this->gsize;i++) gdoflist[i]+=dofcount; 748 899 } 749 900 else if(setenum==FsetEnum){ 750 for(i=0;i<this-> indexing.fsize;i++) indexing.fdoflist[i]+=dofcount;901 for(i=0;i<this->fsize;i++) fdoflist[i]+=dofcount; 751 902 } 752 903 else if(setenum==SsetEnum){ 753 for(i=0;i<this-> indexing.ssize;i++) indexing.sdoflist[i]+=dofcount;904 for(i=0;i<this->ssize;i++) sdoflist[i]+=dofcount; 754 905 } 755 906 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); … … 758 909 void Node::ShowTrueDofs(int* truedofs,int setenum){/*{{{*/ 759 910 760 _assert_(!this-> indexing.clone);911 _assert_(!this->clone); 761 912 762 913 /*Ok, we are not a clone, just plug our dofs into truedofs: */ 763 914 switch(setenum){ 764 915 case GsetEnum: 765 for(int j=0;j<this-> indexing.gsize;j++) truedofs[j]=indexing.gdoflist[j];916 for(int j=0;j<this->gsize;j++) truedofs[j]=gdoflist[j]; 766 917 break; 767 918 case FsetEnum: 768 for(int j=0;j<this-> indexing.fsize;j++) truedofs[j]=indexing.fdoflist[j];919 for(int j=0;j<this->fsize;j++) truedofs[j]=fdoflist[j]; 769 920 break; 770 921 case SsetEnum: 771 for(int j=0;j<this-> indexing.ssize;j++) truedofs[j]=indexing.sdoflist[j];922 for(int j=0;j<this->ssize;j++) truedofs[j]=sdoflist[j]; 772 923 break; 773 924 default: … … 779 930 void Node::UpdateCloneDofs(int* alltruedofs,int setenum){/*{{{*/ 780 931 781 _assert_(this-> indexing.clone);932 _assert_(this->clone); 782 933 783 934 /*Ok, we are a clone node, but we did not create the dofs for this node. … … 785 936 switch(setenum){ 786 937 case GsetEnum: 787 for(int j=0;j<this-> indexing.gsize;j++) indexing.gdoflist[j]=alltruedofs[j];938 for(int j=0;j<this->gsize;j++) gdoflist[j]=alltruedofs[j]; 788 939 break; 789 940 case FsetEnum: 790 for(int j=0;j<this-> indexing.fsize;j++) indexing.fdoflist[j]=alltruedofs[j];941 for(int j=0;j<this->fsize;j++) fdoflist[j]=alltruedofs[j]; 791 942 break; 792 943 case SsetEnum: 793 for(int j=0;j<this-> indexing.ssize;j++) indexing.sdoflist[j]=alltruedofs[j];944 for(int j=0;j<this->ssize;j++) sdoflist[j]=alltruedofs[j]; 794 945 break; 795 946 default: -
issm/trunk-jpl/src/c/classes/Node.h
r23602 r23612 10 10 #include "../datastructures/datastructures.h" 11 11 #include "../shared/shared.h" 12 #include "./DofIndexing.h"13 12 class Inputs; 14 13 class Hook; … … 16 15 class DataSet; 17 16 class Vertices; 18 template <class doubletype> class 19 template <class doubletype> class 17 template <class doubletype> class Vector; 18 template <class doubletype> class Matrix; 20 19 class ElementVector; 21 20 class ElementMatrix; … … 34 33 int pid; // parallel id (specific to this partition) 35 34 36 int analysis_enum; 35 bool clone; //this node is replicated from another one 36 int analysis_enum; 37 37 IssmDouble coord_system[3][3]; 38 38 bool indexingupdate; 39 DofIndexing indexing; 39 40 /*sizes: */ 41 int gsize; //number of dofs for a node 42 int fsize; //number of dofs solver for 43 int ssize; //number of constrained dofs 44 45 /*Activation*/ 46 bool active; //Is this node active or inactive (all dofs are constrained) 47 bool freeze; //this is required for 2d solutions, we never activate nodes that are not on base 48 49 /*boundary conditions sets: */ 50 bool *f_set; //is dof on f-set (on which we solve) 51 bool *s_set; //is dof on s-set (on which boundary conditions -dirichlet- are applied) 52 IssmDouble *svalues; //list of constraint values. size g_size, for ease of use. 53 54 /*types of dofs: */ 55 int *doftype; //approximation type of the dofs (used only for coupling), size g_size 56 57 /*list of degrees of freedom: */ 58 int *gdoflist; //dof list in g_set 59 int *fdoflist; //dof list in f_set 60 int *sdoflist; //dof list in s_set 40 61 41 62 /*Node constructors, destructors*/ -
issm/trunk-jpl/src/c/classes/classes.h
r23524 r23612 129 129 /*diverse: */ 130 130 #include "./Hook.h" 131 #include "./DofIndexing.h"132 131 #include "./IoModel.h" 133 132 #include "./FemModel.h" -
issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp
r23587 r23612 249 249 Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i)); 250 250 if(!node->IsClone()){ 251 for(j=0;j<node-> indexing.fsize;j++){251 for(j=0;j<node->fsize;j++){ 252 252 _assert_(count<m); 253 253 d_nnz[count]=numberofdofspernode*(d_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]); -
issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp
r23587 r23612 9 9 void GetSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel){ 10 10 11 /*intermediary: */12 int gsize;13 int analysisenum;14 15 /*output: */16 Vector<IssmDouble>* solution=NULL;17 18 11 if(VerboseModule()) _printf0_(" Get solution from inputs\n"); 19 12 20 /*retrive parameters: */ 13 /*retrieve parameters: */ 14 int analysisenum; 21 15 femmodel->parameters->FindParam(&analysisenum,AnalysisTypeEnum); 22 16 23 17 /*Get size of vector: */ 24 gsize=femmodel->nodes->NumberOfDofs(GsetEnum); 18 int gsize = femmodel->nodes->NumberOfDofs(GsetEnum); 19 int gsize_local = femmodel->nodes->NumberOfDofsLocal(GsetEnum); 25 20 if(gsize==0) _error_("Allocating a Vec of size 0 as gsize=0 "); 26 21 27 22 /*Initialize solution: */ 28 solution=new Vector<IssmDouble>(gsize);23 Vector<IssmDouble>* solution=new Vector<IssmDouble>(gsize_local,gsize); 29 24 30 25 /*Go through elements and plug solution: */
Note:
See TracChangeset
for help on using the changeset viewer.