Changeset 22719
- Timestamp:
- 04/27/18 16:07:51 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/model.js
r22447 r22719 360 360 } 361 361 } //}}} 362 this.extract = function(md,area) { //{{{ 363 //extract - extract a model according to an Argus contour or flag list 364 // 365 // This routine extracts a submodel from a bigger model with respect to a given contour 366 // md must be followed by the corresponding exp file or flags list 367 // It can either be a domain file (argus type, .exp extension), or an array of element flags. 368 // If user wants every element outside the domain to be 369 // extract2d, add '~' to the name of the domain file (ex: '~HO.exp'); 370 // an empty string '' will be considered as an empty domain 371 // a string 'all' will be considered as the entire domain 372 // 373 // Usage: 374 // md2=extract(md,area); 375 // 376 // Examples: 377 // md2=extract(md,'Domain.exp'); 378 // 379 // See also: EXTRUDE, COLLAPSE 380 381 //some checks on list of arguments 382 var argc = arguments.length; 383 384 if (!((argc == 2) | (argc == 1))) { 385 throw "extract error message: bad usage"; 386 } 387 388 //get elements that are inside area 389 flag_elem=FlagElements(this,area); 390 391 if (!ArrayAnyEqual(flag_elem,1))throw "extracted model is empty!" 392 393 /*kick out all elements with 3 dirichlets: actually, not so fast, not good for javscript usually. 394 spc_elem=find(~flag_elem); 395 spc_node=sort(unique(md1.mesh.elements(spc_elem,:))); 396 flag=ones(md1.mesh.numberofvertices,1); 397 flag(spc_node)=0; 398 pos=find(sum(flag(md1.mesh.elements),2)==0); 399 flag_elem(pos)=0;*/ 400 401 //extracted elements and nodes lists 402 var pos_elem = ArrayFind(flag_elem,1); 403 var dup_nodes= new Array(pos_elem.length*3); 404 for(var i=0;i<pos_elem.length;i++){ 405 dup_nodes[3*i]=md.mesh.elements[pos_elem[i]][0]-1; 406 dup_nodes[3*i+1]=md.mesh.elements[pos_elem[i]][1]-1; 407 dup_nodes[3*i+2]=md.mesh.elements[pos_elem[i]][2]-1; 408 } 409 pos_node=ArrayUnique(dup_nodes); pos_node=ArraySort(pos_node); 410 411 //keep track of some fields 412 var numberofvertices1=md.mesh.numberofvertices; 413 var numberofelements1=md.mesh.numberofelements; 414 var numberofvertices2=pos_node.length; 415 var numberofelements2=pos_elem.length; 416 var flag_node=NewArrayFill(numberofvertices1,0); 417 for (var i=0;i<pos_node.length;i++)flag_node[pos_node[i]]=1; 418 419 //Create Pelem and Pnode (transform old nodes in new nodes and same thing for the elements) 420 Pelem=NewArrayFill(numberofelements1,0); 421 for (var i=0;i<numberofelements2;i++) Pelem[pos_elem[i]]=i; 422 Pnode=NewArrayFill(numberofvertices1,0); 423 for (var i=0;i<numberofvertices2;i++) Pnode[pos_node[i]]=i; 424 //renumber the elements (some nodes won't exist anymore) 425 var elements_2=NewArrayFill2D(numberofelements2,3,0); 426 for (var i=0;i<numberofelements2;i++){ 427 for (var j=0;j<3;j++){ 428 elements_2[i][j]=Pnode[md.mesh.elements[i][j]-1]+1; 429 } 430 } 431 432 /*if isa(md.mesh,'mesh3dprisms'), 433 elements_2(:,4)=Pnode(elements_2(:,4)); 434 elements_2(:,5)=Pnode(elements_2(:,5)); 435 elements_2(:,6)=Pnode(elements_2(:,6)); 436 end 437 */ 438 439 //OK, now create the new model! 440 441 //take every field from model 442 var md2=md.deepcopy(md); 443 //var md2=new model(); md2.mesh=new mesh3dsurface(); 444 445 //deal with mesh: {{{ 446 md2.mesh.numberofvertices=numberofvertices2; 447 md2.mesh.numberofelements=numberofelements2; 448 md2.mesh.elements=elements_2; 449 450 md2.mesh.x=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.x[i]=md.mesh.x[pos_node[i]]; 451 md2.mesh.y=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.y[i]=md.mesh.y[pos_node[i]]; 452 md2.mesh.z=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.z[i]=md.mesh.z[pos_node[i]]; 453 md2.mesh.lat=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.lat[i]=md.mesh.lat[pos_node[i]]; 454 md2.mesh.long=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.long[i]=md.mesh.long[pos_node[i]]; 455 md2.mesh.r=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.mesh.r[i]=md.mesh.r[pos_node[i]]; 456 //}}} 457 //deal with geometry: {{{ 458 md2.geometry.base=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.geometry.base[i]=md.geometry.base[pos_node[i]]; 459 md2.geometry.thickness=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.geometry.thickness[i]=md.geometry.thickness[pos_node[i]]; 460 md2.geometry.surface=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.geometry.surface[i]=md.geometry.surface[pos_node[i]]; 461 md2.geometry.bed=new Array(numberofvertices2); for (var i=0;i<numberofvertices2;i++)md2.geometry.bed[i]=md.geometry.bed[pos_node[i]]; 462 //}}} 463 464 //Keep track of pos_node and pos_elem 465 for (var i=0;i<md2.mesh.numberofvertices;i++)pos_node[i]=pos_node[i]+1; 466 for (var i=0;i<md2.mesh.numberofelements;i++)pos_elem[i]=pos_elem[i]+1; 467 md2.mesh.extractedvertices=pos_node; 468 md2.mesh.extractedelements=pos_elem; 469 470 return md2; 471 472 473 474 //automatically modify fields 475 476 //loop over model fields 477 //model_fields=fields(md); 478 479 480 481 482 483 } //}}} 362 484 this.collapse = function(md) { //{{{ 363 485 /*
Note:
See TracChangeset
for help on using the changeset viewer.