Exemple #1
0
def AddDofs(model_part):
    for node in model_part.Nodes:
        # adding dofs
        node.AddDof(VELOCITY_X)
        node.AddDof(VELOCITY_Y)
        node.AddDof(VELOCITY_Z)
        node.AddDof(PRESSURE)

    levelset_solver.AddDofs(model_part, distance_settings)
    print("dofs for the monolithic solver added correctly")
    def __init__(self, model_part, domain_size, fluid_linear_solver_settings,
                 redistance_settings, ConvectionType):
        Timer.Start("DPG_Monolithic_constructor")
        if (ConvectionType == "Classic"):
            self.use_distance_convection_process = False
        else:
            self.use_distance_convection_process = True
        # DISTANCE CONVECTION SELECTION
        if (self.use_distance_convection_process == False):
            import levelset_solver
            levelset_solver.AddVariables(model_part, distance_settings)
            levelset_solver.AddDofs(model_part, distance_settings)
        else:
            pass
            #model_part.AddNodalSolutionStepVariable(DISTANCE)
        #self.compute_flow_length_object=ComputeFlowLength1(model_part)
    #def __init__(self, model_part, domain_size,linear_solver_iterations=300, linear_solver_tolerance=1e-5,dynamic_tau_levelset=0.01):
        self.fluid_linear_solver_settings = fluid_linear_solver_settings
        self.redistance_settings = redistance_settings
        self.redistance_type = redistance_settings.redistance_type
        self.model_part = model_part
        self.domain_size = domain_size
        self.alpha = -0.0
        self.move_mesh_strategy = 0
        # self.time_scheme = ResidualBasedPredictorCorrectorVelocityBossakSchemeDPGEnriched(
        # self.alpha, self.move_mesh_strategy, self.domain_size)
        self.time_scheme = ResidualBasedPredictorCorrectorBDFSchemeTurbulent(
            self.domain_size)
        self.time_scheme.Check(self.model_part)

        # self.time_scheme = ResidualBasedPredictorCorrectorVelocityBossakScheme( self.alpha,self.move_mesh_strategy )
        # definition of the solvers
        # self.linear_solver =  SkylineLUFactorizationSolver()
        # self.linear_solver =SuperLUSolver()
        # self.linear_solver = MKLPardisoSolver()
        # pPrecond = DiagonalPreconditioner()
        # pPrecond = ILU0Preconditioner()
        # self.linear_solver =  BICGSTABSolver(1e-6, 5000,pPrecond)
        # gmres_size = 30
        # ilu_level_of_fill = 2
        # tol = 1e-5
        # verbosity = 0
        # self.linear_solver = PastixSolver(tol,gmres_size,ilu_level_of_fill,verbosity,False)
        # self.linear_solver = PastixSolver(verbosity,False)
        # new solvers
        self.gmres_size = fluid_linear_solver_settings.gmres_size
        self.iterations = fluid_linear_solver_settings.linear_solver_iterations  #400 # Ojo, antes 200
        self.tol = fluid_linear_solver_settings.linear_solver_tolerance  #1e-5 #Before 1e-5
        self.verbosity = fluid_linear_solver_settings.verbosity
        if (fluid_linear_solver_settings.linear_solver_type == "BICGSTAB2"):
            #self.linear_solver = ExternalSolver.ScalingSolver(AMGCLSolver(
            self.linear_solver = ScalingSolver(
                ExternalSolver.AMGCLSolver(
                    ExternalSolver.AMGCLSmoother.ILU0,
                    ExternalSolver.AMGCLIterativeSolverType.
                    BICGSTAB2,  #AMGCLIterativeSolverType.GMRES, #BICGSTAB_WITH_GMRES_FALLBACK,
                    fluid_linear_solver_settings.linear_solver_tolerance,
                    fluid_linear_solver_settings.linear_solver_iterations,
                    fluid_linear_solver_settings.verbosity,
                    fluid_linear_solver_settings.gmres_size),
                True)
        else:
            self.linear_solver = ScalingSolver(
                ExternalSolver.AMGCLSolver(
                    ExternalSolver.AMGCLSmoother.ILU0,
                    ExternalSolver.AMGCLIterativeSolverType.
                    BICGSTAB_WITH_GMRES_FALLBACK,  #AMGCLIterativeSolverType.GMRES, #BICGSTAB_WITH_GMRES_FALLBACK,
                    fluid_linear_solver_settings.linear_solver_tolerance,
                    fluid_linear_solver_settings.linear_solver_iterations,
                    fluid_linear_solver_settings.verbosity,
                    fluid_linear_solver_settings.gmres_size),
                True)
        # definition of the convergence criteria
        self.rel_vel_tol = 1e-5
        self.abs_vel_tol = 1e-7
        self.rel_pres_tol = 1e-5
        self.abs_pres_tol = 1e-7

        self.dynamic_tau_levelset = fluid_linear_solver_settings.dynamic_tau_levelset
        self.dynamic_tau_fluid = fluid_linear_solver_settings.dynamic_tau_fluid  #0.01
        self.oss_switch = 0

        # non newtonian setting
        self.regularization_coef = 1000

        self.max_iter = 30

        # default settings
        self.echo_level = 0
        self.CalculateReactionFlag = True
        self.ReformDofSetAtEachStep = True
        self.CalculateNormDxFlag = True
        self.MoveMeshFlag = False
        self.volume_correction = True
        self.vol_cr_step = 5
        # Data for constructing the mass loss
        self.AcumulatedMassLossInWalls = 0.0
        self.AcumulatedMassLossInWetWalls = 0.0
        self.AcumulatedConvectedMass = 0.0
        self.AcumulatedLossInRedistance = 0.0

        # print "Construction monolithic solver finished"

        # Creat Lavel_set solver
        # construct the model part
        if (self.use_distance_convection_process == False):
            if (domain_size == 2):
                raise "error, still not implemented in 2D"
                conv_elem = "SUPGConv2D"
                conv_cond = "Condition2D"
            else:
                conv_elem = "SUPGConv3D"  #"SUPGConvLevelSet"#"SUPGConv3D"
                conv_cond = "Condition3D"
            self.level_set_model_part = ModelPart("level_set_model_part")
            self.conv_generator = ConnectivityPreserveModeler()
            (self.conv_generator).GenerateModelPart(self.model_part,
                                                    self.level_set_model_part,
                                                    conv_elem, conv_cond)
            # constructing the convection solver for the distance
            self.level_set_solver = levelset_solver.Solver(
                self.level_set_model_part, domain_size, distance_settings)
            self.level_set_solver.max_iter = 8
        else:  #### The Distance Convection will be used
            max_cfl = 5.0
            ## For using linear solver GMRES #AMGCLIterativeSolverType.GMRES, #BICGSTAB_WITH_GMRES_FALLBACK,
            #linear_solver = ScalingSolver(AMGCLSolver( AMGCLSmoother.ILU0, AMGCLIterativeSolverType.GMRES, 1e-9, 50, fluid_linear_solver_settings.verbosity, 50),True)
            self.convection_tolerance = 1e-9
            self.convection_max_number_iterations = 100
            self.convection_gmres_size = 25
            linear_solver = ScalingSolver(
                ExternalSolver.AMGCLSolver(
                    ExternalSolver.AMGCLSmoother.ILU0, ExternalSolver.
                    AMGCLIterativeSolverType.BICGSTAB_WITH_GMRES_FALLBACK,
                    self.convection_tolerance,
                    self.convection_max_number_iterations,
                    fluid_linear_solver_settings.verbosity,
                    self.convection_gmres_size), True)

            self.levelset_convection_process = LevelSetConvectionProcess3D(
                DISTANCE, self.model_part, linear_solver, max_cfl)
    #
    # properties of the two fluids
        self.rho1 = 2400.0  # applied on the negative part of the domain 1000.0
        self.conductivity1 = 1.0

        self.rho2 = 1.0  # applied to the positive part of the domain#1.0
        self.conductivity2 = 1.0

        self.mu = 3.0e-3
        self.divergence_clearance_performed = False

        ##########################################
        ##### Compute Max Edge Size       ########
        ##########################################

        if (self.domain_size == 2):
            self.max_edge_size = ParallelDistanceCalculator2D(
            ).FindMaximumEdgeSize(self.model_part)
        else:
            self.max_edge_size = ParallelDistanceCalculator3D(
            ).FindMaximumEdgeSize(self.model_part)

        self.average_edge_size = BiphasicFillingUtilities().ComputePartAvgh(
            self.model_part)
        # self.max_distance = self.max_edge_size * self.redistance_settings.max_distance_factor #Ojo antes 5.0

        ##########################################
        ##### Initialize Counters         ########
        ##########################################
        self.internal_step_counter = 1
        self.redistance_frequency = self.redistance_settings.redistance_frequency

        ##########################################
        ##### OLD REDISTANCE              ########
        ##########################################

        # Distance utilities
        if (self.redistance_type == "Old"):
            print("performing Old Redistance")
            if (self.domain_size == 2):
                self.distance_calculator = ParallelDistanceCalculator2D()
            else:
                self.distance_calculator = ParallelDistanceCalculator3D()

            self.max_edge_size = self.distance_calculator.FindMaximumEdgeSize(
                self.model_part)
            self.max_distance = self.max_edge_size * self.redistance_settings.max_distance_factor  #Ojo antes 5.0
            self.max_levels = self.redistance_settings.max_levels  #Ojo antes 25

            self.max_ns_iterations = self.redistance_settings.max_ns_iterations  #Ojo antes 8
        else:
            print("performing New Redistance")
            for cond in self.model_part.Conditions:
                for node in cond.GetNodes():
                    node.Set(BOUNDARY, True)
            distance_calculator_aux = ParallelDistanceCalculator3D()
            self.max_edge_size = distance_calculator_aux.FindMaximumEdgeSize(
                self.model_part)
            distance_linear_solver = linear_solver_factory.ConstructSolver(
                self.redistance_settings)
            self.distance_calculator = VariationalDistanceCalculationProcess3D(
                self.model_part, distance_linear_solver,
                self.redistance_settings.redistance_iterations)
            self.max_distance = self.max_edge_size * self.redistance_settings.max_distance_factor
        # Slip condition
        self.use_slip_conditions = False

        # volume correction
        self.volume_correction_switch = True
        self.negative_volume_correction = False
        self.volume_corrector_type = "Old"

        # element size
        self.maxmin = []
        ParticleLevelSetUtils3D().FindMaxMinEdgeSize(self.model_part,
                                                     self.maxmin)
        # Variables needed for computing the Efficiency of the Injection
        self.OldNetInletVolume = 0.0
        self.OldWetVolume = 0.0

        self.distance_utilities = DistanceUtilities()
        self.volume_corrector = CorrectVolume(self.model_part,
                                              self.average_edge_size,
                                              self.max_edge_size)
        Timer.Stop("DPG_Monolithic_constructor")