|
| 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) |
| |