|
id | i: (id folders) |
|
| fprintf ('Processing folder:%s\n', folder_name) |
|
| fprintf (' Reading file %d:%s\n', j, file_name) |
|
Extract mesh size from file | h_values (i, j) |
|
| fprintf (' h=%.6e\n', h_values(i, j)) |
|
Read data matrix from | file (skip comment lines starting with '#') data |
|
Compute energy error | errors (i, j) |
|
| fprintf (' h=%.6e, error=%.6e\n', h_values(i, j), errors(i, j)) |
|
end | fprintf ('\n') |
|
end Sort data by mesh | size (finest to coarsest or vice versa) for i |
|
| errors (i,:) |
|
| convergence_rates (i) |
|
| fprintf ('Folder %s:Convergence rate=%.3f\n', folders{i}, convergence_rates(i)) |
|
end Plot convergence results | figure ('Position', [100, 100, 800, 600]) |
|
Position for | annotation (midpoint in log space) h_mid |
|
Add text annotation | text (h_mid, error_mid, sprintf('%.2f', local_slope),... 'FontSize', 9, 'Color', colors(i,:),... 'HorizontalAlignment', 'center',... 'BackgroundColor', 'white', 'EdgeColor', colors(i,:),... 'Margin', 2) |
|
end end | xlabel ('Mesh size h(log scale)', 'FontSize', 12) |
|
| ylabel ('Energy Error(log scale)', 'FontSize', 12) |
|
| title ('Convergence Analysis', 'FontSize', 14) |
|
| legend ('Location', 'best', 'FontSize', 10) |
|
| set (gca, 'FontSize', 11) |
|
Print summary table | fprintf ('\n===Convergence Summary===\n') |
|
| fprintf ('%-15s %-15s %-15s\n', 'Folder', 'Conv. Rate', 'Error Range') |
|
| fprintf ('%-15s %-15s %-15s\n', '------', '----------', '-----------') |
|
otherwise | error ('Unknown folder name:%s', folder_name) |
|
|
Convergence Analysis for Triangle and Quadrilateral Meshes | clear |
|
close | all |
|
| clc |
|
Setup | folders = {'ca_tri', 'ca_quad'} |
|
| Nfolders = 2 |
|
| Nfiles = 5 |
|
Initialize storage arrays | h_values = zeros(Nfolders, Nfiles) |
|
mesh sizes | errors = zeros(Nfolders, Nfiles) |
|
for | j |
|
end Compute convergence rates | convergence_rates = zeros(Nfolders, 1) |
|
for | i |
|
hold | on |
|
Define | markers = {'^-', 's-'} |
|
triangle and square markers | colors = lines(Nfolders) |
|
| error_mid = exp((log(errors(i,j)) + log(errors(i,j+1))) / 2) |
|
hold | off |
|
| end |
|
| dt = dt_values(file_index) |
|
Determine mesh name based on folder switch folder_name case ca_tri For triangular | meshes |
|
Determine mesh name based on folder switch folder_name case ca_tri For triangular | mesh1_2 |
|
Determine mesh name based on folder switch folder_name case ca_tri For triangular etc | mesh_name = sprintf('mesh1_%d', file_index) |
|
case ca_quad For quadrilateral | quad10x10 |
|
case ca_quad For quadrilateral etc | mesh_size = 5 * 2^(file_index-1) |
|
end Construct full filename | filename |
|
end function | h |
|
| h_cell = regexp(text, 'MeshSize:\s*([0-9.e+-]+)', 'tokens', 'once') |
|
end function | error |
|
| H1velocity = data(:,5).^2 |
|
| L2density = data(:,7).^2 |
|
| UPWdensity = data(:,9).^2 |
|
| nu = 1 |
|
| rhomin = 1 |
|
| err = max(L2density) + rhomin * max(L2velocity) + dt * sum(UPWdensity) + (nu * dt / 2) * sum(H1velocity) |
|