1727da7e7SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2727da7e7SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3a515125bSLeila Ghaffari // 4727da7e7SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5a515125bSLeila Ghaffari // 6727da7e7SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 7a515125bSLeila Ghaffari 8a515125bSLeila Ghaffari /// @file 9a515125bSLeila Ghaffari /// Utility functions for setting up DENSITY_CURRENT 10a515125bSLeila Ghaffari 11a515125bSLeila Ghaffari #include "../navierstokes.h" 12a515125bSLeila Ghaffari #include "../qfunctions/densitycurrent.h" 13a515125bSLeila Ghaffari 1405a512bdSLeila Ghaffari PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, DM dm, void *setup_ctx, 15a515125bSLeila Ghaffari void *ctx) { 163a8779fbSJames Wright 173a8779fbSJames Wright PetscInt ierr; 183a8779fbSJames Wright ierr = NS_NEWTONIAN_IG(problem, dm, setup_ctx, ctx); CHKERRQ(ierr); 19a515125bSLeila Ghaffari SetupContext setup_context = *(SetupContext *)setup_ctx; 20a515125bSLeila Ghaffari User user = *(User *)ctx; 21a515125bSLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 22a515125bSLeila Ghaffari PetscFunctionBeginUser; 23a515125bSLeila Ghaffari 24a515125bSLeila Ghaffari // ------------------------------------------------------ 25a515125bSLeila Ghaffari // SET UP DENSITY_CURRENT 26a515125bSLeila Ghaffari // ------------------------------------------------------ 27a515125bSLeila Ghaffari problem->ics = ICsDC; 28a515125bSLeila Ghaffari problem->ics_loc = ICsDC_loc; 29a515125bSLeila Ghaffari problem->bc = Exact_DC; 30a515125bSLeila Ghaffari 31a515125bSLeila Ghaffari // ------------------------------------------------------ 32a515125bSLeila Ghaffari // Create the libCEED context 33a515125bSLeila Ghaffari // ------------------------------------------------------ 34a515125bSLeila Ghaffari CeedScalar rc = 1000.; // m (Radius of bubble) 35a515125bSLeila Ghaffari PetscReal center[3], dc_axis[3] = {0, 0, 0}; 3605a512bdSLeila Ghaffari PetscReal domain_min[3], domain_max[3], domain_size[3]; 3705a512bdSLeila Ghaffari ierr = DMGetBoundingBox(dm, domain_min, domain_max); CHKERRQ(ierr); 3805a512bdSLeila Ghaffari for (int i=0; i<3; i++) domain_size[i] = domain_max[i] - domain_min[i]; 39a515125bSLeila Ghaffari 40a515125bSLeila Ghaffari // ------------------------------------------------------ 41a515125bSLeila Ghaffari // Command line Options 42a515125bSLeila Ghaffari // ------------------------------------------------------ 43*1485969bSJeremy L Thompson PetscOptionsBegin(comm, NULL, "Options for DENSITY_CURRENT problem", NULL); 44a515125bSLeila Ghaffari ierr = PetscOptionsScalar("-rc", "Characteristic radius of thermal bubble", 45a515125bSLeila Ghaffari NULL, rc, &rc, NULL); CHKERRQ(ierr); 4605a512bdSLeila Ghaffari for (int i=0; i<3; i++) center[i] = .5*domain_size[i]; 47a515125bSLeila Ghaffari PetscInt n = problem->dim; 48a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-center", "Location of bubble center", 49a515125bSLeila Ghaffari NULL, center, &n, NULL); CHKERRQ(ierr); 50a515125bSLeila Ghaffari n = problem->dim; 51a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-dc_axis", 52a515125bSLeila Ghaffari "Axis of density current cylindrical anomaly, or {0,0,0} for spherically symmetric", 53a515125bSLeila Ghaffari NULL, dc_axis, &n, NULL); CHKERRQ(ierr); 54a515125bSLeila Ghaffari { 55a515125bSLeila Ghaffari PetscReal norm = PetscSqrtReal(PetscSqr(dc_axis[0]) + PetscSqr(dc_axis[1]) + 56a515125bSLeila Ghaffari PetscSqr(dc_axis[2])); 57a515125bSLeila Ghaffari if (norm > 0) { 58a515125bSLeila Ghaffari for (int i=0; i<3; i++) dc_axis[i] /= norm; 59a515125bSLeila Ghaffari } 60a515125bSLeila Ghaffari } 61a515125bSLeila Ghaffari 62*1485969bSJeremy L Thompson PetscOptionsEnd(); 63a515125bSLeila Ghaffari 643a8779fbSJames Wright PetscScalar meter = user->units->meter; 65a515125bSLeila Ghaffari rc = fabs(rc) * meter; 66a515125bSLeila Ghaffari for (int i=0; i<3; i++) center[i] *= meter; 67a515125bSLeila Ghaffari 68a515125bSLeila Ghaffari setup_context->rc = rc; 69a515125bSLeila Ghaffari setup_context->center[0] = center[0]; 70a515125bSLeila Ghaffari setup_context->center[1] = center[1]; 71a515125bSLeila Ghaffari setup_context->center[2] = center[2]; 72a515125bSLeila Ghaffari setup_context->dc_axis[0] = dc_axis[0]; 73a515125bSLeila Ghaffari setup_context->dc_axis[1] = dc_axis[1]; 74a515125bSLeila Ghaffari setup_context->dc_axis[2] = dc_axis[2]; 75a515125bSLeila Ghaffari 76a515125bSLeila Ghaffari PetscFunctionReturn(0); 77a515125bSLeila Ghaffari } 78a515125bSLeila Ghaffari 79ba5420e5SLeila Ghaffari PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed, CeedData ceed_data, 80002797a3SLeila Ghaffari AppCtx app_ctx, SetupContext setup_ctx, Physics phys) { 81ba5420e5SLeila Ghaffari PetscFunctionBeginUser; 823a8779fbSJames Wright PetscInt ierr = SetupContext_NEWTONIAN_IG(ceed, ceed_data, app_ctx, setup_ctx, 833a8779fbSJames Wright phys); 843a8779fbSJames Wright CHKERRQ(ierr); 85a515125bSLeila Ghaffari PetscFunctionReturn(0); 86a515125bSLeila Ghaffari } 87a515125bSLeila Ghaffari 88a515125bSLeila Ghaffari PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys, SetupContext setup_ctx, 89a515125bSLeila Ghaffari AppCtx app_ctx) { 90a515125bSLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 91a515125bSLeila Ghaffari PetscErrorCode ierr; 92a515125bSLeila Ghaffari PetscFunctionBeginUser; 93a515125bSLeila Ghaffari 94a515125bSLeila Ghaffari ierr = PetscPrintf(comm, 95a515125bSLeila Ghaffari " Problem:\n" 96a515125bSLeila Ghaffari " Problem Name : %s\n" 97a515125bSLeila Ghaffari " Stabilization : %s\n", 98a515125bSLeila Ghaffari app_ctx->problem_name, StabilizationTypes[phys->stab]); 99a515125bSLeila Ghaffari CHKERRQ(ierr); 100a515125bSLeila Ghaffari 101a515125bSLeila Ghaffari PetscFunctionReturn(0); 102a515125bSLeila Ghaffari } 103