|
1 | 1 | #:def Hardcoded2DVariables() |
2 | 2 | ! Place any declaration of intermediate variables here |
3 | | - real(wp) :: eps |
| 3 | + real(wp) :: eps, eps_mhd, C_mhd |
4 | 4 | real(wp) :: r, rmax, gam, umax, p0 |
5 | 5 | real(wp) :: rhoH, rhoL, pRef, pInt, h, lam, wl, amp, intH, intL, alph |
6 | 6 | real(wp) :: factor |
| 7 | + real(wp) :: r0, alpha, r2 |
| 8 | + real(wp) :: sinA, cosA |
| 9 | + |
| 10 | + real(wp) :: r_sq |
| 11 | + |
7 | 12 | ! # 207 |
8 | 13 | real(wp) :: sigma, gauss1, gauss2 |
9 | 14 | ! # 208 |
|
183 | 188 | q_prim_vf(E_idx)%sf(i, j, 0) = 3.e-5_wp |
184 | 189 | end if |
185 | 190 |
|
186 | | - case (252) ! MHD Smooth Magnetic Vortex |
| 191 | + ! case 252 is for the 2D MHD Rotor problem |
| 192 | + case (252) ! 2D MHD Rotor Problem |
| 193 | + ! Ambient conditions are set in the JSON file. |
| 194 | + ! This case imposes the dense, rotating cylinder. |
| 195 | + ! |
| 196 | + ! gamma = 1.4 |
| 197 | + ! Ambient medium (r > 0.1): |
| 198 | + ! rho = 1, p = 1, v = 0, B = (1,0,0) |
| 199 | + ! Rotor (r <= 0.1): |
| 200 | + ! rho = 10, p = 1 |
| 201 | + ! v has angular velocity w=20, giving v_tan=2 at r=0.1 |
| 202 | + |
| 203 | + ! Calculate distance squared from the center |
| 204 | + r_sq = (x_cc(i) - 0.5_wp)**2 + (y_cc(j) - 0.5_wp)**2 |
| 205 | + |
| 206 | + ! inner radius of 0.1 |
| 207 | + if (r_sq <= 0.1**2) then |
| 208 | + ! -- Inside the rotor -- |
| 209 | + ! Set density uniformly to 10 |
| 210 | + q_prim_vf(contxb)%sf(i, j, 0) = 10._wp |
| 211 | + |
| 212 | + ! Set vup constant rotation of rate v=2 |
| 213 | + ! v_x = -omega * (y - y_c) |
| 214 | + ! v_y = omega * (x - x_c) |
| 215 | + q_prim_vf(momxb)%sf(i, j, 0) = -20._wp*(y_cc(j) - 0.5_wp) |
| 216 | + q_prim_vf(momxb + 1)%sf(i, j, 0) = 20._wp*(x_cc(i) - 0.5_wp) |
| 217 | + |
| 218 | + ! taper width of 0.015 |
| 219 | + else if (r_sq <= 0.115**2) then |
| 220 | + ! linearly smooth the function between r = 0.1 and 0.115 |
| 221 | + q_prim_vf(contxb)%sf(i, j, 0) = 1._wp + 9._wp*(0.115_wp - sqrt(r_sq))/(0.015_wp) |
| 222 | + |
| 223 | + q_prim_vf(momxb)%sf(i, j, 0) = -(2._wp/sqrt(r_sq))*(y_cc(j) - 0.5_wp)*(0.115_wp - sqrt(r_sq))/(0.015_wp) |
| 224 | + q_prim_vf(momxb + 1)%sf(i, j, 0) = (2._wp/sqrt(r_sq))*(x_cc(i) - 0.5_wp)*(0.115_wp - sqrt(r_sq))/(0.015_wp) |
| 225 | + end if |
| 226 | + |
| 227 | + case (253) ! MHD Smooth Magnetic Vortex |
187 | 228 | ! Section 5.2 of |
188 | 229 | ! Implicit hybridized discontinuous Galerkin methods for compressible magnetohydrodynamics |
189 | 230 | ! C. Ciuca, P. Fernandez, A. Christophe, N.C. Nguyen, J. Peraire |
|
199 | 240 | ! pressure |
200 | 241 | q_prim_vf(E_idx)%sf(i, j, 0) = 1._wp + (1 - 2._wp*(x_cc(i)**2 + y_cc(j)**2))*exp(1 - (x_cc(i)**2 + y_cc(j)**2))/((2._wp*pi)**3) |
201 | 242 |
|
| 243 | + case (260) ! Gaussian Divergence Pulse |
| 244 | + ! Bx(x) = 1 + C * erf((x-0.5)/σ) |
| 245 | + ! ⇒ ∂Bx/∂x = C * (2/√π) * exp[-((x-0.5)/σ)**2] * (1/σ) |
| 246 | + ! Choose C = ε * σ * √π / 2 ⇒ ∂Bx/∂x = ε * exp[-((x-0.5)/σ)**2] |
| 247 | + ! ψ is initialized to zero everywhere. |
| 248 | + |
| 249 | + eps_mhd = patch_icpp(patch_id)%a(2) |
| 250 | + sigma = patch_icpp(patch_id)%a(3) |
| 251 | + C_mhd = eps_mhd*sigma*sqrt(pi)*0.5_wp |
| 252 | + |
| 253 | + ! B-field |
| 254 | + q_prim_vf(B_idx%beg)%sf(i, j, 0) = 1._wp + C_mhd*erf((x_cc(i) - 0.5_wp)/sigma) |
| 255 | + |
| 256 | + case (261) ! Blob |
| 257 | + r0 = 1._wp/sqrt(8._wp) |
| 258 | + r2 = x_cc(i)**2 + y_cc(j)**2 |
| 259 | + r = sqrt(r2) |
| 260 | + alpha = r/r0 |
| 261 | + if (alpha < 1) then |
| 262 | + q_prim_vf(B_idx%beg)%sf(i, j, 0) = 1._wp/sqrt(4._wp*pi)*(alpha**8 - 2._wp*alpha**4 + 1._wp) |
| 263 | + ! q_prim_vf(B_idx%beg)%sf(i,j,0) = 1._wp/sqrt(4000._wp*pi) * (4096._wp*r2**4 - 128._wp*r2**2 + 1._wp) |
| 264 | + ! q_prim_vf(B_idx%beg)%sf(i,j,0) = 1._wp/(4._wp*pi) * (alpha**8 - 2._wp*alpha**4 + 1._wp) |
| 265 | + ! q_prim_vf(E_idx)%sf(i,j,0) = 6._wp - q_prim_vf(B_idx%beg)%sf(i,j,0)**2/2._wp |
| 266 | + end if |
| 267 | + |
| 268 | + case (262) ! Tilted 2D MHD shock‐tube at α = arctan2 (≈63.4°) |
| 269 | + ! rotate by α = atan(2) |
| 270 | + alpha = atan(2._wp) |
| 271 | + cosA = cos(alpha) |
| 272 | + sinA = sin(alpha) |
| 273 | + ! projection along shock normal |
| 274 | + r = x_cc(i)*cosA + y_cc(j)*sinA |
| 275 | + |
| 276 | + if (r <= 0.5_wp) then |
| 277 | + ! LEFT state: ρ=1, v∥=+10, v⊥=0, p=20, B∥=B⊥=5/√(4π) |
| 278 | + q_prim_vf(contxb)%sf(i, j, 0) = 1._wp |
| 279 | + q_prim_vf(momxb)%sf(i, j, 0) = 10._wp*cosA |
| 280 | + q_prim_vf(momxb + 1)%sf(i, j, 0) = 10._wp*sinA |
| 281 | + q_prim_vf(E_idx)%sf(i, j, 0) = 20._wp |
| 282 | + q_prim_vf(B_idx%beg)%sf(i, j, 0) = (5._wp/sqrt(4._wp*pi))*cosA & |
| 283 | + - (5._wp/sqrt(4._wp*pi))*sinA |
| 284 | + q_prim_vf(B_idx%beg + 1)%sf(i, j, 0) = (5._wp/sqrt(4._wp*pi))*sinA & |
| 285 | + + (5._wp/sqrt(4._wp*pi))*cosA |
| 286 | + else |
| 287 | + ! RIGHT state: ρ=1, v∥=−10, v⊥=0, p=1, B∥=B⊥=5/√(4π) |
| 288 | + q_prim_vf(contxb)%sf(i, j, 0) = 1._wp |
| 289 | + q_prim_vf(momxb)%sf(i, j, 0) = -10._wp*cosA |
| 290 | + q_prim_vf(momxb + 1)%sf(i, j, 0) = -10._wp*sinA |
| 291 | + q_prim_vf(E_idx)%sf(i, j, 0) = 1._wp |
| 292 | + q_prim_vf(B_idx%beg)%sf(i, j, 0) = (5._wp/sqrt(4._wp*pi))*cosA & |
| 293 | + - (5._wp/sqrt(4._wp*pi))*sinA |
| 294 | + q_prim_vf(B_idx%beg + 1)%sf(i, j, 0) = (5._wp/sqrt(4._wp*pi))*sinA & |
| 295 | + + (5._wp/sqrt(4._wp*pi))*cosA |
| 296 | + end if |
| 297 | + ! v^z and B^z remain zero by default |
| 298 | + |
202 | 299 | case (270) |
203 | 300 | ! This hardcoded case extrudes a 1D profile to initialize a 2D simulation domain |
204 | 301 | @: HardcodedReadValues() |
|
0 commit comments