| 1 | !> @dir PulsedJet
|
|---|
| 2 | !! @brief Contains files necessary for module PulsedJet
|
|---|
| 3 |
|
|---|
| 4 | !> @file problem.f90
|
|---|
| 5 | !! @brief Main file for module PulsedJet
|
|---|
| 6 |
|
|---|
| 7 | !> @defgroup PulsedJet PulsedJet Module
|
|---|
| 8 | !! @brief Module for simulating a pulsed 2.5D Jet
|
|---|
| 9 | !! @ingroup Modules
|
|---|
| 10 |
|
|---|
| 11 | !> Pulsed Jet problem module
|
|---|
| 12 | !! @ingroup 1DJet
|
|---|
| 13 | MODULE Problem
|
|---|
| 14 | USE GlobalDeclarations
|
|---|
| 15 | USE PhysicsDeclarations
|
|---|
| 16 | USE DataDeclarations
|
|---|
| 17 | USE CoolingSrc
|
|---|
| 18 | USE ZCooling
|
|---|
| 19 | USE Chemistry
|
|---|
| 20 | USE Refinements
|
|---|
| 21 | USE Shapes
|
|---|
| 22 | USE Fields
|
|---|
| 23 | USE Emissions
|
|---|
| 24 | USE Projections
|
|---|
| 25 | USE ProcessingDeclarations
|
|---|
| 26 | USE Ambients
|
|---|
| 27 | IMPLICIT NONE
|
|---|
| 28 | PUBLIC ProblemModuleInit, ProblemGridInit, &
|
|---|
| 29 | ProblemBeforeStep, ProblemAfterStep, ProblemSetErrFlag, ProblemBeforeGlobalStep
|
|---|
| 30 |
|
|---|
| 31 | REAL(KIND=qPREC) :: namb, njet, tamb, vjet, Rjet, Bm, vrange, newvjet, period, pamb, alpha, &
|
|---|
| 32 | Betam, Rm, freq, amp, yupper, theta, ycoeff, xzcoeff, precfreq, precperiod, CoolingRes
|
|---|
| 33 | REAL(KIND=qPREC), ALLOCATABLE :: randoms(:), vtimes(:)
|
|---|
| 34 | INTEGER :: Bgeom, nrandoms, seed, vtype, simtype, N
|
|---|
| 35 | INTEGER, PARAMETER :: toroidal = 1, helical = 2
|
|---|
| 36 | INTEGER, PARAMETER :: constant = 0, sinusoidal = 1, random = 2
|
|---|
| 37 | INTEGER, PARAMETER :: single = 0, colliding_same = 1, colliding_opp = 2
|
|---|
| 38 | LOGICAL :: ljet
|
|---|
| 39 |
|
|---|
| 40 |
|
|---|
| 41 | CONTAINS
|
|---|
| 42 |
|
|---|
| 43 | !> Initializes module variables
|
|---|
| 44 | SUBROUTINE ProblemModuleInit()
|
|---|
| 45 | TYPE(AmbientDef), POINTER :: Ambient
|
|---|
| 46 | TYPE(RefinementDef), POINTER :: InjectRefine, TopInjectRefine, CoolingLengthRefinement
|
|---|
| 47 | TYPE(ProjectionDef), POINTER :: Projection
|
|---|
| 48 | REAL(KIND=qPREC) :: rand
|
|---|
| 49 | INTEGER :: i, jj
|
|---|
| 50 |
|
|---|
| 51 | NAMELIST/problemdata/ namb, tamb, njet, vjet, vrange, Rjet, Rm, Betam, Bgeom, vtype, freq, &
|
|---|
| 52 | theta, precfreq, seed, simtype, N, CoolingRes
|
|---|
| 53 |
|
|---|
| 54 | OPEN(PROBLEM_DATA_HANDLE,FILE='problem.data',STATUS='old')
|
|---|
| 55 | READ(PROBLEM_DATA_HANDLE,NML=problemdata)
|
|---|
| 56 | CLOSE(PROBLEM_DATA_HANDLE)
|
|---|
| 57 |
|
|---|
| 58 | ! CALL AddDiagnosticVar(OI_Field, 'OI') ! 6300
|
|---|
| 59 | ! CALL AddDiagnosticVar(NII_Field, 'NII') ! 6583
|
|---|
| 60 | ! CALL AddDiagnosticVar(SII_6716_Field, 'SII_6716')
|
|---|
| 61 | ! CALL AddDiagnosticVar(SII_6731_Field, 'SII_6731')
|
|---|
| 62 | ! CALL AddDiagnosticVar(Halpha_Field, 'Halpha')
|
|---|
| 63 | ! CALL AddDiagnosticVar(CellSize_Field, 'dx')
|
|---|
| 64 | ! CALL AddDiagnosticVar(CoolingLength_Field, 'CoolingLength')
|
|---|
| 65 |
|
|---|
| 66 | ! Set up some parameters for the velocity pulses
|
|---|
| 67 | SELECT CASE(vtype)
|
|---|
| 68 | CASE(constant)
|
|---|
| 69 | CASE(sinusoidal)
|
|---|
| 70 | period = final_time/freq
|
|---|
| 71 | amp = vrange/vjet
|
|---|
| 72 | CASE(random)
|
|---|
| 73 | ! set up an array of pseudo-random numbers to use for random jet velocities
|
|---|
| 74 | nrandoms = NINT(freq)
|
|---|
| 75 | period = final_time/REAL(nrandoms,qPrec)
|
|---|
| 76 | ALLOCATE(randoms(nrandoms))
|
|---|
| 77 | ALLOCATE(vtimes(nrandoms))
|
|---|
| 78 | CALL RANDOM_SEED(seed)
|
|---|
| 79 | DO jj=1, nrandoms
|
|---|
| 80 | CALL RANDOM_NUMBER(rand)
|
|---|
| 81 | randoms(jj) = rand
|
|---|
| 82 | vtimes(jj) = jj*period
|
|---|
| 83 | END DO
|
|---|
| 84 | END SELECT
|
|---|
| 85 |
|
|---|
| 86 | pamb = namb*Boltzmann*tamb
|
|---|
| 87 | IF(lMHD) THEN
|
|---|
| 88 | Bm = SQRT(8d0*Pi*pamb/Betam)/Bscale
|
|---|
| 89 | alpha = 1d0 - (Rm/Rjet)**2d0/Betam
|
|---|
| 90 | ELSE
|
|---|
| 91 | Bm = 0d0
|
|---|
| 92 | alpha = 1d0
|
|---|
| 93 | Rm = -10d0
|
|---|
| 94 | END IF
|
|---|
| 95 |
|
|---|
| 96 | ! Set up parameters related to a precessing injection velocity
|
|---|
| 97 | theta = theta*Pi/180d0
|
|---|
| 98 | ycoeff = SQRT(1d0/(1d0 + 2d0*TAN(theta)**2d0))
|
|---|
| 99 | xzcoeff = SQRT(1d0 - ycoeff**2d0)
|
|---|
| 100 | precperiod = final_time/precfreq
|
|---|
| 101 |
|
|---|
| 102 | ! Set up ambient
|
|---|
| 103 | CALL CreateAmbient(Ambient)
|
|---|
| 104 | Ambient%density= namb/nScale
|
|---|
| 105 | Ambient%pressure= pamb/pScale
|
|---|
| 106 |
|
|---|
| 107 | ! Set up refinement
|
|---|
| 108 | CALL ClearAllRefinements()
|
|---|
| 109 |
|
|---|
| 110 | CALL CreateRefinement(CoolingLengthRefinement)
|
|---|
| 111 | CoolingLengthRefinement%field=CoolingTime_Field
|
|---|
| 112 | CoolingLengthRefinement%limit = LESSTHAN
|
|---|
| 113 | CoolingLengthRefinement%Threshold(0:MaxLevel)=CoolingRes*levels(0:MaxLevel)%dx/(0.1*vjet/VelScale)
|
|---|
| 114 |
|
|---|
| 115 | CALL CreateRefinement(InjectRefine)
|
|---|
| 116 | CALL CreateShape(InjectRefine%Shape)
|
|---|
| 117 | InjectRefine%Shape%type = RECTANGULAR_PRISM
|
|---|
| 118 | InjectRefine%Shape%position = (/ 0d0, 0d0, 0d0 /)
|
|---|
| 119 | InjectRefine%Shape%size_param = (/Rjet, 1*levels(0)%dx, Rjet/)
|
|---|
| 120 | InjectRefine%Maxlevel = 3
|
|---|
| 121 | CALL SetShapeBounds(InjectRefine%Shape)
|
|---|
| 122 |
|
|---|
| 123 | IF (simtype /= single) THEN
|
|---|
| 124 | yupper = GxBounds(2,2)
|
|---|
| 125 | CALL CreateRefinement(TopInjectRefine)
|
|---|
| 126 | CALL CreateShape(TopInjectRefine%Shape)
|
|---|
| 127 | TopInjectRefine%Shape%type = RECTANGULAR_PRISM
|
|---|
| 128 | TopInjectRefine%Shape%position = (/ 0d0, yupper, 0d0 /)
|
|---|
| 129 | TopInjectRefine%Shape%size_param = Rjet
|
|---|
| 130 | InjectRefine%Maxlevel = 3
|
|---|
| 131 | CALL SetShapeBounds(TopInjectRefine%Shape)
|
|---|
| 132 | END IF
|
|---|
| 133 |
|
|---|
| 134 | ! Set up projections to make emission maps
|
|---|
| 135 | CALL CreateProjection(Projection)
|
|---|
| 136 | IF (iCylindrical == 0) THEN
|
|---|
| 137 | Projection%dim = 3
|
|---|
| 138 | ELSE
|
|---|
| 139 | Projection%dim = CYLINDRICAL_PROJECTION
|
|---|
| 140 | END IF
|
|---|
| 141 | Projection%PlotLevel = MIN(MaxLevel, 4)
|
|---|
| 142 | Projection%field(1)%id = Halpha_Field
|
|---|
| 143 | Projection%field(1)%name = "Halpha"
|
|---|
| 144 | Projection%field(2)%id = SII_6716_Field
|
|---|
| 145 | Projection%field(2)%name = "SII_6716"
|
|---|
| 146 | Projection%field(3)%id = SII_6731_Field
|
|---|
| 147 | Projection%field(3)%name = "SII_6731"
|
|---|
| 148 | ! Projection%field(4)%id = NII_Field
|
|---|
| 149 | ! Projection%field(4)%name = "NII"
|
|---|
| 150 |
|
|---|
| 151 | END SUBROUTINE ProblemModuleInit
|
|---|
| 152 |
|
|---|
| 153 | !> Applies initial conditions
|
|---|
| 154 | !! @param Info Info object
|
|---|
| 155 | SUBROUTINE ProblemGridInit(Info)
|
|---|
| 156 | TYPE(InfoDef) :: Info
|
|---|
| 157 | CALL PlaceJet(Info, levels(Info%level)%dx)
|
|---|
| 158 | END SUBROUTINE ProblemGridInit
|
|---|
| 159 |
|
|---|
| 160 | !> Applies Boundary conditions
|
|---|
| 161 | !! @param Info Info object
|
|---|
| 162 | SUBROUTINE ProblemBeforeStep(Info)
|
|---|
| 163 | TYPE(InfoDef) :: Info
|
|---|
| 164 | CALL PlaceJet(Info, 0d0)
|
|---|
| 165 | END SUBROUTINE ProblemBeforeStep
|
|---|
| 166 |
|
|---|
| 167 | SUBROUTINE PlaceJet(Info, yjet)
|
|---|
| 168 | TYPE(InfoDef) :: Info
|
|---|
| 169 | REAL(KIND=qPREC), POINTER, DIMENSION(:,:,:,:) :: q
|
|---|
| 170 | INTEGER :: nn, i, j, k, rmbc, zrmbc, level, mx, my, mz, ii, jj, kk, Nz
|
|---|
| 171 | REAL(KIND=qPREC) :: x, y , z, r, phi, dx, xlower, ylower, zlower, dt, time,&
|
|---|
| 172 | Bx, By, Bz, randv, pjet, Bjet, nH, nHe, Ay, ptot, padd, ddx, xx, yy, zz, rr, yjet, hdx, pB, sumpB, ddz
|
|---|
| 173 | REAL(KIND=qPREC),ALLOCATABLE :: A(:,:,:,:), BzAux(:,:)
|
|---|
| 174 | REAL(KIND=qPREC), DIMENSION(1:NrHydroVars) :: newq, sumq
|
|---|
| 175 |
|
|---|
| 176 |
|
|---|
| 177 | level=Info%level
|
|---|
| 178 | q=>Info%q
|
|---|
| 179 | rmbc = levels(level)%gmbc(levels(level)%step)
|
|---|
| 180 | zrmbc = 0
|
|---|
| 181 | mx = Info%mX(1)
|
|---|
| 182 | my = Info%mX(2)
|
|---|
| 183 | mz = Info%mX(3)
|
|---|
| 184 | dx = levels(level)%dX
|
|---|
| 185 | ddx = dx/N
|
|---|
| 186 | ddz = 0
|
|---|
| 187 | Nz = 1
|
|---|
| 188 | IF (nDim == 3) THEN
|
|---|
| 189 | zrmbc = rmbc
|
|---|
| 190 | Nz=N
|
|---|
| 191 | ddz=ddx
|
|---|
| 192 | END IF
|
|---|
| 193 |
|
|---|
| 194 | xlower = Info%xBounds(1,1)
|
|---|
| 195 | ylower = Info%xBounds(2,1)
|
|---|
| 196 | zlower = Info%xBounds(3,1)
|
|---|
| 197 | hdx=half*dx
|
|---|
| 198 |
|
|---|
| 199 | dt = levels(level)%dt
|
|---|
| 200 | time = levels(level)%tnow
|
|---|
| 201 | ! IF (time <= dt) RETURN ! don't want to overwrite initial conditions
|
|---|
| 202 |
|
|---|
| 203 | phi = 0.0
|
|---|
| 204 |
|
|---|
| 205 | ! sets new jet velocity depending on time and type of velocity changes
|
|---|
| 206 | SELECT CASE(vtype)
|
|---|
| 207 | CASE(constant)
|
|---|
| 208 | newvjet = vjet
|
|---|
| 209 | CASE(sinusoidal)
|
|---|
| 210 | newvjet = vjet*(1d0 + amp*SIN(2d0*Pi*time/period))
|
|---|
| 211 | phi = 2d0*Pi*time/precperiod
|
|---|
| 212 | CASE(random)
|
|---|
| 213 | DO nn=1, nrandoms
|
|---|
| 214 | IF (time == vtimes(nn)) THEN
|
|---|
| 215 | randv = ((randoms(nn)*2d0)-1d0)*vrange
|
|---|
| 216 | newvjet = vjet + randv
|
|---|
| 217 | ELSE IF (time < vtimes(1)) THEN
|
|---|
| 218 | newvjet = vjet
|
|---|
| 219 | END IF
|
|---|
| 220 | END DO
|
|---|
| 221 | END SELECT
|
|---|
| 222 |
|
|---|
| 223 |
|
|---|
| 224 | DO j=1-rmbc, my+rmbc
|
|---|
| 225 | y = ylower + (REAL(j,xPrec) - 1d0)*dx
|
|---|
| 226 |
|
|---|
| 227 | IF (simtype /= single) THEN
|
|---|
| 228 | IF (y >= 0d0+yjet .AND. y <= yupper-yjet-dx) cycle
|
|---|
| 229 | ELSE
|
|---|
| 230 | IF (y >= 0d0+yjet) THEN
|
|---|
| 231 | ! write(*,*) j, y
|
|---|
| 232 | cycle
|
|---|
| 233 | END IF
|
|---|
| 234 | END IF
|
|---|
| 235 |
|
|---|
| 236 | DO i=1-rmbc, mx+rmbc
|
|---|
| 237 | x = xlower + (REAL(i,xPrec) - 1d0)*dx
|
|---|
| 238 | DO k=1-zrmbc, mz+zrmbc
|
|---|
| 239 | z = zlower + (REAL(k,xPrec) - 1d0)*dx
|
|---|
| 240 |
|
|---|
| 241 | sumq=0d0
|
|---|
| 242 | sumpB=0d0
|
|---|
| 243 | CALL Cons_To_Prim(q(i,j,k,:))
|
|---|
| 244 |
|
|---|
| 245 | DO jj=1, N
|
|---|
| 246 | yy = y + (REAL(jj,xPrec) - half)*ddx
|
|---|
| 247 | ! ONLY DO FOLLOWING INSIDE THE -y BOUNDARY. ALSO,
|
|---|
| 248 | ! ABOVE THE +y BOUNDARY IF THIS IS A COLLIDING JETS RUN
|
|---|
| 249 | IF (simtype /= single) THEN
|
|---|
| 250 | ljet = (yy <= 0d0+yjet .AND. yy >= yupper-yjet)
|
|---|
| 251 | ELSE
|
|---|
| 252 | ljet = (yy <= 0d0+yjet)
|
|---|
| 253 | ! write(*,'(2I6,2E15.4,L2)') j,jj,y,yy,ljet
|
|---|
| 254 | END IF
|
|---|
| 255 | DO ii=1, N
|
|---|
| 256 | xx = x + (REAL(ii,xPrec) - half)*ddx
|
|---|
| 257 | DO kk=1, Nz
|
|---|
| 258 |
|
|---|
| 259 | IF (ljet) THEN
|
|---|
| 260 | IF (nDim == 2) THEN
|
|---|
| 261 | rr = xx
|
|---|
| 262 | ELSE IF (nDim == 3) THEN
|
|---|
| 263 | zz = z + (REAL(kk,xPrec) - half)*ddz
|
|---|
| 264 | rr = SQRT(xx**2d0+zz**2d0)
|
|---|
| 265 | END IF
|
|---|
| 266 |
|
|---|
| 267 | IF (rr < Rjet) THEN
|
|---|
| 268 | newq(1) = njet/nScale
|
|---|
| 269 | newq(ivx) = xzcoeff*COS(phi)*newvjet/velScale
|
|---|
| 270 | newq(ivy) = ycoeff*newvjet/velScale
|
|---|
| 271 | ! Second jet injection region, if this is a colliding jets run
|
|---|
| 272 | IF (ivz /= 0) THEN
|
|---|
| 273 | IF (simtype /= single .AND. y > yupper-yjet) newq(ivy) = -newq(ivy)
|
|---|
| 274 | newq(ivz) = xzcoeff*SIN(phi)*newvjet/velScale
|
|---|
| 275 | END IF
|
|---|
| 276 | IF (rr < Rm) THEN
|
|---|
| 277 | pjet = pamb*(alpha + 2d0/Betam*(1d0 - (rr/Rm)**2d0))/pScale
|
|---|
| 278 | ELSE
|
|---|
| 279 | pjet = alpha*pamb/pScale
|
|---|
| 280 | END IF
|
|---|
| 281 | newq(iE) = pjet !/gamma1 + half*SUM(newq(ivx:ivz)**2d0)/newq(1)
|
|---|
| 282 | IF (rr < Rm) THEN
|
|---|
| 283 | pB= .5*(Bm*rr/Rm)**2d0
|
|---|
| 284 | ELSE
|
|---|
| 285 | pB = .5*(Bm*Rm/rr)**2d0
|
|---|
| 286 | END IF
|
|---|
| 287 | IF (lTrackHydrogen) THEN
|
|---|
| 288 | nH = newq(1)/(1d0+xH+HeFrac*(1d0+xHe+2d0*xHeII)+ZFrac*(1d0+xZ))
|
|---|
| 289 | newq(iH) = (1d0-xH)*nH
|
|---|
| 290 | newq(iHII) = xH*nH
|
|---|
| 291 | IF (lTrackHelium) THEN
|
|---|
| 292 | nHe = HeFrac*nH
|
|---|
| 293 | newq(iHe) = (1d0-xHe-xHeII)*nHe
|
|---|
| 294 | newq(iHeII) = xHe*nHe
|
|---|
| 295 | newq(iHeIII) = xHeII*nHe
|
|---|
| 296 | END IF
|
|---|
| 297 | END IF
|
|---|
| 298 |
|
|---|
| 299 | ELSE
|
|---|
| 300 | newq=Info%q(i,j,k,1:NrHydroVars)
|
|---|
| 301 | ! newq(1) = newq(1) + Info%q(i,j,k,1,1) !namb/nScale
|
|---|
| 302 | ! newq(ivx:ivz) = newq(ivx:ivz) + 0d0
|
|---|
| 303 | ! newq(iE) = newq(iE) + pamb/pScale/gamma1
|
|---|
| 304 | pB=0d0
|
|---|
| 305 | END IF
|
|---|
| 306 | ELSE
|
|---|
| 307 | newq=Info%q(i,j,k,1:NrHydroVars)
|
|---|
| 308 | pB=0d0
|
|---|
| 309 | END IF
|
|---|
| 310 | sumq=sumq+newq
|
|---|
| 311 | sumpB=sumpB+pB
|
|---|
| 312 | END DO
|
|---|
| 313 | END DO
|
|---|
| 314 | END DO
|
|---|
| 315 | q(i,j,k,1:NrHydroVars) = sumq/N**nDim
|
|---|
| 316 | CALL Prim_To_Cons(q(i,j,k,:))
|
|---|
| 317 | q(i,j,k,iE)=q(i,j,k,iE)+sumpB/N**nDim
|
|---|
| 318 | END DO
|
|---|
| 319 | END DO
|
|---|
| 320 | END DO
|
|---|
| 321 |
|
|---|
| 322 | IF (lMHD) THEN
|
|---|
| 323 | ALLOCATE(A(1-rmbc:mx+rmbc+1,1-rmbc:my+rmbc+1,1-zrmbc:mz+zrmbc+1,3))
|
|---|
| 324 | IF (nDim == 2) ALLOCATE(BzAux(1-rmbc:mx+rmbc+1,1-rmbc:my+rmbc+1))
|
|---|
| 325 | A(:,:,:,1) = 0d0
|
|---|
| 326 | A(:,:,:,3) = 0d0
|
|---|
| 327 | DO j=1-rmbc, my+rmbc+1
|
|---|
| 328 | y = ylower + (REAL(j,xPrec) - half)*dx
|
|---|
| 329 | ljet = .false.
|
|---|
| 330 | ! Check if inside jet injection region(s)
|
|---|
| 331 | IF (simtype /= single) THEN
|
|---|
| 332 | IF (y < 0d0+yjet .OR. y > yupper-yjet) ljet = .true.
|
|---|
| 333 | ELSE
|
|---|
| 334 | IF (y < 0d0+yjet) ljet = .true.
|
|---|
| 335 | END IF
|
|---|
| 336 | DO i=1-rmbc, mx+rmbc+1
|
|---|
| 337 | x = xlower + (REAL(i,xPrec) - 1d0)*dx
|
|---|
| 338 | DO k=1-zrmbc, mz+zrmbc+1
|
|---|
| 339 | ! A M B I E N T
|
|---|
| 340 | Ay = -Bm*Rm*(LOG(Rjet/Rm)+half)
|
|---|
| 341 |
|
|---|
| 342 | IF (ljet) THEN
|
|---|
| 343 | IF (nDim == 2) THEN
|
|---|
| 344 | r = x
|
|---|
| 345 | ELSE IF (nDim == 3) THEN
|
|---|
| 346 | z = zlower + (REAL(k,xPrec) - 1d0)*dx
|
|---|
| 347 | r = SQRT(x**2d0 + z**2d0)
|
|---|
| 348 | END IF
|
|---|
| 349 | IF (r < Rjet) THEN
|
|---|
| 350 | IF (r < Rm) THEN
|
|---|
| 351 | Ay = -half*Bm*r**2d0/Rm
|
|---|
| 352 | ELSE
|
|---|
| 353 | Ay = -Bm*Rm*(LOG(r/Rm)+half)
|
|---|
| 354 | END IF
|
|---|
| 355 | END IF
|
|---|
| 356 | END IF
|
|---|
| 357 |
|
|---|
| 358 | IF (simtype == colliding_opp .AND. y > yupper-dx) Ay = -Ay
|
|---|
| 359 | A(i,j,k,2) = Ay
|
|---|
| 360 | END DO
|
|---|
| 361 | END DO
|
|---|
| 362 | END DO
|
|---|
| 363 |
|
|---|
| 364 | !Then take the curl of A to get B
|
|---|
| 365 | IF (nDim == 2) THEN
|
|---|
| 366 | Info%aux(:,:,:,:) = 0d0
|
|---|
| 367 | ELSE IF (nDim == 3) THEN
|
|---|
| 368 | DO j=1-rmbc, my+rmbc
|
|---|
| 369 | y = ylower + (REAL(j,xPrec) - half)*dx
|
|---|
| 370 | IF (simtype /= single) THEN
|
|---|
| 371 | IF (y >= 0d0+yjet .AND. y <= yupper-yjet) CYCLE
|
|---|
| 372 | ELSE
|
|---|
| 373 | IF (y >= 0d0+yjet) CYCLE
|
|---|
| 374 | END IF
|
|---|
| 375 | DO i=1-rmbc, mx+rmbc+1
|
|---|
| 376 | DO k=1-zrmbc, mz+zrmbc
|
|---|
| 377 | Info%aux(i,j,k,1) = (A(i,j+1,k,3)-A(i,j,k,3))/dx - (A(i,j,k+1,2)-A(i,j,k,2))/dx
|
|---|
| 378 | END DO
|
|---|
| 379 | END DO
|
|---|
| 380 | END DO
|
|---|
| 381 |
|
|---|
| 382 | DO j=1-rmbc, my+rmbc+1
|
|---|
| 383 | y = ylower + (REAL(j,xPrec) - 1d0)*dx
|
|---|
| 384 | IF (simtype /= single) THEN
|
|---|
| 385 | IF (y >= 0d0+yjet .AND. y <= yupper+yjet) CYCLE
|
|---|
| 386 | ELSE
|
|---|
| 387 | IF (y >= 0d0+yjet) CYCLE
|
|---|
| 388 | END IF
|
|---|
| 389 | DO i=1-rmbc, mx+rmbc
|
|---|
| 390 | DO k=1-zrmbc, mz+zrmbc
|
|---|
| 391 | Info%aux(i,j,k,2) = (A(i,j,k+1,1)-A(i,j,k,1))/dx - (A(i+1,j,k,3)-A(i,j,k,3))/dx
|
|---|
| 392 | END DO
|
|---|
| 393 | END DO
|
|---|
| 394 | END DO
|
|---|
| 395 | END IF
|
|---|
| 396 | DO j=1-rmbc, my+rmbc
|
|---|
| 397 | y = ylower + (REAL(j,xPrec) - half)*dx
|
|---|
| 398 | IF (simtype /= single) THEN
|
|---|
| 399 | IF (y >= 0d0+yjet .AND. y <= yupper-yjet) CYCLE
|
|---|
| 400 | ELSE
|
|---|
| 401 | IF (y >= 0d0+yjet) CYCLE
|
|---|
| 402 | END IF
|
|---|
| 403 | DO i=1-rmbc, mx+rmbc
|
|---|
| 404 | DO k=1-zrmbc, mz+zrmbc+1
|
|---|
| 405 | IF (nDim == 2) THEN
|
|---|
| 406 | BzAux(i,j) = (A(i+1,j,1,2)-A(i,j,1,2))/dx - (A(i,j+1,1,1)-A(i,j,1,1))/dx
|
|---|
| 407 | ELSE IF (nDim == 3) THEN
|
|---|
| 408 | Info%aux(i,j,k,3) = (A(i+1,j,k,2)-A(i,j,k,2))/dx - (A(i,j+1,k,1)-A(i,j,k,1))/dx
|
|---|
| 409 | END IF
|
|---|
| 410 | END DO
|
|---|
| 411 | END DO
|
|---|
| 412 | END DO
|
|---|
| 413 | DEALLOCATE(A)
|
|---|
| 414 |
|
|---|
| 415 | ! Average aux fields to get B-fields for q, update energy
|
|---|
| 416 | DO j=1-rmbc, my+rmbc
|
|---|
| 417 | y = ylower + (REAL(j,xPrec) - half)*dx
|
|---|
| 418 | IF (simtype /= single) THEN
|
|---|
| 419 | IF (y >= 0d0+yjet .AND. y <= yupper-yjet) CYCLE
|
|---|
| 420 | ELSE
|
|---|
| 421 | IF (y >= 0d0+yjet) CYCLE
|
|---|
| 422 | END IF
|
|---|
| 423 | DO i=1-rmbc, mx+rmbc
|
|---|
| 424 | DO k=1-zrmbc, mz+zrmbc
|
|---|
| 425 | IF (nDim == 2) THEN
|
|---|
| 426 | q(i,j,k,iBx:iBy) = 0d0
|
|---|
| 427 | q(i,j,k,iBz) = BzAux(i,j)
|
|---|
| 428 | ELSE IF (nDim == 3) THEN
|
|---|
| 429 | q(i,j,k,iBx) = half*(Info%aux(i,j,k,1)+Info%aux(i+1,j,k,1))
|
|---|
| 430 | q(i,j,k,iBy) = half*(Info%aux(i,j,k,2)+Info%aux(i,j+1,k,2))
|
|---|
| 431 | q(i,j,k,iBz) = half*(Info%aux(i,j,k,3)+Info%aux(i,j,k+1,3))
|
|---|
| 432 | END IF
|
|---|
| 433 | ! q(i,j,k,iE) = q(i,j,k,iE) + half*SUM(q(i,j,k,iBx:iBz)**2d0)
|
|---|
| 434 |
|
|---|
| 435 | ! Pressure Check
|
|---|
| 436 | ! ptot = (gamma1*(q(i,j,k,iE) - half*SUM(q(i,j,k,2:m_high)**2d0)/q(i,j,k,1)) + &
|
|---|
| 437 | ! gamma13*half*SUM(q(i,j,k,iBx:iBz)**2d0))*pScale
|
|---|
| 438 | ! IF (ptot < pamb) THEN
|
|---|
| 439 | ! padd = pamb - ptot
|
|---|
| 440 | ! q(i,j,k,iE) = q(i,j,k,iE) + padd/gamma1/pScale
|
|---|
| 441 | ! END IF
|
|---|
| 442 | END DO
|
|---|
| 443 | END DO
|
|---|
| 444 | END DO
|
|---|
| 445 | IF (nDim == 2) DEALLOCATE(BzAux)
|
|---|
| 446 | END IF
|
|---|
| 447 |
|
|---|
| 448 | END SUBROUTINE PlaceJet
|
|---|
| 449 |
|
|---|
| 450 | !> Could be used to update grids pre-output
|
|---|
| 451 | !! @param Info Info Object
|
|---|
| 452 | SUBROUTINE ProblemAfterStep(Info)
|
|---|
| 453 | TYPE(InfoDef) :: Info
|
|---|
| 454 | END SUBROUTINE ProblemAfterStep
|
|---|
| 455 |
|
|---|
| 456 | !> Could be used to set force refinement
|
|---|
| 457 | !! @param Info Info object
|
|---|
| 458 | SUBROUTINE ProblemSetErrFlag(Info)
|
|---|
| 459 | TYPE(InfoDef) :: Info
|
|---|
| 460 | END SUBROUTINE ProblemSetErrFlag
|
|---|
| 461 |
|
|---|
| 462 | SUBROUTINE ProblemBeforeGlobalStep(n)
|
|---|
| 463 | INTEGER :: n
|
|---|
| 464 | END SUBROUTINE ProblemBeforeGlobalStep
|
|---|
| 465 |
|
|---|
| 466 |
|
|---|
| 467 | END MODULE Problem
|
|---|
| 468 |
|
|---|