def CalculateRecoveryErrors(self, time): error_mat_deriv = 0. max_error_mat_deriv = - float('inf') error_laplacian = 0. max_error_laplacian = - float('inf') total_volume = 0. mat_deriv_average = Vector(3) laplacian_average = Vector(3) for k in range(3): mat_deriv_average[k] = 0.0 laplacian_average[k] = 0.0 norm_mat_deriv_average = 0. norm_laplacian_average = 0. module_mat_deriv = 0. module_laplacian = 0. fluid_model_part = self.all_model_parts.Get('FluidPart') for i_node, node in enumerate(fluid_model_part.Nodes): calc_mat_deriv = [0.] * 3 calc_laplacian = [0.] * 3 mat_deriv= Vector(3) laplacian= Vector(3) coor= Vector(3) coor[0]=node.X coor[1]=node.Y coor[2]=node.Z self.flow_field.CalculateMaterialAcceleration(time, coor, mat_deriv, 0) self.flow_field.CalculateLaplacian(time, coor, laplacian, 0) calc_mat_deriv[0] = node.GetSolutionStepValue(MATERIAL_ACCELERATION_X) calc_mat_deriv[1] = node.GetSolutionStepValue(MATERIAL_ACCELERATION_Y) calc_mat_deriv[2] = node.GetSolutionStepValue(MATERIAL_ACCELERATION_Z) calc_laplacian[0] = node.GetSolutionStepValue(VELOCITY_LAPLACIAN_X) calc_laplacian[1] = node.GetSolutionStepValue(VELOCITY_LAPLACIAN_Y) calc_laplacian[2] = node.GetSolutionStepValue(VELOCITY_LAPLACIAN_Z) module_mat_deriv += math.sqrt(calc_mat_deriv[0] ** 2 + calc_mat_deriv[1] ** 2 + calc_mat_deriv[2] ** 2) module_laplacian += math.sqrt(calc_laplacian[0] ** 2 + calc_laplacian[1] ** 2 + calc_laplacian[2] ** 2) #module_mat_deriv = max(math.sqrt(mat_deriv[0] ** 2 + mat_deriv[1] ** 2 + mat_deriv[2] ** 2), 1e-8) #module_laplacian = max(math.sqrt(laplacian[0] ** 2 + laplacian[1] ** 2 + laplacian[2] ** 2), 1e-8) #laplacian[0] = 14 #laplacian[1] = 2 #laplacian[2] = 0 #nodal_volume = node.GetSolutionStepValue(NODAL_AREA) #total_volume += nodal_volume current_error = SDP.NormOfDifference(calc_mat_deriv, mat_deriv) error_mat_deriv += current_error max_error_mat_deriv = max(max_error_mat_deriv, current_error) current_error = SDP.NormOfDifference(calc_laplacian, laplacian) error_laplacian += current_error max_error_laplacian = max(max_error_laplacian, current_error) diff_mat_deriv = [calc_mat_deriv[i] - mat_deriv[i] for i in range(len(calc_mat_deriv))] diff_laplacian = [calc_laplacian[i] - laplacian[i] for i in range(len(calc_laplacian))] #mat_deriv_averager.SDP.Norm(diff_mat_deriv) #laplacian_averager.SDP.Norm(diff_laplacian) #for k in range(3): #mat_deriv_average[k] += mat_deriv[k] #laplacian_average[k] += laplacian[k] norm_mat_deriv_average += SDP.Norm(mat_deriv) norm_laplacian_average += SDP.Norm(laplacian) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_RATE_X, calc_mat_deriv[0] - mat_deriv[0]) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_RATE_Y, calc_mat_deriv[1] - mat_deriv[1]) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_RATE_Z, calc_mat_deriv[2] - mat_deriv[2]) #node.SetSolutionStepValue(MATERIAL_ACCELERATION_X, mat_deriv[0]) #node.SetSolutionStepValue(MATERIAL_ACCELERATION_Y, mat_deriv[1]) #node.SetSolutionStepValue(MATERIAL_ACCELERATION_Z, mat_deriv[2]) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_X, calc_laplacian[0] - laplacian[0]) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Y, calc_laplacian[1] - laplacian[1]) node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Z, calc_laplacian[2] - laplacian[2]) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_X, calc_laplacian_0) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Y, calc_laplacian_1) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Z, calc_laplacian_2) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_X, laplacian[0]) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Y, laplacian[1]) #node.SetSolutionStepValue(VELOCITY_LAPLACIAN_Z, laplacian[2]) module_mat_deriv /= len(fluid_model_part.Nodes) module_laplacian /= len(fluid_model_part.Nodes) SDP.MultiplyNodalVariableByFactor(fluid_model_part, VELOCITY_LAPLACIAN_RATE, 1.0 / module_mat_deriv) SDP.MultiplyNodalVariableByFactor(fluid_model_part, VELOCITY_LAPLACIAN, 1.0 / module_laplacian) if norm_mat_deriv_average > 0. and norm_laplacian_average > 0: self.current_mat_deriv_errors[0] = error_mat_deriv / norm_mat_deriv_average self.current_mat_deriv_errors[1] = max_error_mat_deriv / norm_mat_deriv_average * len(fluid_model_part.Nodes) self.current_laplacian_errors[0] = error_laplacian / norm_laplacian_average self.current_laplacian_errors[1] = max_error_laplacian / norm_laplacian_average * len(fluid_model_part.Nodes) self.mat_deriv_errors.append(self.current_mat_deriv_errors) self.laplacian_errors.append(self.current_laplacian_errors) #print('mat_deriv: min, max, avg, ', mat_deriv_averager.GetCurrentData()) #print('laplacian: min, max, avg, ', laplacian_averager.GetCurrentData()) print('rel_error_mat_deriv', error_mat_deriv / norm_mat_deriv_average) print('rel_error_laplacian', error_laplacian / norm_laplacian_average)
calc_laplacian[1] = node.GetSolutionStepValue(VELOCITY_LAPLACIAN_Y) calc_laplacian[2] = node.GetSolutionStepValue(VELOCITY_LAPLACIAN_Z) module_mat_deriv += math.sqrt(calc_mat_deriv[0]**2 + calc_mat_deriv[1]**2 + calc_mat_deriv[2]**2) module_laplacian += math.sqrt(calc_laplacian[0]**2 + calc_laplacian[1]**2 + calc_laplacian[2]**2) #module_mat_deriv = max(math.sqrt(mat_deriv[0] ** 2 + mat_deriv[1] ** 2 + mat_deriv[2] ** 2), 1e-8) #module_laplacian = max(math.sqrt(laplacian[0] ** 2 + laplacian[1] ** 2 + laplacian[2] ** 2), 1e-8) #laplacian[0] = 14 #laplacian[1] = 2 #laplacian[2] = 0 #nodal_volume = node.GetSolutionStepValue(NODAL_AREA) #total_volume += nodal_volume current_error = swim_proc.NormOfDifference(calc_mat_deriv, mat_deriv) error_mat_deriv += current_error max_error_mat_deriv = max(max_error_mat_deriv, current_error) current_error = swim_proc.NormOfDifference(calc_laplacian, laplacian) error_laplacian += current_error max_error_laplacian = max(max_error_laplacian, current_error) diff_mat_deriv = [ calc_mat_deriv[i] - mat_deriv[i] for i in range(len(calc_mat_deriv)) ] diff_laplacian = [ calc_laplacian[i] - laplacian[i] for i in range(len(calc_laplacian)) ] #mat_deriv_averager.swim_proc.Norm(diff_mat_deriv)