GRIDMAN
grid managment library
test_tria.f
Go to the documentation of this file.
1 C> @file tests/test_tria.f
2 C> Unit tests of subroutines from formats/tria.f and convert/tria.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_tria
24  USE gridman
25  USE gridman_lib
26  IMPLICIT NONE
27  INTRINSIC sum
28 
29  CHARACTER(256) :: fnames(3)
30  INTEGER(GRIDMAN_SP) :: nrknot,ntrii,i,iy,icell
31  INTEGER :: ierr
32  REAL(GRIDMAN_DP),ALLOCATABLE :: xytrian(:,:),xytrian2(:,:)
33  INTEGER(GRIDMAN_SP),ALLOCATABLE :: necke(:,:),nchbar(:,:),
34  i nseite(:,:),itri(:,:),
35  i necke2(:,:),nchbar2(:,:),
36  i nseite2(:,:),itri2(:,:)
37  TYPE(gridman_grid) :: tria_grid,tria_grid_copy,tria1,tria2,tria
38  REAL(GRIDMAN_DP),ALLOCATABLE :: vol(:),vol1(:),vol2(:)
39  REAL(GRIDMAN_DP) :: v1,v2,v0,v
40  LOGICAL,ALLOCATABLE :: lcadd(:)
41 
42  gridman_check=.true.
43 cc GRIDMAN_DBG=.TRUE.
44 
45 C READ TRIANGULAR GRID
46  fnames(1)='./input/fort.33';
47  fnames(2)='./input/fort.34';
48  fnames(3)='./input/fort.35';
49  CALL gridman_tria_read(fnames,nrknot,ntrii,xytrian,
50  s necke,nchbar,nseite,itri,ierr)
51  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
52 C CONVERT TRIA INTO GRID OBJECT
53  CALL gridman_tria2grid(tria_grid,nrknot,ntrii,xytrian,
54  s necke,nchbar,nseite,itri,ierr)
55  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
56 C WRITE TRIANGULAR GRID
57  fnames(1)='fort.33b';
58  fnames(2)='fort.34b';
59  fnames(3)='fort.35b';
60  CALL gridman_tria_write(tria_grid,fnames,ierr)
61  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
62  fnames(1)='';
63  fnames(2)='';
64  fnames(3)='';
65  CALL gridman_tria_write(tria_grid,fnames,ierr)
66  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
67  CALL gridman_grid_write(tria_grid,'tria.grd',ierr)
68  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
69 
70 C READ TRIANGULAR GRID WHICH WAS WRITTEN
71  CALL gridman_tria_read(tria_grid_copy,fnames,ierr)
72  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
73 
74 C CHECK TRANSFORMATIONS OF ITRI
75  ALLOCATE(xytrian2(2,tria_grid_copy%NPOINTS),
76  a necke2(3,tria_grid_copy%NCELLS),
77  a nchbar2(3,tria_grid_copy%NCELLS),
78  a nseite2(3,tria_grid_copy%NCELLS),
79  a itri2(5,tria_grid_copy%NCELLS))
80  itri2=0
81  CALL gridman_grid2tria(tria_grid_copy,xytrian2,necke2,nchbar2,
82  c nseite2,itri2,ierr)
83  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
84  DO icell=1,tria_grid_copy%NCELLS
85  IF(itri(1,icell).NE.itri2(1,icell).OR.
86  f itri(2,icell).NE.itri2(2,icell)) THEN
87  WRITE(*,*) "ERROR: cell index mismatch"
88  WRITE(*,*) " ICELL ",icell
89  WRITE(*,*) " IX, IY ",itri(1,icell),itri(2,icell)
90  WRITE(*,*) " IX2, IY2 ",itri2(1,icell),itri2(2,icell)
91  stop "TEST_TRIA TERMINATED"
92  END IF
93  IF(sum(itri(3:5,icell)).NE.sum(itri2(3:5,icell))) THEN
94  WRITE(*,*) "ERROR: edge index mismatch"
95  WRITE(*,*) " ICELL ",icell
96  WRITE(*,*) " ITRI ",itri(3:5,icell)
97  WRITE(*,*) " ITRI2 ",itri2(3:5,icell)
98  stop "TEST_TRIA TERMINATED"
99  END IF
100  END DO
101  DEALLOCATE(xytrian2,necke2,nchbar2,nseite2,itri2)
102 
103 C CHECK IF TRIA_GRID AND TRIA_GRID_COPY HAVE SAME VOLUMES
104  ALLOCATE(vol1(tria_grid%NCELLS),vol2(tria_grid_copy%NCELLS))
105  gridman_tol=1e-5
106  CALL gridman_grid2d_cylvolumes(tria_grid,vol1,ierr)
107  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
108  CALL gridman_grid2d_cylvolumes(tria_grid_copy,vol2,ierr)
109  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
110  v1=sum(vol1)
111  v2=sum(vol2)
112  IF(abs(v1-v2).GT.gridman_tol*(abs(v1)+abs(v2))) THEN
113  WRITE(*,*) "ERROR: grids have different volumes"
114  WRITE(*,*) "V1, V2 ",v1,v2
115  stop "TEST_TRIA TERMINATED"
116  END IF
117 
118  gridman_tol=1e-7
119 C CONVERT INTO GRID OBJECT WHICH INCLUDES ONLY IY<11 CELLS
120  ALLOCATE(lcadd(tria_grid%NCELLS))
121  lcadd=.false.
122  DO i=1,ntrii
123  iy=itri(2,i)
124  IF(iy.LT.11) lcadd(i)=.true.
125  END DO
126  CALL gridman_grid_eliminate_cells(tria1,tria_grid,lcadd,ierr)
127  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
128 
129 C CONVERT INTO GRID OBJECT WHICH INCLUDES ONLY IY>=11 CELLS
130  lcadd=.false.
131  DO i=1,ntrii
132  iy=itri(2,i)
133  IF(iy.GE.11) lcadd(i)=.true.
134  END DO
135  CALL gridman_grid_eliminate_cells(tria2,tria_grid,lcadd,ierr)
136  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
137 
138 C CHECK THAT SUM OF VOLUMES OF THOSE GRIDS
139 C IS EQUAL TO THE VOLUME OF COMBINED GRID
140  DEALLOCATE(vol1,vol2)
141  ALLOCATE(vol(tria_grid%NCELLS),
142  a vol1(tria1%NCELLS),vol2(tria2%NCELLS))
143  gridman_tol=1e-5
144  CALL gridman_grid2d_cylvolumes(tria_grid,vol,ierr)
145  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
146  CALL gridman_grid2d_cylvolumes(tria1,vol1,ierr)
147  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
148  CALL gridman_grid2d_cylvolumes(tria2,vol2,ierr)
149  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
150  v0=sum(vol)
151  v1=sum(vol1)
152  v2=sum(vol2)
153  IF(abs(v0-v1-v2).GT.gridman_tol) THEN
154  WRITE(*,*) "ERROR: sum of volumes is not equal",
155  w " to the volume of combined grid"
156  WRITE(*,*) "V, V1+V2 ",v0,v1+v2
157  stop "TEST_TRIA TERMINATED"
158  END IF
159 
160 C MERGE TWO PARTIAL GRIDS
161  CALL gridman_grid2d_merge(tria,tria1,tria2,1e-5_gridman_dp,ierr)
162  IF(ierr.NE.0) stop "TEST_MERGE TERMINATED"
163  IF(tria%NCELLS.NE.tria_grid%NCELLS) THEN
164  WRITE(*,*) "ERROR: wrong merging"
165  stop "TEST_TRIA TERMINATED"
166  END IF
167  CALL gridman_grid2d_cylvolumes(tria,vol,ierr)
168  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
169  v=sum(vol)
170  IF(abs(v0-v).GT.gridman_tol) THEN
171  WRITE(*,*) "ERROR: mismatch between volumes ",
172  w " of original and merged grids"
173  WRITE(*,*) "V0, V ",v0,v
174  stop "TEST_TRIA TERMINATED"
175  END IF
176 
177 C DEALLOCATE
178  CALL gridman_grid_deallocate(tria_grid,ierr)
179  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
180  CALL gridman_grid_deallocate(tria_grid_copy,ierr)
181  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
182  CALL gridman_grid_deallocate(tria1,ierr)
183  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
184  CALL gridman_grid_deallocate(tria2,ierr)
185  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
186  CALL gridman_grid_deallocate(tria,ierr)
187  IF(ierr.NE.0) stop "TEST_TRIA TERMINATED"
188 
189  WRITE(*,*) "TEST_TRIA COMPLETED"
190 
191  END PROGRAM test_tria
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
subroutine gridman_grid_eliminate_cells(GRID_NEW, GRID, LTAKE, IERR)
Eliminate cells from GRIDMAN_GRID object.
Definition: grid2.f:544
Explicit interfaces to GRIDMAN subroutines and functions.
Definition: gridman.f:251
Data-type which describes a grid as a set of edges, methods in grid.f.
Definition: gridman.f:168
subroutine gridman_grid2tria(GRID, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Convert GRIDMAN_GRID grid object into EIRENE triangular grid.
Definition: tria.f:310
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
Definition: grid1.f:184
subroutine gridman_tria2grid(GRID, NRKNOT, NTRII, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Convert EIRENE triangular grid into GRIDMAN_GRID grid object (type=GRID2D)
Definition: tria.f:38
Definition of data types, global constants and variables.
Definition: gridman.f:83