diff --git a/ANN_Data_Generator.py b/ANN_Data_Generator.py index f9d2e67259fc5da81db468877b4aeb62809150e7..b7600bbf24f304a395831fea42a7f7b6a3579a00 100644 --- a/ANN_Data_Generator.py +++ b/ANN_Data_Generator.py @@ -157,8 +157,6 @@ class TrainingDataGenerator: # Create normalized input data norm_input_matrix = self._normalize_data(input_matrix) - # print(input_matrix) - # print(norm_input_matrix) return {'input_data.raw': input_matrix, 'output_data': output_matrix, 'input_data.normalized': norm_input_matrix} @@ -217,10 +215,6 @@ class TrainingDataGenerator: adjustment = 0 if initial_condition.is_smooth() \ else mesh.non_ghost_cells[self._stencil_length//2] initial_condition.induce_adjustment(-mesh.cell_len/3) - # print(initial_condition.is_smooth()) - # print(mesh.interval_len, mesh.non_ghost_cells, mesh.cell_len) - # print(adjustment, -mesh.cell_len/3) - # print() # Calculate basis coefficients for stencil polynomial_degree = np.random.randint(1, high=5) @@ -229,7 +223,6 @@ class TrainingDataGenerator: basis=self._basis_list[polynomial_degree], quadrature=self._quadrature_list[polynomial_degree], adjustment=adjustment) - # print(projection) input_data[i] = self._basis_list[ polynomial_degree].calculate_cell_average( projection=projection[:, 1:-1], diff --git a/DG_Approximation.py b/DG_Approximation.py index 91070b08e51c16895542b71c0e541a5be6976bc1..26e3fa98cd3ac9d8720870c96a3c90b69eaa6b82 100644 --- a/DG_Approximation.py +++ b/DG_Approximation.py @@ -12,13 +12,17 @@ TODO: Contemplate containing coarse mesh generation in Mesh TODO: Contemplate extracting boundary condition from InitialCondition TODO: Contemplate containing boundary condition in Mesh TODO: Ask whether all quadratures depend on freely chosen num_nodes -TODO: Contemplate saving each IC separately +TODO: Contemplate saving training data for each IC separately TODO: Contemplate removing TrainingDataGenerator class Urgent: -TODO: Investigate self-referencing in classes +TODO: Investigate self-referencing in classes -> Done +TODO: Apply self-referencing in Mesh -> Done +TODO: Refactor random_stencil() -> Done +TODO: Fix bug applying wrong boundary condition when generating ANN + training data -> Done +TODO: Find errors in centering for ANN training -> Done TODO: Remove stencil_length as instance variable -TODO: Find errors in centering for ANN training TODO: Adapt TCD from Soraya (Dropbox->...->TEST_troubled-cell-detector->Troubled_Cell_Detector) TODO: Add TC condition to only flag cell if left-adjacent one is flagged as @@ -27,6 +31,8 @@ TODO: Move plot_approximation_results() into plotting script TODO: Add verbose output TODO: Improve file naming (e.g. use '.' instead of '__') TODO: Check whether ghost cells are handled/set correctly +TODO: Unify use of 'length' and 'len' in naming +TODO: Unify use of 'initial_condition' and 'init_cond' in naming TODO: Ensure uniform use of mesh and grid Critical, but not urgent: @@ -44,7 +50,6 @@ TODO: Extract object initialization from DGScheme TODO: Use cfl_number for updating, not just time Currently not critical: -TODO: Unify use of 'length' and 'len' in naming TODO: Replace loops with list comprehension if feasible TODO: Replace loops/list comprehension with vectorization if feasible TODO: Check whether 'projection' is always a ndarray @@ -319,10 +324,9 @@ def do_initial_projection(initial_condition, mesh, basis, quadrature, for eval_point in mesh.non_ghost_cells: new_row = [] - for degree in range(basis.polynomial_degree + 1): new_row.append(np.float64(sum(initial_condition.calculate( - mesh, eval_point + mesh.cell_len/2 + x=eval_point + mesh.cell_len/2 * quadrature.nodes[point] - adjustment) * basis.basis[degree].subs( x, quadrature.nodes[point]) diff --git a/Initial_Condition.py b/Initial_Condition.py index e7bd2a2c2b13e0a1a3f3eef8dff6e59e7a016b15..3ce562ae8e1fd94bf75e8c740e0bb32a6a52bb96 100644 --- a/Initial_Condition.py +++ b/Initial_Condition.py @@ -77,18 +77,18 @@ class InitialCondition(ABC): """ pass - def calculate(self, mesh, x): + def calculate(self, x, mesh=None): """Evaluates function at given x-value. - Projects x-value into interval of the periodic function and evaluates - the function. + If a mesh is given, the x-value is projected into its periodic + interval before evaluating the function. Parameters ---------- - mesh : Mesh - Mesh for calculation. x : float Evaluation point of function. + mesh : Mesh, optional + Mesh for calculation. Default: None. Returns ------- @@ -96,11 +96,12 @@ class InitialCondition(ABC): Value of function evaluates at x-value. """ - left_bound, right_bound = mesh.bounds - while x < left_bound: - x += mesh.interval_len - while x > right_bound: - x -= mesh.interval_len + if mesh is not None: + left_bound, right_bound = mesh.bounds + while x < left_bound: + x += mesh.interval_len + while x > right_bound: + x -= mesh.interval_len return self._get_point(x) @abstractmethod diff --git a/projection_utils.py b/projection_utils.py index 2ede5b24415a43a8b2094a1b589ff9db926b67ff..39f825ea7fabbd48a5106ad68aaeface524becd4 100644 --- a/projection_utils.py +++ b/projection_utils.py @@ -202,7 +202,7 @@ def calculate_exact_solution( eval_values = [] for eval_point in eval_points: - new_entry = init_cond.calculate(mesh, eval_point + new_entry = init_cond.calculate(mesh=mesh, x=eval_point - wave_speed * final_time + num_periods * mesh.interval_len) eval_values.append(new_entry)