44 REAL,
PARAMETER :: tsim = 0.05
45 REAL,
PARAMETER :: gamma = 1.4
47 REAL,
PARAMETER :: rho0 = 1.0
48 REAL,
PARAMETER :: p0 = 1.0e-05
49 REAL,
PARAMETER :: e1 = 1.0
53 REAL,
PARAMETER :: r0 = 3.0e-2
55 INTEGER,
PARAMETER :: mgeo = cartesian
56 INTEGER,
PARAMETER :: res = 64
58 INTEGER,
PARAMETER :: onum = 5
59 CHARACTER(LEN=256),
PARAMETER &
61 CHARACTER(LEN=256),
PARAMETER &
64 INTEGER,
PARAMETER :: num_tests = 8
66 CLASS(
fosite),
ALLOCATABLE :: sim
68 CHARACTER(LEN=80) :: testinfo(num_tests)
82 CALL setattr(sim%config,
"/timedisc/method", modified_euler)
83 CALL setattr(sim%config,
"/timedisc/order", 2)
84 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-mdeu2") )
86 CALL setattr(sim%config,
"/timedisc/method", modified_euler)
87 CALL setattr(sim%config,
"/timedisc/order", 3)
88 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-mdeu3") )
90 CALL setattr(sim%config,
"/timedisc/method", rk_fehlberg)
91 CALL setattr(sim%config,
"/timedisc/order", 3)
92 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-rkfeh3") )
94 CALL setattr(sim%config,
"/timedisc/method", rk_fehlberg)
95 CALL setattr(sim%config,
"/timedisc/order", 5)
96 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-rkfeh5") )
98 CALL setattr(sim%config,
"/timedisc/method", cash_karp)
99 CALL setattr(sim%config,
"/timedisc/order", 5)
100 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-cshka5") )
102 CALL setattr(sim%config,
"/timedisc/method", dormand_prince)
103 CALL setattr(sim%config,
"/timedisc/order", 5)
104 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-drmpr5") )
106 CALL setattr(sim%config,
"/timedisc/method", ssprk)
107 CALL setattr(sim%config,
"/timedisc/order", 3)
108 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-ssprk3") )
110 CALL setattr(sim%config,
"/timedisc/method", ssprk)
111 CALL setattr(sim%config,
"/timedisc/order", 5)
112 CALL setattr(sim%config,
"/datafile/filename", (trim(odir) // trim(ofname) //
"-ssprk5") )
114 CALL sim%Error(
"ode",
"Unknown test number!")
120 CALL initdata(sim%Mesh, sim%Physics, sim%Timedisc)
124 IF (.NOT. sim%aborted)
THEN
125 tap_check(.true.,
"Simulation finished")
126 CALL sim%ComputeRunTime()
127 WRITE(testinfo(k),
'(A,I3,A38,A,I2,A11,F5.2,A2)')
"#", k, &
128 ". ODE solver: " // adjustl(sim%Timedisc%GetName()) //
", ", &
129 "order", sim%Timedisc%GetOrder(),
", runtime: ", sim%run_time,
" s"
131 WRITE(testinfo(k),
'(A)')
"#", k,
". ODE solver: " // adjustl(sim%Timedisc%GetName()) //
"FAILED"
134 IF(k.LT.num_tests)
THEN
135 CALL sim%Finalize(.false.)
142 CALL sim%Info(repeat(
"*",67))
144 CALL sim%Info(testinfo(k))
146 CALL sim%Info(repeat(
"*",67))
158 TYPE(dict_typ),
POINTER :: config
161 TYPE(dict_typ),
POINTER :: mesh, physics, boundary, datafile, &
167 mesh => dict(
"meshtype" / midpoint, &
168 "geometry" / cartesian, &
181 boundary => dict(
"western" / no_gradients, &
182 "eastern" / no_gradients, &
183 "southern" / no_gradients, &
184 "northern" / no_gradients, &
185 "bottomer" / no_gradients, &
186 "topper" / no_gradients)
189 physics => dict(
"problem" / euler, &
193 fluxes => dict(
"order" / linear, &
195 "variables" / conservative, &
196 "limiter" / monocent, &
201 "method" / modified_euler, &
203 "ShowButcherTableau" / 1, &
205 "dtlimit" / 1.0e-15, &
207 "tol_abs" / (/0.0,1e-3,1e-3,0.0/), &
208 "output/error" / 1, &
212 datafile => dict(
"fileformat" / vtk, &
214 "filename" / (trim(odir) // trim(ofname)), &
217 config => dict(
"mesh" / mesh, &
218 "physics" / physics, &
219 "boundary" / boundary, &
221 "timedisc" / timedisc, &
222 "datafile" / datafile)
230 CLASS(physics_base),
INTENT(IN) :: Physics
231 CLASS(mesh_base),
INTENT(IN) :: Mesh
232 CLASS(timedisc_base),
INTENT(INOUT) :: Timedisc
239 SELECT TYPE (phys => physics)
241 SELECT TYPE (pvar => timedisc%pvar)
244 pvar%density%data1d(:) = rho0
246 pvar%velocity%data1d(:) = 0.0
249 p1 = 3.*(phys%gamma - 1.0)*e1 / ((n + 1)*pi*r0**n)
250 WHERE (mesh%radius%bcenter(:,:,:).LE.r0)
252 pvar%pressure%data3d(:,:,:) = p1
255 pvar%pressure%data3d(:,:,:) = p0
259 CALL phys%Error(
"ode:InitData",
"statevector must be of class euler")
263 CALL phys%Error(
"ode:InitData",
"physics not supported")
266 CALL physics%Convert2Conservative(timedisc%pvar,timedisc%cvar)
267 CALL mesh%Info(
" DATA-----> initial condition: 2D Sedov explosion")
subroutine initdata(Mesh, Physics, Fluxes, Timedisc)
subroutine makeconfig(Sim, config)
physics module for 1D,2D and 3D non-isothermal Euler equations