From 343917ffa89ef75251259b8d07b53e0272b42b24 Mon Sep 17 00:00:00 2001 From: akshaysripada Date: Sun, 15 Jan 2017 19:27:19 -0500 Subject: [PATCH 1/4] level speciffic wace tol added --- src/2d/shallow/flag2refine2.f90 | 27 ++++++++++++++++++--------- src/2d/shallow/refinement_module.f90 | 6 ++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/2d/shallow/flag2refine2.f90 b/src/2d/shallow/flag2refine2.f90 index 6e3c20beb..9e87d4670 100644 --- a/src/2d/shallow/flag2refine2.f90 +++ b/src/2d/shallow/flag2refine2.f90 @@ -177,18 +177,27 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & eta = q(1,i,j) + aux(1,i,j) ! Check wave criteria - if (abs(eta - sea_level) > wave_tolerance) then - ! Check to see if we are near shore - if (q(1,i,j) < deep_depth) then - amrflags(i,j) = DOFLAG - cycle x_loop - ! Check if we are allowed to flag in deep water - ! anyway - else if (level < max_level_deep) then + !New method - level specific wave tolerance! + do m=1,min(size(wave_tolerance),mxnest) + if (abs(eta - sea_level) > wave_tolerance(m) .and. level <= m) then amrflags(i,j) = DOFLAG cycle x_loop endif - endif + enddo + + !Old method! + !if (abs(eta - sea_level) > wave_tolerance) then + ! ! Check to see if we are near shore + ! if (q(1,i,j) < deep_depth) then + ! amrflags(i,j) = DOFLAG + ! cycle x_loop + ! ! Check if we are allowed to flag in deep water + ! ! anyway + ! else if (level < max_level_deep) then + ! amrflags(i,j) = DOFLAG + ! cycle x_loop + ! endif + !endif ! Check speed criteria, note that it might be useful to ! also have a per layer criteria since this is not diff --git a/src/2d/shallow/refinement_module.f90 b/src/2d/shallow/refinement_module.f90 index ae5a8f298..0a97473a3 100644 --- a/src/2d/shallow/refinement_module.f90 +++ b/src/2d/shallow/refinement_module.f90 @@ -11,7 +11,7 @@ module refinement_module ! ======================================================================== ! Refinement Criteria ! ======================================================================== - real(kind=8) :: wave_tolerance + real(kind=8), allocatable :: wave_tolerance(:) real(kind=8), allocatable :: speed_tolerance(:) real(kind=8) :: deep_depth integer :: max_level_deep @@ -59,7 +59,9 @@ subroutine set_refinement(file_name) endif ! Basic criteria - read(unit,*) wave_tolerance + read(unit,'(a)') line + allocate(wave_tolerance(get_value_count(line))) + read(line,*) wave_tolerance read(unit,'(a)') line allocate(speed_tolerance(get_value_count(line))) read(line,*) speed_tolerance From 21cb1e618d01daa1bde29b769a158997371e78e0 Mon Sep 17 00:00:00 2001 From: akshaysripada Date: Mon, 16 Jan 2017 20:38:24 -0500 Subject: [PATCH 2/4] minor fix --- src/2d/shallow/flag2refine2.f90 | 43 ++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/2d/shallow/flag2refine2.f90 b/src/2d/shallow/flag2refine2.f90 index 9e87d4670..2b7598fbf 100644 --- a/src/2d/shallow/flag2refine2.f90 +++ b/src/2d/shallow/flag2refine2.f90 @@ -177,27 +177,36 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & eta = q(1,i,j) + aux(1,i,j) ! Check wave criteria - !New method - level specific wave tolerance! - do m=1,min(size(wave_tolerance),mxnest) + !New method - level specific wave tolerance + do m=1,min(size(wave_tolerance),mxnest) if (abs(eta - sea_level) > wave_tolerance(m) .and. level <= m) then - amrflags(i,j) = DOFLAG - cycle x_loop + ! Check to see if we are near shore + if (q(1,i,j) < deep_depth) then + amrflags(i,j) = DOFLAG + cycle x_loop + ! Check if we are allowed to flag in deep water + ! anyway + else if (level < max_level_deep) then + amrflags(i,j) = DOFLAG + cycle x_loop + endif endif enddo - !Old method! - !if (abs(eta - sea_level) > wave_tolerance) then - ! ! Check to see if we are near shore - ! if (q(1,i,j) < deep_depth) then - ! amrflags(i,j) = DOFLAG - ! cycle x_loop - ! ! Check if we are allowed to flag in deep water - ! ! anyway - ! else if (level < max_level_deep) then - ! amrflags(i,j) = DOFLAG - ! cycle x_loop - ! endif - !endif + if (size(wave_tolerance) < mxnest-1) then + if (abs(eta - sea_level) > wave_tolerance(size(wave_tolerance)) .and. level > size(wave_tolerance)) then + ! Check to see if we are near shore + if (q(1,i,j) < deep_depth) then + amrflags(i,j) = DOFLAG + cycle x_loop + ! Check if we are allowed to flag in deep water + ! anyway + else if (level < max_level_deep) then + amrflags(i,j) = DOFLAG + cycle x_loop + endif + endif + endif ! Check speed criteria, note that it might be useful to ! also have a per layer criteria since this is not From a73b783c13d28dbd9e7f45514405c41ba233f002 Mon Sep 17 00:00:00 2001 From: akshaysripada Date: Tue, 17 Jan 2017 19:19:36 -0500 Subject: [PATCH 3/4] added comments --- src/2d/shallow/flag2refine2.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/2d/shallow/flag2refine2.f90 b/src/2d/shallow/flag2refine2.f90 index 2b7598fbf..6ef3e8ae5 100644 --- a/src/2d/shallow/flag2refine2.f90 +++ b/src/2d/shallow/flag2refine2.f90 @@ -177,7 +177,7 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & eta = q(1,i,j) + aux(1,i,j) ! Check wave criteria - !New method - level specific wave tolerance + ! New method - level specific wave tolerance do m=1,min(size(wave_tolerance),mxnest) if (abs(eta - sea_level) > wave_tolerance(m) .and. level <= m) then ! Check to see if we are near shore @@ -192,7 +192,8 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & endif endif enddo - + ! Check if wave tolerance array size is smaller than max level + ! then refine with the last wave tolerance value for the rest of the levels if (size(wave_tolerance) < mxnest-1) then if (abs(eta - sea_level) > wave_tolerance(size(wave_tolerance)) .and. level > size(wave_tolerance)) then ! Check to see if we are near shore From b97a4db9bce82a5bbf2a6c602fa2cccc4b72190a Mon Sep 17 00:00:00 2001 From: akshaysripada Date: Tue, 14 Feb 2017 20:17:18 -0500 Subject: [PATCH 4/4] robust version to handle different lengths of wave tolerance inputs --- src/2d/shallow/flag2refine2.f90 | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/2d/shallow/flag2refine2.f90 b/src/2d/shallow/flag2refine2.f90 index 6ef3e8ae5..7d4c1fa22 100644 --- a/src/2d/shallow/flag2refine2.f90 +++ b/src/2d/shallow/flag2refine2.f90 @@ -61,7 +61,7 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & ! Generic locals integer :: i,j,m - real(kind=8) :: x_c,y_c,x_low,y_low,x_hi,y_hi + real(kind=8) :: x_c,y_c,x_low,y_low,x_hi,y_hi,mth_level_wave_tolerance, mth_level_speed_tolerance real(kind=8) :: speed, eta, ds ! Storm specific variables @@ -175,28 +175,22 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & if (q(1,i,j) > dry_tolerance) then eta = q(1,i,j) + aux(1,i,j) - + ! Check wave criteria + ! New method - level specific wave tolerance - do m=1,min(size(wave_tolerance),mxnest) - if (abs(eta - sea_level) > wave_tolerance(m) .and. level <= m) then - ! Check to see if we are near shore - if (q(1,i,j) < deep_depth) then - amrflags(i,j) = DOFLAG - cycle x_loop - ! Check if we are allowed to flag in deep water - ! anyway - else if (level < max_level_deep) then - amrflags(i,j) = DOFLAG - cycle x_loop - endif + do m=1,mxnest + if (m > size(wave_tolerance)) then + mth_level_wave_tolerance = wave_tolerance(size(wave_tolerance)) + else + mth_level_wave_tolerance = wave_tolerance(m) endif - enddo - ! Check if wave tolerance array size is smaller than max level - ! then refine with the last wave tolerance value for the rest of the levels - if (size(wave_tolerance) < mxnest-1) then - if (abs(eta - sea_level) > wave_tolerance(size(wave_tolerance)) .and. level > size(wave_tolerance)) then + + if (abs(eta - sea_level) > mth_level_wave_tolerance .and. level <= m) then ! Check to see if we are near shore + Print *, "Level is ", level + Print *, "Wave tolerance is ", mth_level_wave_tolerance + if (q(1,i,j) < deep_depth) then amrflags(i,j) = DOFLAG cycle x_loop @@ -207,14 +201,20 @@ subroutine flag2refine2(mx,my,mbc,mbuff,meqn,maux,xlower,ylower,dx,dy,t,level, & cycle x_loop endif endif - endif + enddo ! Check speed criteria, note that it might be useful to ! also have a per layer criteria since this is not ! gradient based speed = sqrt(q(2,i,j)**2 + q(3,i,j)**2) / q(1,i,j) - do m=1,min(size(speed_tolerance),mxnest) - if (speed > speed_tolerance(m) .and. level <= m) then + do m=1,mxnest + if (m > size(speed_tolerance)) then + mth_level_speed_tolerance = speed_tolerance(size(speed_tolerance)) + else + mth_level_speed_tolerance = speed_tolerance(m) + endif + + if (speed > mth_level_speed_tolerance .and. level <= m) then amrflags(i,j) = DOFLAG cycle x_loop endif