xref: /honee/problems/taylorgreen.c (revision cde3d787254b08959b09942e5479b240fd3e38f4)
1 // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2 // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3 
4 /// @file
5 /// Utility functions for setting up Taylor-Green Vortex
6 
7 #include "../qfunctions/taylorgreen.h"
8 
9 #include <navierstokes.h>
10 
11 PetscErrorCode NS_TAYLOR_GREEN(ProblemData problem, DM dm, void *ctx) {
12   Honee                honee = *(Honee *)ctx;
13   Ceed                 ceed  = honee->ceed;
14   MPI_Comm             comm  = honee->comm;
15   TaylorGreenContext   taylorgreen_ctx;
16   CeedQFunctionContext taylorgreen_qfctx;
17   SetupContext         setup_ctx;
18 
19   PetscFunctionBeginUser;
20   PetscCall(NS_NEWTONIAN_IG(problem, dm, ctx));
21 
22   PetscCall(PetscNew(&taylorgreen_ctx));
23   PetscCallCeed(ceed, CeedQFunctionContextGetData(problem->ics.qfctx, CEED_MEM_HOST, &setup_ctx));
24   *taylorgreen_ctx = (struct TaylorGreenContext_){
25       .reference = setup_ctx->reference,
26       .newt_ctx  = setup_ctx->newt_ctx,
27       .lx        = setup_ctx->lx,
28       .ly        = setup_ctx->ly,
29       .lz        = setup_ctx->lz,
30   };
31   PetscCallCeed(ceed, CeedQFunctionContextRestoreData(problem->ics.qfctx, &setup_ctx));
32 
33   PetscOptionsBegin(comm, NULL, "Options for TAYLOR-GREEN problem", NULL);
34   PetscInt u_size = PETSC_STATIC_ARRAY_LENGTH(taylorgreen_ctx->u);
35   PetscCall(PetscOptionsScalarArray("-taylorgreen_background_velocity", "Background velocity to add to Taylor-Green initial condition", NULL,
36                                     taylorgreen_ctx->u, &u_size, NULL));
37   PetscOptionsEnd();
38 
39   PetscCallCeed(ceed, CeedQFunctionContextCreate(honee->ceed, &taylorgreen_qfctx));
40   PetscCallCeed(ceed, CeedQFunctionContextSetData(taylorgreen_qfctx, CEED_MEM_HOST, CEED_USE_POINTER, sizeof(*taylorgreen_ctx), taylorgreen_ctx));
41   PetscCallCeed(ceed, CeedQFunctionContextSetDataDestroy(taylorgreen_qfctx, CEED_MEM_HOST, FreeContextPetsc));
42 
43   PetscCallCeed(ceed, CeedQFunctionContextDestroy(&problem->ics.qfctx));
44   problem->ics = (HoneeQFSpec){
45       .qf_func_ptr = ICsTaylorGreen,
46       .qf_loc      = ICsTaylorGreen_loc,
47       .qfctx       = taylorgreen_qfctx,
48   };
49   PetscFunctionReturn(PETSC_SUCCESS);
50 }
51