|
| 1 | +%clc |
| 2 | +clear |
| 3 | +close all |
| 4 | + |
| 5 | +addpath('../matlab') |
| 6 | + |
| 7 | +BalanceLaws.prepare_vars(); |
| 8 | +global I_Mesh I_TI I_BalanceLaws I_Tech I_RunOps I_Results |
| 9 | + |
| 10 | +N = uint32(64); |
| 11 | +I_Mesh('NODES_X') = N; I_Mesh('NODES_Y') = N; I_Mesh('NODES_Z') = N; |
| 12 | +I_Mesh('XMIN') = 0.0; I_Mesh('XMAX') = 6.283185307179586; % = 2*pi |
| 13 | +I_Mesh('YMIN') = 0.0; I_Mesh('YMAX') = 6.283185307179586; |
| 14 | +I_Mesh('ZMIN') = 0.0; I_Mesh('ZMAX') = 6.283185307179586; |
| 15 | + |
| 16 | +I_TI('final_time') = 10; |
| 17 | +I_TI('cfl') = 0.85; |
| 18 | + |
| 19 | +dt = I_TI('cfl') * (I_Mesh('YMAX') / double(I_Mesh('NODES_Y')-1)) / 10; |
| 20 | +num_steps = ceil(I_TI('final_time')/dt); |
| 21 | +dt = I_TI('final_time') / num_steps; |
| 22 | + |
| 23 | +%Time integrator: SSPRK33 SSPRK104 CalvoFrancoRandez2R64 |
| 24 | +%KennedyCarpenterLewis2R54C CarpenterKennedy2N54 ToulorgeDesmet2N84F |
| 25 | +I_TI('time_integrator') = 'CarpenterKennedy2N54'; |
| 26 | + |
| 27 | +I_TI('DT') = dt; |
| 28 | +I_TI('num_steps') = num_steps; |
| 29 | + |
| 30 | +I_Tech('device') = 1; |
| 31 | +I_Tech('REAL') = 'double'; % float, double |
| 32 | +I_Tech('REAL4') = sprintf('%s4',I_Tech('REAL')); %Vector datatype |
| 33 | +I_Tech('memory_layout') = 'USE_ARRAY_OF_STRUCTURES'; % USE_ARRAY_OF_STRUCTURES, USE_STRUCTURE_OF_ARRAYS |
| 34 | + |
| 35 | +% Use as kernel defines to keep consistency with header files? |
| 36 | +I_BalanceLaws('NUM_CONSERVED_VARS') = 5; |
| 37 | +I_BalanceLaws('NUM_AUXILIARY_VARS') = 4; |
| 38 | +I_BalanceLaws('NUM_TOTAL_VARS') = I_BalanceLaws('NUM_CONSERVED_VARS') + I_BalanceLaws('NUM_AUXILIARY_VARS'); |
| 39 | + |
| 40 | +%Compiler based optimizations |
| 41 | +if strcmp(I_Tech('REAL'),'float') |
| 42 | + I_Tech('optimizations') = ' -cl-mad-enable -cl-no-signed-zeros -cl-finite-math-only -cl-single-precision-constant'; |
| 43 | +else |
| 44 | + I_Tech('optimizations') = ' -cl-mad-enable -cl-no-signed-zeros -cl-finite-math-only'; |
| 45 | +end |
| 46 | + |
| 47 | +I_RunOps('periodic') = 'USE_PERIODIC'; % 'USE_PERIODIC', 'USE_PERIODIC'; must be set to 'USE_PERIODIC' |
| 48 | + % if periodic boundary conditions should be used |
| 49 | + |
| 50 | +I_RunOps('order') = 6; I_RunOps('operator_form') = 'classical'; % order: 2, 4, 6; operator_form: classical, extended |
| 51 | +I_RunOps('conservation_laws') = 'ideal_gas_Euler'; |
| 52 | +I_RunOps('testcase') = 'Taylor_Green_vortex'; |
| 53 | +I_RunOps('plot_numerical_solution') = 'z'; |
| 54 | +I_RunOps('save_integrals_over_time') = false; |
| 55 | +% Choose between L2 and LInfinity norm for error calculation |
| 56 | +I_RunOps('norm') = 'LInf'; % L2, LInf |
| 57 | +%% Initialize variables |
| 58 | +[field_u1, field_u2] = BalanceLaws.initialize(); |
| 59 | + |
| 60 | +fprintf('Testcase: %s \nOrder: %d \nTime integrator: %s\nDT: %.16e N_STEPS: %5d FINAL_TIME: %.16e\nDX: %.16e NODES_X: %5d\nDY: %.16e NODES_Y: %5d\nDZ: %.16e NODES_Z: %5d \nREAL: %s\n\n',... |
| 61 | + I_RunOps('testcase'), I_RunOps('order'), I_TI('time_integrator'), I_TI('DT'), I_TI('num_steps'), I_TI('final_time'), I_Mesh('DX'), I_Mesh('NODES_X'), I_Mesh('DY'), I_Mesh('NODES_Y'), I_Mesh('DZ'), I_Mesh('NODES_Z'), I_Tech('REAL')); |
| 62 | +%% Compute numerical solution |
| 63 | +BalanceLaws.compute_numerical_solution(field_u1, field_u2); |
| 64 | +fprintf('Total runtime: %.3f seconds Kernel runtime: %d\n', I_Results('runtime'), I_Results('kernel_runtime')); |
| 65 | + |
| 66 | +rel_err = I_Results('rel_err'); |
| 67 | +for comp=0:I_BalanceLaws('NUM_CONSERVED_VARS') - 1 |
| 68 | + fprintf('Relative Error of Field Component %d: %.15f %%\n', comp, 100*rel_err(comp + 1)) |
| 69 | +end |
| 70 | + |
| 71 | +%% Plot numerical solution |
| 72 | +num_nodes = I_Mesh('NODES_X')*I_Mesh('NODES_Y')*I_Mesh('NODES_Z'); |
| 73 | +field_u2(:) = field_u1; |
| 74 | +cl_run_kernel(I_Tech('device'), 'compute_vorticity', I_BalanceLaws('g_range'), I_BalanceLaws('l_range'), field_u1, field_u2, 0); |
| 75 | +if strcmp(I_Tech('memory_layout'), 'USE_ARRAY_OF_STRUCTURES') |
| 76 | + field_u1_plot = reshape(field_u1(1:num_nodes*I_BalanceLaws('NUM_TOTAL_VARS')), [I_BalanceLaws('NUM_TOTAL_VARS'), num_nodes]); |
| 77 | + field_u2_plot = reshape(field_u2(1:num_nodes*I_BalanceLaws('NUM_TOTAL_VARS')), [I_BalanceLaws('NUM_TOTAL_VARS'), num_nodes]); |
| 78 | +elseif strcmp(I_Tech('memory_layout'), 'USE_STRUCTURE_OF_ARRAYS') |
| 79 | + field_u1_tmp = reshape(field_u1, I_Tech('NUM_NODES_PAD'), I_BalanceLaws('NUM_TOTAL_VARS')); |
| 80 | + field_u1_plot = field_u1_tmp(1:num_nodes, :)'; |
| 81 | + field_u2_tmp = reshape(field_u2, I_Tech('NUM_NODES_PAD'), I_BalanceLaws('NUM_TOTAL_VARS')); |
| 82 | + field_u2_plot = field_u2_tmp(1:num_nodes, :)'; |
| 83 | +else |
| 84 | + error('You must USE_ARRAY_OF_STRUCTURES or USE_STRUCTURE_OF_ARRAYS.') |
| 85 | +end |
| 86 | + |
| 87 | +%Optional plots |
| 88 | +if ismember(lower(char(I_RunOps('plot_numerical_solution'))),{'x','y','z','xy', 'xz', 'yz', 'xyz'}) |
| 89 | + plot_2D(field_u1_plot, I_RunOps('plot_numerical_solution'),... |
| 90 | + I_Mesh('NODES_X'), I_Mesh('NODES_Y'), I_Mesh('NODES_Z'), 'Numerical Solution', 5, 5); |
| 91 | + |
| 92 | + plot_2D(field_u2_plot, I_RunOps('plot_numerical_solution'),... |
| 93 | + I_Mesh('NODES_X'), I_Mesh('NODES_Y'), I_Mesh('NODES_Z'), 'Vorticity', 6, 8); |
| 94 | +end |
| 95 | + |
0 commit comments