UNLFJ6OBGZOKEVGFS3DEF75WM2BY4QKYVNIT443DINI2JUU4WYBQC Cactus Code Thorn TestODESolversAuthor(s) : Erik Schnetter <schnetter@gmail.com>Maintainer(s): Erik Schnetter <schnetter@gmail.com>Licence : LGPL--------------------------------------------------------------------------1. PurposeTest the ODESolvers thorn
# Configuration definitions for thorn TestODESolvers
# Interface definition for thorn TestODESolversIMPLEMENTS: TestODESolversCCTK_REAL state TYPE=gf TAGS='rhs="TestODESolvers::rhs"' "State vector"CCTK_REAL rhs TYPE=gf "RHS of state vector"CCTK_REAL error TYPE=gf "Error in state vector"
ActiveThorns = "CarpetXIOUtilODESolversTestODESolvers"CarpetX::ncells_x = 1CarpetX::ncells_y = 1CarpetX::ncells_z = 1CarpetX::blocking_factor_x = 1CarpetX::blocking_factor_y = 1CarpetX::blocking_factor_z = 1CarpetX::ghost_size = 0CarpetX::dtfac = 0.1ODESolvers::method = "Euler"TestODESolvers::order = 1CarpetX::out_plotfile_groups = ""CarpetX::out_tsv = yesIO::out_dir = $parfileIO::out_every = 1
# Parameter definitions for thorn TestODESolversCCTK_INT order "order p, where u(t) = (1+t)^p" STEERABLE=always{0:* :: ""} 1
# Schedule definitions for thorn TestODESolversSTORAGE: state rhsSCHEDULE TestODESolvers_initial AT initial{LANG: CWRITES: state} "Initialize state vector"SCHEDULE TestODESolvers_RHS IN ODESolvers_RHS{LANG: CREADS: stateWRITES: rhs} "RHS function"SCHEDULE TestODESolvers_boundary AT poststep{LANG: CSYNC: state} "Apply boundary conditions to state vector"SCHEDULE TestODESolvers_error AT analysis{LANG: CREADS: stateWRITES: error} "Calculate error in state vector"
# Main make.code.defn file for thorn TestODESolvers# Source files in this directorySRCS = odes.cxx# Subdirectories containing source filesSUBDIRS =
#include <cctk.h>#include <cctk_Parameters.h>#include <cctk_Arguments_Checked.h>#include <cmath>namespace TestODESolvers {using namespace std;extern "C" void TestODESolvers_initial(CCTK_ARGUMENTS) {DECLARE_CCTK_ARGUMENTS_TestODESolvers_initial;DECLARE_CCTK_PARAMETERS;const CCTK_REAL u0 = pow(1 + cctk_time, order);for (int k = 0; k < cctk_lsh[2]; ++k) {for (int j = 0; j < cctk_lsh[1]; ++j) {#pragma omp simdfor (int i = 0; i < cctk_lsh[0]; ++i) {int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);state[ind] = u0;}}}}extern "C" void TestODESolvers_boundary(CCTK_ARGUMENTS) {DECLARE_CCTK_ARGUMENTS_TestODESolvers_boundary;DECLARE_CCTK_PARAMETERS;// do nothing}extern "C" void TestODESolvers_RHS(CCTK_ARGUMENTS) {DECLARE_CCTK_ARGUMENTS_TestODESolvers_RHS;DECLARE_CCTK_PARAMETERS;// u(t) = (1+t)^p// d/dt u = p (1+t)^(p-1)for (int k = 0; k < cctk_lsh[2]; ++k) {for (int j = 0; j < cctk_lsh[1]; ++j) {#pragma omp simdfor (int i = 0; i < cctk_lsh[0]; ++i) {int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);rhs[ind] = order * pow(1 + cctk_time, order - 1);}}}}extern "C" void TestODESolvers_error(CCTK_ARGUMENTS) {DECLARE_CCTK_ARGUMENTS_TestODESolvers_error;DECLARE_CCTK_PARAMETERS;const CCTK_REAL u0 = pow(1 + cctk_time, order);for (int k = 0; k < cctk_lsh[2]; ++k) {for (int j = 0; j < cctk_lsh[1]; ++j) {#pragma omp simdfor (int i = 0; i < cctk_lsh[0]; ++i) {int ind = CCTK_GFINDEX3D(cctkGH, i, j, k);error[ind] = state[ind] - u0;}}}}} // namespace TestODESolvers
ActiveThorns = "CarpetXIOUtilODESolversTestODESolvers"CarpetX::ncells_x = 1CarpetX::ncells_y = 1CarpetX::ncells_z = 1CarpetX::blocking_factor_x = 1CarpetX::blocking_factor_y = 1CarpetX::blocking_factor_z = 1CarpetX::ghost_size = 0CarpetX::dtfac = 0.1ODESolvers::method = "Euler"TestODESolvers::order = 1CarpetX::out_plotfile_groups = ""CarpetX::out_tsv = yesIO::out_dir = $parfileIO::out_every = 1
ActiveThorns = "CarpetXIOUtilODESolversTestODESolvers"CarpetX::ncells_x = 1CarpetX::ncells_y = 1CarpetX::ncells_z = 1CarpetX::blocking_factor_x = 1CarpetX::blocking_factor_y = 1CarpetX::blocking_factor_z = 1CarpetX::ghost_size = 0CarpetX::dtfac = 0.1ODESolvers::method = "RK2"TestODESolvers::order = 2CarpetX::out_plotfile_groups = ""CarpetX::out_tsv = yesIO::out_dir = $parfileIO::out_every = 1