dimsp2.f.html | ![]() |
Source file: dimsp2.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/clawpack/2d/lib | |
Converted: Sun May 15 2011 at 19:15:43 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c c ========================================================== subroutine dimsp2(maxm,maxmx,maxmy,meqn,mwaves,mbc,mx,my, & qold,qnew,aux,dx,dy,dt,method,mthlim,cfl, & cflv,qadd,fadd,gadd,q1d,dtdx1d,dtdy1d, & aux1,aux2,aux3,work,mwork,rpn2,rpt2) c ========================================================== c c # Take one time step, updating q, using dimensional c # splitting. Two choices are available: c # c # method(3) = -1 gives Godunov splitting: c # time step dt in x-direction c # time step dt in y-direction c c # method(3) = -2 gives Strang splitting c # time step dt/2 in x-direction c # time step dt in y-direction c # time step dt/2 in x-direction c c # Godunov splitting is recommended over Strang splitting normally c # since it typically works as well, is faster, and boundary c # conditions are handled properly. c implicit double precision (a-h,o-z) external rpn2,rpt2 dimension qold(1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc, meqn) dimension qnew(1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc, meqn) dimension q1d(1-mbc:maxm+mbc, meqn) dimension cflv(4) dimension qadd(1-mbc:maxm+mbc, meqn) dimension fadd(1-mbc:maxm+mbc, meqn) dimension gadd(1-mbc:maxm+mbc, meqn, 2) dimension aux(1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc, *) dimension aux1(1-mbc:maxm+mbc, *) dimension aux2(1-mbc:maxm+mbc, *) dimension aux3(1-mbc:maxm+mbc, *) dimension dtdx1d(1-mbc:maxmx+mbc) dimension dtdy1d(1-mbc:maxmx+mbc) dimension method(7),mthlim(mwaves) dimension work(mwork) c c # If method(3) = -1, take a full time step in x. c # If method(3) = -2, take a half time step in x. c dt2 = dt/2.d0 c if( method(3) .eq. -2 )then call step2ds(maxm,maxmx,maxmy,meqn,mwaves,mbc,mx,my, & qold,qnew,aux,dx,dy,dt2,method,mthlim,cflx, & qadd,fadd,gadd,q1d,dtdx1d,dtdy1d, & aux1,aux2,aux3,work,mwork,rpn2,rpt2,1) else call step2ds(maxm,maxmx,maxmy,meqn,mwaves,mbc,mx,my, & qold,qnew,aux,dx,dy,dt,method,mthlim,cflx, & qadd,fadd,gadd,q1d,dtdx1d,dtdy1d, & aux1,aux2,aux3,work,mwork,rpn2,rpt2,1) endif c if (cflx .gt. cflv(1)) then c # Abort if the Courant number was too large in x-sweep cfl = cflx return endif c c # Take full step in y-direction c call step2ds(maxm,maxmx,maxmy,meqn,mwaves,mbc,mx,my, & qnew,qnew,aux,dx,dy,dt,method,mthlim,cfly, & qadd,fadd,gadd,q1d,dtdx1d,dtdy1d, & aux1,aux2,aux3,work,mwork,rpn2,rpt2,2) c cfl = dmax1(cflx,cfly) c c # Finally, take a half time step in the x-direction c # if Strang splitting is used. NOTE: boundary conditions may c # not be set properly for this sweep. c if( method(3) .eq. -2 )then if (cfly .gt. cflv(1)) then c # Abort if the Courant number was too large in y-sweep cfl = cfly return endif call step2ds(maxm,maxmx,maxmy,meqn,mwaves,mbc,mx,my, & qnew,qnew,aux,dx,dy,dt2,method,mthlim,cflx, & qadd,fadd,gadd,q1d,dtdx1d,dtdy1d, & aux1,aux2,aux3,work,mwork,rpn2,rpt2,1) cfl = dmax1(cfl,cflx) endif c return end