|
| 1 | +from math import * |
| 2 | +import proteus.MeshTools |
| 3 | +from proteus import Domain |
| 4 | +from proteus.default_n import * |
| 5 | +from proteus.Profiling import logEvent |
| 6 | + |
| 7 | +from proteus import Context |
| 8 | + |
| 9 | +opts = Context.Options([ |
| 10 | + ("T", 4.0, "Time interval [0, T]"), |
| 11 | + ("he",0.2, "maximum size of edges"), |
| 12 | + ("onlySaveFinalSolution",False,"Only save the final solution"), |
| 13 | + ("vspaceOrder",2,"FE space for velocity"), |
| 14 | + ("pspaceOrder",1,"FE space for pressure") |
| 15 | +], mutable=True) |
| 16 | + |
| 17 | + |
| 18 | +sedimentDynamics=False |
| 19 | +genMesh = False#True |
| 20 | +movingDomain = False |
| 21 | +# applyRedistancing = True |
| 22 | +useOldPETSc = False |
| 23 | +useSuperlu = True#False |
| 24 | +timeDiscretization = 'vbdf'#'vbdf' # 'vbdf', 'be', 'flcbdf' |
| 25 | +spaceOrder = opts.vspaceOrder |
| 26 | +pspaceOrder = opts.pspaceOrder |
| 27 | +useHex = False |
| 28 | +useRBLES = 0.0 |
| 29 | +useMetrics = 1.0 |
| 30 | +# applyCorrection = True |
| 31 | +useVF = 0.0 |
| 32 | +useOnlyVF = False |
| 33 | +useRANS = 0 # 0 -- None |
| 34 | + # 1 -- K-Epsilon |
| 35 | + # 2 -- K-Omega |
| 36 | +openTop=True |
| 37 | +fl_H = 0.41 |
| 38 | +# Input checks |
| 39 | +if spaceOrder not in [1, 2]: |
| 40 | + print("INVALID: spaceOrder" + spaceOrder) |
| 41 | + sys.exit() |
| 42 | + |
| 43 | +if useRBLES not in [0.0, 1.0]: |
| 44 | + print("INVALID: useRBLES" + useRBLES) |
| 45 | + sys.exit() |
| 46 | + |
| 47 | +if useMetrics not in [0.0, 1.0]: |
| 48 | + print("INVALID: useMetrics") |
| 49 | + sys.exit() |
| 50 | + |
| 51 | +nd = 2 |
| 52 | + |
| 53 | +if spaceOrder == 1: |
| 54 | + hFactor = 1.0 |
| 55 | + if useHex: |
| 56 | + basis = C0_AffineLinearOnCubeWithNodalBasis |
| 57 | + elementQuadrature = CubeGaussQuadrature(nd, 2) |
| 58 | + elementBoundaryQuadrature = CubeGaussQuadrature(nd - 1, 2) |
| 59 | + else: |
| 60 | + basis = C0_AffineLinearOnSimplexWithNodalBasis |
| 61 | + elementQuadrature = SimplexGaussQuadrature(nd, 3) |
| 62 | + elementBoundaryQuadrature = SimplexGaussQuadrature(nd - 1, 3) |
| 63 | +elif spaceOrder == 2: |
| 64 | + hFactor = 0.5 |
| 65 | + if useHex: |
| 66 | + basis = C0_AffineLagrangeOnCubeWithNodalBasis |
| 67 | + elementQuadrature = CubeGaussQuadrature(nd, 4) |
| 68 | + elementBoundaryQuadrature = CubeGaussQuadrature(nd - 1, 4) |
| 69 | + else: |
| 70 | + basis = C0_AffineQuadraticOnSimplexWithNodalBasis |
| 71 | + elementQuadrature = SimplexGaussQuadrature(nd, 5) |
| 72 | + elementBoundaryQuadrature = SimplexGaussQuadrature(nd - 1, 5) |
| 73 | + |
| 74 | +if pspaceOrder == 1: |
| 75 | + if useHex: |
| 76 | + pbasis = C0_AffineLinearOnCubeWithNodalBasis |
| 77 | + else: |
| 78 | + pbasis = C0_AffineLinearOnSimplexWithNodalBasis |
| 79 | +elif pspaceOrder == 2: |
| 80 | + if useHex: |
| 81 | + pbasis = C0_AffineLagrangeOnCubeWithNodalBasis |
| 82 | + else: |
| 83 | + pbasis = C0_AffineQuadraticOnSimplexWithNodalBasis |
| 84 | + |
| 85 | + |
| 86 | +weak_bc_penalty_constant = 10.0 |
| 87 | +nLevels = 1 |
| 88 | +#parallelPartitioningType = proteus.MeshTools.MeshParallelPartitioningTypes.element |
| 89 | +parallelPartitioningType = proteus.MeshTools.MeshParallelPartitioningTypes.node |
| 90 | +nLayersOfOverlapForParallel = 0 |
| 91 | +structured = False |
| 92 | + |
| 93 | +he=opts.he |
| 94 | +DX=he |
| 95 | +try: |
| 96 | + from .symmetricDomain_john import symmetric2D |
| 97 | +except: |
| 98 | + from symmetricDomain_john import symmetric2D |
| 99 | + |
| 100 | +domain = symmetric2D(box=(2.2,0.41), |
| 101 | + L= 0.2, |
| 102 | + H = 0.2, |
| 103 | + r = 0.1, |
| 104 | + C = (0.2,0.2), |
| 105 | + DX = DX, |
| 106 | + refinement_length=1.0, |
| 107 | + DX_coarse = DX) |
| 108 | +domain.boundaryFlags['top']=domain.boundaryFlags['back'] |
| 109 | +domain.boundaryFlags['bottom']=domain.boundaryFlags['front'] |
| 110 | +#print domain.boundaryFlags |
| 111 | +boundaryTags = domain.boundaryTags = domain.boundaryFlags |
| 112 | +domain.writePoly("mesh") |
| 113 | +domain.writePLY("mesh") |
| 114 | +#domain.writeAsymptote("mesh") |
| 115 | +#triangleOptions = "VApq30Dena%8.8f" % ((he ** 2) / 2.0,) |
| 116 | +#triangleOptions = "VApq30Dena" |
| 117 | +triangleOptions= "Apq30ena" |
| 118 | + |
| 119 | +logEvent("""Mesh generated using: tetgen -%s %s""" % (triangleOptions, domain.polyfile + ".poly")) |
| 120 | +# Time stepping |
| 121 | +T=opts.T |
| 122 | +dt_fixed = 0.005#0.03 |
| 123 | +dt_init = 0.005#min(0.1*dt_fixed,0.001) |
| 124 | +runCFL=0.33 |
| 125 | +nDTout = int(round(T/dt_fixed)) |
| 126 | +tnList = [0.0,dt_init]+[i*dt_fixed for i in range(1,nDTout+1)] |
| 127 | + |
| 128 | +if opts.onlySaveFinalSolution == True: |
| 129 | + tnList = [0.0,dt_init,opts.T] |
| 130 | + |
| 131 | + |
| 132 | +# Numerical parameters |
| 133 | +ns_forceStrongDirichlet = False |
| 134 | +ns_sed_forceStrongDirichlet = False |
| 135 | +if useMetrics: |
| 136 | + ns_shockCapturingFactor = 0.0 |
| 137 | + ns_lag_shockCapturing = True |
| 138 | + ns_lag_subgridError = True |
| 139 | + ls_shockCapturingFactor = 0.5 |
| 140 | + ls_lag_shockCapturing = True |
| 141 | + ls_sc_uref = 1.0 |
| 142 | + ls_sc_beta = 1.5 |
| 143 | + vof_shockCapturingFactor = 0.5 |
| 144 | + vof_lag_shockCapturing = True |
| 145 | + vof_sc_uref = 1.0 |
| 146 | + vof_sc_beta = 1.5 |
| 147 | + rd_shockCapturingFactor = 0.5 |
| 148 | + rd_lag_shockCapturing = False |
| 149 | + epsFact_density = 1.5 |
| 150 | + epsFact_viscosity = epsFact_curvature = epsFact_vof = epsFact_consrv_heaviside = epsFact_consrv_dirac = epsFact_density |
| 151 | + epsFact_redistance = 0.33 |
| 152 | + epsFact_consrv_diffusion = 10.0 |
| 153 | + redist_Newton = True |
| 154 | + kappa_shockCapturingFactor = 0.25 |
| 155 | + kappa_lag_shockCapturing = True#False |
| 156 | + kappa_sc_uref = 1.0 |
| 157 | + kappa_sc_beta = 1.0 |
| 158 | + dissipation_shockCapturingFactor = 0.25 |
| 159 | + dissipation_lag_shockCapturing = True#False |
| 160 | + dissipation_sc_uref = 1.0 |
| 161 | + dissipation_sc_beta = 1.0 |
| 162 | +else: |
| 163 | + ns_shockCapturingFactor = 0.9 |
| 164 | + ns_lag_shockCapturing = True |
| 165 | + ns_lag_subgridError = True |
| 166 | + ns_sed_shockCapturingFactor = 0.9 |
| 167 | + ns_sed_lag_shockCapturing = True |
| 168 | + ns_sed_lag_subgridError = True |
| 169 | + ls_shockCapturingFactor = 0.9 |
| 170 | + ls_lag_shockCapturing = True |
| 171 | + ls_sc_uref = 1.0 |
| 172 | + ls_sc_beta = 1.0 |
| 173 | + vof_shockCapturingFactor = 0.9 |
| 174 | + vof_lag_shockCapturing = True |
| 175 | + vof_sc_uref = 1.0 |
| 176 | + vof_sc_beta = 1.0 |
| 177 | + vos_shockCapturingFactor = 0.9 |
| 178 | + vos_lag_shockCapturing = True |
| 179 | + vos_sc_uref = 1.0 |
| 180 | + vos_sc_beta = 1.0 |
| 181 | + rd_shockCapturingFactor = 0.9 |
| 182 | + rd_lag_shockCapturing = False |
| 183 | + epsFact_density = 1.5 |
| 184 | + epsFact_viscosity = epsFact_curvature = epsFact_vof = epsFact_vos = epsFact_consrv_heaviside = epsFact_consrv_dirac = \ |
| 185 | + epsFact_density |
| 186 | + epsFact_redistance = 0.33 |
| 187 | + epsFact_consrv_diffusion = 0.1 |
| 188 | + redist_Newton = False |
| 189 | + kappa_shockCapturingFactor = 0.9 |
| 190 | + kappa_lag_shockCapturing = True #False |
| 191 | + kappa_sc_uref = 1.0 |
| 192 | + kappa_sc_beta = 1.0 |
| 193 | + dissipation_shockCapturingFactor = 0.9 |
| 194 | + dissipation_lag_shockCapturing = True #False |
| 195 | + dissipation_sc_uref = 1.0 |
| 196 | + dissipation_sc_beta = 1.0 |
| 197 | + |
| 198 | +ns_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 199 | +ns_sed_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 200 | +vof_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 201 | +vos_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 202 | +ls_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 203 | +rd_nl_atol_res = max(1.0e-10, 0.05 * he) |
| 204 | +mcorr_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 205 | +kappa_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 206 | +dissipation_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 207 | +phi_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 208 | +pressure_nl_atol_res = max(1.0e-10, 0.01 * he ** 2) |
| 209 | + |
| 210 | +#turbulence |
| 211 | +ns_closure = 0 #1-classic smagorinsky, 2-dynamic smagorinsky, 3 -- k-epsilon, 4 -- k-omega |
| 212 | +ns_sed_closure = 0 #1-classic smagorinsky, 2-dynamic smagorinsky, 3 -- k-epsilon, 4 -- k-omega |
| 213 | +if useRANS == 1: |
| 214 | + ns_closure = 3 |
| 215 | +elif useRANS == 2: |
| 216 | + ns_closure == 4 |
| 217 | +# Water |
| 218 | +rho_0 = 1.0e0 |
| 219 | +nu_0 = 1.0e-3 |
| 220 | + |
| 221 | +# Air |
| 222 | +rho_1 = rho_0#1.205 |
| 223 | +nu_1 = nu_0#1.500e-5 |
| 224 | + |
| 225 | +# Sediment |
| 226 | + |
| 227 | +rho_s = rho_0 |
| 228 | +nu_s = 10000.0*nu_0 |
| 229 | +dragAlpha = 0.0 |
| 230 | + |
| 231 | +# Surface tension |
| 232 | +# sigma_01 = 0.0 |
| 233 | + |
| 234 | +# Gravity |
| 235 | +g = [0.0, 0.0] |
| 236 | + |
| 237 | +Um = 1.5 |
| 238 | + |
| 239 | +domain.MeshOptions.triangleOptions="pAq30ena"#D=Delaunay gives bad results for this composite meshing approach |
| 240 | +domain.MeshOptions.genMesh=False#True |
| 241 | +#domain.writePLY('cylinder2D') |
| 242 | +#domain.writePoly('mesh_cylinder2D') |
| 243 | +domain.polyfile = domain.polyfile=os.path.dirname(os.path.abspath(__file__))+"/../conforming_rans2p/"+"mesh_cylinder2D" |
| 244 | + |
| 245 | +if sedimentDynamics: |
| 246 | + pnList = [("vos_p", "vos_n"),#0 |
| 247 | + ("vof_p", "vof_n"),#1 |
| 248 | + ("ls_p", "ls_n"),#2 |
| 249 | + ("redist_p", "redist_n"),#3 |
| 250 | + ("ls_consrv_p", "ls_consrv_n"),#4 |
| 251 | + ("threep_navier_stokes_sed_p", "threep_navier_stokes_sed_n"),#5 |
| 252 | + ("twp_navier_stokes_p", "twp_navier_stokes_n"),#6 |
| 253 | + ("pressureincrement_p", "pressureincrement_n"),#7 |
| 254 | + ("pressure_p", "pressure_n"),#8 |
| 255 | + ("pressureInitial_p", "pressureInitial_n")]#9 |
| 256 | + VOS_model=0 |
| 257 | + VOF_model=1 |
| 258 | + LS_model=2 |
| 259 | + RD_model=3 |
| 260 | + MCORR_model=4 |
| 261 | + SED_model=5 |
| 262 | + V_model=6 |
| 263 | + PINC_model=7 |
| 264 | + PRESSURE_model=8 |
| 265 | + PINIT_model=9 |
| 266 | +else: |
| 267 | + pnList = [("twp_navier_stokes_p", "twp_navier_stokes_n"),#0 |
| 268 | + ("pressureincrement_p", "pressureincrement_n"),#1 |
| 269 | + ("pressure_p", "pressure_n"),#2 |
| 270 | + ("pressureInitial_p", "pressureInitial_n")]#3 |
| 271 | + |
| 272 | + VOF_model=None |
| 273 | + VOS_model=None |
| 274 | + SED_model=None |
| 275 | + V_model=0 |
| 276 | + PINC_model=1 |
| 277 | + PRESSURE_model=2 |
| 278 | + PINIT_model=3 |
0 commit comments