Changeset 1329


Ignore:
Timestamp:
07/16/09 08:38:55 (16 years ago)
Author:
Mathieu Morlighem
Message:

speeded up Yams call (no more loop in fprintf... we should do the same for expwrite vim YamsCall.m )

Location:
issm/trunk/src/m/utils/Mesh
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/utils/Mesh/BuildAdaptedMeshYams.m

    r1327 r1329  
    1919%Antarctica settings
    2020nsteps=6;
    21 resolution=10000;
    22 hmin=500;
     21resolution=8000;
     22hmin=50;
    2323hmax=3*10^5;
    2424gradation=[1.5*ones(2,1);3*ones(nsteps-2,1)];
    25 epsilon=5*10^-1;
     25epsilon=2*10^-0;
    2626domainoutline='EnvDomainOutline200km.exp';
    2727%%}
  • issm/trunk/src/m/utils/Mesh/YamsCall.m

    r1327 r1329  
    1919global ISSM_DIR
    2020
     21t1=clock; fprintf('%s','      computing Hessian...');
    2122%initialization
    2223index=md.elements;
     
    5960        sparse(line,ones(linesize,1),repmat(areas.*hessian(:,2),3,1),numberofgrids,1)./weights ...
    6061        sparse(line,ones(linesize,1),repmat(areas.*hessian(:,3),3,1),numberofgrids,1)./weights ];
     62t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']);
    6163
    62 test=1;
     64t1=clock; fprintf('%s','      computing metric...');
     65%first, find the eigen values of eah line of H=[hessian(i,1) hessian(i,2); hessian(i,2)  hessian(i,3)]
     66a=hessian(:,1); b=hessian(:,2); d=hessian(:,3);
     67lambda1=0.5*((a+d)+sqrt(4*b.^2+(a-d).^2));
     68lambda2=0.5*((a+d)-sqrt(4*b.^2+(a-d).^2));
     69pos1=find(lambda1==0);
     70pos2=find(lambda2==0);
    6371
    64 tic
    65         if test==1,
    66                 %first, find the eigen values of eah line of H=[hessian(i,1) hessian(i,2); hessian(i,2)  hessian(i,3)]
    67                 a=hessian(:,1); b=hessian(:,2); d=hessian(:,3);
    68                 lambda1=0.5*((a+d)+sqrt(4*b.^2+(a-d).^2));
    69                 lambda2=0.5*((a+d)-sqrt(4*b.^2+(a-d).^2));
    70                 pos1=find(lambda1==0);
    71                 pos2=find(lambda2==0);
     72%Modify the eigen values to control the shape of the elements
     73lambda1=min(max(abs(lambda1)*scale/epsilon,1/hmax^2),1/hmin^2);
     74lambda2=min(max(abs(lambda2)*scale/epsilon,1/hmax^2),1/hmin^2);
    7275
    73                 %Modify the eigen values to control the shape of the elements
    74                 lambda1=min(max(abs(lambda1)*scale/epsilon,1/hmax^2),1/hmin^2);
    75                 lambda2=min(max(abs(lambda2)*scale/epsilon,1/hmax^2),1/hmin^2);
     76%compute eigen vectors
     77norm1=sqrt(8*b.^2+2*(d-a).^2+2*(d-a).*sqrt((a-d).^2+4*b.^2));
     78v1x=2*b./norm1;
     79v1y=((d-a)+sqrt((a-d).^2+4*b.^2))./norm1;
     80norm2=sqrt(8*b.^2+2*(d-a).^2-2*(d-a).*sqrt((a-d).^2+4*b.^2));
     81v2x=2*b./norm2;
     82v2y=((d-a)-sqrt((a-d).^2+4*b.^2))./norm2;
    7683
    77                 %compute eigen vectors
    78                 norm1=sqrt(8*b.^2+2*(d-a).^2+2*(d-a).*sqrt((a-d).^2+4*b.^2));
    79                 v1x=2*b./norm1;
    80                 v1y=((d-a)+sqrt((a-d).^2+4*b.^2))./norm1;
    81                 norm2=sqrt(8*b.^2+2*(d-a).^2-2*(d-a).*sqrt((a-d).^2+4*b.^2));
    82                 v2x=2*b./norm2;
    83                 v2y=((d-a)-sqrt((a-d).^2+4*b.^2))./norm2;
     84%Compute new metric (for each node M=V*Lambda*V^-1)
     85metric=full([(v1x.*v2y-v1y.*v2x).^(-1).*(lambda1.*v2y.*v1x-lambda2.*v1y.*v2x) ...
     86        (v1x.*v2y-v1y.*v2x).^(-1).*(lambda1.*v1y.*v2y-lambda2.*v1y.*v2y) ...
     87        (v1x.*v2y-v1y.*v2x).^(-1).*(-lambda1.*v2x.*v1y+lambda2.*v1x.*v2y)]);
    8488
    85                 %Compute new metric (for each node M=V*Lambda*V^-1)
    86                 metric=full([(v1x.*v2y-v1y.*v2x).^(-1).*(lambda1.*v2y.*v1x-lambda2.*v1y.*v2x) ...
    87                         (v1x.*v2y-v1y.*v2x).^(-1).*(lambda1.*v1y.*v2y-lambda2.*v1y.*v2y) ...
    88                         (v1x.*v2y-v1y.*v2x).^(-1).*(-lambda1.*v2x.*v1y+lambda2.*v1x.*v2y)]);
    89 
    90                 %some corrections for 0 eigen values
    91                 metric(pos1,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos1),1);
    92                 metric(pos2,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos2),1);
    93 
    94         end
    95         if test==2,
    96                 for i=1:md.numberofgrids
    97                         H=[hessian(i,1) hessian(i,2)
    98                         hessian(i,2) hessian(i,3)];
    99                         [u,v]=eig(H);
    100                         lambda1=v(1,1);
    101                         lambda2=v(2,2);
    102                         v(1,1)=min(max(abs(lambda1)*scale/epsilon,1/hmax^2),1/hmin^2);
    103                         v(2,2)=min(max(abs(lambda2)*scale/epsilon,1/hmax^2),1/hmin^2);
    104 
    105                         metricTria=u*v*u^(-1);
    106                         metric(i,:)=[metricTria(1,1) metricTria(1,2) metricTria(2,2)];
    107                 end
    108         end
    109 toc
     89%some corrections for 0 eigen values
     90metric(pos1,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos1),1);
     91metric(pos2,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos2),1);
    11092
    11193if any(isnan(metric)),
    11294        error('YamsCall error message: NaN in the metric...')
    11395end
     96t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']);
     97
    11498%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Build FILES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    11599
    116 Tria=md.elements;
    117 Coor=[md.x md.y];
    118 save -ascii carre0.tria Tria
    119 save -ascii carre0.coor Coor
     100t1=clock; fprintf('%s','      writing initial mesh files...');
    120101save -ascii carre0.met  metric
    121102
     
    129110
    130111%Vertices
    131 fprintf(fid,'\n%s\n%i\n','Vertices',md.numberofgrids);
    132 for i=1:md.numberofgrids,
    133         fprintf(fid,'\n%f %f %i',md.x(i),md.y(i),0);
    134 end
     112fprintf(fid,'\n%s\n%i\n\n','Vertices',md.numberofgrids);
     113fprintf(fid,'%8g %8g %i\n',[md.x md.y zeros(md.numberofgrids,1)]');
    135114
    136115%Triangles
    137 fprintf(fid,'\n\n%s\n%i\n','Triangles',md.numberofelements);
    138 for i=1:md.numberofelements,
    139         fprintf(fid,'\n%i %i %i %i',md.elements(i,1),md.elements(i,2),md.elements(i,3),0);
    140 end
     116fprintf(fid,'\n\n%s\n%i\n\n','Triangles',md.numberofelements);
     117fprintf(fid,'%i %i %i %i\n',[md.elements zeros(md.numberofelements,1)]');
    141118
    142119%Corners
    143120pos=find(md.gridonboundary);
    144 fprintf(fid,'\n\n%s\n%i\n','Corners',length(pos));
    145 for i=1:length(pos),
    146         fprintf(fid,'\n%i',pos(i));
    147 end
     121fprintf(fid,'\n\n%s\n%i\n\n','Corners',length(pos));
     122fprintf(fid,'%i\n',pos');
    148123
    149124%close
    150125fclose(fid);
     126t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']);
    151127
    152128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% call Yams %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    153129
    154130%call yams
     131fprintf('%s\n','      call Yams...');
    155132addpath([ISSM_DIR '/externalpackages/yams']);
    156 system(['yams2-linux -O 1 -v 10 -ecp -hgrad ' num2str(gradation)  ' carre0 carre1']);
     133system(['yams2-linux -O 1 -v 1 -ecp -hgrad ' num2str(gradation)  ' carre0 carre1']);
    157134rmpath([ISSM_DIR '/externalpackages/yams']);
     135t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']);
    158136
    159137%plug new mesh
     138t1=clock; fprintf('\n%s','      reading final mesh files...');
    160139Tria=load('carre1.tria');
    161140Coor=load('carre1.coor');
     
    167146md.numberofgrids=size(Coor,1);
    168147md.numberofelements=size(Tria,1);
     148
     149%clean up:
     150system('rm carre0.mesh carre0.met carre1.tria carre1.coor carre1.meshb');
Note: See TracChangeset for help on using the changeset viewer.