203 | | Note that during the !ProblemGridInit routine, ghost zones do not need to be initialized (rmbc = 0) - however - during beforestep calculations they should be. |
204 | | |
205 | | {{{ |
206 | | |
207 | | rmbc=levels(Info%level)%gmbc(levels(Info%level)%step) |
208 | | |
209 | | mx=Info%mX(1); dx=levels(Info%level)%dX; xlower=Info%xbounds(1,1) |
210 | | my=Info%mX(2); ylower=Info%xbounds(2,1) |
211 | | mz=Info%mX(3); zlower=Info%xbounds(3,1) |
212 | | |
213 | | SELECT CASE(nDim) |
214 | | CASE(2) |
215 | | zrmbc=0;mz=1;zl=0;dz=0 |
216 | | CASE(3) |
217 | | zrmbc=rmbc |
218 | | END SELECT |
219 | | |
220 | | ! Initialize environment |
221 | | DO k=1-zrmbc, mz+zrmbc |
222 | | DO j=1-rmbc, my+rmbc |
223 | | DO i=1-rmbc, mx+rmbc |
224 | | |
225 | | x=(xlower + (REAL(i, xPrec)-half) * dx) |
226 | | y=(ylower + (REAL(j, xPrec)-half) * dx) |
227 | | z=(zlower + (REAL(k, xPrec)-half) * dx) |
228 | | |
229 | | Info%q(i,j,k,irho) = rho(x,y,z) |
230 | | END DO |
| 203 | Note that during the !ProblemGridInit routine, ghost zones do not need to be initialized (rmbc = 0) - however - during beforestep calculations they should be (if needed). |
| 204 | |
| 205 | {{{ |
| 206 | SUBROUTINE ProblemGridInit(Info) |
| 207 | TYPE(InfoDef), POINTER :: Info |
| 208 | INTEGER :: i,j,k |
| 209 | REAL(KIND=xPREC) :: pos(3) |
| 210 | |
| 211 | ! Initialize background |
| 212 | Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), 1)=1d0 |
| 213 | Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivx)=0d0 |
| 214 | IF (ivy /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivy)=0d0 |
| 215 | IF (ivz /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivz)=0d0 |
| 216 | IF (iE /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), iE)=gamma7 |
| 217 | |
| 218 | ! Increase density for points inside of clump |
| 219 | DO i=1, Info%mX(1) |
| 220 | DO j=1, Info%mX(2) |
| 221 | DO k=1, Info%mX(3) |
| 222 | pos=CellPos(Info, i, j, k) |
| 223 | IF (sqrt(sum(pos**2)) < 1d0) THEN |
| 224 | Info%q(i,j,k,irho) = 10d0 |
| 225 | END IF |
233 | | }}} |
| 229 | END SUBROUTINE |
| 230 | }}} |
| 231 | |
| 232 | Now let's say we want to be able to adjust the density of the clump and the radius of the clump at run-time. To do this we need to declare two variables within our module.. |
| 233 | |
| 234 | {{{ |
| 235 | MODULE Problem |
| 236 | USE GlobalDeclarations |
| 237 | USE PhysicsDeclarations |
| 238 | USE DataDeclarations |
| 239 | IMPLICIT NONE |
| 240 | SAVE |
| 241 | PUBLIC ProblemModuleInit, ProblemGridInit, & |
| 242 | ProblemBeforeStep, ProblemAfterStep, ProblemSetErrFlag, ProblemBeforeGlobalStep |
| 243 | PRIVATE REAL(KIND=qPREC) :: rho, radius |
| 244 | |
| 245 | CONTAINS |
| 246 | |
| 247 | SUBROUTINE ProblemModuleInit() |
| 248 | NAMELIST/ProblemData/ rho, radius |
| 249 | OPEN(UNIT=PROBLEM_DATA_HANDLE, FILE='problem.data', STATUS="OLD") |
| 250 | READ(PROBLEM_DATA_HANDLE,NML=ProblemData) |
| 251 | CLOSE(PROBLEM_DATA_HANDLE) |
| 252 | END SUBROUTINE |
| 253 | |
| 254 | SUBROUTINE ProblemGridInit(Info) |
| 255 | TYPE(InfoDef), POINTER :: Info |
| 256 | INTEGER :: i,j,k |
| 257 | REAL(KIND=xPREC) :: pos(3) |
| 258 | |
| 259 | ! Initialize background |
| 260 | Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), 1)=1d0 |
| 261 | Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivx)=0d0 |
| 262 | IF (ivy /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivy)=0d0 |
| 263 | IF (ivz /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), ivz)=0d0 |
| 264 | IF (iE /= 0) Info%q(1:Info%mX(1),1:Info%mX(2),1:Info%mX(3), iE)=gamma7 |
| 265 | |
| 266 | ! Increase density for points inside of clump |
| 267 | DO i=1, Info%mX(1) |
| 268 | DO j=1, Info%mX(2) |
| 269 | DO k=1, Info%mX(3) |
| 270 | pos=CellPos(Info, i, j, k) |
| 271 | IF (sqrt(sum(pos**2)) < radius) THEN |
| 272 | Info%q(i,j,k,irho) = rho |
| 273 | END IF |
| 274 | END DO |
| 275 | END DO |
| 276 | END DO |
| 277 | END SUBROUTINE |
| 278 | }}} |
| 279 | |
| 280 | |
| 281 | |