214 INTEGER,
INTENT(IN) :: NDS
215 CHARACTER(60),
INTENT(IN) :: FNAME
219 INTEGER :: i,j,k, NODES, NELTS, ID, KID
220 INTEGER :: ID1, ID2, KID1, ITMP(3)
221 INTEGER :: I1, I2, I3
222 INTEGER(KIND=4) :: Ind,eltype,ntag, INode
223 CHARACTER :: COMSTR*1, SPACE*1 =
' ', cels*64
224 REAL,
ALLOCATABLE :: TAGS(:)
225 CHARACTER(LEN=64),
ALLOCATABLE :: ELS(:)
226 CHARACTER(LEN=120) :: LINE
227 CHARACTER(LEN=50) :: CHTMP
228 CHARACTER(LEN=10) :: A, B, C
229 INTEGER,
ALLOCATABLE :: NELS(:), TRIGPTMP1(:,:), TRIGPTMP2(:,:)
230 INTEGER(KIND=4),
ALLOCATABLE :: IFOUND(:), VERTEX(:), BOUNDTMP(:)
231 DOUBLE PRECISION,
ALLOCATABLE :: XYBTMP1(:,:),XYBTMP2(:,:)
234 OPEN(nds,
file = fname,status=
'old')
235 READ (nds,
'(A)') comstr
236 IF (comstr.EQ.
' ') comstr =
'$'
237 CALL nextln(comstr, nds, ndse)
239 CALL nextln(comstr, nds, ndse)
248 ALLOCATE(xybtmp1(3,nodes))
250 READ(nds,*) j, xybtmp1(1,i), xybtmp1(2,i), xybtmp1(3,i)
255 ALLOCATE(boundtmp(nodes))
257 CALL nextln(comstr, nds, ndse)
259 ALLOCATE(trigptmp1(3,nelts))
262 READ(nds,
'(A100)') line
263 READ(line,*) ind,eltype,ntag
271 READ(line,*) ind,eltype,ntag,tags,inode
279 READ(line,*) ind,eltype,ntag,tags,itmp
280 trigptmp1(1:3,j) = itmp
292 ALLOCATE(ifound(nodes))
303 ifound(i1)= ifound(i1) + 1
304 ifound(i2)= ifound(i2) + 1
305 ifound(i3)= ifound(i3) + 1
310 ALLOCATE(trigptmp2(3,
ntri),vertex(nodes),xybtmp2(3,nodes))
315 IF( ifound(i) .GT. 0)
THEN
317 xybtmp2(:,j) = xybtmp1(:,i)
330 trigptmp2(1,i) = vertex(i1)
331 trigptmp2(2,i) = vertex(i2)
332 trigptmp2(3,i) = vertex(i3)
335 DEALLOCATE(xybtmp1,ifound,trigptmp1)
340 CALL count(trigptmp2)
346 xgrd(1,i) = xybtmp2(1,i)
347 ygrd(1,i) = xybtmp2(2,i)
352 itmp = trigptmp2(:,i)
356 DEALLOCATE(trigptmp2,xybtmp2)
469 INTEGER,
INTENT(IN) :: NDS
470 CHARACTER(60),
INTENT(IN) :: FNAME
474 INTEGER :: i,j,k, NODES
475 LOGICAL :: lfile_exists
476 CHARACTER :: COMSTR*1, SPACE*1 =
' ', cels*64
477 DOUBLE PRECISION,
ALLOCATABLE :: XYBTMP1(:,:)
479 INQUIRE(
file=fname, exist=lfile_exists)
480 IF (.NOT. lfile_exists)
RETURN
481 OPEN(nds,
file = fname,status=
'old')
482 READ (nds,
'(A)') comstr
483 IF (comstr.EQ.
' ') comstr =
'$'
484 CALL nextln(comstr, nds, ndse)
486 CALL nextln(comstr, nds, ndse)
491 ALLOCATE(xybtmp1(3,nodes))
493 READ(nds,*) j, xybtmp1(1,i), xybtmp1(2,i), xybtmp1(3,i)
494 IF (int(xybtmp1(3,i)) .EQ. 3)
iobp(i) = 3
574 INTEGER,
SAVE :: IENT = 0
580 integer*2,
intent(out) :: STATUS(NX)
581 INTEGER :: COLLECTED(NX), NEXTVERT(NX), PREVVERT(NX)
582 INTEGER :: ISFINISHED, INEXT, IPREV
583 INTEGER :: IPNEXT, IPPREV, ZNEXT, IP, I, IE
585 CALL strace (ient,
'VA_SETUP_IOBPD')
601 ipnext=
trigp(inext,ie)
602 ipprev=
trigp(iprev,ie)
603 IF (status(ip).EQ.0)
THEN
626 ipnext=
trigp(inext,ie)
627 ipprev=
trigp(iprev,ie)
628 IF (status(ip).eq.0)
THEN
630 IF (znext.eq.ipprev)
THEN
633 IF (nextvert(ip).eq.prevvert(ip))
THEN
642 IF ((collected(ip).eq.0).and.(status(ip).eq.0))
THEN
645 IF (status(ip).eq.0)
THEN
649 IF (isfinished.eq.1)
THEN
669 SUBROUTINE readmshobc(NDS, FNAME, TMPSTA, UGOBCOK)
729 INTEGER,
INTENT(IN) :: NDS
730 CHARACTER(60),
INTENT(IN) :: FNAME
731 INTEGER,
INTENT(INOUT) :: TMPSTA(NY,NX)
732 LOGICAL,
INTENT(OUT) :: UGOBCOK
737 INTEGER(KIND=4) :: Ind,ntag, INode
738 CHARACTER :: COMSTR*1, SPACE*1 =
' ', cels*64
739 REAL,
ALLOCATABLE :: TAGS(:)
740 CHARACTER(LEN=120) :: LINE
744 OPEN(nds,
file = fname,status=
'old')
745 READ (nds,
'(A)') comstr
746 IF (comstr.EQ.
' ') comstr =
'$'
747 CALL nextln(comstr, nds,
ndse)
750 READ (nds,
'(A100)',
END=2001,ERR=2002,IOSTAT=IERR) line
751 READ(line,*,iostat=ierr) ind,ntag
754 READ(line,*,iostat=ierr) ind,ntag,tags,inode
772 WRITE (ndse,1002) ierr
774 1001
FORMAT (/
' *** WAVEWATCH III ERROR IN READMSHOBC : '/ &
775 ' PREMATURE END OF FILE IN READING ',a/)
776 1002
FORMAT (/
' *** WAVEWATCH III ERROR IN READMSHOBC : '/ &
777 ' ERROR IN READING ',a,
' IOSTAT =',i8/)
844 INTEGER,
INTENT(INOUT) :: TMPSTA(NY,NX)
846 INTEGER,
SAVE :: IENT = 0
848 REAL ,
INTENT(IN) :: ZBIN(NY,NX)
849 REAL ,
INTENT(IN) :: ZLIM
856 INTEGER*2 :: STATUS(NX)
862 CALL strace (ient,
'UG_GETOPENBOUNDARY')
869 IF ((ix.NE.0).AND.(ix.LE.nx))
THEN
870 IF ( (tmpsta(1,ix).EQ.1) .AND. (status(ix).EQ.0) .AND. (zbin(1,ix) .LT. zlim)) tmpsta(1,ix) = 2
948 REAL :: TL1, TL2, TL3, TMPTRIGP
949 INTEGER :: I1, I2, I3
958 CALL strace (ient,
'SPATIAL_GRID')
972 tria(k) = real( (pt(2,2)-pt(1,2)) &
975 *(pt(2,1)-pt(1,1)) )*0.5
980 IF (
tria(k) .lt. tiny(1.))
THEN
981 tmptrigp =
trigp(2,k)
983 trigp(3,k) = tmptrigp
1056 INTEGER :: I1, I2, I3, I11, I22, I33
1058 real*8 :: p1(2), p2(2), p3(2)
1059 real*8 :: r1(2), r2(2), r3(2)
1060 real*8 :: n1(2), n2(2), n3(2)
1069 CALL strace (ient,
'NVECTRI')
1104 len(ie,1) = dsqrt(r1(1)**2+r1(2)**2)
1105 len(ie,2) = dsqrt(r2(1)**2+r2(2)**2)
1106 len(ie,3) = dsqrt(r3(1)**2+r3(2)**2)
1134 SUBROUTINE count(TRIGPTEMP)
1192 INTEGER,
INTENT(IN) :: TRIGPTEMP(:,:)
1197 INTEGER :: COUNTER, IP, IE, I, J, N(3)
1204 CALL strace (ient,
'COUNT')
1217 n(1) = trigptemp(1,ie)
1218 n(2) = trigptemp(2,ie)
1219 n(3) = trigptemp(3,ie)
1220 conn(n(1)) = conn(n(1)) + 1
1221 conn(n(2)) = conn(n(2)) + 1
1222 conn(n(3)) = conn(n(3)) + 1
1237 END SUBROUTINE count
1298 CALL strace (ient,
'COORDMAX')
1314 sx = minval(
len(:,:))
1391 INTEGER,
INTENT(IN) :: IMOD
1395 INTEGER :: COUNTER,ifound,alreadyfound
1396 INTEGER :: I, J, K, II
1397 INTEGER :: IP, IE, POS, POS_I, POS_J, POS_K, IP_I, IP_J, IP_K
1398 INTEGER :: I1, I2, I3, IP2, CHILF(NX)
1399 INTEGER :: TMP(NX), CELLVERTEX(NX,COUNTRI,2)
1400 INTEGER :: COUNT_MAX
1401 DOUBLE PRECISION :: TRIA03
1402 INTEGER,
ALLOCATABLE :: PTABLE(:,:)
1410 CALL strace (ient,
'AREA_SI')
1423 tria03 = 1./3. *
tria(ie)
1424 si(i1) =
si(i1) + tria03
1425 si(i2) =
si(i2) + tria03
1426 si(i3) =
si(i3) + tria03
1429 cellvertex(:,:,:) = 0
1437 chilf(i) = chilf(i)+1
1438 cellvertex(i,chilf(i),1) = ie
1439 cellvertex(i,chilf(i),2) = j
1452 ie_cell(j) = cellvertex(ip,i,1)
1469 ALLOCATE(ptable(count_max,7))
1484 ELSE IF (pos == 2)
THEN
1492 ip_j =
trigp(pos_j,ie)
1493 ip_k =
trigp(pos_k,ie)
1528 ALLOCATE (
grids(imod)%IAA(nx+1))
1529 ALLOCATE (
grids(imod)%POSI(3,count_max))
1549 IF (tmp(i) .GT. 0)
THEN
1564 DO k =
iaa(ip),
iaa(ip+1) - 1
1565 IF (ip ==
jaa(k))
posi(1,j) = k
1566 IF (ip_j ==
jaa(k))
posi(2,j) = k
1567 IF (ip_k ==
jaa(k))
posi(3,j) = k
1569 WRITE(*,*) .EQ.
'ERROR IN AREA_SI K 0'
1604 SUBROUTINE is_in_ungrid(IMOD, XTIN, YTIN, ITOUT, IS, JS, RW)
1711 INTEGER,
INTENT(IN) :: IMOD
1712 DOUBLE PRECISION,
INTENT(IN) :: XTIN, YTIN
1713 INTEGER,
INTENT(OUT) :: itout
1714 INTEGER,
INTENT(OUT) :: IS(4), JS(4)
1715 REAL,
INTENT(OUT) :: RW(4)
1719 DOUBLE PRECISION :: x1, x2, x3
1720 DOUBLE PRECISION :: y1, y2, y3
1721 DOUBLE PRECISION :: s1, s2, s3, sg1, sg2, sg3
1724 INTEGER :: I1, I2, I3
1728 CALL strace (ient,
'IS_IN_UNGRID')
1735 DO WHILE (nbfound.EQ.0.AND.itri.LT.
grids(imod)%NTRI)
1737 i1=
grids(imod)%TRIGP(1,itri)
1738 i2=
grids(imod)%TRIGP(2,itri)
1739 i3=
grids(imod)%TRIGP(3,itri)
1753 sg3=(y3-y1)*(x2-x1)-(x3-x1)*(y2-y1)
1755 s3=(ytin-y1)*(x2-x1)-(xtin-x1)*(y2-y1)
1757 sg1=(y1-y2)*(x3-x2)-(x1-x2)*(y3-y2)
1759 s1=(ytin-y2)*(x3-x2)-(xtin-x2)*(y3-y2)
1761 sg2=(y2-y3)*(x1-x3)-(x2-x3)*(y1-y3)
1763 s2=(ytin-y3)*(x1-x3)-(xtin-x3)*(y1-y3)
1764 IF ((s1*sg1.GE.0).AND.(s2*sg2.GE.0).AND.(s3*sg3.GE.0))
THEN
1774 rw(3)=1.-rw(1)-rw(2)
1806 SUBROUTINE is_in_ungrid2(IMOD, XTIN, YTIN, FORCE, ITOUT, IS, JS, RW)
1915 INTEGER,
INTENT(IN) :: IMOD, FORCE
1916 DOUBLE PRECISION,
INTENT(IN) :: XTIN, YTIN
1917 INTEGER,
INTENT(OUT) :: itout
1918 INTEGER,
INTENT(OUT) :: IS(4), JS(4)
1919 REAL,
INTENT(OUT) :: RW(4)
1923 DOUBLE PRECISION :: x1, x2, x3, D1, D2, D3, DISTMIN, DDMIN
1924 DOUBLE PRECISION :: s1, s2, s3, sg1, sg2, sg3, smin, ssum
1925 DOUBLE PRECISION :: y1, y2, y3
1926 INTEGER :: ITRI, ITRIS
1927 INTEGER :: I1, I2, I3
1932 CALL strace (ient,
'IS_IN_UNGRID2')
1942 DO WHILE (nbfound.EQ.0.AND.itri.LT.
grids(imod)%NTRI)
1944 i1=
grids(imod)%TRIGP(1,itri)
1945 i2=
grids(imod)%TRIGP(2,itri)
1946 i3=
grids(imod)%TRIGP(3,itri)
1948 x1=
grids(imod)%XGRD(1,i1)
1949 y1=
grids(imod)%YGRD(1,i1)
1951 x2=
grids(imod)%XGRD(1,i2)
1952 y2=
grids(imod)%XGRD(1,i2)
1954 x3=
grids(imod)%XGRD(1,i3)
1955 y3=
grids(imod)%YGRD(1,i3)
1958 sg3=(y3-y1)*(x2-x1)-(x3-x1)*(y2-y1)
1960 s3=(ytin-y1)*(x2-x1)-(xtin-x1)*(y2-y1)
1962 sg1=(y1-y2)*(x3-x2)-(x1-x2)*(y3-y2)
1964 s1=(ytin-y2)*(x3-x2)-(xtin-x2)*(y3-y2)
1966 sg2=(y2-y3)*(x1-x3)-(x2-x3)*(y1-y3)
1968 s2=(ytin-y3)*(x1-x3)-(xtin-x3)*(y1-y3)
1970 mapstaok = ((
grids(imod)%MAPSTA(1,i1).GE.1).AND. &
1971 (
grids(imod)%MAPSTA(1,i2).GE.1).AND.(
grids(imod)%MAPSTA(1,i3).GE.1))
1972 IF (force.LT.2) mapstaok =.true.
1973 ssum = (xtin-(x1+x2+x3)/3.)**2+(ytin-(y1+y2+y2)/3.)**2
1974 IF (smin.EQ.0.AND. mapstaok ) smin=ssum
1976 IF (ssum.LT.smin .AND. mapstaok )
THEN
1980 IF ((s1*sg1.GE.0).AND.(s2*sg2.GE.0).AND.(s3*sg3.GE.0))
THEN
1990 rw(3)=1.-rw(1)-rw(2)
1994 IF (itout.EQ.0.AND.force.GT.0)
THEN
1996 i1=
grids(imod)%TRIGP(1,itri)
1997 i2=
grids(imod)%TRIGP(2,itri)
1998 i3=
grids(imod)%TRIGP(3,itri)
2000 x1=
grids(imod)%XGRD(1,i1)
2001 y1=
grids(imod)%YGRD(1,i1)
2003 x2=
grids(imod)%XGRD(1,i2)
2004 y2=
grids(imod)%YGRD(1,i2)
2006 x3=
grids(imod)%XGRD(1,i3)
2007 y3=
grids(imod)%YGRD(1,i3)
2008 d1=(xtin-x1)**2+(ytin-y1)**2
2009 d2=(xtin-x2)**2+(ytin-y2)**2
2010 d3=(xtin-x3)**2+(ytin-y3)**2
2011 IF (d1.LE.d2.AND.d1.LE.d3) is(1)=i1
2012 IF (d2.LE.d1.AND.d2.LE.d3) is(1)=i2
2013 IF (d3.LE.d2.AND.d3.LE.d1) is(1)=i3
2096 REAL,
INTENT(IN) :: PARAM(0:NSEA)
2097 REAL,
INTENT(OUT) :: DIFFX(:,:), DIFFY(:,:)
2101 INTEGER :: VERTICES(3), NI(3), NI_GL(3)
2102 REAL :: TMP1(3), TMP2(3)
2103 INTEGER :: I, IX, IE, IE_GL
2104 REAL :: VAR(3), FACT, LATMEAN
2105 REAL :: DIFFXTMP, DIFFYTMP
2106 REAL :: DEDX(3), DEDY(3)
2107 REAL :: DVDXIE, DVDYIE
2108 REAL :: WEI(NX), WEI_LOCAL(NSEAL)
2109 real*8 :: rtmp(nseal)
2127 wei(ni) = wei(ni) + 2.*
tria(ie)
2134 var = param(
mapfs(1,ni)) * fact
2135 dvdxie = dot_product( var,dedx)
2136 dvdyie = dot_product( var,dedy)
2137 diffx(1,ni) = diffx(1,ni) + dvdxie * latmean
2138 diffy(1,ni) = diffy(1,ni) + dvdyie
2140 diffx(1,:) = diffx(1,:)/wei
2141 diffy(1,:) = diffy(1,:)/wei
2148 ni_gl =
trigp(:,ie_gl)
2150 wei_local(ni) = wei_local(ni) + 2.*
pdlib_tria(ie)
2157 var = param(
mapfs(1,ni_gl)) * fact
2158 dvdxie = dot_product(var,dedx)
2159 dvdyie = dot_product(var,dedy)
2160 diffx(1,ni) = diffx(1,ni) + dvdxie * latmean
2161 diffy(1,ni) = diffy(1,ni) + dvdyie
2163 diffx(1,:) = diffx(1,:)/wei_local
2164 diffy(1,:) = diffy(1,:)/wei_local
2236 REAL,
INTENT(IN) :: DISTMIN
2237 LOGICAL,
INTENT(INOUT) :: FLOK
2239 INTEGER :: I, J, JMEMO, IS, IX, N, IX1(NBI)
2251 IF (abs(
mapsta(1,ix)) .EQ. 2)
THEN
2254 WRITE(
ndse,*)
'Error: boundary node index > NBI ... nest.ww3 file is not consistent with mod_def.ww3'
2259 WRITE(
ndse ,*)
'ADDING BOUNDARY POINT:',n,ix
2272 IF (dist.LT.dist0)
THEN
2273 is =
mapfs(1,ix1(j))
2280 IF (dist0.LE.distmin)
THEN
2283 WRITE(
ndse ,
'(A,I6,A,I7,A,I6)')
'MATCHED BOUNDARY POINT:',i,
'GRID POINT:', &
2284 mapsf(is,1),
'INDEX IN nest.ww3:', jmemo
2292 IF ( n .NE. nbi)
THEN
2293 WRITE(
ndse ,900) n, nbi
2295 WRITE(6,*)
'THIS POINT HAS MAPSTA=2:',
isbpi(j)
2300 900
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC : '/ &
2301 ' NUMBER OF MAPSTA=2 DIFFERS FROM NUMBER IN nest.ww3 '/ &
2302 ' CHECK nest.ww3 AND ww3_grid.inp ',2i8/)
2382 INTEGER,
INTENT(IN) :: MASK(NX)
2383 INTEGER*2,
INTENT(OUT) :: STATUS(NX)
2385 INTEGER :: COLLECTED(NX), NEXTVERT(NX), PREVVERT(NX)
2386 INTEGER :: ISFINISHED
2387 INTEGER :: INEXT(3), IPREV(3)
2388 INTEGER :: ZNEXT, IP, I, IE, IPNEXT, IPPREV, COUNT
2389 integer nb0, nb1, nbM1
2401 IF (status(ip).EQ.-1)
THEN
2422 IF (status(ip).EQ.-1)
THEN
2424 IF (znext.EQ.ipprev)
THEN
2427 IF (nextvert(ip).EQ.prevvert(ip))
THEN
2440 IF (mask(ip).LE.0)
THEN
2443 IF ((collected(ip).EQ.0).AND.(status(ip).EQ.-1))
THEN
2446 IF (status(ip).eq.-1)
THEN
2451 IF (isfinished.EQ.1)
THEN
2479 SUBROUTINE get_boundary(MNP, MNE, TRIGP, IOBP, NEIGHBOR_PREV, &
2539 INTEGER,
SAVE :: IENT = 0
2542 INTEGER,
INTENT(IN) :: MNP, MNE, TRIGP(3,MNE)
2543 INTEGER*2,
INTENT(INOUT) :: IOBP(MNP)
2544 INTEGER,
INTENT(INOUT) :: NEIGHBOR_PREV(MNP)
2545 INTEGER,
INTENT(INOUT) :: NEIGHBOR_NEXT(MNP)
2547 INTEGER,
POINTER :: STATUS(:)
2548 INTEGER,
POINTER :: COLLECTED(:)
2549 INTEGER,
POINTER :: NEXTVERT(:)
2550 INTEGER,
POINTER :: PREVVERT(:)
2552 INTEGER :: IE, I, IP, IP2, IP3
2553 INTEGER :: ISFINISHED, INEXT, IPREV, ISTAT
2554 INTEGER :: IPNEXT, IPPREV, ZNEXT, ZPREV
2556 CALL strace (ient,
'GET_BOUNDARY')
2558 ALLOCATE(status(mnp), stat=istat)
2559 check_alloc_status( istat )
2560 ALLOCATE(collected(mnp), stat=istat)
2561 check_alloc_status( istat )
2562 ALLOCATE(prevvert(mnp), stat=istat)
2563 check_alloc_status( istat )
2564 ALLOCATE(nextvert(mnp), stat=istat)
2565 check_alloc_status( istat )
2577 ipnext=trigp(inext,ie)
2578 ipprev=trigp(iprev,ie)
2579 IF (status(ip).EQ.0)
THEN
2593 ipnext=trigp(inext,ie)
2594 ipprev=trigp(iprev,ie)
2595 IF (status(ip).EQ.0)
THEN
2597 IF (znext.EQ.ipprev)
THEN
2600 IF (nextvert(ip).EQ.prevvert(ip))
THEN
2610 IF ((collected(ip).EQ.0).AND.(status(ip).EQ.0))
THEN
2612 neighbor_next(ip)=nextvert(ip)
2614 IF (status(ip).EQ.0)
THEN
2618 IF (isfinished.EQ.1)
THEN
2631 ipnext=trigp(inext,ie)
2632 ipprev=trigp(iprev,ie)
2633 IF (status(ip).EQ.0)
THEN
2647 ipnext=trigp(inext,ie)
2648 ipprev=trigp(iprev,ie)
2649 IF (status(ip).EQ.0)
THEN
2651 IF (zprev.EQ.ipnext)
THEN
2654 IF (prevvert(ip).EQ.nextvert(ip))
THEN
2664 IF ((collected(ip).EQ.0).AND.(status(ip).EQ.0))
THEN
2666 neighbor_prev(ip)=prevvert(ip)
2668 IF (status(ip).EQ.0)
THEN
2672 IF (isfinished.EQ.1)
THEN
2678 ip2=neighbor_next(ip)
2680 ip3=neighbor_prev(ip2)
2681 IF (abs(ip3 - ip).GT.0)
THEN
2682 WRITE(*,*)
'IP=', ip,
' IP2=', ip2,
' IP3=', ip3
2683 WRITE(*,*)
'We have a dramatic inconsistency'
2690 IF (status(ip).EQ.-1 .AND. iobp(ip) .EQ. 1)
THEN
2695 DEALLOCATE(status, stat=istat)
2696 check_dealloc_status( istat )
2697 DEALLOCATE(collected, stat=istat)
2698 check_dealloc_status( istat )
2699 DEALLOCATE(nextvert, stat=istat)
2700 check_dealloc_status( istat )
2701 DEALLOCATE(prevvert, stat=istat)
2702 check_dealloc_status( istat )
2776 INTEGER,
SAVE :: IENT = 0
2781 INTEGER,
INTENT(IN) :: I
2782 INTEGER,
INTENT(OUT) :: INEXT, IPREV
2784 CALL strace (ient,
'TRIANG_INDEXES')
2879 refpars, reflc, refld, &
2899 INTEGER :: ITH, IX, I, J, IP, IE, NDIRSUM
2900 REAL (KIND = 8) :: cossum, sinsum
2901 REAL (KIND = 8) :: dirmin, dirmax, shift, tempo, dircoast
2902 REAL (KIND = 8) :: x1, x2, y1, y2, dxp1, dxp2, dxp3
2903 REAL (KIND = 8) :: dyp1, dyp2, dyp3, edet1, edet2, evx, evy
2904 REAL(KIND=8), parameter :: thr = tiny(1.)
2905 INTEGER :: I1, I2, I3
2906 INTEGER :: ITMP(NX), NEXTVERT(NX), PREVVERT(NX)
2907 CHARACTER(60) :: FNAME
2909 INTEGER,
SAVE :: IENT = 0
2917 CALL strace (ient,
'SETUGIOBP')
2925 fname =
'meshbnd.msh'
2935 IF (
mapsta(1,ip).EQ.2)
THEN
2976 IF (
iobp(ip) .eq. 0)
THEN
2977 edet1 = thr-x1*evy+y1*evx
2978 edet2 = thr+x2*evy-y2*evx
2979 IF ((edet1.gt.0.).and.(edet2.gt.0.))
THEN
3016 IF (
iobp(ip).EQ.0.AND.
mapsta(1,ip).EQ.1)
THEN
3023 ndirsum=ndirsum+
iobpd(ith,ip)
3025 dircoast=atan2(sinsum, cossum)
3027 refld(2,
mapfs(1,ip)) = 4-max(2,nint(4.*real(ndirsum)/real(
nth)))
3028 reflc(1,
mapfs(1,ip))= refpars(1)
3086 INTEGER,
INTENT(IN) :: I1, I2, I3
3087 DOUBLE PRECISION,
INTENT(IN) :: XGRD(:,:), YGRD(:,:)
3088 real*8,
INTENT(OUT) :: pt(3,2)
3094 INTEGER :: R1GT180, R2GT180, R3GT180
3122 pt(1,1) = xgrd(1,i1)
3123 pt(1,2) = ygrd(1,i1)
3124 pt(2,1) = xgrd(1,i2)
3125 pt(2,2) = ygrd(1,i2)
3126 pt(3,1) = xgrd(1,i3)
3127 pt(3,2) = ygrd(1,i3)
3130 r1gt180 = merge(1, 0, abs(pt(3,1)-pt(2,1)).GT.180)
3131 r2gt180 = merge(1, 0, abs(pt(1,1)-pt(3,1)).GT.180)
3132 r3gt180 = merge(1, 0, abs(pt(2,1)-pt(1,1)).GT.180)
3138 IF ( r1gt180 + r2gt180 == 2 )
THEN
3139 pt(3,1)=pt(3,1)-sign(360.0d0,(pt(3,1)-pt(2,1)))
3140 ELSE IF ( r2gt180 + r3gt180 == 2 )
THEN
3141 pt(1,1)=pt(1,1)-sign(360.0d0,(pt(1,1)-pt(2,1)))
3142 ELSE IF ( r1gt180 + r3gt180 == 2 )
THEN
3143 pt(2,1)=pt(2,1)-sign(360.0d0,(pt(2,1)-pt(3,1)))