Changeset 1346


Ignore:
Timestamp:
07/17/09 11:59:35 (16 years ago)
Author:
Mathieu Morlighem
Message:

improved yams 2...

Location:
issm/trunk/src/m
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/classes/public/mesh/meshyams.m

    r1341 r1346  
    2828
    2929%recover some fields
    30 domainoutline=yamsoptions.domainoutline;
    31 groundeddomain=yamsoptions.groundeddomain;
    32 velocities=yamsoptions.velocities;
    33 resolution=yamsoptions.resolution;
     30disp('MeshYams Options:')
     31domainoutline=yamsoptions.domainoutline;   disp(sprintf('   %-15s: ''%s''','DomainOutline',domainoutline));
     32groundeddomain=yamsoptions.groundeddomain; disp(sprintf('   %-15s: ''%s''','GroundedDomain',groundeddomain));
     33velocities=yamsoptions.velocities;         disp(sprintf('   %-15s: ''%s''','Velocities',velocities));
     34resolution=yamsoptions.resolution;         disp(sprintf('   %-15s: %f','Resolution',resolution));
    3435gradation=yamsoptions.gradation;
    35 nsteps=yamsoptions.nsteps;
    36 epsilon=yamsoptions.epsilon;
    37 hmin=yamsoptions.hmin;
    38 hmax=yamsoptions.hmax;
     36nsteps=yamsoptions.nsteps;                 disp(sprintf('   %-15s: %i','nsteps',nsteps));
     37epsilon=yamsoptions.epsilon;               disp(sprintf('   %-15s: %f','epsilon',epsilon));
     38hmin=yamsoptions.hmin;                     disp(sprintf('   %-15s: %f','hmin',hmin));
     39hmax=yamsoptions.hmax;                     disp(sprintf('   %-15s: %f\n','hmax',hmax));
    3940
    4041%mesh with initial resolution
    4142disp('Initial mesh generation...');
    4243md=mesh(md,domainoutline,resolution);
     44disp(['Initial mesh, number of elements: ' num2str(md.numberofelements)]);
    4345
    4446%load velocities
     
    5153
    5254        %interpolate velocities onto mesh
    53         disp('   interpolating velocities');
     55        disp('   interpolating velocities...');
    5456        vx_obs=InterpFromGrid(x_m,y_m,vx,md.x,md.y,0);
    5557        vy_obs=InterpFromGrid(x_m,y_m,vy,md.x,md.y,0);
     
    6668
    6769        %adapt according to velocities
    68         disp('   adapting');
     70        disp('   adapting...');
    6971        md=YamsCall(md,field,hmin,hmax,gradation(i),epsilon);
     72
    7073end
    7174       
    7275disp(['Final mesh, number of elements: ' num2str(md.numberofelements)]);
    7376
    74 %Now, build the connectivity tables for this mesh.
    75 md.nodeconnectivity=NodeConnectivity(md.elements,md.numberofgrids);
    76 md.elementconnectivity=ElementConnectivity(md.elements,md.nodeconnectivity);
    77 
    78 %Recreate the segments
    79 disp('Creating segments...');
    80 elementconnectivity=md.elementconnectivity;
    81 elementonboundary=double(elementconnectivity(:,end)==0);
    82 pos=find(elementonboundary);
    83 num_segments=length(pos);
    84 segments=zeros(num_segments,3);
    85 for i=1:num_segments,
    86         el1=pos(i);
    87         els2=elementconnectivity(el1,find(elementconnectivity(el1,:)));
    88         flag=intersect(md.elements(els2(1),:),md.elements(els2(2),:));
    89         nods1=md.elements(el1,:);
    90         nods1(find(nods1==flag))=[];
    91         segments(i,:)=[nods1 el1];
    92 
    93         ord1=find(nods1(1)==md.elements(el1,:));
    94         ord2=find(nods1(2)==md.elements(el1,:));
    95 
    96         %swap segment grids if necessary
    97         if ( (ord1==1 & ord2==2) | (ord1==2 & ord2==3) | (ord1==3 & ord2==1) ),
    98                 temp=segments(i,1);
    99                 segments(i,1)=segments(i,2);
    100                 segments(i,2)=temp;
    101         end
    102         segments(i,1:2)=fliplr(segments(i,1:2));
    103 end
    104 md.segments=segments;
     77%recreate segments
     78md.segments=findsegments(md);
     79md.gridonboundary=zeros(md.numberofgrids,1); md.gridonboundary(md.segments(:,1:2))=1;
    10580
    10681%Fill in rest of fields:
    10782md.z=zeros(md.numberofgrids,1);
    108 md.gridonboundary=zeros(md.numberofgrids,1); md.gridonboundary(md.segments(:,1:2))=1;
    10983md.gridonbed=ones(md.numberofgrids,1);
    11084md.gridonsurface=ones(md.numberofgrids,1);
  • issm/trunk/src/m/utils/Mesh/ComputeMetric.m

    r1342 r1346  
    1515pos1=find(lambda1==0);
    1616pos2=find(lambda2==0);
     17pos3=find(b==0 & lambda1==lambda2);
    1718
    1819%Modify the eigen values to control the shape of the elements
     
    2829v2y=((d-a)-sqrt((a-d).^2+4*b.^2))./norm2;
    2930
     31v1x(pos3)=1; v1y(pos3)=0;
     32v2x(pos3)=0; v2y(pos3)=1;
     33
    3034%Compute new metric (for each node M=V*Lambda*V^-1)
    3135metric=full([(v1x.*v2y-v1y.*v2x).^(-1).*(lambda1.*v2y.*v1x-lambda2.*v1y.*v2x) ...
     
    4044metric(pos,:)=repmat([1/hmax^2 0 1/hmax^2],length(pos),1);
    4145
     46%take care of NaNs if any (use Matlab eig in a loop)
     47[pos posj]=find(isnan(metric)); clear posj;
     48if ~isempty(pos),
     49        fprintf(' %i %s',length(pos),'NaN found in the metric. Use Matlab routine...');
     50        for i=1:length(pos)
     51                H=[hessian(pos(i),1) hessian(pos(i),2)
     52                hessian(pos(i),2) hessian(pos(i),3)];
     53                [u,v]=eig(H);
     54                lambda1=v(1,1);
     55                lambda2=v(2,2);
     56                v(1,1)=min(max(abs(lambda1)*scale/epsilon,1/hmax^2),1/hmin^2);
     57                v(2,2)=min(max(abs(lambda2)*scale/epsilon,1/hmax^2),1/hmin^2);
     58
     59                metricTria=u*v*u^(-1);
     60                metric(pos(i),:)=[metricTria(1,1) metricTria(1,2) metricTria(2,2)];
     61        end
     62end
     63
    4264if any(isnan(metric)),
    43         error('ComputeMetric error message: NaN in the metric...')
     65        error('ComputeMetric error message: NaN in the metric despite our efforts...')
    4466end
  • issm/trunk/src/m/utils/Mesh/YamsCall.m

    r1342 r1346  
    1010%
    1111%   Usage:
    12 %      md=YamsCall(md,field,hmin,hmax,epsilon)
     12%      md=YamsCall(md,field,hmin,hmax,gradation,epsilon);
    1313%
    1414%   Example:
    1515%      md=YamsCall(md,md.vel_obs,1500,10^8,1.3,0.9);
    16 
    17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Build metric %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1816
    1917global ISSM_DIR
     
    5755fprintf(fid,'%i %i %i %i\n',[md.elements zeros(md.numberofelements,1)]');
    5856
    59 %Corners
    60 pos=find(md.gridonboundary);
    61 fprintf(fid,'\n\n%s\n%i\n\n','Corners',length(pos));
    62 fprintf(fid,'%i\n',pos');
    63 
    6457%close
    6558fclose(fid);
     
    6861%call yams
    6962fprintf('%s\n','      call Yams...');
    70 system(['yams2-linux -O 1 -v 2 -ecp -hgrad ' num2str(gradation)  ' carre0 carre1']);
     63system(['yams2-linux -O 1 -v -0 -ecp -hgrad ' num2str(gradation)  ' carre0 carre1']);
    7164
    7265%plug new mesh
Note: See TracChangeset for help on using the changeset viewer.