1a515125bSLeila Ghaffari // Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at 2a515125bSLeila Ghaffari // the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights 3a515125bSLeila Ghaffari // reserved. See files LICENSE and NOTICE for details. 4a515125bSLeila Ghaffari // 5a515125bSLeila Ghaffari // This file is part of CEED, a collection of benchmarks, miniapps, software 6a515125bSLeila Ghaffari // libraries and APIs for efficient high-order finite element and spectral 7a515125bSLeila Ghaffari // element discretizations for exascale applications. For more information and 8a515125bSLeila Ghaffari // source code availability see http://github.com/ceed. 9a515125bSLeila Ghaffari // 10a515125bSLeila Ghaffari // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 11a515125bSLeila Ghaffari // a collaborative effort of two U.S. Department of Energy organizations (Office 12a515125bSLeila Ghaffari // of Science and the National Nuclear Security Administration) responsible for 13a515125bSLeila Ghaffari // the planning and preparation of a capable exascale ecosystem, including 14a515125bSLeila Ghaffari // software, applications, hardware, advanced system engineering and early 15a515125bSLeila Ghaffari // testbed platforms, in support of the nation's exascale computing imperative. 16a515125bSLeila Ghaffari 17a515125bSLeila Ghaffari /// @file 18a515125bSLeila Ghaffari /// Utility functions for setting up DENSITY_CURRENT 19a515125bSLeila Ghaffari 20a515125bSLeila Ghaffari #include "../navierstokes.h" 21a515125bSLeila Ghaffari #include "../qfunctions/densitycurrent.h" 22a515125bSLeila Ghaffari 2305a512bdSLeila Ghaffari PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, DM dm, void *setup_ctx, 24a515125bSLeila Ghaffari void *ctx) { 25*3a8779fbSJames Wright 26*3a8779fbSJames Wright PetscInt ierr; 27*3a8779fbSJames Wright ierr = NS_NEWTONIAN_IG(problem, dm, setup_ctx, ctx); CHKERRQ(ierr); 28a515125bSLeila Ghaffari SetupContext setup_context = *(SetupContext *)setup_ctx; 29a515125bSLeila Ghaffari User user = *(User *)ctx; 30a515125bSLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 31a515125bSLeila Ghaffari PetscFunctionBeginUser; 32a515125bSLeila Ghaffari 33a515125bSLeila Ghaffari // ------------------------------------------------------ 34a515125bSLeila Ghaffari // SET UP DENSITY_CURRENT 35a515125bSLeila Ghaffari // ------------------------------------------------------ 36a515125bSLeila Ghaffari problem->ics = ICsDC; 37a515125bSLeila Ghaffari problem->ics_loc = ICsDC_loc; 38a515125bSLeila Ghaffari problem->bc = Exact_DC; 39a515125bSLeila Ghaffari 40a515125bSLeila Ghaffari // ------------------------------------------------------ 41a515125bSLeila Ghaffari // Create the libCEED context 42a515125bSLeila Ghaffari // ------------------------------------------------------ 43a515125bSLeila Ghaffari CeedScalar rc = 1000.; // m (Radius of bubble) 44a515125bSLeila Ghaffari PetscReal center[3], dc_axis[3] = {0, 0, 0}; 4505a512bdSLeila Ghaffari PetscReal domain_min[3], domain_max[3], domain_size[3]; 4605a512bdSLeila Ghaffari ierr = DMGetBoundingBox(dm, domain_min, domain_max); CHKERRQ(ierr); 4705a512bdSLeila Ghaffari for (int i=0; i<3; i++) domain_size[i] = domain_max[i] - domain_min[i]; 48a515125bSLeila Ghaffari 49a515125bSLeila Ghaffari // ------------------------------------------------------ 50a515125bSLeila Ghaffari // Command line Options 51a515125bSLeila Ghaffari // ------------------------------------------------------ 52a515125bSLeila Ghaffari ierr = PetscOptionsBegin(comm, NULL, "Options for DENSITY_CURRENT problem", 53a515125bSLeila Ghaffari NULL); CHKERRQ(ierr); 54a515125bSLeila Ghaffari ierr = PetscOptionsScalar("-rc", "Characteristic radius of thermal bubble", 55a515125bSLeila Ghaffari NULL, rc, &rc, NULL); CHKERRQ(ierr); 5605a512bdSLeila Ghaffari for (int i=0; i<3; i++) center[i] = .5*domain_size[i]; 57a515125bSLeila Ghaffari PetscInt n = problem->dim; 58a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-center", "Location of bubble center", 59a515125bSLeila Ghaffari NULL, center, &n, NULL); CHKERRQ(ierr); 60a515125bSLeila Ghaffari n = problem->dim; 61a515125bSLeila Ghaffari ierr = PetscOptionsRealArray("-dc_axis", 62a515125bSLeila Ghaffari "Axis of density current cylindrical anomaly, or {0,0,0} for spherically symmetric", 63a515125bSLeila Ghaffari NULL, dc_axis, &n, NULL); CHKERRQ(ierr); 64a515125bSLeila Ghaffari { 65a515125bSLeila Ghaffari PetscReal norm = PetscSqrtReal(PetscSqr(dc_axis[0]) + PetscSqr(dc_axis[1]) + 66a515125bSLeila Ghaffari PetscSqr(dc_axis[2])); 67a515125bSLeila Ghaffari if (norm > 0) { 68a515125bSLeila Ghaffari for (int i=0; i<3; i++) dc_axis[i] /= norm; 69a515125bSLeila Ghaffari } 70a515125bSLeila Ghaffari } 71a515125bSLeila Ghaffari 72a515125bSLeila Ghaffari ierr = PetscOptionsEnd(); CHKERRQ(ierr); 73a515125bSLeila Ghaffari 74*3a8779fbSJames Wright PetscScalar meter = user->units->meter; 75a515125bSLeila Ghaffari rc = fabs(rc) * meter; 76a515125bSLeila Ghaffari for (int i=0; i<3; i++) center[i] *= meter; 77a515125bSLeila Ghaffari 78a515125bSLeila Ghaffari setup_context->rc = rc; 79a515125bSLeila Ghaffari setup_context->center[0] = center[0]; 80a515125bSLeila Ghaffari setup_context->center[1] = center[1]; 81a515125bSLeila Ghaffari setup_context->center[2] = center[2]; 82a515125bSLeila Ghaffari setup_context->dc_axis[0] = dc_axis[0]; 83a515125bSLeila Ghaffari setup_context->dc_axis[1] = dc_axis[1]; 84a515125bSLeila Ghaffari setup_context->dc_axis[2] = dc_axis[2]; 85a515125bSLeila Ghaffari 86a515125bSLeila Ghaffari PetscFunctionReturn(0); 87a515125bSLeila Ghaffari } 88a515125bSLeila Ghaffari 89ba5420e5SLeila Ghaffari PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed, CeedData ceed_data, 90002797a3SLeila Ghaffari AppCtx app_ctx, SetupContext setup_ctx, Physics phys) { 91ba5420e5SLeila Ghaffari PetscFunctionBeginUser; 92*3a8779fbSJames Wright PetscInt ierr = SetupContext_NEWTONIAN_IG(ceed, ceed_data, app_ctx, setup_ctx, 93*3a8779fbSJames Wright phys); 94*3a8779fbSJames Wright CHKERRQ(ierr); 95a515125bSLeila Ghaffari PetscFunctionReturn(0); 96a515125bSLeila Ghaffari } 97a515125bSLeila Ghaffari 98a515125bSLeila Ghaffari PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys, SetupContext setup_ctx, 99a515125bSLeila Ghaffari AppCtx app_ctx) { 100a515125bSLeila Ghaffari MPI_Comm comm = PETSC_COMM_WORLD; 101a515125bSLeila Ghaffari PetscErrorCode ierr; 102a515125bSLeila Ghaffari PetscFunctionBeginUser; 103a515125bSLeila Ghaffari 104a515125bSLeila Ghaffari ierr = PetscPrintf(comm, 105a515125bSLeila Ghaffari " Problem:\n" 106a515125bSLeila Ghaffari " Problem Name : %s\n" 107a515125bSLeila Ghaffari " Stabilization : %s\n", 108a515125bSLeila Ghaffari app_ctx->problem_name, StabilizationTypes[phys->stab]); 109a515125bSLeila Ghaffari CHKERRQ(ierr); 110a515125bSLeila Ghaffari 111a515125bSLeila Ghaffari PetscFunctionReturn(0); 112a515125bSLeila Ghaffari } 113