29 SUBROUTINE check_mappings(LX,LY,NX,NY,BR,BZ,LXB,LYB,NXB,NYB,GRID)
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)
40 CHARACTER(256) :: stitle
41 INTEGER(GRIDMAN_SP) :: nx,ny,nncut,nniso
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(:,:),
49 REAL(GRIDMAN_DP) :: rbt
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"
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,
68 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
70 CALL gridman_carre_read30(fort30_grid,
'./input/fort.30',ierr)
71 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
73 CALL gridman_grid_write(fort30_grid,
'carre.grd',ierr)
74 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
76 CALL gridman_grid_read(grid,
'carre.grd',ierr)
77 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
80 IF(res.NE.0.OR.ierr.NE.0) stop
"TEST_CARRE TERMINATED"
82 CALL check_mappings(1_gridman_sp,1_gridman_sp,
83 c nx,ny,br,bz,1_gridman_sp,1_gridman_sp,
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"
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,
100 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
102 CALL gridman_carre_readsonnet(carre_grid,
103 s
'./input/iterm.carre.105',ierr)
104 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
107 carre_grid%DESCRIPTION=stitle
109 IF(res.NE.0.OR.ierr.NE.0) stop
"TEST_CARRE TERMINATED"
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,
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)
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,
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)
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,
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)
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,
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)
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,
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)
172 CALL gridman_carre_read30(fort30_grid,
'./input/fort.30.b25',ierr)
173 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
177 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
179 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
181 WRITE(*,*)
"TEST_CARRE COMPLETED"
183 END PROGRAM test_carre
188 SUBROUTINE check_mappings(LX,LY,NX,NY,BR,BZ,LXB,LYB,NXB,NYB,GRID)
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)
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),
200 INTEGER(GRIDMAN_SP) :: ix,iy,ie,ix1,ix2,iy1,iy2,icell,iedge,m
202 REAL(GRIDMAN_DP) :: s213,s143,r213,r143,x1,x2,y1,y2
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.
232 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
234 IF(grid%NCELLINDEX.NE.1)
THEN
235 WRITE(*,*)
"ERORR: wrong number of indices"
236 WRITE(*,*)
" NCELLINDEX ",grid%NCELLINDEX
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"
246 DO ie=1,grid%CELLINDEX(1)%NELEMENTS
247 icell=grid%CELLINDEX(1)%INDEXES(0,ie)
249 WRITE(*,*)
"ERORR: wrong cell index"
250 WRITE(*,*)
" index mismatch"
251 WRITE(*,*)
" IE, ICELL ",ie, icell
252 stop
"TEST_CARRE TERMINATED"
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"
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"
285 sx(ix,iy)=
gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
290 sy(ix,iy)=
gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
299 sx(ix-1,iy)=
gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
307 sy(ix,iy-1)=
gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
312 IF(ierr.NE.0) stop
"TEST_CARRE TERMINATED"
315 IF(grid%NEDGEINDEX.NE.3)
THEN
316 WRITE(*,*)
"ERORR: wrong number of indices"
317 WRITE(*,*)
" NEDGEINDEX ",grid%NEDGEINDEX
318 stop
"TEST_CARRE TERMINATED"
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"
331 m=(nx-lx+1)*(ny-ly+2)
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"
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"
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"
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"
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"
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"
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.
logical, save, public gridman_check
Switch to enforce extra checks of input parameters.
real(gridman_dp), save, public gridman_tol
Tolerance parameter which is used to compare two real numbers.
subroutine gridman_grid2d_cylvolumes(GRID, VCELLS, IERR, ANGLE)
Calculate cylindrical cell volumes.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine gridman_grid2d_cylareas(GRID, SEDGES, IERR, ANGLE)
Calculate cylindrical areas of the cell edges.
Data-type which describes a grid as a set of edges, methods in grid.f.
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
logical, save, public gridman_dbg
Switch for debugging mode.
real(gridman_dp), parameter, public gridman_pi
PI number.
Definition of data types, global constants and variables.
subroutine gridman_grid_compare(GRID1, GRID2, RES, IERR)
Compare two grid objects.