30 INTEGER(GRIDMAN_SP),
PARAMETER :: np1=9,np2=18,np3=13
31 REAL(GRIDMAN_DP) :: xp(6),yp(6),
32 r xp1(np1),yp1(np1),xp2(np2),yp2(np2),
37 SUBROUTINE test_mappings(GRID0,GRID1,XP,YP,NP,IERR)
40 INTEGER(GRIDMAN_SP),
INTENT(IN) :: np
41 REAL(GRIDMAN_DP) :: xp(np),yp(np)
42 INTEGER,
INTENT(OUT) :: ierr
43 END SUBROUTINE test_mappings
48 CALL test_polygon1(xp1,yp1,np1)
50 . 7._gridman_dp,2._gridman_dp)
52 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (7,2)"
53 stop
"TEST_CUT TERMINATED"
56 . 10._gridman_dp,1.1_gridman_dp)
58 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (10,1.1)"
59 stop
"TEST_CUT TERMINATED"
62 . 6.1_gridman_dp,3._gridman_dp)
64 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (6.1,3)"
65 stop
"TEST_CUT TERMINATED"
69 . 6._gridman_dp,6._gridman_dp)
71 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (6,6)"
72 stop
"TEST_CUT TERMINATED"
75 . 10._gridman_dp,5._gridman_dp)
77 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (10,5)"
78 stop
"TEST_CUT TERMINATED"
81 . 7._gridman_dp,-0.51_gridman_dp)
83 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP1, (7,-0.51)"
84 stop
"TEST_CUT TERMINATED"
88 CALL test_polygon2(xp2,yp2,np2)
90 . 15._gridman_dp,2._gridman_dp)
92 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (15,2)"
93 stop
"TEST_CUT TERMINATED"
96 . 9.001_gridman_dp,-5.999_gridman_dp)
98 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for ",
99 w
"XP2, (9.001,-5.999)"
100 stop
"TEST_CUT TERMINATED"
103 . 18._gridman_dp,-1._gridman_dp)
105 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (18,-1)"
106 stop
"TEST_CUT TERMINATED"
109 . 17._gridman_dp,7._gridman_dp)
111 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (17,7)"
112 stop
"TEST_CUT TERMINATED"
115 . 16._gridman_dp,3.5_gridman_dp)
117 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (16,3.5)"
118 stop
"TEST_CUT TERMINATED"
122 . 15.5_gridman_dp,0.5_gridman_dp)
124 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (15.5,0.5)"
125 stop
"TEST_CUT TERMINATED"
128 . 19.0001_gridman_dp,-1._gridman_dp)
130 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for ",
132 stop
"TEST_CUT TERMINATED"
135 . 12._gridman_dp,5.5_gridman_dp)
137 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (12,5.5)"
138 stop
"TEST_CUT TERMINATED"
141 . 14._gridman_dp,3._gridman_dp)
143 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (14,3)"
144 stop
"TEST_CUT TERMINATED"
147 . 14._gridman_dp,9.01_gridman_dp)
149 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (14,9.01)"
150 stop
"TEST_CUT TERMINATED"
153 . 14._gridman_dp,-6.51_gridman_dp)
155 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (14,-6.51)"
156 stop
"TEST_CUT TERMINATED"
159 . 12._gridman_dp,2._gridman_dp)
161 WRITE(*,*)
"GRIDMAN_POINT_IN_POLYGON failed for XP2, (12,2)"
162 stop
"TEST_CUT TERMINATED"
165 WRITE(*,*)
"test_cut: test 0 passed"
168 CALL grid_example1(grid,ierr)
169 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
183 c 5_gridman_sp,.false.,ierr)
184 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
187 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
189 WRITE(*,*)
"Grids are different"
190 stop
"TEST_GRID TERMINATED"
193 CALL test_mappings(grid,cutgrid,xp,yp,5_gridman_sp,ierr)
195 WRITE(*,*)
"Wrong indices in test 1.1"
196 stop
"TEST_GRID TERMINATED"
199 WRITE(*,*)
"test_cut: test 1.1 passed"
213 c 5_gridman_sp,.false.,ierr)
214 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
216 CALL gridman_grid_write(cutgrid,
'cutA.grd',ierr)
217 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
219 IF(cutgrid%NCELLS.NE.4.OR.cutgrid%NEDGES.NE.12.OR.
220 f cutgrid%NPOINTS.NE.9.OR.
221 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.4.OR.
222 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.4)
THEN
223 WRITE(*,*)
"Unexpected resulting grid (0)"
224 stop
"TEST_GRID TERMINATED"
227 CALL test_mappings(grid,cutgrid,xp,yp,5_gridman_sp,ierr)
229 WRITE(*,*)
"Wrong indices in test 1.2"
230 stop
"TEST_GRID TERMINATED"
233 WRITE(*,*)
"test_cut: test 1.2 passed"
237 c 5_gridman_sp,.true.,ierr)
238 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
240 CALL gridman_grid_write(cutgrid,
'cutAI.grd',ierr)
241 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
243 IF(cutgrid%NCELLS.NE.10.OR.cutgrid%NEDGES.NE.33.OR.
244 f cutgrid%NPOINTS.NE.23.OR.
245 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.10.OR.
246 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.25)
THEN
247 WRITE(*,*)
"Unexpected resulting grid (0-I)"
248 stop
"TEST_GRID TERMINATED"
251 CALL test_mappings(grid,cutgrid,xp,yp,5_gridman_sp,ierr)
253 WRITE(*,*)
"Wrong indices in test 1.3"
254 stop
"TEST_GRID TERMINATED"
257 WRITE(*,*)
"test_cut: test 1.3 passed"
262 c 5_gridman_sp,.false.,ierr)
264 WRITE(*,*)
"Unexpected output, expected value 100, IERR ",ierr
265 stop
"TEST_CUT TERMINATED"
281 c 5_gridman_sp,.false.,ierr)
283 WRITE(*,*)
"Unexpected output, expected value 100, IERR ",ierr
284 stop
"TEST_GRID TERMINATED"
302 c 6_gridman_sp,.false.,ierr)
304 WRITE(*,*)
"Unexpected output, expected value 400, IERR ",ierr
305 stop
"TEST_GRID TERMINATED"
308 WRITE(*,*)
"test_cut: test 1.4 passed"
312 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
314 CALL gridman_grid_write(cutgrid,
'cutB.grd',ierr)
315 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
317 IF(cutgrid%NCELLS.NE.5.OR.cutgrid%NEDGES.NE.19.OR.
318 f cutgrid%NPOINTS.NE.15.OR.
319 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.5.OR.
320 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.10)
THEN
321 WRITE(*,*)
"Unexpected resulting grid (1)"
322 stop
"TEST_GRID TERMINATED"
325 CALL test_mappings(grid,cutgrid,xp,yp,6_gridman_sp,ierr)
327 WRITE(*,*)
"Wrong indices in test 2.1"
328 stop
"TEST_GRID TERMINATED"
331 WRITE(*,*)
"test_cut: test 2.1 passed"
335 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
337 CALL gridman_grid_write(cutgrid,
'cutBI.grd',ierr)
338 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
340 IF(cutgrid%NCELLS.NE.10.OR.cutgrid%NEDGES.NE.31.OR.
341 f cutgrid%NPOINTS.NE.23.OR.
342 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.10.OR.
343 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.22)
THEN
344 WRITE(*,*)
"Unexpected resulting grid (1-I)"
345 stop
"TEST_GRID TERMINATED"
348 CALL test_mappings(grid,cutgrid,xp1,yp1,np1,ierr)
350 WRITE(*,*)
"Wrong indices in test 2.2"
351 stop
"TEST_GRID TERMINATED"
354 WRITE(*,*)
"test_cut: test 2.2 passed"
358 CALL grid_example4(grid,ierr)
359 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
362 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
364 CALL gridman_grid_write(cutgrid,
'cutC.grd',ierr)
365 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
367 IF(cutgrid%NCELLS.NE.9.OR.cutgrid%NEDGES.NE.34.OR.
368 f cutgrid%NPOINTS.NE.31.OR.
369 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.9.OR.
370 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.17)
THEN
371 WRITE(*,*)
"Unexpected resulting grid (2)"
372 stop
"TEST_GRID TERMINATED"
375 CALL test_mappings(grid,cutgrid,xp2,yp2,np2,ierr)
377 WRITE(*,*)
"Wrong indices in test 3.1"
378 stop
"TEST_GRID TERMINATED"
381 WRITE(*,*)
"test_cut: test 3.1 passed"
385 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
387 CALL gridman_grid_write(cutgrid,
'cutCI.grd',ierr)
388 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
390 IF(cutgrid%NCELLS.NE.7.OR.cutgrid%NEDGES.NE.42.OR.
391 f cutgrid%NPOINTS.NE.36.OR.
392 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.7.OR.
393 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.25)
THEN
394 WRITE(*,*)
"Unexpected resulting grid (4)"
395 stop
"TEST_GRID TERMINATED"
398 CALL test_mappings(grid,cutgrid,xp2,yp2,np2,ierr)
400 WRITE(*,*)
"Wrong indices in test 3.2"
401 stop
"TEST_GRID TERMINATED"
404 WRITE(*,*)
"test_cut: test 3.2 passed"
407 CALL test_polygon3(xp3,yp3,np3)
409 CALL grid_example1(grid,ierr)
410 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
413 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
415 CALL gridman_grid_write(cutgrid,
'cutD.grd',ierr)
416 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
418 IF(cutgrid%NCELLS.NE.11.OR.cutgrid%NEDGES.NE.39.OR.
419 f cutgrid%NPOINTS.NE.30.OR.
420 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.11.OR.
421 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.19)
THEN
422 WRITE(*,*)
"Unexpected resulting grid (5)"
423 stop
"TEST_GRID TERMINATED"
426 CALL test_mappings(grid,cutgrid,xp3,yp3,np3,ierr)
428 WRITE(*,*)
"Wrong indices in test 4.1"
429 stop
"TEST_GRID TERMINATED"
432 WRITE(*,*)
"test_cut: test 4.1 passed"
436 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
438 CALL gridman_grid_write(cutgrid,
'cutDI.grd',ierr)
439 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
441 IF(cutgrid%NCELLS.NE.16.OR.cutgrid%NEDGES.NE.48.OR.
442 f cutgrid%NPOINTS.NE.36.OR.
443 f cutgrid%CELLINDEX(1)%NELEMENTS.NE.16.OR.
444 f cutgrid%EDGEINDEX(1)%NELEMENTS.NE.28)
THEN
445 WRITE(*,*)
"Unexpected resulting grid (6)"
446 stop
"TEST_GRID TERMINATED"
449 CALL test_mappings(grid,cutgrid,xp3,yp3,np3,ierr)
451 WRITE(*,*)
"Wrong indices in test 4.2"
452 stop
"TEST_GRID TERMINATED"
455 WRITE(*,*)
"test_cut: test 4.2 passed"
459 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
461 IF(ierr.NE.0) stop
"TEST_CUT TERMINATED"
463 WRITE(*,*)
"TEST_CUT COMPLETED"
469 SUBROUTINE test_polygon1(X,Y,N)
472 INTEGER(GRIDMAN_SP),
INTENT(IN) :: n
473 REAL(GRIDMAN_DP),
INTENT(OUT) :: x(n),y(n)
494 END SUBROUTINE test_polygon1
498 SUBROUTINE test_polygon2(X,Y,N)
501 INTEGER(GRIDMAN_SP),
INTENT(IN) :: n
502 REAL(GRIDMAN_DP),
INTENT(OUT) :: x(n),y(n)
503 REAL(GRIDMAN_DP) :: x0(n-1),y0(n-1)
546 END SUBROUTINE test_polygon2
550 SUBROUTINE test_polygon3(X,Y,N)
553 INTEGER(GRIDMAN_SP),
INTENT(IN) :: n
554 REAL(GRIDMAN_DP),
INTENT(OUT) :: x(n),y(n)
555 REAL(GRIDMAN_DP) :: x0(n-1),y0(n-1)
588 END SUBROUTINE test_polygon3
591 SUBROUTINE test_mappings(GRID0,GRID1,XP,YP,NP,IERR)
597 INTEGER(GRIDMAN_SP),
INTENT(IN) :: np
598 REAL(GRIDMAN_DP) :: xp(np),yp(np)
599 INTEGER,
INTENT(OUT) :: ierr
600 INTEGER(GRIDMAN_SP) :: iedge1,iedge0,icell,imin,imax,ie,
601 i icell1_1,icell1_2,icell0_1,icell0_2,
603 INTEGER(GRIDMAN_SP),
ALLOCATABLE :: indcell(:)
605 REAL(GRIDMAN_DP) :: ls,le
606 REAL(GRIDMAN_DP),
ALLOCATABLE :: dl(:)
610 IF(((grid1%NEDGEINDEX.NE.grid0%NEDGEINDEX).AND.
611 f (grid1%NEDGEINDEX.NE.grid0%NEDGEINDEX+1)).OR.
612 f grid1%NCELLINDEX.NE.grid0%NCELLINDEX)
THEN
613 WRITE(*,*)
"ERROR: wrong number of indices"
614 WRITE(*,*)
" NEDGEINDEX0, NEDGEINDEX1 ",
615 w grid0%NEDGEINDEX,grid1%NEDGEINDEX
616 WRITE(*,*)
" NCELLINDEX0, NCELLINDEX1 ",
617 w grid0%NCELLINDEX,grid1%NCELLINDEX
623 c grid1%CELLINDEX(1),ierr)
627 DO iedge1=1,grid1%EDGEINDEX(1)%NELEMENTS
628 IF(iedge1.NE.grid1%EDGEINDEX(1)%INDEXES(0,iedge1))
THEN
629 WRITE(*,*)
"ERROR: wrong edge index"
630 WRITE(*,*)
" IEDGE1, INDEXES(0,IEDGE1) ",
631 w iedge1, grid1%EDGEINDEX(1)%INDEXES(0,iedge1)
635 iedge0=grid1%EDGEINDEX(1)%INDEXES(1,iedge1)
636 IF(iedge0.LT.1.OR.iedge0.GT.grid0%NEDGES)
THEN
637 WRITE(*,*)
"ERROR: wrong edge index"
638 WRITE(*,*)
" IEDGE0, NEDGES0 ",iedge0,grid0%NEDGES
642 icell=grid1%CELLS(1,iedge1)
648 WRITE(*,*)
"ERROR: wrong cell index"
649 WRITE(*,*)
" ICELL not in the index ",icell
653 icell1_1=grid1%CELLINDEX(1)%INDEXES(1,ie)
654 IF(icell1_1.LT.1.OR.icell1_1.GT.grid0%NCELLS)
THEN
655 WRITE(*,*)
"ERROR: wrong cell index"
656 WRITE(*,*)
" ICELL0, NEDGES0 ",icell1_1,grid0%NCELLS
661 icell=grid1%CELLS(2,iedge1)
667 WRITE(*,*)
"ERROR: wrong cell index"
668 WRITE(*,*)
" ICELL not in the index ",icell
672 icell1_2=grid1%CELLINDEX(1)%INDEXES(1,ie)
673 IF(icell1_2.LT.1.OR.icell1_2.GT.grid0%NCELLS)
THEN
674 WRITE(*,*)
"ERROR: wrong cell index"
675 WRITE(*,*)
" ICELL0, NEDGES0 ",icell1_2,grid0%NCELLS
680 icell0_1=grid0%CELLS(1,iedge0)
681 icell0_2=grid0%CELLS(2,iedge0)
682 IF(icell0_1.NE.icell1_1)
THEN
683 IF(icell0_1.NE.icell1_2)
THEN
684 WRITE(*,*)
"ERROR: inconsistent edge and cell indices"
685 WRITE(*,*)
" IEDGE1, IEDGE0 ", iedge1, iedge0
686 WRITE(*,*)
" ICELL0_1, ICELL0_2 ", icell0_1,icell0_2
687 WRITE(*,*)
" ICELL1_1, ICELL1_2 ", icell1_1,icell1_2
691 ELSEIF(icell0_2.NE.icell1_2)
THEN
692 WRITE(*,*)
"ERROR: inconsistent edge and cell indices"
693 WRITE(*,*)
" IEDGE1, IEDGE0 ", iedge1, iedge0
694 WRITE(*,*)
" ICELL0_1, ICELL0_2 ", icell0_1,icell0_2
695 WRITE(*,*)
" ICELL1_1, ICELL1_2 ", icell1_1,icell1_2
705 WRITE(*,*)
"ERROR: edge mappings are different"
713 WRITE(*,*)
"ERROR: cell mappings are different"
721 IF(grid1%NEDGEINDEX.GT.2)
THEN
722 ALLOCATE(dl(grid1%NEDGES))
726 ls=sqrt((xp(ip)-xp(ip+1))**2+(yp(ip)-yp(ip+1))**2)
728 DO ie=1,grid1%EDGEINDEX(3)%NELEMENTS
729 iseg=grid1%EDGEINDEX(3)%INDEXES(1,ie)
731 iedge=grid1%EDGEINDEX(3)%INDEXES(0,ie)
732 le=le+dl(iedge)*grid1%UNIT2SI
735 IF(le.GT.ls+gridman_tol)
THEN
736 WRITE(*,*)
"ERROR: incorrect indices of segments"
737 WRITE(*,*)
" IP, LS, LE ",ip,ls,le
746 END SUBROUTINE test_mappings
logical, save, public gridman_check
Switch to enforce extra checks of input parameters.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine gridman_index_compare(INDEX1, INDEX2, RES, IERR)
Compare two index objects.
subroutine gridman_grid2d_cut(CUTGRID, GRID, XP, YP, NP, LEX, IERR)
Select part of a 2D grid cut by polygon.
Data-type which describes a grid as a set of edges, methods in grid.f.
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
subroutine gridman_index_elmap(ELMAP, NMIN, NMAX, INDEX, IERR)
Create an aray which maps elements into the table of indices.
logical function gridman_point_in_polygon(XP, YP, NP, X0, Y0)
Find if point lies inside a closed polygon.
Definition of data types, global constants and variables.
subroutine gridman_grid2d_lengths(GRID, LEDGES, IERR)
Calculate lengths of the cell edges.
subroutine gridman_grid_compare(GRID1, GRID2, RES, IERR)
Compare two grid objects.