GRIDMAN
grid managment library
test_merge.f
Go to the documentation of this file.
1 C> @file tests/test_merge.f
2 C> Unit tests of GRIDMAN_GRID2D_MERGE
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_merge
24  USE gridman
25  USE gridman_lib
26  IMPLICIT NONE
27  INTRINSIC sum,abs
28  INTERFACE
29  SUBROUTINE test_mappings(GRID,GRID1,GRID2)
30  USE gridman,ONLY:gridman_grid
31  TYPE(gridman_grid) :: grid,grid1,grid2
32  END SUBROUTINE test_mappings
33  END INTERFACE
34 
35  TYPE(gridman_grid) :: grid1,grid2,grid
36  INTEGER(GRIDMAN_SP) :: n,itmp
37  INTEGER :: ierr,res
38  REAL(GRIDMAN_DP),ALLOCATABLE :: vol1(:),vol2(:),vol(:)
39  REAL(GRIDMAN_DP) :: v,v12,xtmp,ytmp,tol=1e-5
40 
41 cc GRIDMAN_DBG=.TRUE.
42  gridman_check=.true.
43  gridman_tol=1e-7
44 
45  CALL grid_example1(grid1,ierr)
46  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
47  CALL gridman_grid2d_check(grid1,res,ierr)
48  IF(res.NE.0.OR.ierr.NE.0) stop "TEST_MERGE TERMINATED"
49 
50  CALL grid_example3(grid2,ierr)
51  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
52  CALL gridman_grid2d_check(grid2,res,ierr)
53  IF(res.NE.0.OR.ierr.NE.0) stop "TEST_MERGE TERMINATED"
54 
55  CALL gridman_grid2d_merge(grid,grid1,grid2,tol,ierr)
56  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
57  n=grid1%NCELLS+grid2%NCELLS
58  IF(grid%NCELLS.NE.n) THEN
59  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE: ",
60  w "cell number mismatch"
61  WRITE(*,*) "N, N1+N2 ",grid%NCELLS,n
62  stop "TEST_MERGE TERMINATED"
63  END IF
64  IF(grid%NEDGES.NE.40) THEN
65  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE: ",
66  w "edge number mismatch"
67  WRITE(*,*) "expected value 40, NEDGES ",grid%NEDGES
68  stop "TEST_MERGE TERMINATED"
69  END IF
70  IF(grid%NPOINTS.NE.25) THEN
71  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE: ",
72  w "points number mismatch"
73  WRITE(*,*) "expected value 25, NPOINTS ",grid%NPOINTS
74  stop "TEST_MERGE TERMINATED"
75  END IF
76 
77  WRITE(*,*) "NCELLS ", grid%NCELLS
78  WRITE(*,*) "NEDGES ", grid%NEDGES
79  WRITE(*,*) "NPOINTS ", grid%NPOINTS
80 
81  ALLOCATE(vol(grid%NCELLS),vol1(grid1%NCELLS),vol2(grid2%NCELLS))
82  CALL gridman_grid2d_cylvolumes(grid,vol,ierr)
83  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
84  CALL gridman_grid2d_cylvolumes(grid1,vol1,ierr)
85  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
86  CALL gridman_grid2d_cylvolumes(grid2,vol2,ierr)
87  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
88  v=sum(vol)
89  v12=sum(vol1)+sum(vol2)*1e-6 !VOL2 in CM^3, VOL,VOL1 IN M^3
90  WRITE(*,*) "VOL ",v
91  WRITE(*,*) "VOL1+VOL2 ",v12
92  IF(abs(v-v12).GT.gridman_tol*(abs(v)+abs(v12))) THEN
93  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE: ",
94  w "volume of combined grid =/= sum of volumes"
95  WRITE(*,*) " VOL ",v
96  WRITE(*,*) " VOL1+VOL2 ",v12
97  stop "TEST_MERGE TERMINATED"
98  END IF
99 
100  CALL gridman_grid_write(grid1,'grid1.grd',ierr)
101  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
102  CALL gridman_grid_write(grid2,'grid2.grd',ierr)
103  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
104  CALL gridman_grid_write(grid,'merged.grd',ierr)
105  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
106 
107  CALL test_mappings(grid,grid1,grid2)
108 C
109 C ILLEGAL INPUT
110 C
111  xtmp= grid2%X(1,12) !CORRUPT THE GRID
112  grid2%X(1,12) = 7.
113  CALL gridman_grid2d_merge(grid,grid1,grid2,tol,ierr)
114  IF(ierr.NE.400) THEN
115  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
116  WRITE(*,*) "Expected value IERR=400, IERR ", ierr
117  stop "TEST_MERGE TERMINATED"
118  END IF
119  grid2%X(1,12) =xtmp !RESTORE THE GRID
120 C
121 C CORRUPTED GRID OBJECTS
122 C
123  gridman_check=.true.
124 C BREAK THE CHAIN IN GRID1
125  itmp=grid1%POINTS(1,13)
126  grid1%POINTS(1,13)=1
127  CALL gridman_grid2d_merge(grid,grid1,grid2,tol,ierr)
128  IF(ierr.NE.100) THEN
129  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
130  WRITE(*,*) "Expected value IERR=100, IERR ",ierr
131  stop "TEST_MERGE TERMINATED"
132  END IF
133  grid1%POINTS(1,13)=itmp
134 
135 C CREATE INTERSECTING EDGES IN GRID2
136  xtmp=grid2%X(1,14)
137  ytmp=grid2%X(1,14)
138  grid2%X(1,14)=11.0*100
139  grid2%X(1,14)=-3.
140  CALL gridman_grid2d_merge(grid,grid1,grid2,tol,ierr)
141  IF(ierr.NE.100) THEN
142  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
143  WRITE(*,*) "Expected value IERR=100, IERR ",ierr
144  stop "TEST_MERGE TERMINATED"
145  END IF
146  grid2%X(1,14)=xtmp
147  grid2%X(2,14)=ytmp
148 
149 C DEALLOCATE
150  CALL gridman_grid_deallocate(grid1,ierr)
151  IF(ierr.GT.0) stop "TEST_MERGE TERMINATED"
152  CALL gridman_grid_deallocate(grid2,ierr)
153  IF(ierr.GT.0) stop "TEST_MERGE TERMINATED"
154  CALL gridman_grid_deallocate(grid,ierr)
155  IF(ierr.GT.0) stop "TEST_MERGE TERMINATED"
156 
157  WRITE(*,*) "TEST_MERGE COMPLETED"
158 
159  END PROGRAM test_merge
160 
161 
162 C
163 C
164 C
165  SUBROUTINE test_mappings(GRID,GRID1,GRID2)
166  USE gridman
167  USE gridman_lib
168  IMPLICIT NONE
169  TYPE(gridman_grid) :: grid,grid1,grid2
170  REAL(GRIDMAN_DP) :: s1(grid1%nedges),
171  r s2(grid2%NEDGES),s(grid%NEDGES),
172  r vol(grid%NCELLS),
173  r vol1(grid1%NCELLS),vol2(grid2%NCELLS)
174  REAL(GRIDMAN_DP) :: s_sum,s22,v,v1,v2
175  INTEGER(GRIDMAN_SP) :: ie,iee,iedge,iedge1,i1,iedge2,i2,
176  i icell,icell1,icell2
177  INTEGER :: ierr,res
178 
179  CALL gridman_grid2d_cylareas(grid,s,ierr)
180  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
181  CALL gridman_grid2d_cylareas(grid1,s1,ierr)
182  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
183  CALL gridman_grid2d_cylareas(grid2,s2,ierr)
184  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
185 
186  DO ie=1,grid%EDGEINDEX(1)%NELEMENTS
187  iedge1=grid%EDGEINDEX(1)%INDEXES(1,ie)
188  s_sum=0.
189  DO iee=1,grid%EDGEINDEX(1)%NELEMENTS
190  iedge=grid%EDGEINDEX(1)%INDEXES(0,iee)
191  i1=grid%EDGEINDEX(1)%INDEXES(1,iee)
192  IF(i1.EQ.iedge1) s_sum=s_sum+s(iedge)
193  END DO
194  IF(abs(s_sum-s1(iedge1)).GT.
195  f gridman_tol*(abs(s_sum)+abs(s1(iedge1)))) THEN
196  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
197  WRITE(*,*) "Wrong edge index - mismatch of areas"
198  WRITE(*,*) " IEDGE1, S, S1 ",iedge1,s_sum,s1(iedge1)
199  stop "TEST_MERGE TERMINATED"
200  END IF
201  END DO
202 
203  CALL gridman_index_compare(grid%EDGEINDEX(2),
204  c grid%EDGEINDEX(1),res,ierr)
205  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
206  IF(res.NE.0) THEN
207  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
208  WRITE(*,*) "EDGEINDEX(2) and EDGEINDEX(1) must be equal"
209  stop "TEST_MERGE TERMINATED"
210  END IF
211 
212  DO ie=1,grid%EDGEINDEX(3)%NELEMENTS
213  iedge2=grid%EDGEINDEX(3)%INDEXES(1,ie)
214  s_sum=0.
215  DO iee=1,grid%EDGEINDEX(3)%NELEMENTS
216  iedge=grid%EDGEINDEX(3)%INDEXES(0,iee)
217  i2=grid%EDGEINDEX(3)%INDEXES(1,iee)
218  IF(i2.EQ.iedge2) s_sum=s_sum+s(iedge)
219  END DO
220  s_sum=s_sum*grid%UNIT2SI**2
221  s22=s2(iedge2)*grid2%UNIT2SI**2
222  IF(abs(s_sum-s22).GT.gridman_tol*(abs(s_sum)+abs(s22))) THEN
223  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
224  WRITE(*,*) "Wrong edge index - mismatch of areas"
225  WRITE(*,*) " IEDGE2, S, S2 ",iedge2,s_sum,s2(iedge2)
226  stop "TEST_MERGE TERMINATED"
227  END IF
228  END DO
229 
230  CALL gridman_index_compare(grid%EDGEINDEX(3),
231  c grid%EDGEINDEX(4),res,ierr)
232  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
233  IF(res.NE.0) THEN
234  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
235  WRITE(*,*) "EDGEINDEX(3) and EDGEINDEX(4) must be equal"
236  stop "TEST_MERGE TERMINATED"
237  END IF
238 
239  CALL gridman_grid2d_cylvolumes(grid,vol,ierr)
240  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
241  CALL gridman_grid2d_cylvolumes(grid1,vol1,ierr)
242  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
243  CALL gridman_grid2d_cylvolumes(grid2,vol2,ierr)
244  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
245 
246  DO ie=1,grid%CELLINDEX(1)%NELEMENTS
247  icell=grid%CELLINDEX(1)%INDEXES(0,ie)
248  icell1=grid%CELLINDEX(1)%INDEXES(1,ie)
249  v=vol(icell)
250  v1=vol1(icell1)
251  IF(abs(v-v1).GT.gridman_tol*(abs(v)+abs(v1))) THEN
252  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
253  WRITE(*,*) "Wrong cell index - mismatch of volumes"
254  WRITE(*,*) " ICELL, ICELL1, V, V1 ",icell,icell1,v,v1
255  stop "TEST_MERGE TERMINATED"
256  END IF
257  END DO
258 
259  CALL gridman_index_compare(grid%CELLINDEX(2),
260  c grid%CELLINDEX(1),res,ierr)
261  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
262  IF(res.NE.0) THEN
263  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
264  WRITE(*,*) "CELLINDEX(2) and CELLINDEX(1) must be equal"
265  stop "TEST_MERGE TERMINATED"
266  END IF
267 
268  DO ie=1,grid%CELLINDEX(3)%NELEMENTS
269  icell=grid%CELLINDEX(3)%INDEXES(0,ie)
270  icell2=grid%CELLINDEX(3)%INDEXES(1,ie)
271  v=vol(icell)*grid%UNIT2SI**3
272  v2=vol2(icell2)*grid2%UNIT2SI**3
273  IF(abs(v-v2).GT.gridman_tol*(abs(v)+abs(v2))) THEN
274  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
275  WRITE(*,*) "Wrong cell index - mismatch of volumes"
276  WRITE(*,*) " ICELL, ICELL2, V, V2 ",icell,icell2,v,v2
277  stop "TEST_MERGE TERMINATED"
278  END IF
279  END DO
280 
281  CALL gridman_index_compare(grid%CELLINDEX(4),
282  c grid%CELLINDEX(3),res,ierr)
283  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
284  IF(res.NE.0) THEN
285  WRITE(*,*) "ERROR in GRIDMAN_GRID2D_MERGE"
286  WRITE(*,*) "CELLINDEX(4) and CELLINDEX(3) must be equal"
287  stop "TEST_MERGE TERMINATED"
288  END IF
289 
290  END SUBROUTINE test_mappings
logical, save, public gridman_check
Switch to enforce extra checks of input parameters.
Definition: gridman.f:133
subroutine gridman_grid2d_merge(GRID, GRID1, GRID2, TOL, IERR)
Merge two 2D grids by connecting their boundary edges.
Definition: merge.f:39
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_index_compare(INDEX1, INDEX2, RES, IERR)
Compare two index objects.
Definition: index.f:423
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
Definition of data types, global constants and variables.
Definition: gridman.f:83