flag2refine1.f90.html CLAWPACK  
 Source file:   flag2refine1.f90
 Directory:   /Users/rjl/clawpack_src/clawpack_master/amrclaw/examples/euler_1d_wcblast
 Converted:   Mon Feb 19 2024 at 17:59:05   using clawcode2html
 This documentation file will not reflect any later changes in the source file.

 
! ::::::::::::::::::::: flag2refine ::::::::::::::::::::::::::::::::::
!
! User routine to control flagging of points for refinement.
!
! -----------------------------------------------------------------------
! This version for wcblast problem uses only the jump in density to flag.
! -----------------------------------------------------------------------
!
! Default version computes spatial difference dq in each direction and
! for each component of q and flags any point where this is greater than
! the tolerance tolsp.  This is consistent with what the routine errsp did in
! earlier versions of amrclaw (4.2 and before).
!
! This routine can be copied to an application directory and modified to
! implement some other desired refinement criterion.
!
! Points may also be flagged for refining based on a Richardson estimate
! of the error, obtained by comparing solutions on the current grid and a
! coarsened grid.  Points are flagged if the estimated error is larger than
! the parameter tol in amr2ez.data, provided flag_richardson is .true.,
! otherwise the coarsening and Richardson estimation is not performed!  
! Points are flagged via Richardson in a separate routine.
!
! Once points are flagged via this routine and/or Richardson, the subroutine
! flagregions is applied to check each point against the min_level and
! max_level of refinement specified in any "region" set by the user.
! So flags set here might be over-ruled by region constraints.
!
!    q   = grid values including ghost cells (bndry vals at specified
!          time have already been set, so can use ghost cell values too)
!
!  aux   = aux array on this grid patch
!
! amrflags  = array to be flagged with either the value
!             DONTFLAG (no refinement needed)  or
!             DOFLAG   (refinement desired)    
!
! tolsp = tolerance specified by user in input file amr1ez.data, used in default
!         version of this routine as a tolerance for spatial differences.
!
! ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
subroutine flag2refine1(mx,mbc,mbuff,meqn,maux,xlower,dx,t,level, &
                            tolsp,q,aux,amrflags)

    use regions_module
    use amr_module, only : DOFLAG, UNSET

    implicit none

    ! Subroutine arguments
    integer, intent(in) :: mx,mbc,meqn,maux,level,mbuff
    real(kind=8), intent(in) :: xlower,dx,t,tolsp
    
    real(kind=8), intent(in) :: q(meqn,1-mbc:mx+mbc)
    real(kind=8), intent(in) :: aux(maux,1-mbc:mx+mbc)
    
    ! Flagging
    real(kind=8),intent(inout) :: amrflags(1-mbuff:mx+mbuff)
    
    logical :: allowflag
    external allowflag

    ! Locals
    integer :: i,m
    real(kind=8) :: x_c,x_low,x_hi
    real(kind=8) :: dqi(meqn), dq(meqn)

    ! Don't initialize flags, since they were already 
    ! flagged by flagregions2
    ! amrflags = DONTFLAG
    
    ! Loop over interior points on this grid
    ! (i) grid cell is [x_low,x_hi], cell center at (x_c)
    ! This information is not needed for the default flagging based on
    ! undivided differences, but might be needed in a user's version.
    ! Note that if you want to refine only in certain space-time regions,
    ! it may be easiest to use the "regions" feature.  The flags set here or
    ! in the Richardson error estimator are potentially modified by the
    ! min_level and max_level specified in any regions.
        
    x_loop: do i = 1,mx
        !x_low = xlower + (i - 1) * dx
        !x_c = xlower + (i - 0.5d0) * dx
        !x_hi = xlower + i * dx

        ! -----------------------------------------------------------------
            ! Only check undivided differences if flag hasn't been set yet. 
            ! If flag == DONTFLAG then refinement is forbidden by a region, 
            ! if flag == DOFLAG checking is not needed
            if(amrflags(i) == UNSET) then
                dq = 0.d0
                dqi = abs(q(:,i+1) - q(:,i-1))
                dq = max(dq,dqi)

                ! check only undivided difference of density:
                do m=1,1
                    if (dq(m) > tolsp) then
                        amrflags(i) = DOFLAG
                        cycle x_loop
                    endif
                enddo
            endif

    enddo x_loop
   
end subroutine flag2refine1