GRIDMAN
grid managment library
test_carre.f
Go to the documentation of this file.
1 C> @file tests/test_carre.f
2 C> Unit tests of subroutines from formats/carre.f and convert/carre.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_carre
24  USE gridman
25  USE gridman_lib
26  IMPLICIT NONE
27 
28  INTERFACE
29  SUBROUTINE check_mappings(LX,LY,NX,NY,BR,BZ,LXB,LYB,NXB,NYB,GRID)
30  USE gridman
31  IMPLICIT NONE
32  INTEGER(GRIDMAN_SP),INTENT(IN) :: lx,ly,nx,ny
33  INTEGER(GRIDMAN_SP),INTENT(IN) :: lxb,lyb,nxb,nyb
34  REAL(GRIDMAN_DP) :: br(lxb:nxb,lyb:nyb,4),bz(lxb:nxb,lyb:nyb,4)
35  TYPE(gridman_grid) :: grid
36  END SUBROUTINE
37  END INTERFACE
38 
39  TYPE(gridman_grid) :: fort30_grid,carre_grid,grid
40  CHARACTER(256) :: stitle
41  INTEGER(GRIDMAN_SP) :: nx,ny,nncut,nniso
42  INTEGER :: ierr,res
43  INTEGER(GRIDMAN_SP),ALLOCATABLE ::
44  i nxcut30(:,:),nycut30(:,:),
45  i nxiso30(:,:),nyiso30(:,:),
46  i nxcut(:),nycut(:),nxiso(:),nyiso(:)
47  REAL(GRIDMAN_DP),ALLOCATABLE :: br(:,:,:),bz(:,:,:),pit(:,:),
48  r bc(:,:,:)
49  REAL(GRIDMAN_DP) :: rbt
50 
51  gridman_dbg=.false.
52  gridman_check=.true.
53 C
54 C GRID FROM FORT30 FILE
55 C
56 
57  CALL gridman_carre_read30('./input/fort.30',stitle,nx,ny,
58  c nncut,nxcut30,nycut30,
59  c nniso,nxiso30,nyiso30,br,bz,ierr)
60  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
61 
62  CALL gridman_carre2grid_fort30(fort30_grid,
63  c 1_gridman_sp,1_gridman_sp,
64  c nx,ny,nncut,nxcut30,nycut30,
65  c nniso,nxiso30,nyiso30,br,bz,
66  c 1_gridman_sp,1_gridman_sp,
67  c nx,ny,ierr)
68  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
69 
70  CALL gridman_carre_read30(fort30_grid,'./input/fort.30',ierr)
71  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
72 
73  CALL gridman_grid_write(fort30_grid,'carre.grd',ierr)
74  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
75 
76  CALL gridman_grid_read(grid,'carre.grd',ierr)
77  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
78 
79  CALL gridman_grid_compare(fort30_grid,grid,res,ierr)
80  IF(res.NE.0.OR.ierr.NE.0) stop "TEST_CARRE TERMINATED"
81 
82  CALL check_mappings(1_gridman_sp,1_gridman_sp,
83  c nx,ny,br,bz,1_gridman_sp,1_gridman_sp,
84  c nx,ny,fort30_grid)
85 
86 C
87 C GRID FROM SONNET FILE
88 C
89  CALL gridman_carre_readsonnet('./input/iterm.carre.105',nx,ny,
90  s nncut,nxcut,nycut,nniso,nxiso,nyiso,
91  s rbt,br,bz,pit,bc,ierr)
92  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
93 
94  CALL gridman_carre2grid(carre_grid,
95  s 0_gridman_sp,0_gridman_sp,
96  s nx+1,ny+1,nncut,nxcut,nycut,
97  s nniso,nxiso,nyiso,br,bz,
98  s 1_gridman_sp,1_gridman_sp,
99  s nx,ny,ierr)
100  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
101 
102  CALL gridman_carre_readsonnet(carre_grid,
103  s './input/iterm.carre.105',ierr)
104  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
105 
106  gridman_tol=1e-5
107  carre_grid%DESCRIPTION=stitle
108  CALL gridman_grid_compare(fort30_grid,carre_grid,res,ierr)
109  IF(res.NE.0.OR.ierr.NE.0) stop "TEST_CARRE TERMINATED"
110 C
111 C CHECK DIFFERENT TYPES OF INDEXING
112 C
113  WRITE(*,*) "CHECK 1"
114  CALL gridman_carre2grid(carre_grid,
115  s 0_gridman_sp,0_gridman_sp,
116  s nx+1,ny+1,nncut,nxcut,nycut,
117  s nniso,nxiso,nyiso,br,bz,
118  s 0_gridman_sp,0_gridman_sp,
119  s nx+1,ny+1,ierr)
120  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
121  CALL check_mappings(0_gridman_sp,0_gridman_sp,nx+1,ny+1,br,bz,
122  c 0_gridman_sp,0_gridman_sp, nx+1,ny+1,carre_grid)
123 
124  WRITE(*,*) "CHECK 2"
125  CALL gridman_carre2grid(carre_grid,
126  s 0_gridman_sp,0_gridman_sp,
127  s nx+1,ny+1,nncut,nxcut,nycut,
128  s nniso,nxiso,nyiso,br,bz,
129  s 1_gridman_sp,0_gridman_sp,
130  s nx,ny+1,ierr)
131  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
132  CALL check_mappings(1_gridman_sp,0_gridman_sp,nx,ny+1,br,bz,
133  c 0_gridman_sp,0_gridman_sp,nx+1,ny+1,carre_grid)
134 
135  WRITE(*,*) "CHECK 3"
136  CALL gridman_carre2grid(carre_grid,
137  s 0_gridman_sp,0_gridman_sp,
138  s nx+1,ny+1,nncut,nxcut,nycut,
139  s nniso,nxiso,nyiso,br,bz,
140  s 0_gridman_sp,1_gridman_sp,
141  s nx+1,ny,ierr)
142  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
143  CALL check_mappings(0_gridman_sp,1_gridman_sp,nx+1,ny,br,bz,
144  c 0_gridman_sp,0_gridman_sp,nx+1,ny+1,carre_grid)
145 
146  WRITE(*,*) "CHECK 4"
147  CALL gridman_carre2grid(carre_grid,
148  s 0_gridman_sp,0_gridman_sp,
149  s nx+1,ny+1,nncut,nxcut,nycut,
150  s nniso,nxiso,nyiso,br,bz,
151  s 0_gridman_sp,2_gridman_sp,
152  s nx+1,ny,ierr)
153  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
154  CALL check_mappings(0_gridman_sp,2_gridman_sp,nx+1,ny,br,bz,
155  c 0_gridman_sp,0_gridman_sp,nx+1,ny+1,carre_grid)
156 
157  WRITE(*,*) "CHECK 5"
158  CALL gridman_carre2grid(carre_grid,
159  s 0_gridman_sp,0_gridman_sp,
160  s nx+1,ny+1,nncut,nxcut,nycut,
161  s nniso,nxiso,nyiso,br,bz,
162  s 1_gridman_sp,2_gridman_sp,
163  s nx-1,ny,ierr)
164  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
165  CALL check_mappings(1_gridman_sp,2_gridman_sp,nx-1,ny,br,bz,
166  c 0_gridman_sp,0_gridman_sp,nx+1,ny+1,carre_grid)
167 
168  WRITE(*,*) "CHECK 6"
169 C
170 C GRID FROM FORT30 FILE PRODUCED BY SOLPS5
171 C
172  CALL gridman_carre_read30(fort30_grid,'./input/fort.30.b25',ierr)
173  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
174 
175 C DEALLOCATION
176  CALL gridman_grid_deallocate(carre_grid,ierr)
177  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
178  CALL gridman_grid_deallocate(grid,ierr)
179  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
180 
181  WRITE(*,*) "TEST_CARRE COMPLETED"
182 
183  END PROGRAM test_carre
184 
185 C
186 C
187 C
188  SUBROUTINE check_mappings(LX,LY,NX,NY,BR,BZ,LXB,LYB,NXB,NYB,GRID)
189  USE gridman
190  USE gridman_lib
191  IMPLICIT NONE
192  INTEGER(GRIDMAN_SP),INTENT(IN) :: lx,ly,nx,ny
193  INTEGER(GRIDMAN_SP),INTENT(IN) :: lxb,lyb,nxb,nyb
194  REAL(GRIDMAN_DP) :: br(lxb:nxb,lyb:nyb,4),bz(lxb:nxb,lyb:nyb,4)
195  TYPE(gridman_grid) :: grid
196  REAL(GRIDMAN_DP) :: volb2(lx:nx,ly:ny),vol(grid%ncells),
197  r sx(lx-1:nx,ly:ny),sy(lx:nx,ly-1:ny),
198  r sarea(grid%NEDGES)
199 
200  INTEGER(GRIDMAN_SP) :: ix,iy,ie,ix1,ix2,iy1,iy2,icell,iedge,m
201  INTEGER :: ierr
202  REAL(GRIDMAN_DP) :: s213,s143,r213,r143,x1,x2,y1,y2
203 
204 C REGION WHERE VOLUMES AND SURFACES WILL BE COMPARED
205  ix1=lx+3
206  ix2=nx-3
207  iy1=ly+3
208  iy2=ny-3
209 
210  ix1=lx
211  ix2=nx
212  iy1=ly
213  iy2=ny
214 
215 C VOLUME OF B2 GRID
216  DO iy=ly,ny
217  DO ix=lx,nx
218  s213=br(ix,iy,2)*(bz(ix,iy,1)-bz(ix,iy,3))+
219  + br(ix,iy,1)*(bz(ix,iy,3)-bz(ix,iy,2))+
220  + br(ix,iy,3)*(bz(ix,iy,2)-bz(ix,iy,1))
221  s143=br(ix,iy,1)*(bz(ix,iy,4)-bz(ix,iy,3))+
222  + br(ix,iy,4)*(bz(ix,iy,3)-bz(ix,iy,1))+
223  + br(ix,iy,3)*(bz(ix,iy,1)-bz(ix,iy,4))
224  r213=br(ix,iy,2)+br(ix,iy,1)+br(ix,iy,3)
225  r143=br(ix,iy,1)+br(ix,iy,4)+br(ix,iy,3)
226  volb2(ix,iy)=gridman_pi*abs((r213*s213+r143*s143))/3.
227  END DO
228  END DO
229 
230 C VOLUME OF THE GRID CELLS
231  CALL gridman_grid2d_cylvolumes(grid,vol,ierr)
232  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
233 
234  IF(grid%NCELLINDEX.NE.1) THEN
235  WRITE(*,*) "ERORR: wrong number of indices"
236  WRITE(*,*) " NCELLINDEX ",grid%NCELLINDEX
237  END IF
238 
239  IF(grid%CELLINDEX(1)%NELEMENTS.NE.grid%NCELLS) THEN
240  WRITE(*,*) "ERORR: wrong cell index"
241  WRITE(*,*) " NELEMENTS, NCELLS ",
242  w grid%CELLINDEX(1)%NELEMENTS,grid%NCELLS
243  stop "TEST_CARRE TERMINATED"
244  END IF
245 
246  DO ie=1,grid%CELLINDEX(1)%NELEMENTS
247  icell=grid%CELLINDEX(1)%INDEXES(0,ie)
248  IF(ie.NE.icell) THEN
249  WRITE(*,*) "ERORR: wrong cell index"
250  WRITE(*,*) " index mismatch"
251  WRITE(*,*) " IE, ICELL ",ie, icell
252  stop "TEST_CARRE TERMINATED"
253  END IF
254  ix=grid%CELLINDEX(1)%INDEXES(1,ie)
255  iy=grid%CELLINDEX(1)%INDEXES(2,ie)
256  IF(ix.LT.lx.OR.ix.GT.nx.OR.
257  c iy.LT.ly.OR.iy.GT.ny) THEN
258  WRITE(*,*) "ERORR: cell index out of range"
259  WRITE(*,*) " ICELL ",icell
260  WRITE(*,*) " IX, LX, NX ",ix,lx,nx
261  WRITE(*,*) " IY, LY, NY ",iy,ly,ny
262  stop "TEST_CARRE TERMINATED"
263  END IF
264  IF(ix.GE.ix1.AND.ix.LE.ix2.AND.
265  . iy.GE.iy1.AND.iy.LE.iy2) THEN
266  IF(abs(vol(icell)-volb2(ix,iy)).GT.
267  . gridman_tol*(abs(vol(icell))+abs(volb2(ix,iy)))) THEN
268  WRITE(*,*) "ERORR: wrong cell index"
269  WRITE(*,*) " volume mismatch between ",
270  w "original and mapped cells"
271  WRITE(*,*) "ICELL, IX, IY, VOL, VOLB2"
272  WRITE(*,*) icell,ix,iy,vol(icell),volb2(ix,iy)
273  stop "TEST_CARRE TERMINATED"
274  END IF
275  END IF
276  END DO
277 
278 C SURFACE AREAS OF B2 GRID
279  DO iy=ly,ny
280  DO ix=lx,nx
281  x1=br(ix,iy,1)
282  y1=bz(ix,iy,1)
283  x2=br(ix,iy,2)
284  y2=bz(ix,iy,2)
285  sx(ix,iy)=gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
286  x1=br(ix,iy,3)
287  y1=bz(ix,iy,3)
288  x2=br(ix,iy,2)
289  y2=bz(ix,iy,2)
290  sy(ix,iy)=gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
291  END DO
292  END DO
293  ix=lx
294  DO iy=ly,ny
295  x1=br(ix,iy,3)
296  y1=bz(ix,iy,3)
297  x2=br(ix,iy,4)
298  y2=bz(ix,iy,4)
299  sx(ix-1,iy)=gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
300  END DO
301  iy=ly
302  DO ix=lx,nx
303  x1=br(ix,iy,4)
304  y1=bz(ix,iy,4)
305  x2=br(ix,iy,1)
306  y2=bz(ix,iy,1)
307  sy(ix,iy-1)=gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
308  END DO
309 
310 C TOTAL SURFACE OF GRID
311  CALL gridman_grid2d_cylareas(grid,sarea,ierr)
312  IF(ierr.NE.0) stop "TEST_CARRE TERMINATED"
313 
314 C COMPARING ORIGINAL AND MAPPED SURFACE AREAS
315  IF(grid%NEDGEINDEX.NE.3) THEN
316  WRITE(*,*) "ERORR: wrong number of indices"
317  WRITE(*,*) " NEDGEINDEX ",grid%NEDGEINDEX
318  stop "TEST_CARRE TERMINATED"
319  END IF
320 
321  m=2*(nx-lx+1)+2*(ny-ly+1)
322  IF(grid%EDGEINDEX(1)%NINDEX.NE.1.OR.
323  f grid%EDGEINDEX(1)%NELEMENTS.NE.m) THEN
324  WRITE(*,*) "ERORR: wrong 1st edge index"
325  WRITE(*,*) " NINDEX, NELEMENTS, M ",
326  w grid%EDGEINDEX(1)%NINDEX,
327  w grid%EDGEINDEX(1)%NELEMENTS,m
328  stop "TEST_CARRE TERMINATED"
329  END IF
330 
331  m=(nx-lx+1)*(ny-ly+2)
332 C Poloidal edges
333  IF(grid%EDGEINDEX(2)%NELEMENTS.NE.m) THEN
334  WRITE(*,*) "ERORR: wrong 1st edge index"
335  WRITE(*,*) " NELEMENTS, NX*(NY+1) ",
336  w grid%EDGEINDEX(1)%NELEMENTS,m
337  stop "TEST_CARRE TERMINATED"
338  END IF
339  DO ie=1,grid%EDGEINDEX(2)%NELEMENTS
340  iedge=grid%EDGEINDEX(2)%INDEXES(0,ie)
341  ix=grid%EDGEINDEX(2)%INDEXES(1,ie)
342  iy=grid%EDGEINDEX(2)%INDEXES(2,ie)
343  IF(iedge.LT.1.OR.iedge.GT.grid%NEDGES.OR.
344  f ix.LT.lx.OR.ix.GT.nx.OR.iy.LT.ly-1.OR.iy.GT.ny) THEN
345  WRITE(*,*) "ERORR: poloidal edge index is out of range"
346  WRITE(*,*) " IEDGE, NEDGES ",iedge,grid%NEDGES
347  WRITE(*,*) " IX, LX, NX ",ix,lx,nx
348  WRITE(*,*) " IY, LY-1, NY ",iy,ly-1,ny
349  stop "TEST_CARRE TERMINATED"
350  END IF
351  IF(ix.GE.ix1.AND.ix.LE.ix2.AND.
352  . iy.GE.ly-1.AND.iy.LE.ny) THEN
353  IF(abs(sarea(iedge)-sy(ix,iy)).GT.
354  . gridman_tol*(abs(sarea(iedge))+abs(sy(ix,iy)))) THEN
355  WRITE(*,*) "ERORR: surface area mismatch between ",
356  w "original and mapped Y-surfaces"
357  WRITE(*,*) "IEDGE, IX, IY, SAREA, SY"
358  WRITE(*,*) iedge,ix,iy,sarea(iedge),sy(ix,iy)
359  stop "TEST_CARRE TERMINATED"
360  END IF
361  END IF
362  END DO
363 C Radial edges
364  m=(nx-lx+2)*(ny-ly+1)
365  IF(grid%EDGEINDEX(3)%NELEMENTS.NE.m) THEN
366  WRITE(*,*) "ERORR: wrong 2nd edge index"
367  WRITE(*,*) " NELEMENTS, (NX-1)*NY ",
368  w grid%EDGEINDEX(2)%NELEMENTS,m
369  stop "TEST_CARRE TERMINATED"
370  END IF
371  DO ie=1,grid%EDGEINDEX(3)%NELEMENTS
372  iedge=grid%EDGEINDEX(3)%INDEXES(0,ie)
373  ix=grid%EDGEINDEX(3)%INDEXES(1,ie)
374  iy=grid%EDGEINDEX(3)%INDEXES(2,ie)
375  IF(iedge.LT.1.OR.iedge.GT.grid%NEDGES.OR.
376  f ix.LT.lx-1.OR.ix.GT.nx.OR.iy.LT.ly.OR.iy.GT.ny) THEN
377  WRITE(*,*) "ERORR: poloidal edge index is out of range"
378  WRITE(*,*) " IEDGE, NEDGES ",iedge,grid%NEDGES
379  WRITE(*,*) " IX, LX-1, NX ",ix,lx-1,nx
380  WRITE(*,*) " IY, LY, NY ",iy,ly,ny
381  stop "TEST_CARRE TERMINATED"
382  END IF
383  IF(ix.GE.lx-1.AND.ix.LE.nx.AND.
384  . iy.GE.iy1.AND.iy.LE.iy2) THEN
385  IF(abs(sarea(iedge)-sx(ix,iy)).GT.
386  . gridman_tol*(abs(sarea(iedge))+abs(sx(ix,iy)))) THEN
387  WRITE(*,*) "ERORR: surface area mismatch between ",
388  w "original and mapped X-surfaces"
389  WRITE(*,*) "IEDGE, IX, IY, SAREA, SX"
390  WRITE(*,*) iedge,ix,iy,sarea(iedge),sx(ix,iy)
391  stop "TEST_CARRE TERMINATED"
392  END IF
393  END IF
394  END DO
395 
396  END SUBROUTINE check_mappings
subroutine gridman_carre2grid(GRID, LXB, LYB, NXB, NYB, NNCUT, NXCUT, NYCUT, NNISO, NXISO, NYISO, BR, BZ, LX, LY, NXL, NYL, IERR, LEIR)
Convert B2 (CARRE, SONNET) grid into GRIDMAN_GRID grid object.
Definition: carre.f:72
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_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
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_grid_compare(GRID1, GRID2, RES, IERR)
Compare two grid objects.
Definition: grid1.f:1068