Changeset 22719


Ignore:
Timestamp:
04/27/18 16:07:51 (7 years ago)
Author:
Eric.Larour
Message:

CHG: some changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/model.js

    r22447 r22719  
    360360                        }
    361361                } //}}}
     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                } //}}}
    362484                this.collapse = function(md) { //{{{
    363485                        /*
Note: See TracChangeset for help on using the changeset viewer.