Changeset 20793


Ignore:
Timestamp:
06/22/16 14:50:37 (9 years ago)
Author:
ayfeng
Message:

Implement Project3D module, fix issue with undefined reference in model

Location:
issm/trunk-jpl/jenkins/javascript/karma/lib/bin
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/jenkins/javascript/karma/lib/bin/model.js

    r20767 r20793  
    55
    66function model () {
     7    function ones(...args) {
     8        var array = [];
     9        for (var i = 0; i < args[0]; ++i) {
     10            array.push(args.length === 1 ? 1 : ones(args.slice(1)));
     11        }
     12        return array;
     13    }
     14
    715        //methods
    816                this.disp = function() { //{{{
     
    111119
    112120                } //}}}
    113         this.extrude = function(md, ...args) { //{{{
     121        this.extrude = function(md) { //{{{
    114122        //EXTRUDE - vertically extrude a 2d mesh
    115123        //
     
    134142
    135143        //some checks on list of arguments
    136             var argc = args.length;
     144            var argc = arguments.length;
    137145
    138146            if ((argc > 4) | (argc < 2)) {
     
    142150            //Extrude the mesh
    143151            if (argc==2) { //list of coefficients
    144                 clist=args[0];
     152                clist=arguments[0];
    145153
    146154                if (clist.some(function(x) { return x < 0; }) | clist.some(function(x) { return x > 1; }))
     
    156164                numlayers=extrusionlist.length;
    157165            } else if (argc==3) { //one polynomial law
    158                 if (args[2]<=0) {
     166                if (arguments[2]<=0) {
    159167                    //help extrude;
    160168                    throw 'extrusionexponent must be >=0';
    161169                }
    162                 numlayers=args[0];
     170                numlayers=arguments[0];
    163171
    164172                extrusionlist = [];
    165173
    166174                for (var i = 0; i < numlayers; i++) {
    167                     extrusionlist.push(Math.pow(i/(numlayers-1), args[2]));
     175                    extrusionlist.push(Math.pow(i/(numlayers-1), arguments[2]));
    168176                };
    169177
    170178            } else if (argc==4) { //two polynomial laws
    171                 numlayers=args[0];
    172                 lowerexp=args[1];
    173                 upperexp=args[2];
    174 
    175                 if (args[1]<=0 | args[2]<=0) {
     179                numlayers=arguments[0];
     180                lowerexp=arguments[1];
     181                upperexp=arguments[2];
     182
     183                if (arguments[1]<=0 | args[2]<=0) {
    176184                    throw 'lower and upper extrusionexponents must be >=0';
    177185                }
     
    202210
    203211            if (numlayers<2) {
    204                 error('number of layers should be at least 2');
     212                console.error('number of layers should be at least 2');
    205213            }
    206214
    207215            if (md.mesh.domaintype() !== '3D') {
    208                 error('Cannot extrude a 3d mesh (extrude cannot be called more than once)');
     216                console.error('Cannot extrude a 3d mesh (extrude cannot be called more than once)');
    209217            }
    210218
    211219            //Initialize with the 2d mesh
    212220            mesh2d = md.mesh;
    213             md.mesh=mesh3dprisms();
     221            md.mesh=new mesh3dprisms();
     222
    214223            md.mesh.x                           = mesh2d.x;
    215224            md.mesh.y                           = mesh2d.y;
     
    244253            };
    245254
    246             number_nodes3d=size(x3d,1); //number of 3d nodes for the non extruded part of the mesh
    247 
    248                 //Extrude elements
    249                 elements3d=[];
    250                 for (var i = 0; i < numlayers; i++) {
    251                     elements3d.push(md.mesh.elements+(i-1)*md.mesh.numberofvertices, md.mesh.elements+i*md.mesh.numberofvertices); //Create the elements of the 3d mesh for the non extruded part
    252                 };
    253 
    254                 number_el3d=size(elements3d,1); //number of 3d nodes for the non extruded part of the mesh
    255 
    256                 function fillArray(value, len) {
    257                     if (len == 0) return [];
    258                     var a = [value];
    259                     while (a.length * 2 <= len) a = a.concat(a);
    260                     if (a.length < len) a = a.concat(a.slice(0, len - a.length));
    261                     return a;
    262                 }
    263 
    264                 //Keep a trace of lower and upper nodes
    265                 //lowervertex=NaN*ones(number_nodes3d,1);
    266                 //uppervertex=NaN*ones(number_nodes3d,1);
    267 
    268                 lowervertex = fillArray(null, number_nodes3d);
    269                 uppervertex = fillArray(null, number_nodes3d);
    270 
    271                 //lowervertex(md.mesh.numberofvertices+1:end)=1:(numlayers-1)*md.mesh.numberofvertices;
    272                 //uppervertex(1:(numlayers-1)*md.mesh.numberofvertices)=md.mesh.numberofvertices+1:number_nodes3d;
    273 
    274                 for (var i = md.mesh.numberofvertices+1, k = 1; i < lowervertex.length && k <= (numlayers-1)*md.mesh.numberofvertices; i++, k++) {
    275                     lowervertex[i] = k;
    276                 };
    277 
    278                 for (var i = 1, k = md.mesh.numberofvertices+1; i <= (numlayers-1)*md.mesh.numberofvertices && k <= number_nodes3d; i++, k++) {
    279                     uppervertex[i] = k;
    280                 };
    281 
    282                 md.mesh.lowervertex=lowervertex;
    283                 md.mesh.uppervertex=uppervertex;
    284 
    285                 //same for lower and upper elements
    286                 lowerelements = fillArray(null, number_el3d);
    287                 upperelements = fillArray(null, number_el3d);
    288                 //lowerelements(md.mesh.numberofelements+1:end)=1:(numlayers-2)*md.mesh.numberofelements;
    289                 //upperelements(1:(numlayers-2)*md.mesh.numberofelements)=md.mesh.numberofelements+1:(numlayers-1)*md.mesh.numberofelements;
    290 
    291                 for (var i = md.mesh.numberofvertices+1, k = 1; i < lowerelements.length && k <= (numlayers-2)*md.mesh.numberofelements; i++, k++) {
    292                     lowerelements[i] = k;
    293                 };
    294 
    295                 for (var i = 1, k = md.mesh.numberofelements + 1; i <= (numlayers-2)*md.mesh.numberofelements && k <= (numlayers-1)*md.mesh.numberofelements; i++, k++) {
    296                     upperelements[i] = k;
    297                 };
    298 
    299                 md.mesh.lowerelements=lowerelements;
    300                 md.mesh.upperelements=upperelements;
    301 
    302                 //Save old mesh
    303                 md.mesh.x2d=md.mesh.x;
    304                 md.mesh.y2d=md.mesh.y;
    305                 md.mesh.elements2d=md.mesh.elements;
    306                 md.mesh.numberofelements2d=md.mesh.numberofelements;
    307                 md.mesh.numberofvertices2d=md.mesh.numberofvertices;
    308 
    309                 //Build global 3d mesh
    310                 md.mesh.elements=elements3d;
    311                 md.mesh.x=x3d;
    312                 md.mesh.y=y3d;
    313                 md.mesh.z=z3d;
    314                 md.mesh.numberofelements=number_el3d;
    315                 md.mesh.numberofvertices=number_nodes3d;
    316                 md.mesh.numberoflayers=numlayers;
    317 
    318                 //Ok, now deal with the other fields from the 2d mesh:
    319 
    320                     //bedinfo and surface info
    321                 md.mesh.vertexonbase=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',1);
    322                 md.mesh.vertexonsurface=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',md.mesh.numberoflayers);
    323                 md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node');
    324 
    325                 //lat long
    326                 md.mesh.lat=project3d(md,'vector',md.mesh.lat,'type','node');
    327                 md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node');
    328 
    329                 md.geometry=extrude(md.geometry,md);
     255            number_nodes3d=x3d.length; //number of 3d nodes for the non extruded part of the mesh
     256
     257            //Extrude elements
     258            elements3d=[];
     259            for (var i = 0; i < numlayers; i++) {
     260                elements3d.push(md.mesh.elements+(i-1)*md.mesh.numberofvertices, md.mesh.elements+i*md.mesh.numberofvertices); //Create the elements of the 3d mesh for the non extruded part
     261            };
     262
     263            number_el3d=elements3d.length; //number of 3d nodes for the non extruded part of the mesh
     264
     265            function fillArray(value, len) {
     266                if (len == 0) return [];
     267                var a = [value];
     268                while (a.length * 2 <= len) a = a.concat(a);
     269                if (a.length < len) a = a.concat(a.slice(0, len - a.length));
     270                return a;
     271            }
     272
     273            //Keep a trace of lower and upper nodes
     274            //lowervertex=NaN*ones(number_nodes3d,1);
     275            //uppervertex=NaN*ones(number_nodes3d,1);
     276
     277            lowervertex = fillArray(null, number_nodes3d);
     278            uppervertex = fillArray(null, number_nodes3d);
     279
     280            //lowervertex(md.mesh.numberofvertices+1:end)=1:(numlayers-1)*md.mesh.numberofvertices;
     281            //uppervertex(1:(numlayers-1)*md.mesh.numberofvertices)=md.mesh.numberofvertices+1:number_nodes3d;
     282
     283            for (var i = md.mesh.numberofvertices+1, k = 1; i < lowervertex.length && k <= (numlayers-1)*md.mesh.numberofvertices; i++, k++) {
     284                lowervertex[i] = k;
     285            };
     286
     287            for (var i = 1, k = md.mesh.numberofvertices+1; i <= (numlayers-1)*md.mesh.numberofvertices && k <= number_nodes3d; i++, k++) {
     288                uppervertex[i] = k;
     289            };
     290
     291            md.mesh.lowervertex=lowervertex;
     292            md.mesh.uppervertex=uppervertex;
     293
     294            //same for lower and upper elements
     295            lowerelements = fillArray(null, number_el3d);
     296            upperelements = fillArray(null, number_el3d);
     297            //lowerelements(md.mesh.numberofelements+1:end)=1:(numlayers-2)*md.mesh.numberofelements;
     298            //upperelements(1:(numlayers-2)*md.mesh.numberofelements)=md.mesh.numberofelements+1:(numlayers-1)*md.mesh.numberofelements;
     299
     300            for (var i = md.mesh.numberofvertices+1, k = 1; i < lowerelements.length && k <= (numlayers-2)*md.mesh.numberofelements; i++, k++) {
     301                lowerelements[i] = k;
     302            };
     303
     304            for (var i = 1, k = md.mesh.numberofelements + 1; i <= (numlayers-2)*md.mesh.numberofelements && k <= (numlayers-1)*md.mesh.numberofelements; i++, k++) {
     305                upperelements[i] = k;
     306            };
     307
     308            md.mesh.lowerelements=lowerelements;
     309            md.mesh.upperelements=upperelements;
     310
     311            //Save old mesh
     312            md.mesh.x2d=md.mesh.x;
     313            md.mesh.y2d=md.mesh.y;
     314            md.mesh.elements2d=md.mesh.elements;
     315            md.mesh.numberofelements2d=md.mesh.numberofelements;
     316            md.mesh.numberofvertices2d=md.mesh.numberofvertices;
     317
     318            //Build global 3d mesh
     319            md.mesh.elements=elements3d;
     320            md.mesh.x=x3d;
     321            md.mesh.y=y3d;
     322            md.mesh.z=z3d;
     323            md.mesh.numberofelements=number_el3d;
     324            md.mesh.numberofvertices=number_nodes3d;
     325            md.mesh.numberoflayers=numlayers;
     326
     327            //Ok, now deal with the other fields from the 2d mesh:
     328
     329            //bedinfo and surface info
     330            md.mesh.vertexonbase=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',1);
     331            md.mesh.vertexonsurface=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',md.mesh.numberoflayers);
     332            md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node');
     333
     334            //lat long
     335            md.mesh.lat=project3d(md,'vector',md.mesh.lat,'type','node');
     336            md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node');
     337
     338            md.geometry=extrude(md.geometry,md);
    330339                md.friction  = extrude(md.friction,md);
    331340                md.inversion = extrude(md.inversion,md);
     
    373382
    374383                    for (var i = 0; i < md.mesh.elementconnectivity.length; ++i) {
    375                         if (md.mesh.elementconnectivity[i] === null || typeof md.mesh.elementconectivity[i] === 'undefined') {
     384                        if (md.mesh.elementconnectivity[i] === null || typeof md.mesh.elementconnectivity[i] === 'undefined') {
    376385                            md.mesh.elementconnectivity[i] = 0;
    377386                        }
Note: See TracChangeset for help on using the changeset viewer.