xref: /honee/problems/gaussianwave.c (revision 149fb5361f5198e41f87e8815a7e9dbfee84a96a)
1dc936754SJeremy L Thompson // Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors.
2e7754af5SKenneth E. Jansen // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3e7754af5SKenneth E. Jansen //
4e7754af5SKenneth E. Jansen // SPDX-License-Identifier: BSD-2-Clause
5e7754af5SKenneth E. Jansen //
6e7754af5SKenneth E. Jansen // This file is part of CEED:  http://github.com/ceed
7e7754af5SKenneth E. Jansen 
8e7754af5SKenneth E. Jansen /// @file
9e7754af5SKenneth E. Jansen /// Utility functions for setting up Gaussian Wave problem
10e7754af5SKenneth E. Jansen 
11e7754af5SKenneth E. Jansen #include "../qfunctions/gaussianwave.h"
12e7754af5SKenneth E. Jansen 
13e419654dSJeremy L Thompson #include <ceed.h>
14e419654dSJeremy L Thompson #include <petscdm.h>
15e419654dSJeremy L Thompson 
16*149fb536SJames Wright #include <navierstokes.h>
179ed3d70dSJames Wright #include "../qfunctions/bc_freestream_type.h"
18e7754af5SKenneth E. Jansen 
19991aef52SJames Wright PetscErrorCode NS_GAUSSIAN_WAVE(ProblemData problem, DM dm, void *ctx, SimpleBC bc) {
20e7754af5SKenneth E. Jansen   User                     user = *(User *)ctx;
21b4c37c5cSJames Wright   MPI_Comm                 comm = user->comm;
22b4c37c5cSJames Wright   Ceed                     ceed = user->ceed;
23e7754af5SKenneth E. Jansen   GaussianWaveContext      gausswave_ctx;
24e7754af5SKenneth E. Jansen   FreestreamContext        freestream_ctx;
25e7754af5SKenneth E. Jansen   NewtonianIdealGasContext newtonian_ig_ctx;
26e7754af5SKenneth E. Jansen   CeedQFunctionContext     gausswave_context;
27e7754af5SKenneth E. Jansen 
28e7754af5SKenneth E. Jansen   PetscFunctionBeginUser;
29e7754af5SKenneth E. Jansen   PetscCall(NS_NEWTONIAN_IG(problem, dm, ctx, bc));
30e7754af5SKenneth E. Jansen 
31e7754af5SKenneth E. Jansen   switch (user->phys->state_var) {
32e7754af5SKenneth E. Jansen     case STATEVAR_CONSERVATIVE:
33e7754af5SKenneth E. Jansen       problem->ics.qfunction     = IC_GaussianWave_Conserv;
34e7754af5SKenneth E. Jansen       problem->ics.qfunction_loc = IC_GaussianWave_Conserv_loc;
35e7754af5SKenneth E. Jansen       break;
36e7754af5SKenneth E. Jansen     case STATEVAR_PRIMITIVE:
37e7754af5SKenneth E. Jansen       problem->ics.qfunction     = IC_GaussianWave_Prim;
38e7754af5SKenneth E. Jansen       problem->ics.qfunction_loc = IC_GaussianWave_Prim_loc;
39e7754af5SKenneth E. Jansen       break;
409b103f75SJames Wright     case STATEVAR_ENTROPY:
419b103f75SJames Wright       problem->ics.qfunction     = IC_GaussianWave_Entropy;
429b103f75SJames Wright       problem->ics.qfunction_loc = IC_GaussianWave_Entropy_loc;
439b103f75SJames Wright       break;
44e7754af5SKenneth E. Jansen   }
45e7754af5SKenneth E. Jansen 
46e7754af5SKenneth E. Jansen   // -- Option Defaults
47e7754af5SKenneth E. Jansen   CeedScalar epicenter[3] = {0.};   // m
48e7754af5SKenneth E. Jansen   CeedScalar width        = 0.002;  // m
49e7754af5SKenneth E. Jansen   CeedScalar amplitude    = 0.1;    // -
50e7754af5SKenneth E. Jansen 
51e7754af5SKenneth E. Jansen   PetscOptionsBegin(comm, NULL, "Options for GAUSSIAN_WAVE problem", NULL);
52e7754af5SKenneth E. Jansen   PetscInt narray = 3;
53e7754af5SKenneth E. Jansen   PetscCall(PetscOptionsScalarArray("-epicenter", "Coordinates of center of wave", NULL, epicenter, &narray, NULL));
54e7754af5SKenneth E. Jansen   PetscCheck(narray == 3, comm, PETSC_ERR_ARG_SIZ, "-epicenter should recieve array of size 3, instead recieved size %" PetscInt_FMT ".", narray);
55e7754af5SKenneth E. Jansen   PetscCall(PetscOptionsScalar("-width", "Width parameter for perturbation size", NULL, width, &width, NULL));
56e7754af5SKenneth E. Jansen   PetscCall(PetscOptionsScalar("-amplitude", "Amplitude of the perturbation", NULL, amplitude, &amplitude, NULL));
57e7754af5SKenneth E. Jansen   PetscOptionsEnd();
58e7754af5SKenneth E. Jansen 
59e7754af5SKenneth E. Jansen   width *= user->units->meter;
60e7754af5SKenneth E. Jansen   for (int i = 0; i < 3; i++) epicenter[i] *= user->units->meter;
61e7754af5SKenneth E. Jansen 
62e7754af5SKenneth E. Jansen   // -- Set gausswave_ctx struct values
63e7754af5SKenneth E. Jansen   PetscCall(PetscCalloc1(1, &gausswave_ctx));
64b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextGetData(problem->apply_vol_rhs.qfunction_context, CEED_MEM_HOST, &newtonian_ig_ctx));
65b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextGetData(problem->apply_freestream.qfunction_context, CEED_MEM_HOST, &freestream_ctx));
66e7754af5SKenneth E. Jansen 
67e7754af5SKenneth E. Jansen   gausswave_ctx->amplitude = amplitude;
68e7754af5SKenneth E. Jansen   gausswave_ctx->width     = width;
69e7754af5SKenneth E. Jansen   gausswave_ctx->S_infty   = freestream_ctx->S_infty;
70e7754af5SKenneth E. Jansen   gausswave_ctx->newt_ctx  = *newtonian_ig_ctx;
71e7754af5SKenneth E. Jansen   PetscCall(PetscArraycpy(gausswave_ctx->epicenter, epicenter, 3));
72e7754af5SKenneth E. Jansen 
73b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextRestoreData(problem->apply_vol_rhs.qfunction_context, &newtonian_ig_ctx));
74b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextRestoreData(problem->apply_freestream.qfunction_context, &freestream_ctx));
75e7754af5SKenneth E. Jansen 
76b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextCreate(user->ceed, &gausswave_context));
77b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextSetData(gausswave_context, CEED_MEM_HOST, CEED_USE_POINTER, sizeof(*gausswave_ctx), gausswave_ctx));
78b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextSetDataDestroy(gausswave_context, CEED_MEM_HOST, FreeContextPetsc));
79b4c37c5cSJames Wright   PetscCallCeed(ceed, CeedQFunctionContextDestroy(&problem->ics.qfunction_context));
80e7754af5SKenneth E. Jansen   problem->ics.qfunction_context = gausswave_context;
81d949ddfcSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
82e7754af5SKenneth E. Jansen }
83