177841947SLeila Ghaffari // Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at 277841947SLeila Ghaffari // the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights 377841947SLeila Ghaffari // reserved. See files LICENSE and NOTICE for details. 477841947SLeila Ghaffari // 577841947SLeila Ghaffari // This file is part of CEED, a collection of benchmarks, miniapps, software 677841947SLeila Ghaffari // libraries and APIs for efficient high-order finite element and spectral 777841947SLeila Ghaffari // element discretizations for exascale applications. For more information and 877841947SLeila Ghaffari // source code availability see http://github.com/ceed. 977841947SLeila Ghaffari // 1077841947SLeila Ghaffari // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 1177841947SLeila Ghaffari // a collaborative effort of two U.S. Department of Energy organizations (Office 1277841947SLeila Ghaffari // of Science and the National Nuclear Security Administration) responsible for 1377841947SLeila Ghaffari // the planning and preparation of a capable exascale ecosystem, including 1477841947SLeila Ghaffari // software, applications, hardware, advanced system engineering and early 1577841947SLeila Ghaffari // testbed platforms, in support of the nation's exascale computing imperative. 1677841947SLeila Ghaffari 1777841947SLeila Ghaffari /// @file 1877841947SLeila Ghaffari /// Utility functions for setting up DENSITY_CURRENT 1977841947SLeila Ghaffari 2077841947SLeila Ghaffari #include "../navierstokes.h" 2177841947SLeila Ghaffari #include "../qfunctions/setupgeo.h" 2277841947SLeila Ghaffari #include "../qfunctions/densitycurrent.h" 2377841947SLeila Ghaffari 2477841947SLeila Ghaffari PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, void *setup_ctx, 2577841947SLeila Ghaffari void *ctx) { 2677841947SLeila Ghaffari SetupContext setup_context = *(SetupContext *)setup_ctx; 2777841947SLeila Ghaffari User user = *(User *)ctx; 2877841947SLeila Ghaffari StabilizationType stab; 2977841947SLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 3077841947SLeila Ghaffari PetscBool implicit; 3177841947SLeila Ghaffari PetscBool has_curr_time = PETSC_FALSE; 3277841947SLeila Ghaffari PetscInt ierr; 3377841947SLeila Ghaffari PetscFunctionBeginUser; 3477841947SLeila Ghaffari 3577841947SLeila Ghaffari ierr = PetscCalloc1(1, &user->phys->dc_ctx); CHKERRQ(ierr); 3677841947SLeila Ghaffari 3777841947SLeila Ghaffari // ------------------------------------------------------ 3877841947SLeila Ghaffari // SET UP DENSITY_CURRENT 3977841947SLeila Ghaffari // ------------------------------------------------------ 4077841947SLeila Ghaffari problem->dim = 3; 4177841947SLeila Ghaffari problem->q_data_size_vol = 10; 4277841947SLeila Ghaffari problem->q_data_size_sur = 4; 4377841947SLeila Ghaffari problem->setup_vol = Setup; 4477841947SLeila Ghaffari problem->setup_vol_loc = Setup_loc; 4577841947SLeila Ghaffari problem->setup_sur = SetupBoundary; 4677841947SLeila Ghaffari problem->setup_sur_loc = SetupBoundary_loc; 4777841947SLeila Ghaffari problem->ics = ICsDC; 4877841947SLeila Ghaffari problem->ics_loc = ICsDC_loc; 4977841947SLeila Ghaffari problem->apply_vol_rhs = DC; 5077841947SLeila Ghaffari problem->apply_vol_rhs_loc = DC_loc; 5177841947SLeila Ghaffari problem->apply_vol_ifunction = IFunction_DC; 5277841947SLeila Ghaffari problem->apply_vol_ifunction_loc = IFunction_DC_loc; 5377841947SLeila Ghaffari problem->bc = Exact_DC; 54d0b732dbSLeila Ghaffari problem->setup_ctx = SetupContext_DENSITY_CURRENT; 5577841947SLeila Ghaffari problem->bc_func = BC_DENSITY_CURRENT; 5677841947SLeila Ghaffari problem->non_zero_time = PETSC_FALSE; 5777841947SLeila Ghaffari problem->print_info = PRINT_DENSITY_CURRENT; 5877841947SLeila Ghaffari 5977841947SLeila Ghaffari // ------------------------------------------------------ 6077841947SLeila Ghaffari // Create the libCEED context 6177841947SLeila Ghaffari // ------------------------------------------------------ 6277841947SLeila Ghaffari CeedScalar theta0 = 300.; // K 6377841947SLeila Ghaffari CeedScalar thetaC = -15.; // K 6477841947SLeila Ghaffari CeedScalar P0 = 1.e5; // Pa 6577841947SLeila Ghaffari CeedScalar N = 0.01; // 1/s 6677841947SLeila Ghaffari CeedScalar cv = 717.; // J/(kg K) 6777841947SLeila Ghaffari CeedScalar cp = 1004.; // J/(kg K) 6877841947SLeila Ghaffari CeedScalar g = 9.81; // m/s^2 6977841947SLeila Ghaffari CeedScalar lambda = -2./3.; // - 7077841947SLeila Ghaffari CeedScalar mu = 75.; // Pa s, dynamic viscosity 7177841947SLeila Ghaffari // mu = 75 is not physical for air, but is good for numerical stability 7277841947SLeila Ghaffari CeedScalar k = 0.02638; // W/(m K) 73*504dc8e0SLeila Ghaffari CeedScalar c_tau = 0.5; // - 74932417b3SJed Brown // c_tau = 0.5 is reported as "optimal" in Hughes et al 2010 7577841947SLeila Ghaffari PetscScalar lx = 8000.; // m 7677841947SLeila Ghaffari PetscScalar ly = 8000.; // m 7777841947SLeila Ghaffari PetscScalar lz = 4000.; // m 7877841947SLeila Ghaffari CeedScalar rc = 1000.; // m (Radius of bubble) 7977841947SLeila Ghaffari PetscReal center[3], dc_axis[3] = {0, 0, 0}; 8077841947SLeila Ghaffari 8177841947SLeila Ghaffari // ------------------------------------------------------ 8277841947SLeila Ghaffari // Create the PETSc context 8377841947SLeila Ghaffari // ------------------------------------------------------ 8477841947SLeila Ghaffari PetscScalar meter = 1e-2; // 1 meter in scaled length units 8577841947SLeila Ghaffari PetscScalar kilogram = 1e-6; // 1 kilogram in scaled mass units 8677841947SLeila Ghaffari PetscScalar second = 1e-2; // 1 second in scaled time units 8777841947SLeila Ghaffari PetscScalar Kelvin = 1; // 1 Kelvin in scaled temperature units 8877841947SLeila Ghaffari PetscScalar W_per_m_K, Pascal, J_per_kg_K, m_per_squared_s; 8977841947SLeila Ghaffari 9077841947SLeila Ghaffari // ------------------------------------------------------ 9177841947SLeila Ghaffari // Command line Options 9277841947SLeila Ghaffari // ------------------------------------------------------ 9377841947SLeila Ghaffari ierr = PetscOptionsBegin(comm, NULL, "Options for DENSITY_CURRENT problem", 9477841947SLeila Ghaffari NULL); CHKERRQ(ierr); 9577841947SLeila Ghaffari // -- Physics 9677841947SLeila Ghaffari ierr = PetscOptionsScalar("-theta0", "Reference potential temperature", 9777841947SLeila Ghaffari NULL, theta0, &theta0, NULL); CHKERRQ(ierr); 9877841947SLeila Ghaffari ierr = PetscOptionsScalar("-thetaC", "Perturbation of potential temperature", 9977841947SLeila Ghaffari NULL, thetaC, &thetaC, NULL); CHKERRQ(ierr); 10077841947SLeila Ghaffari ierr = PetscOptionsScalar("-P0", "Atmospheric pressure", 10177841947SLeila Ghaffari NULL, P0, &P0, NULL); CHKERRQ(ierr); 10277841947SLeila Ghaffari ierr = PetscOptionsScalar("-N", "Brunt-Vaisala frequency", 10377841947SLeila Ghaffari NULL, N, &N, NULL); CHKERRQ(ierr); 10477841947SLeila Ghaffari ierr = PetscOptionsScalar("-cv", "Heat capacity at constant volume", 10577841947SLeila Ghaffari NULL, cv, &cv, NULL); CHKERRQ(ierr); 10677841947SLeila Ghaffari ierr = PetscOptionsScalar("-cp", "Heat capacity at constant pressure", 10777841947SLeila Ghaffari NULL, cp, &cp, NULL); CHKERRQ(ierr); 10877841947SLeila Ghaffari ierr = PetscOptionsScalar("-g", "Gravitational acceleration", 10977841947SLeila Ghaffari NULL, g, &g, NULL); CHKERRQ(ierr); 11077841947SLeila Ghaffari ierr = PetscOptionsScalar("-lambda", 11177841947SLeila Ghaffari "Stokes hypothesis second viscosity coefficient", 11277841947SLeila Ghaffari NULL, lambda, &lambda, NULL); CHKERRQ(ierr); 11377841947SLeila Ghaffari ierr = PetscOptionsScalar("-mu", "Shear dynamic viscosity coefficient", 11477841947SLeila Ghaffari NULL, mu, &mu, NULL); CHKERRQ(ierr); 11577841947SLeila Ghaffari ierr = PetscOptionsScalar("-k", "Thermal conductivity", 11677841947SLeila Ghaffari NULL, k, &k, NULL); CHKERRQ(ierr); 11777841947SLeila Ghaffari ierr = PetscOptionsScalar("-lx", "Length scale in x direction", 11877841947SLeila Ghaffari NULL, lx, &lx, NULL); CHKERRQ(ierr); 11977841947SLeila Ghaffari ierr = PetscOptionsScalar("-ly", "Length scale in y direction", 12077841947SLeila Ghaffari NULL, ly, &ly, NULL); CHKERRQ(ierr); 12177841947SLeila Ghaffari ierr = PetscOptionsScalar("-lz", "Length scale in z direction", 12277841947SLeila Ghaffari NULL, lz, &lz, NULL); CHKERRQ(ierr); 12377841947SLeila Ghaffari ierr = PetscOptionsScalar("-rc", "Characteristic radius of thermal bubble", 12477841947SLeila Ghaffari NULL, rc, &rc, NULL); CHKERRQ(ierr); 12577841947SLeila Ghaffari PetscInt n = problem->dim; 12677841947SLeila Ghaffari center[0] = 0.5 * lx; 12777841947SLeila Ghaffari center[1] = 0.5 * ly; 12877841947SLeila Ghaffari center[2] = 0.5 * lz; 12977841947SLeila Ghaffari ierr = PetscOptionsRealArray("-center", "Location of bubble center", 13077841947SLeila Ghaffari NULL, center, &n, NULL); CHKERRQ(ierr); 13177841947SLeila Ghaffari n = problem->dim; 13277841947SLeila Ghaffari ierr = PetscOptionsRealArray("-dc_axis", 13377841947SLeila Ghaffari "Axis of density current cylindrical anomaly, or {0,0,0} for spherically symmetric", 13477841947SLeila Ghaffari NULL, dc_axis, &n, NULL); CHKERRQ(ierr); 13577841947SLeila Ghaffari { 13677841947SLeila Ghaffari PetscReal norm = PetscSqrtReal(PetscSqr(dc_axis[0]) + PetscSqr(dc_axis[1]) + 13777841947SLeila Ghaffari PetscSqr(dc_axis[2])); 13877841947SLeila Ghaffari if (norm > 0) { 13977841947SLeila Ghaffari for (int i=0; i<3; i++) dc_axis[i] /= norm; 14077841947SLeila Ghaffari } 14177841947SLeila Ghaffari } 14277841947SLeila Ghaffari ierr = PetscOptionsEnum("-stab", "Stabilization method", NULL, 14377841947SLeila Ghaffari StabilizationTypes, (PetscEnum)(stab = STAB_NONE), 14477841947SLeila Ghaffari (PetscEnum *)&stab, NULL); CHKERRQ(ierr); 145932417b3SJed Brown ierr = PetscOptionsScalar("-c_tau", "Stabilization constant", 146932417b3SJed Brown NULL, c_tau, &c_tau, NULL); CHKERRQ(ierr); 14777841947SLeila Ghaffari ierr = PetscOptionsBool("-implicit", "Use implicit (IFunction) formulation", 14877841947SLeila Ghaffari NULL, implicit=PETSC_FALSE, &implicit, NULL); 14977841947SLeila Ghaffari CHKERRQ(ierr); 15077841947SLeila Ghaffari 15177841947SLeila Ghaffari // -- Units 15277841947SLeila Ghaffari ierr = PetscOptionsScalar("-units_meter", "1 meter in scaled length units", 15377841947SLeila Ghaffari NULL, meter, &meter, NULL); CHKERRQ(ierr); 15477841947SLeila Ghaffari meter = fabs(meter); 15577841947SLeila Ghaffari ierr = PetscOptionsScalar("-units_kilogram","1 kilogram in scaled mass units", 15677841947SLeila Ghaffari NULL, kilogram, &kilogram, NULL); CHKERRQ(ierr); 15777841947SLeila Ghaffari kilogram = fabs(kilogram); 15877841947SLeila Ghaffari ierr = PetscOptionsScalar("-units_second","1 second in scaled time units", 15977841947SLeila Ghaffari NULL, second, &second, NULL); CHKERRQ(ierr); 16077841947SLeila Ghaffari second = fabs(second); 16177841947SLeila Ghaffari ierr = PetscOptionsScalar("-units_Kelvin", 16277841947SLeila Ghaffari "1 Kelvin in scaled temperature units", 16377841947SLeila Ghaffari NULL, Kelvin, &Kelvin, NULL); CHKERRQ(ierr); 16477841947SLeila Ghaffari Kelvin = fabs(Kelvin); 16577841947SLeila Ghaffari 16677841947SLeila Ghaffari // -- Warnings 16777841947SLeila Ghaffari if (stab == STAB_SUPG && !implicit) { 16877841947SLeila Ghaffari ierr = PetscPrintf(comm, 16977841947SLeila Ghaffari "Warning! Use -stab supg only with -implicit\n"); 17077841947SLeila Ghaffari CHKERRQ(ierr); 17177841947SLeila Ghaffari } 17277841947SLeila Ghaffari 17377841947SLeila Ghaffari ierr = PetscOptionsEnd(); CHKERRQ(ierr); 17477841947SLeila Ghaffari 17577841947SLeila Ghaffari // ------------------------------------------------------ 17677841947SLeila Ghaffari // Set up the PETSc context 17777841947SLeila Ghaffari // ------------------------------------------------------ 17877841947SLeila Ghaffari // -- Define derived units 17977841947SLeila Ghaffari Pascal = kilogram / (meter * PetscSqr(second)); 18077841947SLeila Ghaffari J_per_kg_K = PetscSqr(meter) / (PetscSqr(second) * Kelvin); 18177841947SLeila Ghaffari m_per_squared_s = meter / PetscSqr(second); 18277841947SLeila Ghaffari W_per_m_K = kilogram * meter / (pow(second,3) * Kelvin); 18377841947SLeila Ghaffari 18477841947SLeila Ghaffari user->units->meter = meter; 18577841947SLeila Ghaffari user->units->kilogram = kilogram; 18677841947SLeila Ghaffari user->units->second = second; 18777841947SLeila Ghaffari user->units->Kelvin = Kelvin; 18877841947SLeila Ghaffari user->units->Pascal = Pascal; 18977841947SLeila Ghaffari user->units->J_per_kg_K = J_per_kg_K; 19077841947SLeila Ghaffari user->units->m_per_squared_s = m_per_squared_s; 19177841947SLeila Ghaffari user->units->W_per_m_K = W_per_m_K; 19277841947SLeila Ghaffari 19377841947SLeila Ghaffari // ------------------------------------------------------ 19477841947SLeila Ghaffari // Set up the libCEED context 19577841947SLeila Ghaffari // ------------------------------------------------------ 19677841947SLeila Ghaffari // -- Scale variables to desired units 19777841947SLeila Ghaffari theta0 *= Kelvin; 19877841947SLeila Ghaffari thetaC *= Kelvin; 19977841947SLeila Ghaffari P0 *= Pascal; 20077841947SLeila Ghaffari N *= (1./second); 20177841947SLeila Ghaffari cv *= J_per_kg_K; 20277841947SLeila Ghaffari cp *= J_per_kg_K; 20377841947SLeila Ghaffari g *= m_per_squared_s; 20477841947SLeila Ghaffari mu *= Pascal * second; 20577841947SLeila Ghaffari k *= W_per_m_K; 20677841947SLeila Ghaffari lx = fabs(lx) * meter; 20777841947SLeila Ghaffari ly = fabs(ly) * meter; 20877841947SLeila Ghaffari lz = fabs(lz) * meter; 20977841947SLeila Ghaffari rc = fabs(rc) * meter; 21077841947SLeila Ghaffari for (int i=0; i<3; i++) center[i] *= meter; 21177841947SLeila Ghaffari 21277841947SLeila Ghaffari // -- Setup Context 21377841947SLeila Ghaffari setup_context->theta0 = theta0; 21477841947SLeila Ghaffari setup_context->thetaC = thetaC; 21577841947SLeila Ghaffari setup_context->P0 = P0; 21677841947SLeila Ghaffari setup_context->N = N; 21777841947SLeila Ghaffari setup_context->cv = cv; 21877841947SLeila Ghaffari setup_context->cp = cp; 21977841947SLeila Ghaffari setup_context->g = g; 22077841947SLeila Ghaffari setup_context->rc = rc; 22177841947SLeila Ghaffari setup_context->lx = lx; 22277841947SLeila Ghaffari setup_context->ly = ly; 22377841947SLeila Ghaffari setup_context->lz = lz; 22477841947SLeila Ghaffari setup_context->center[0] = center[0]; 22577841947SLeila Ghaffari setup_context->center[1] = center[1]; 22677841947SLeila Ghaffari setup_context->center[2] = center[2]; 22777841947SLeila Ghaffari setup_context->dc_axis[0] = dc_axis[0]; 22877841947SLeila Ghaffari setup_context->dc_axis[1] = dc_axis[1]; 22977841947SLeila Ghaffari setup_context->dc_axis[2] = dc_axis[2]; 23077841947SLeila Ghaffari setup_context->time = 0; 23177841947SLeila Ghaffari 23277841947SLeila Ghaffari // -- QFunction Context 23377841947SLeila Ghaffari user->phys->stab = stab; 23477841947SLeila Ghaffari user->phys->implicit = implicit; 23577841947SLeila Ghaffari user->phys->has_curr_time = has_curr_time; 23677841947SLeila Ghaffari user->phys->dc_ctx->lambda = lambda; 23777841947SLeila Ghaffari user->phys->dc_ctx->mu = mu; 23877841947SLeila Ghaffari user->phys->dc_ctx->k = k; 23977841947SLeila Ghaffari user->phys->dc_ctx->cv = cv; 24077841947SLeila Ghaffari user->phys->dc_ctx->cp = cp; 24177841947SLeila Ghaffari user->phys->dc_ctx->g = g; 242932417b3SJed Brown user->phys->dc_ctx->c_tau = c_tau; 24377841947SLeila Ghaffari user->phys->dc_ctx->stabilization = stab; 24477841947SLeila Ghaffari 24577841947SLeila Ghaffari PetscFunctionReturn(0); 24677841947SLeila Ghaffari } 24777841947SLeila Ghaffari 248d0b732dbSLeila Ghaffari PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed, CeedData ceed_data, 249d0b732dbSLeila Ghaffari AppCtx app_ctx, SetupContext setup_ctx, 250d0b732dbSLeila Ghaffari Physics phys) { 251d0b732dbSLeila Ghaffari PetscFunctionBeginUser; 252d0b732dbSLeila Ghaffari 253d0b732dbSLeila Ghaffari CeedQFunctionContextCreate(ceed, &ceed_data->setup_context); 254d0b732dbSLeila Ghaffari CeedQFunctionContextSetData(ceed_data->setup_context, CEED_MEM_HOST, 255d0b732dbSLeila Ghaffari CEED_USE_POINTER, sizeof(*setup_ctx), setup_ctx); 256d0b732dbSLeila Ghaffari CeedQFunctionSetContext(ceed_data->qf_ics, ceed_data->setup_context); 257d0b732dbSLeila Ghaffari CeedQFunctionContextCreate(ceed, &ceed_data->dc_context); 258d0b732dbSLeila Ghaffari CeedQFunctionContextSetData(ceed_data->dc_context, CEED_MEM_HOST, 259d0b732dbSLeila Ghaffari CEED_USE_POINTER, 260d0b732dbSLeila Ghaffari sizeof(*phys->dc_ctx), phys->dc_ctx); 261d0b732dbSLeila Ghaffari if (ceed_data->qf_rhs_vol) 262d0b732dbSLeila Ghaffari CeedQFunctionSetContext(ceed_data->qf_rhs_vol, ceed_data->dc_context); 263d0b732dbSLeila Ghaffari if (ceed_data->qf_ifunction_vol) 264d0b732dbSLeila Ghaffari CeedQFunctionSetContext(ceed_data->qf_ifunction_vol, ceed_data->dc_context); 265d0b732dbSLeila Ghaffari 266d0b732dbSLeila Ghaffari PetscFunctionReturn(0); 267d0b732dbSLeila Ghaffari } 268d0b732dbSLeila Ghaffari 26977841947SLeila Ghaffari PetscErrorCode BC_DENSITY_CURRENT(DM dm, SimpleBC bc, Physics phys, 27077841947SLeila Ghaffari void *setup_ctx) { 27177841947SLeila Ghaffari 27277841947SLeila Ghaffari PetscInt len; 27377841947SLeila Ghaffari PetscBool flg; 27477841947SLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 27577841947SLeila Ghaffari PetscErrorCode ierr; 27677841947SLeila Ghaffari PetscFunctionBeginUser; 27777841947SLeila Ghaffari 27877841947SLeila Ghaffari // Default boundary conditions 27977841947SLeila Ghaffari // slip bc on all faces and no wall bc 28077841947SLeila Ghaffari bc->num_slip[0] = bc->num_slip[1] = bc->num_slip[2] = 2; 28177841947SLeila Ghaffari bc->slips[0][0] = 5; 28277841947SLeila Ghaffari bc->slips[0][1] = 6; 28377841947SLeila Ghaffari bc->slips[1][0] = 3; 28477841947SLeila Ghaffari bc->slips[1][1] = 4; 28577841947SLeila Ghaffari bc->slips[2][0] = 1; 28677841947SLeila Ghaffari bc->slips[2][1] = 2; 28777841947SLeila Ghaffari 28877841947SLeila Ghaffari // Parse command line options 28977841947SLeila Ghaffari ierr = PetscOptionsBegin(comm, NULL, "Options for DENSITY_CURRENT BCs ", 29077841947SLeila Ghaffari NULL); CHKERRQ(ierr); 29177841947SLeila Ghaffari ierr = PetscOptionsIntArray("-bc_wall", 29277841947SLeila Ghaffari "Use wall boundary conditions on this list of faces", 29377841947SLeila Ghaffari NULL, bc->walls, 29477841947SLeila Ghaffari (len = sizeof(bc->walls) / sizeof(bc->walls[0]), 29577841947SLeila Ghaffari &len), &flg); CHKERRQ(ierr); 29677841947SLeila Ghaffari if (flg) { 29777841947SLeila Ghaffari bc->num_wall = len; 29877841947SLeila Ghaffari // Using a no-slip wall disables automatic slip walls (they must be set explicitly) 29977841947SLeila Ghaffari bc->num_slip[0] = bc->num_slip[1] = bc->num_slip[2] = 0; 30077841947SLeila Ghaffari } 30177841947SLeila Ghaffari for (PetscInt j=0; j<3; j++) { 30277841947SLeila Ghaffari const char *flags[3] = {"-bc_slip_x", "-bc_slip_y", "-bc_slip_z"}; 30377841947SLeila Ghaffari ierr = PetscOptionsIntArray(flags[j], 30477841947SLeila Ghaffari "Use slip boundary conditions on this list of faces", 30577841947SLeila Ghaffari NULL, bc->slips[j], 30677841947SLeila Ghaffari (len = sizeof(bc->slips[j]) / sizeof(bc->slips[j][0]), 30777841947SLeila Ghaffari &len), &flg); CHKERRQ(ierr); 30877841947SLeila Ghaffari if (flg) { 30977841947SLeila Ghaffari bc->num_slip[j] = len; 31077841947SLeila Ghaffari bc->user_bc = PETSC_TRUE; 31177841947SLeila Ghaffari } 31277841947SLeila Ghaffari } 31377841947SLeila Ghaffari ierr = PetscOptionsEnd(); CHKERRQ(ierr); 31477841947SLeila Ghaffari 31577841947SLeila Ghaffari { 31677841947SLeila Ghaffari // Set slip boundary conditions 31777841947SLeila Ghaffari DMLabel label; 31877841947SLeila Ghaffari ierr = DMGetLabel(dm, "Face Sets", &label); CHKERRQ(ierr); 31977841947SLeila Ghaffari PetscInt comps[1] = {1}; 32077841947SLeila Ghaffari ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "slipx", label, "Face Sets", 32177841947SLeila Ghaffari bc->num_slip[0], bc->slips[0], 0, 1, comps, 32277841947SLeila Ghaffari (void(*)(void))NULL, NULL, setup_ctx, NULL); 32377841947SLeila Ghaffari CHKERRQ(ierr); 32477841947SLeila Ghaffari comps[0] = 2; 32577841947SLeila Ghaffari ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "slipy", label, "Face Sets", 32677841947SLeila Ghaffari bc->num_slip[1], bc->slips[1], 0, 1, comps, 32777841947SLeila Ghaffari (void(*)(void))NULL, NULL, setup_ctx, NULL); 32877841947SLeila Ghaffari CHKERRQ(ierr); 32977841947SLeila Ghaffari comps[0] = 3; 33077841947SLeila Ghaffari ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "slipz", label, "Face Sets", 33177841947SLeila Ghaffari bc->num_slip[2], bc->slips[2], 0, 1, comps, 33277841947SLeila Ghaffari (void(*)(void))NULL, NULL, setup_ctx, NULL); 33377841947SLeila Ghaffari CHKERRQ(ierr); 33477841947SLeila Ghaffari } 33577841947SLeila Ghaffari 336e6225c47SLeila Ghaffari if (bc->user_bc) { 33777841947SLeila Ghaffari for (PetscInt c = 0; c < 3; c++) { 33877841947SLeila Ghaffari for (PetscInt s = 0; s < bc->num_slip[c]; s++) { 33977841947SLeila Ghaffari for (PetscInt w = 0; w < bc->num_wall; w++) { 34077841947SLeila Ghaffari if (bc->slips[c][s] == bc->walls[w]) 34177841947SLeila Ghaffari SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, 34277841947SLeila Ghaffari "Boundary condition already set on face %D!\n", 34377841947SLeila Ghaffari bc->walls[w]); 34477841947SLeila Ghaffari } 34577841947SLeila Ghaffari } 34677841947SLeila Ghaffari } 34777841947SLeila Ghaffari } 34877841947SLeila Ghaffari 34977841947SLeila Ghaffari // Set wall boundary conditions 35077841947SLeila Ghaffari // zero velocity and zero flux for mass density and energy density 35177841947SLeila Ghaffari { 35277841947SLeila Ghaffari DMLabel label; 35377841947SLeila Ghaffari PetscInt comps[3] = {1, 2, 3}; 35477841947SLeila Ghaffari ierr = DMGetLabel(dm, "Face Sets", &label); CHKERRQ(ierr); 35577841947SLeila Ghaffari ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "wall", label, "Face Sets", 35677841947SLeila Ghaffari bc->num_wall, bc->walls, 0, 35777841947SLeila Ghaffari 3, comps, (void(*)(void))Exact_DC, NULL, 35877841947SLeila Ghaffari setup_ctx, NULL); CHKERRQ(ierr); 35977841947SLeila Ghaffari } 36077841947SLeila Ghaffari 36177841947SLeila Ghaffari PetscFunctionReturn(0); 36277841947SLeila Ghaffari } 36377841947SLeila Ghaffari 36477841947SLeila Ghaffari PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys, SetupContext setup_ctx, 36577841947SLeila Ghaffari AppCtx app_ctx) { 36677841947SLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 36777841947SLeila Ghaffari PetscErrorCode ierr; 36877841947SLeila Ghaffari PetscFunctionBeginUser; 36977841947SLeila Ghaffari 37077841947SLeila Ghaffari ierr = PetscPrintf(comm, 37177841947SLeila Ghaffari " Problem:\n" 37277841947SLeila Ghaffari " Problem Name : %s\n" 37377841947SLeila Ghaffari " Stabilization : %s\n", 37477841947SLeila Ghaffari app_ctx->problem_name, StabilizationTypes[phys->stab]); 37577841947SLeila Ghaffari CHKERRQ(ierr); 37677841947SLeila Ghaffari 37777841947SLeila Ghaffari PetscFunctionReturn(0); 37877841947SLeila Ghaffari } 379