Changeset 1329
- Timestamp:
- 07/16/09 08:38:55 (16 years ago)
- Location:
- issm/trunk/src/m/utils/Mesh
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/utils/Mesh/BuildAdaptedMeshYams.m
r1327 r1329 19 19 %Antarctica settings 20 20 nsteps=6; 21 resolution= 10000;22 hmin=50 0;21 resolution=8000; 22 hmin=50; 23 23 hmax=3*10^5; 24 24 gradation=[1.5*ones(2,1);3*ones(nsteps-2,1)]; 25 epsilon= 5*10^-1;25 epsilon=2*10^-0; 26 26 domainoutline='EnvDomainOutline200km.exp'; 27 27 %%} -
issm/trunk/src/m/utils/Mesh/YamsCall.m
r1327 r1329 19 19 global ISSM_DIR 20 20 21 t1=clock; fprintf('%s',' computing Hessian...'); 21 22 %initialization 22 23 index=md.elements; … … 59 60 sparse(line,ones(linesize,1),repmat(areas.*hessian(:,2),3,1),numberofgrids,1)./weights ... 60 61 sparse(line,ones(linesize,1),repmat(areas.*hessian(:,3),3,1),numberofgrids,1)./weights ]; 62 t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']); 61 63 62 test=1; 64 t1=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)] 66 a=hessian(:,1); b=hessian(:,2); d=hessian(:,3); 67 lambda1=0.5*((a+d)+sqrt(4*b.^2+(a-d).^2)); 68 lambda2=0.5*((a+d)-sqrt(4*b.^2+(a-d).^2)); 69 pos1=find(lambda1==0); 70 pos2=find(lambda2==0); 63 71 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 73 lambda1=min(max(abs(lambda1)*scale/epsilon,1/hmax^2),1/hmin^2); 74 lambda2=min(max(abs(lambda2)*scale/epsilon,1/hmax^2),1/hmin^2); 72 75 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 77 norm1=sqrt(8*b.^2+2*(d-a).^2+2*(d-a).*sqrt((a-d).^2+4*b.^2)); 78 v1x=2*b./norm1; 79 v1y=((d-a)+sqrt((a-d).^2+4*b.^2))./norm1; 80 norm2=sqrt(8*b.^2+2*(d-a).^2-2*(d-a).*sqrt((a-d).^2+4*b.^2)); 81 v2x=2*b./norm2; 82 v2y=((d-a)-sqrt((a-d).^2+4*b.^2))./norm2; 76 83 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) 85 metric=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)]); 84 88 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 90 metric(pos1,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos1),1); 91 metric(pos2,:)=repmat([1/hmin^2 0 1/hmin^2],length(pos2),1); 110 92 111 93 if any(isnan(metric)), 112 94 error('YamsCall error message: NaN in the metric...') 113 95 end 96 t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']); 97 114 98 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Build FILES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 115 99 116 Tria=md.elements; 117 Coor=[md.x md.y]; 118 save -ascii carre0.tria Tria 119 save -ascii carre0.coor Coor 100 t1=clock; fprintf('%s',' writing initial mesh files...'); 120 101 save -ascii carre0.met metric 121 102 … … 129 110 130 111 %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 112 fprintf(fid,'\n%s\n%i\n\n','Vertices',md.numberofgrids); 113 fprintf(fid,'%8g %8g %i\n',[md.x md.y zeros(md.numberofgrids,1)]'); 135 114 136 115 %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 116 fprintf(fid,'\n\n%s\n%i\n\n','Triangles',md.numberofelements); 117 fprintf(fid,'%i %i %i %i\n',[md.elements zeros(md.numberofelements,1)]'); 141 118 142 119 %Corners 143 120 pos=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 121 fprintf(fid,'\n\n%s\n%i\n\n','Corners',length(pos)); 122 fprintf(fid,'%i\n',pos'); 148 123 149 124 %close 150 125 fclose(fid); 126 t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']); 151 127 152 128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% call Yams %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 153 129 154 130 %call yams 131 fprintf('%s\n',' call Yams...'); 155 132 addpath([ISSM_DIR '/externalpackages/yams']); 156 system(['yams2-linux -O 1 -v 1 0-ecp -hgrad ' num2str(gradation) ' carre0 carre1']);133 system(['yams2-linux -O 1 -v 1 -ecp -hgrad ' num2str(gradation) ' carre0 carre1']); 157 134 rmpath([ISSM_DIR '/externalpackages/yams']); 135 t2=clock;fprintf('%s\n',[' done (' num2str(etime(t2,t1)) ' seconds)']); 158 136 159 137 %plug new mesh 138 t1=clock; fprintf('\n%s',' reading final mesh files...'); 160 139 Tria=load('carre1.tria'); 161 140 Coor=load('carre1.coor'); … … 167 146 md.numberofgrids=size(Coor,1); 168 147 md.numberofelements=size(Tria,1); 148 149 %clean up: 150 system('rm carre0.mesh carre0.met carre1.tria carre1.coor carre1.meshb');
Note:
See TracChangeset
for help on using the changeset viewer.