GRIDMAN
grid managment library
test_grid2d.f
Go to the documentation of this file.
1 C> @file tests/test_grid2d.f
2 C> Unit tests of subroutines from grid2D/grid2d.f
3 C GRIDMAN, grid managment library. Author: Vladislav Kotov, v.kotov@fz-juelich.de
4 
5 ! Copyright (c) 2017 Forschungszentrum Juelich GmbH
6 ! Vladislav Kotov
7 !
8 ! This file is part of GRIDMAN.
9 !
10 ! GRIDMAN is free software: you can redistribute it and/or modify
11 ! it under the terms of the GNU General Public License as published by
12 ! the Free Software Foundation, either version 3 of the License, or
13 ! (at your option) any later version.
14 !
15 ! GRIDMAN is distributed in the hope that it will be useful,
16 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ! GNU General Public License for more details.
19 !
20 ! You should have received a copy of the GNU General Public License
21 ! along with GRIDMAN. If not, see <http://www.gnu.org/licenses/>.
22 
23  PROGRAM test_grid2d
24  USE gridman
25  USE gridman_lib
26  IMPLICIT NONE
27 
28  INTRINSIC any,sum,dot_product,sqrt
29 
30  TYPE(gridman_grid) :: grid2d
31  INTEGER :: ierr,res
32  REAL(GRIDMAN_DP),ALLOCATABLE :: ledges(:),sedges(:),
33  r vol(:),xcn(:,:),
34  r scell(:),vn(:,:)
35  REAL(GRIDMAN_DP) :: ltot,stot,vtot,xtmp,xc,yc
36  LOGICAL,ALLOCATABLE :: isconvex(:)
37 
38  gridman_dbg=.true.
39  gridman_dbg=.false.
40 
41  CALL grid_example1(grid2d,ierr)
42  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
43  CALL gridman_grid2d_check(grid2d,res,ierr)
44  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
45  IF(res.NE.0) THEN
46  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
47  WRITE(*,*) "Expected value 0, RES ",res
48  stop "TEST_GRID2D TERMINATED"
49  END IF
50 
51 C TEST _GRID2D_CHECK
52  CALL test_check(grid2d)
53 
54  gridman_check=.true.
55 
56 C
57 C NO SEPARATE TEST FOR GRIDMAN_GRID2D_CHAINS
58 C - TESTED INSIDE OTHER SUBROUTINES
59 C
60 
61 C EDGE LENGTHS
62  ALLOCATE(ledges(grid2d%NEDGES))
63  CALL gridman_grid2d_lengths(grid2d,ledges,ierr)
64  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
65  ltot=sum(ledges)
66  IF(abs(ltot-58.155374460927121_gridman_dp).GT.gridman_tol) THEN
67  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_LENGTHS ",
68  w " wrong total edge length"
69  WRITE(*,*) " LTOT ",ltot
70  stop "TEST_GRID2D TERMINATED"
71  END IF
72  DEALLOCATE(ledges)
73 
74 C CELL CROSS SECTIONS
75  ALLOCATE(scell(grid2d%NCELLS))
76  CALL gridman_grid2d_crossect(grid2d,scell,ierr)
77  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
78  stot=sum(scell)
79  IF(abs(stot-38.0).GT.gridman_tol) THEN
80  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_CELLAREAS",
81  w " wrong total poloidal area"
82  WRITE(*,*) " STOT ",stot
83  stop "TEST_GRID2D TERMINATED"
84  END IF
85 
86 C CELL CENTERS
87  ALLOCATE(xcn(2,grid2d%NCELLS))
88  CALL gridman_grid2d_center(grid2d,xcn,ierr)
89  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
90 cc DO I=1,GRID2D%NCELLS
91 cc WRITE(*,'(1X,I3,2F7.3)') I,XCN(1,I),XCN(2,I)
92 cc END DO
93  xc=dot_product(xcn(1,:),scell)
94  yc=dot_product(xcn(2,:),scell)
95  stot=sum(scell)
96  xc=xc/stot
97  yc=yc/stot
98  IF(abs(xc-7.0).GT.gridman_tol.OR.
99  w abs(yc+2.105263157894737e-01).GT.gridman_tol) THEN
100  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_CENTER",
101  w " wrong center of cells coordinates"
102  WRITE(*,*) "XC, YC ",xc,yc
103  stop "TEST_GRID2D TERMINATED"
104  END IF
105  DEALLOCATE(xcn)
106  DEALLOCATE(scell)
107 
108 C AREAS
109  ALLOCATE(sedges(grid2d%NEDGES))
110  CALL gridman_grid2d_cylareas(grid2d,sedges,ierr)
111  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
112  stot=sum(sedges)
113  IF(abs(stot-2557.8070316024337_gridman_dp).GT.1e-4) THEN
114  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_AREAS:",
115  w " wrong edge areas"
116  WRITE(*,*) " STOT ",stot
117  stop "TEST_GRID2D TERMINATED"
118  END IF
119  CALL gridman_grid2d_cylareas(grid2d,sedges,ierr,gridman_pi)
120  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
121  stot=sum(sedges)
122  IF(abs(stot-0.5*2557.8070316024337_gridman_dp).GT.1e-4) THEN
123  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_AREAS:",
124  w " wrong edge areas"
125  WRITE(*,*) " STOT ",stot
126  stop "TEST_GRID2D TERMINATED"
127  END IF
128  DEALLOCATE(sedges)
129 
130 C VOLUMES
131  ALLOCATE(vol(grid2d%NCELLS))
132  CALL gridman_grid2d_cylvolumes(grid2d,vol,ierr)
133  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
134  vtot=sum(vol)
135  IF(abs(vtot-1671.3273382186890_gridman_dp).GT.1e-4) THEN
136  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_VOLUMES",
137  w " wrong total volume"
138  WRITE(*,*) " VTOT ",vtot
139  stop "TEST_GRID2D TERMINATED"
140  END IF
141  CALL gridman_grid2d_cylvolumes(grid2d,vol,ierr,0.5*gridman_pi)
142  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
143  vtot=sum(vol)
144  IF(abs(vtot-0.25*1671.3273382186890_gridman_dp).GT.1e-4) THEN
145  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_VOLUMES",
146  w " wrong total volume"
147  WRITE(*,*) " VTOT ",vtot
148  stop "TEST_GRID2D TERMINATED"
149  END IF
150  DEALLOCATE(vol)
151 
152 C CELLS CONVEX OR NOT?
153  ALLOCATE(isconvex(grid2d%NCELLS))
154  CALL gridman_grid2d_isconvex(grid2d,isconvex,ierr)
155  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
156 cc write(*,*) "isconvex ",isconvex
157  IF(.NOT.all(isconvex)) THEN
158  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_ISCONVEX",
159  w " shows that not all cells are convex"
160  stop "TEST_GRID2D TERMINATED"
161  END IF
162 
163 C SHIFT ONE POINT TO CREATE A NON-CONVEX CELL
164  xtmp=grid2d%X(2,10)
165  grid2d%X(2,10)=-3.0
166  CALL gridman_grid2d_isconvex(grid2d,isconvex,ierr)
167  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
168 cc write(*,*) "isconvex ",isconvex
169  IF(.NOT.all(isconvex(1:9))) THEN
170  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_ISCONVEX: ",
171  w " shows that not all cells from 1st to 9th are convex"
172  stop "TEST_GRID2D TERMINATED"
173  END IF
174  IF(isconvex(10)) THEN
175  WRITE(*,*) "ERORR in GRIDMAN_GRID2D_ISCONVEX",
176  w " shows that 10th cell is convex"
177  stop "TEST_GRID2D TERMINATED"
178  END IF
179  grid2d%X(2,10)=xtmp
180  DEALLOCATE(isconvex)
181 
182  write(*,*) "GRIDMAN_GRID2D_NORM "
183 C EDGE NORMALS
184  ALLOCATE(vn(2,grid2d%NEDGES))
185  CALL gridman_grid2d_norm(grid2d,vn,ierr)
186  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
187 cc DO I=1,GRID2D%NEDGES
188 cc WRITE(*,*) I,VN(1,I),VN(2,I)
189 cc END DO
190  CALL test_normals(vn,grid2d%NEDGES)
191  DEALLOCATE(vn)
192 
193  CALL gridman_grid_deallocate(grid2d,ierr)
194  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
195 
196  WRITE(*,*) "TEST_GRID2D COMPLETED"
197 
198  END PROGRAM test_grid2d
199 
200 C
201 C
202 C
203  SUBROUTINE test_normals(VN,N)
204  USE gridman
205  IMPLICIT NONE
206  INTRINSIC abs
207  INTEGER(GRIDMAN_DP),INTENT(IN) :: n
208  REAL(GRIDMAN_DP),INTENT(IN) :: vn(2,n)
209 
210  INTEGER :: i
211 
212  i=1
213  IF(abs(vn(1,i)).GT.0..OR.abs(vn(2,i)-1.0).GT.0.) GOTO 100
214  i=2
215  IF(abs(vn(1,i)).GT.0..OR.abs(vn(2,i)-1.0).GT.0.) GOTO 100
216  i=3
217  IF(abs(vn(1,i)+1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
218  i=5
219  IF(abs(vn(1,i)-1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
220  i=8
221  IF(abs(vn(1,i)+1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
222  i=10
223  IF(abs(vn(1,i)-1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
224  i=15
225  IF(abs(vn(1,i)).GT.0..OR.abs(vn(2,i)+1.0).GT.0.) GOTO 100
226  i=16
227  IF(abs(vn(1,i)).GT.0..OR.abs(vn(2,i)+1.0).GT.0.) GOTO 100
228  i=21
229  IF(abs(vn(1,i)+1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
230  i=22
231  IF(abs(vn(1,i)-1.0).GT.0..OR.abs(vn(2,i)).GT.0.) GOTO 100
232  i=23
233  IF(abs(vn(1,i)).GT.0..OR.abs(vn(2,i)+1.0).GT.0.) GOTO 100
234  i=13
235  IF(abs(vn(1,i)+0.554700196225229).GT.gridman_tol.OR.
236  f abs(vn(2,i)-0.832050294337844).GT.gridman_tol) GOTO 100
237  i=14
238  IF(abs(vn(1,i)-0.554700196225229).GT.gridman_tol.OR.
239  f abs(vn(2,i)-0.832050294337844).GT.gridman_tol) GOTO 100
240 
241  RETURN
242 
243  100 WRITE(*,*) "ERORR in GRIDMAN_GRID2D_NORM ",
244  w "wrong direction of normal vector I ",i
245  stop "TEST_GRID2D TERMINATED"
246 
247  END SUBROUTINE test_normals
248 
249 C
250 C
251 C
252  SUBROUTINE test_check(GRID2D)
253  USE gridman
254  USE gridman_lib
255  IMPLICIT NONE
256 
257  TYPE(gridman_grid) :: grid2d
258  TYPE(gridman_grid) :: grid_copy
259  INTEGER :: ierr,res
260  INTEGER(GRIDMAN_SP) :: ip1,ip2
261 
262  CALL gridman_grid_copy(grid_copy,grid2d,ierr)
263  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
264 
265 C GRID TYPE
266  grid2d%TYPE=0
267  CALL gridman_grid2d_check(grid2d,res,ierr)
268  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
269  IF(res.NE.100) THEN
270  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
271  WRITE(*,*) "Expected value 100, RES ",res
272  stop "TEST_GRID2D TERMINATED"
273  END IF
274  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
275  grid2d%PDIM=3
276  CALL gridman_grid2d_check(grid2d,res,ierr)
277  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
278  IF(res.NE.100) THEN
279  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
280  WRITE(*,*) "Expected value 100, RES ",res
281  stop "TEST_GRID2D TERMINATED"
282  END IF
283  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
284  grid2d%EDIM=3
285  CALL gridman_grid2d_check(grid2d,res,ierr)
286  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
287  IF(res.NE.100) THEN
288  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
289  WRITE(*,*) "Expected value 100, RES ",res
290  stop "TEST_GRID2D TERMINATED"
291  END IF
292  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
293 
294 C _GRID_CHECK ERROR
295  grid2d%EDIM=-1
296  CALL gridman_grid2d_check(grid2d,res,ierr)
297  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
298  IF(res.GT.100.OR.res.LT.1) THEN
299  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
300  WRITE(*,*) "Expected value 0<R<100, RES ",res
301  stop "TEST_GRID2D TERMINATED"
302  END IF
303  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
304 
305 C BROKEN CHAIN
306  grid2d%POINTS(1,23)=12
307  CALL gridman_grid2d_check(grid2d,res,ierr)
308  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
309  IF(res.NE.102) THEN
310  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
311  WRITE(*,*) "Expected value 102, RES ",res
312  stop "TEST_GRID2D TERMINATED"
313  END IF
314  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
315 
316 C EDGE WITH ZERO LENGTH
317  ip1=grid2d%POINTS(1,23)
318  ip2=grid2d%POINTS(2,23)
319  grid2d%X(1,ip1)=grid2d%X(1,ip2)
320  grid2d%X(2,ip1)=grid2d%X(2,ip2)
321  CALL gridman_grid2d_check(grid2d,res,ierr)
322  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
323  IF(res.NE.103) THEN
324  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
325  WRITE(*,*) "Expected value 103, RES ",res
326  stop "TEST_GRID2D TERMINATED"
327  END IF
328  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
329 
330 C INTERSECTING EDGES
331  grid2d%POINTS(1,21)=11
332  grid2d%POINTS(2,21)=16
333  grid2d%POINTS(1,22)=15
334  grid2d%POINTS(2,22)=12
335  CALL gridman_grid2d_check(grid2d,res,ierr)
336  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
337  IF(res.NE.111) THEN
338  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_CHECK"
339  WRITE(*,*) "Expected value 111, RES ",res
340  stop "TEST_GRID2D TERMINATED"
341  END IF
342  CALL gridman_grid_copy(grid2d,grid_copy,ierr) !RESTORE OBJECT
343 
344  CALL gridman_grid_deallocate(grid_copy,ierr)
345  IF(ierr.NE.0) stop "TEST_GRID2D TERMINATED"
346 
347  END SUBROUTINE test_check
logical, save, public gridman_check
Switch to enforce extra checks of input parameters.
Definition: gridman.f:133
real(gridman_dp), save, public gridman_tol
Tolerance parameter which is used to compare two real numbers.
Definition: gridman.f:127
subroutine gridman_grid2d_cylvolumes(GRID, VCELLS, IERR, ANGLE)
Calculate cylindrical cell volumes.
Definition: grid2d.f:1018
Explicit interfaces to GRIDMAN subroutines and functions.
Definition: gridman.f:251
subroutine gridman_grid2d_check(GRID, RES, IERR)
Check correctness of the 2D grid object.
Definition: grid2d.f:37
subroutine gridman_grid2d_cylareas(GRID, SEDGES, IERR, ANGLE)
Calculate cylindrical areas of the cell edges.
Definition: grid2d.f:944
Data-type which describes a grid as a set of edges, methods in grid.f.
Definition: gridman.f:168
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
Definition: grid1.f:184
subroutine gridman_grid2d_center(GRID, XCN, IERR)
Calculate coordinates of the cell centers.
Definition: grid2d.f:559
subroutine gridman_grid2d_isconvex(GRID, ISCONVEX, IERR)
Find if cells are convex polygons or not.
Definition: grid2d.f:830
subroutine gridman_grid_copy(GRID2, GRID1, IERR)
Create a copy of the grid object.
Definition: grid1.f:981
subroutine gridman_grid2d_norm(GRID, VN, IERR)
Calculate unit normal vectors to grid edges.
Definition: grid2d.f:692
logical, save, public gridman_dbg
Switch for debugging mode.
Definition: gridman.f:122
real(gridman_dp), parameter, public gridman_pi
PI number.
Definition: gridman.f:106
Definition of data types, global constants and variables.
Definition: gridman.f:83
subroutine gridman_grid2d_lengths(GRID, LEDGES, IERR)
Calculate lengths of the cell edges.
Definition: grid2d.f:425
subroutine gridman_grid2d_crossect(GRID, SCELLS, IERR)
Calculate cross section area of the cells.
Definition: grid2d.f:483