findcut.f.html | ![]() |
Source file: findcut.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib | |
Converted: Sun May 15 2011 at 19:16:14 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c ----------------------------------------------------------- c subroutine findcut(icl,iscr,jscr,idim,jdim,index,iside, 1 ilo,ihi,jlo,jhi) c c ::::::::::::::::::::: FINDCUT ::::::::::::::::::::::::::::; c find best place to split the 2D array of flagged points c either split at a hole, or use signatures to find c zero crossing of laplacian. c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; c implicit double precision (a-h,o-z) include "call.i" dimension iscr(idim), jscr(jdim) c Modified 6/02: c Include call.i to get def's of horizontal/vertical. c integer horizontal, vertical c parameter(horizontal = 1) c parameter(vertical = 2) parameter(ithres = 2) parameter(minoff = 2) c c look for holes first in horizontal then vertical direction c do 10 i = ilo, ihi if (iscr(i) .eq. 0) then index = i iside = horizontal return endif 10 continue do 20 j = jlo, jhi if (jscr(j) .eq. 0) then index = j iside = vertical return endif 20 continue c c no holes - find 2nd derivative of signatures for best cut. c overwrite signature arrays. don't make cuts less than minoff c from boundary c ipre = iscr(ilo) do 50 i = ilo+1, ihi-1 icur = iscr(i) iscr(i) = iscr(i+1)-2*icur+ipre ipre = icur 50 continue locmaxi = 0 indexi = 0 imid = (ilo + ihi) / 2 do 60 i = ilo+minoff, ihi-minoff+1 itemp1 = iscr(i-1) itemp2 = iscr(i) locdif = iabs(itemp1-itemp2) if (itemp1*itemp2.lt.0) then if (locdif .gt. locmaxi) then locmaxi = locdif indexi = i else if (locdif .eq. locmaxi) then if (iabs(i-imid).lt.iabs(indexi-imid)) indexi = i endif endif 60 continue jpre = jscr(jlo) do 130 j = jlo+1, jhi-1 jcur = jscr(j) jscr(j) = jscr(j+1)-2*jcur+jpre jpre = jcur 130 continue locmaxj = 0 indexj = 0 jmid = (jlo + jhi) / 2 do 160 j = jlo+minoff, jhi-minoff+1 jtemp1 = jscr(j-1) jtemp2 = jscr(j) locdif = iabs(jtemp1-jtemp2) if (jtemp1*jtemp2.lt.0) then if (locdif .gt. locmaxj) then locmaxj = locdif indexj = j else if (locdif .eq. locmaxj) then if (iabs(j-jmid).lt.iabs(indexj-jmid)) indexj = j endif endif 160 continue c c ::::: choose max dif for splitting c 220 if (locmaxi .gt. locmaxj) then index = indexi iside = horizontal locmax = locmaxi else if (locmaxi .lt. locmaxj) then index = indexj iside = vertical locmax = locmaxj else if (iabs(indexi-imid).lt.iabs(indexj-jmid)) then index = indexi iside = horizontal locmax = locmaxi else index = indexj iside = vertical locmax = locmaxj endif c ::::: if inflection pt. not over the threshold, signal c ::::: with index 0 (out of range) if (locmax .lt. ithres) index = 0 return end