1*727da7e7SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2*727da7e7SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3a515125bSLeila Ghaffari // 4*727da7e7SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5a515125bSLeila Ghaffari // 6*727da7e7SJeremy 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 // ------------------------------------------------------ 43a515125bSLeila Ghaffari ierr = PetscOptionsBegin(comm, NULL, "Options for DENSITY_CURRENT problem", 44a515125bSLeila Ghaffari NULL); CHKERRQ(ierr); 45a515125bSLeila Ghaffari ierr = PetscOptionsScalar("-rc", "Characteristic radius of thermal bubble", 46a515125bSLeila Ghaffari NULL, rc, &rc, NULL); CHKERRQ(ierr); 4705a512bdSLeila Ghaffari for (int i=0; i<3; i++) center[i] = .5*domain_size[i]; 48a515125bSLeila Ghaffari PetscInt n = problem->dim; 49a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-center", "Location of bubble center", 50a515125bSLeila Ghaffari NULL, center, &n, NULL); CHKERRQ(ierr); 51a515125bSLeila Ghaffari n = problem->dim; 52a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-dc_axis", 53a515125bSLeila Ghaffari "Axis of density current cylindrical anomaly, or {0,0,0} for spherically symmetric", 54a515125bSLeila Ghaffari NULL, dc_axis, &n, NULL); CHKERRQ(ierr); 55a515125bSLeila Ghaffari { 56a515125bSLeila Ghaffari PetscReal norm = PetscSqrtReal(PetscSqr(dc_axis[0]) + PetscSqr(dc_axis[1]) + 57a515125bSLeila Ghaffari PetscSqr(dc_axis[2])); 58a515125bSLeila Ghaffari if (norm > 0) { 59a515125bSLeila Ghaffari for (int i=0; i<3; i++) dc_axis[i] /= norm; 60a515125bSLeila Ghaffari } 61a515125bSLeila Ghaffari } 62a515125bSLeila Ghaffari 63a515125bSLeila Ghaffari ierr = PetscOptionsEnd(); CHKERRQ(ierr); 64a515125bSLeila Ghaffari 653a8779fbSJames Wright PetscScalar meter = user->units->meter; 66a515125bSLeila Ghaffari rc = fabs(rc) * meter; 67a515125bSLeila Ghaffari for (int i=0; i<3; i++) center[i] *= meter; 68a515125bSLeila Ghaffari 69a515125bSLeila Ghaffari setup_context->rc = rc; 70a515125bSLeila Ghaffari setup_context->center[0] = center[0]; 71a515125bSLeila Ghaffari setup_context->center[1] = center[1]; 72a515125bSLeila Ghaffari setup_context->center[2] = center[2]; 73a515125bSLeila Ghaffari setup_context->dc_axis[0] = dc_axis[0]; 74a515125bSLeila Ghaffari setup_context->dc_axis[1] = dc_axis[1]; 75a515125bSLeila Ghaffari setup_context->dc_axis[2] = dc_axis[2]; 76a515125bSLeila Ghaffari 77a515125bSLeila Ghaffari PetscFunctionReturn(0); 78a515125bSLeila Ghaffari } 79a515125bSLeila Ghaffari 80ba5420e5SLeila Ghaffari PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed, CeedData ceed_data, 81002797a3SLeila Ghaffari AppCtx app_ctx, SetupContext setup_ctx, Physics phys) { 82ba5420e5SLeila Ghaffari PetscFunctionBeginUser; 833a8779fbSJames Wright PetscInt ierr = SetupContext_NEWTONIAN_IG(ceed, ceed_data, app_ctx, setup_ctx, 843a8779fbSJames Wright phys); 853a8779fbSJames Wright CHKERRQ(ierr); 86a515125bSLeila Ghaffari PetscFunctionReturn(0); 87a515125bSLeila Ghaffari } 88a515125bSLeila Ghaffari 89a515125bSLeila Ghaffari PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys, SetupContext setup_ctx, 90a515125bSLeila Ghaffari AppCtx app_ctx) { 91a515125bSLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 92a515125bSLeila Ghaffari PetscErrorCode ierr; 93a515125bSLeila Ghaffari PetscFunctionBeginUser; 94a515125bSLeila Ghaffari 95a515125bSLeila Ghaffari ierr = PetscPrintf(comm, 96a515125bSLeila Ghaffari " Problem:\n" 97a515125bSLeila Ghaffari " Problem Name : %s\n" 98a515125bSLeila Ghaffari " Stabilization : %s\n", 99a515125bSLeila Ghaffari app_ctx->problem_name, StabilizationTypes[phys->stab]); 100a515125bSLeila Ghaffari CHKERRQ(ierr); 101a515125bSLeila Ghaffari 102a515125bSLeila Ghaffari PetscFunctionReturn(0); 103a515125bSLeila Ghaffari } 104