|
| 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 | +% Alfven wave testcase used in [Fluxo](https://github.com/project-fluxo/fluxo), domain [-1,1]^3. |
| 11 | +N = uint32(40); |
| 12 | +I_Mesh('NODES_X') = N; I_Mesh('NODES_Y') = N; I_Mesh('NODES_Z') = uint32(5); |
| 13 | +I_Mesh('XMIN') = -1.0; I_Mesh('XMAX') = 1.0; |
| 14 | +I_Mesh('YMIN') = -1.0; I_Mesh('YMAX') = 1.0; |
| 15 | +I_Mesh('ZMIN') = -1.0; I_Mesh('ZMAX') = 1.0; |
| 16 | + |
| 17 | +I_TI('final_time') = 125; |
| 18 | +I_TI('cfl') = 0.4; |
| 19 | + |
| 20 | +dt = I_TI('cfl') * 2.0 / double(I_Mesh('NODES_Y')); |
| 21 | +num_steps = ceil(I_TI('final_time')/dt); |
| 22 | +dt = I_TI('final_time') / num_steps; |
| 23 | + |
| 24 | +%Time integrator: SSPRK33 SSPRK104 CalvoFrancoRandez2R64 |
| 25 | +%KennedyCarpenterLewis2R54C CarpenterKennedy2N54 ToulorgeDesmet2N84F |
| 26 | +I_TI('time_integrator') = 'CarpenterKennedy2N54'; |
| 27 | + |
| 28 | +I_TI('DT') = dt; |
| 29 | +I_TI('num_steps') = num_steps; |
| 30 | + |
| 31 | +I_Tech('device') = 1; |
| 32 | +I_Tech('REAL') = 'double'; % float, double |
| 33 | +I_Tech('REAL4') = sprintf('%s4',I_Tech('REAL')); %Vector datatype |
| 34 | +I_Tech('memory_layout') = 'USE_STRUCTURE_OF_ARRAYS'; % USE_ARRAY_OF_STRUCTURES, USE_STRUCTURE_OF_ARRAYS |
| 35 | + |
| 36 | +% Use as kernel defines to keep consistency with header files? |
| 37 | +I_BalanceLaws('NUM_CONSERVED_VARS') = 8; |
| 38 | +I_BalanceLaws('NUM_AUXILIARY_VARS') = 4; |
| 39 | +I_BalanceLaws('NUM_TOTAL_VARS') = I_BalanceLaws('NUM_CONSERVED_VARS') + I_BalanceLaws('NUM_AUXILIARY_VARS'); |
| 40 | + |
| 41 | +%Compiler based optimizations |
| 42 | +if strcmp(I_Tech('REAL'),'float') |
| 43 | + I_Tech('optimizations') = ' -cl-mad-enable -cl-no-signed-zeros -cl-finite-math-only -cl-single-precision-constant'; |
| 44 | +else |
| 45 | + I_Tech('optimizations') = ' -cl-mad-enable -cl-no-signed-zeros -cl-finite-math-only'; |
| 46 | +end |
| 47 | + |
| 48 | +I_RunOps('periodic') = 'USE_PERIODIC'; % 'NONE', 'USE_PERIODIC'; must be set to 'USE_PERIODIC' |
| 49 | + % if periodic boundary conditions should be used |
| 50 | + |
| 51 | +I_RunOps('order') = 6; I_RunOps('operator_form') = 'classical'; % order: 2, 4, 6; operator_form: classical, extended |
| 52 | +I_RunOps('conservation_laws') = 'ideal_MHD'; |
| 53 | +I_RunOps('testcase') = 'alfven_fluxo'; |
| 54 | +I_RunOps('plot_numerical_solution') = 'z'; |
| 55 | +I_RunOps('save_integrals_over_time') = false; |
| 56 | +% Choose between L2 and LInfinity norm for error calculation |
| 57 | +I_RunOps('norm') = 'LInf'; % L2, LInf |
| 58 | +%% Initialize variables |
| 59 | +[field_u1, field_u2] = BalanceLaws.initialize(); |
| 60 | + |
| 61 | +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',... |
| 62 | + 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')); |
| 63 | +%% Compute numerical solution |
| 64 | +BalanceLaws.compute_numerical_solution(field_u1, field_u2); |
| 65 | +fprintf('Total runtime: %.3f seconds Kernel runtime: %d\n', I_Results('runtime'), I_Results('kernel_runtime')); |
| 66 | + |
| 67 | +rel_err = I_Results('rel_err'); |
| 68 | +for comp=0:I_BalanceLaws('NUM_CONSERVED_VARS') - 1 |
| 69 | + fprintf('Relative Error of Field Component %d: %.15f %%\n', comp, 100*rel_err(comp + 1)) |
| 70 | +end |
| 71 | + |
| 72 | +%% Plot numerical solution |
| 73 | +num_nodes = I_Mesh('NODES_X')*I_Mesh('NODES_Y')*I_Mesh('NODES_Z'); |
| 74 | +if strcmp(I_Tech('memory_layout'), 'USE_ARRAY_OF_STRUCTURES') |
| 75 | + field_u1_plot = reshape(field_u1(1:num_nodes*I_BalanceLaws('NUM_TOTAL_VARS')), [I_BalanceLaws('NUM_TOTAL_VARS'), num_nodes]); |
| 76 | +elseif strcmp(I_Tech('memory_layout'), 'USE_STRUCTURE_OF_ARRAYS') |
| 77 | + field_u1_tmp = reshape(field_u1, I_Tech('NUM_NODES_PAD'), I_BalanceLaws('NUM_TOTAL_VARS')); |
| 78 | + field_u1_plot = field_u1_tmp(1:num_nodes, :)'; |
| 79 | +else |
| 80 | + error('You must USE_ARRAY_OF_STRUCTURES or USE_STRUCTURE_OF_ARRAYS.') |
| 81 | +end |
| 82 | + |
| 83 | +%Optional plots |
| 84 | +if ismember(lower(char(I_RunOps('plot_numerical_solution'))),{'x','y','z','xy', 'xz', 'yz', 'xyz'}) |
| 85 | + plot_2D(field_u1_plot, I_RunOps('plot_numerical_solution'),... |
| 86 | + I_Mesh('NODES_X'), I_Mesh('NODES_Y'), I_Mesh('NODES_Z'), 'Numerical Solution', 6, 8); |
| 87 | +end |
0 commit comments