37 s nchbar,nseite,itri,ierr)
39 u gridman_unit,gridman_dbg,gridman_check,
51 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NRKNOT
53 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NTRII
57 REAL(GRIDMAN_DP),
INTENT(IN) :: XYTRIAN(2,nrknot)
59 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NECKE(3,ntrii)
61 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NCHBAR(3,ntrii)
63 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NSEITE(3,ntrii)
68 INTEGER(GRIDMAN_SP),
INTENT(IN) :: ITRI(5,ntrii)
70 INTEGER,
INTENT(OUT) :: IERR
72 INTEGER(GRIDMAN_SP) :: IND(ntrii*3)
73 INTEGER(GRIDMAN_SP) :: ICELL,ICELL1,IS,IS1,IEDGE,IEDGE1,IP,IPOINT,
76 INTEGER(GRIDMAN_SP),
ALLOCATABLE :: IEDGES(:)
80 f
WRITE(gridman_unit,*)
"Starting GRIDMAN_TRIA2GRID"
87 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
93 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
106 icell1=nchbar(is,icell)
112 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
113 w
"no open side, but ISIDE<=0"
114 WRITE(gridman_unit,*)
" ITRIA, ISIDE ",icell,is
117 iedge1=(icell1-1)*3+is1
118 IF(ind(iedge1).EQ.0)
THEN
124 ind(iedge)=ind(iedge1)
136 IF(ierr.GT.0)
GOTO 100
139 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
140 w
"cannot allocate cell index"
150 iedge=ind((icell-1)*3+is)
152 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
153 w
"internal error IND<0"
154 WRITE(gridman_unit,*)
" ITRIA, ISIDE, IEDGE ",icell,is,iedge
158 IF(grid%CELLS(1,iedge).EQ.0)
THEN
159 grid%CELLS(1,iedge)=icell
160 ELSE IF(grid%CELLS(2,iedge).EQ.0)
THEN
161 grid%CELLS(2,iedge)=icell
163 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
164 w
"wrong triangle data"
165 WRITE(gridman_unit,*)
"Edge belongs to more that 2 triangles"
166 WRITE(gridman_unit,*)
" ITRIA, ISIDE, IEDGE ",icell,is,iedge
167 WRITE(gridman_unit,*)
" CELLS ",grid%CELLS(:,iedge),icell
175 ALLOCATE(iedges(nedges),stat=is)
177 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
178 w
"cannot allocate temporary array"
179 WRITE(gridman_unit,*)
"NEDGES ",nedges
186 iedge=ind((icell-1)*3+is)
189 ipoint=necke(is1,icell)
190 IF(grid%POINTS(ip,iedge).EQ.0)
THEN
191 grid%POINTS(ip,iedge)=ipoint
193 IF(ipoint.NE.grid%POINTS(1,iedge).AND.
194 f ipoint.NE.grid%POINTS(2,iedge))
THEN
195 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
196 w
"point indices do not match previous definition"
197 WRITE(gridman_unit,*)
" ITRIA, ISIDE, IEDGE ",icell,is1,iedge
198 WRITE(gridman_unit,*)
" NECKE, POINTS ",
199 w ipoint,grid%POINTS(:,iedge)
208 IF(itri(2+is,icell).NE.0.AND.iedges(iedge).EQ.0)
THEN
209 nelements=nelements+1
210 iedges(iedge)=nelements
213 grid%CELLINDEX(1)%INDEXES(0,icell)=icell
214 grid%CELLINDEX(1)%INDEXES(1,icell)=itri(1,icell)
215 grid%CELLINDEX(1)%INDEXES(2,icell)=itri(2,icell)
221 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
222 w
"cannot allocate edge index"
231 iedge=ind((icell-1)*3+is)
232 IF(itri(2+is,icell).NE.0)
THEN
233 IF(iedges(iedge).EQ.0)
THEN
235 grid%EDGEINDEX(1)%INDEXES(0,ie)=iedge
236 grid%EDGEINDEX(1)%INDEXES(1,ie)=itri(2+is,icell)
239 IF(grid%EDGEINDEX(1)%INDEXES(1,iedges(iedge)).NE.
240 f itri(2+is,icell)) lwitri=.true.
246 DEALLOCATE(iedges,stat=is)
248 WRITE(gridman_unit,*)
"WARNING from GRIDMAN_TRIA2GRID: ",
249 w
"cannot deallocate temporary array IEDGES"
254 WRITE(gridman_unit,*)
"WARNING from GRIDMAN_TRIA2GRID: "
255 WRITE(gridman_unit,*)
256 w
"Some edge tags defined for the same side ",
257 w
"in different triangles do not match"
265 grid%UNIT2SI=1e-2_gridman_dp
266 grid%UNITS=
'CENTIMETER'
268 grid%DESCRIPTION=
'EIRENE triangular grid'
269 grid%CELLINDEX(1)%DESCRIPTION=
'IX, IY of the plasma grid'
270 grid%CELLINDEX(1)%COLUMNS(1)=
'TRIA_IX'
271 grid%CELLINDEX(1)%COLUMNS(2)=
'TRIA_IY'
272 grid%EDGEINDEX(1)%DESCRIPTION=
'Edge tags of TRIA grid'
273 grid%EDGEINDEX(1)%COLUMNS(1)=
'TRIA_ISRF'
275 IF(gridman_check)
THEN
277 IF(res.NE.0.OR.ierr0.GT.0)
THEN
279 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA2GRID: ",
280 w
"the resulting grid is incorrect"
286 f
WRITE(gridman_unit,*)
"GRIDMAN_TRIA2GRID finished"
289 100
WRITE(gridman_unit,*)
"GRIDMAN_TRIA2GRID terminated"
309 s nchbar,nseite,itri,ierr)
311 u gridman_dp,gridman_sp,
312 u gridman_unit,gridman_dbg,gridman_check
320 REAL(GRIDMAN_DP),
INTENT(OUT) :: XYTRIAN(2,grid%npoints)
322 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NECKE(3,grid%ncells)
324 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NCHBAR(3,grid%ncells)
326 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NSEITE(3,grid%ncells)
328 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: ITRI(5,grid%ncells)
330 INTEGER,
INTENT(OUT) :: IERR
333 INTEGER(GRIDMAN_SP) :: ICELL,N,IPOINT,I,IE,IEDGE,ICELL2,
334 i ipoint1,ipoint2,iside1,iside2,itmp
335 INTEGER(GRIDMAN_SP) :: INDCELL(grid%nedges),INDSIDE(grid%nedges)
336 INTEGER :: RES,IERR0,L
337 REAL(GRIDMAN_DP) :: S,X(3),Y(3)
339 IF(gridman_dbg)
WRITE(gridman_unit,*)
"Starting GRIDMAN_GRID2TRIA"
344 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
346 WRITE(gridman_unit,*)
"GRIDMAN_GRID2TRIA: ",
347 w
"the grid is not of 2D type"
348 WRITE(gridman_unit,*)
" TYPE, PDIM, EDIM ",
349 w grid%TYPE,grid%PDIM,grid%EDIM
353 IF(gridman_check)
THEN
355 IF(res.NE.0.OR.ierr.GT.0)
THEN
357 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
358 w
"the grid is incorrect"
364 IF(ierr.NE.0)
GOTO 100
367 DO icell=1,grid%NCELLS
368 n=cells%ILAST(icell)-cells%IFIRST(icell)
370 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
371 w
"cell is not triangle "
372 WRITE(gridman_unit,*)
" ICELL, N" ,icell,n+1
379 xytrian=grid%X*grid%UNIT2SI*100_gridman_dp
391 IF(ierr.NE.0)
GOTO 100
394 DO icell=1,grid%NCELLS
396 DO ie=points%IFIRST(icell),points%ILAST(icell)-1
397 ipoint=points%IND(ie)
400 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
401 w
"internal erorr - cell has more than 3 points "
402 WRITE(gridman_unit,*)
" ICELL" ,icell
406 necke(i,icell)=ipoint
411 DO icell=1,grid%NCELLS
413 ipoint=necke(i,icell)
414 IF(ipoint.LT.1.OR.ipoint.GT.grid%NPOINTS)
THEN
415 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
416 w
"internal error - triangle corner index is out of range"
417 WRITE(gridman_unit,*)
" ICELL, ISIDE, IPOINT, NPOINTS " ,
418 w icell,i,ipoint,grid%NPOINTS
422 x(i)=grid%X(1,ipoint)
423 y(i)=grid%X(2,ipoint)
425 s=(x(1)*y(2)-x(2)*y(1))+(x(2)*y(3)-x(3)*y(2))+
426 + (x(3)*y(1)-x(1)*y(3))
430 necke(3,icell)=necke(2,icell)
438 DO icell=1,grid%NCELLS
439 DO ie=cells%IFIRST(icell),cells%ILAST(icell)
441 ipoint1=grid%POINTS(1,iedge)
442 ipoint2=grid%POINTS(2,iedge)
443 iside1=find_side(icell,ipoint1,ipoint2)
445 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
446 w
"internal error - cannot find triangle side"
447 WRITE(gridman_unit,*)
" ICELL, IEDGE " ,icell,iedge
448 WRITE(gridman_unit,*)
" IPOINT1, IPOINT2 ",ipoint1,ipoint2
452 icell2=grid%CELLS(1,iedge)
453 IF(icell2.EQ.icell) icell2=grid%CELLS(2,iedge)
458 iside2=find_side(icell2,ipoint1,ipoint2)
460 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID2TRIA: ",
461 w
"internal error - cannot find triangle side"
462 WRITE(gridman_unit,*)
" ICELL2, IEDGE " ,icell2,iedge
463 WRITE(gridman_unit,*)
" IPOINT1, IPOINT2 ",ipoint1,ipoint2
468 nchbar(iside1,icell)=icell2
469 nseite(iside1,icell)=iside2
471 indside(iedge)=iside1
475 IF(grid%NCELLINDEX.GT.0)
THEN
476 l=min(grid%CELLINDEX(1)%NINDEX,2)
477 DO ie=1,grid%CELLINDEX(1)%NELEMENTS
478 icell=grid%CELLINDEX(1)%INDEXES(0,ie)
479 IF(icell.GT.0.AND.icell.LE.grid%NCELLS)
THEN
480 itri(1:l,icell)=grid%CELLINDEX(1)%INDEXES(1:l,ie)
484 IF(grid%NEDGEINDEX.GT.0)
THEN
485 DO ie=1,grid%EDGEINDEX(1)%NELEMENTS
486 iedge=grid%EDGEINDEX(1)%INDEXES(0,ie)
487 IF(iedge.GT.0.AND.iedge.LE.grid%NEDGES)
THEN
489 iside1=indside(iedge)
490 IF(icell.GT.0.AND.iside1.GT.0)
THEN
491 itri(2+iside1,icell)=grid%EDGEINDEX(1)%INDEXES(1,ie)
492 icell2=nchbar(iside1,icell)
493 iside2=nseite(iside1,icell)
494 IF(icell2.GT.0.AND.iside2.GT.0)
495 f itri(2+iside2,icell2)=itri(2+iside1,icell)
505 f
WRITE(gridman_unit,*)
"GRIDMAN_GRID2TRIA finished"
509 100
WRITE(gridman_unit,*)
"GRIDMAN_GRID2TRIA terminated"
517 FUNCTION find_side(ICELL,IPOINT1,IPOINT2)
518 INTEGER(GRIDMAN_SP),
INTENT(IN) :: ICELL,IPOINT1,IPOINT2
519 INTEGER(GRIDMAN_SP) :: FIND_SIDE
520 INTEGER(GRIDMAN_SP) :: IP1,IP2,IP3
528 IF((ipoint1.EQ.ip1.AND.ipoint2.EQ.ip2).OR.
529 f (ipoint1.EQ.ip2.AND.ipoint2.EQ.ip1))
THEN
531 ELSE IF((ipoint1.EQ.ip2.AND.ipoint2.EQ.ip3).OR.
532 f (ipoint1.EQ.ip3.AND.ipoint2.EQ.ip2))
THEN
534 ELSE IF((ipoint1.EQ.ip3.AND.ipoint2.EQ.ip1).OR.
535 f (ipoint1.EQ.ip1.AND.ipoint2.EQ.ip3))
THEN
540 END FUNCTION find_side
559 u gridman_dbg,gridman_unit
567 CHARACTER(*) :: FNAMES(3)
569 INTEGER,
INTENT(OUT) :: IERR
571 INTEGER(GRIDMAN_SP) :: NRKNOT,NTRII
573 INTEGER(GRIDMAN_SP),
ALLOCATABLE :: NECKE(:,:),
574 i nchbar(:,:),nseite(:,:),itri(:,:)
575 REAL(GRIDMAN_DP),
ALLOCATABLE :: XYTRIAN(:,:)
578 f
WRITE(gridman_unit,*)
"Starting GRIDMAN_TRIA_READ_GRID"
583 s necke,nchbar,nseite,itri,ierr)
584 IF(ierr.NE.0)
GOTO 100
587 s nchbar,nseite,itri,ierr)
589 IF(
ALLOCATED(xytrian))
DEALLOCATE(xytrian,stat=is)
590 IF(
ALLOCATED(necke))
DEALLOCATE(necke,stat=is)
591 IF(
ALLOCATED(nchbar))
DEALLOCATE(nchbar,stat=is)
592 IF(
ALLOCATED(nseite))
DEALLOCATE(nseite,stat=is)
593 IF(
ALLOCATED(itri))
DEALLOCATE(itri,stat=is)
596 f
WRITE(gridman_unit,*)
"GRIDMAN_TRIA_READ_GRID finished"
599 100
WRITE(gridman_unit,*)
"GRIDMAN_TRIA_READ_GRID terminated"
614 u gridman_dbg,gridman_unit
622 CHARACTER(*) :: FNAMES(3)
624 INTEGER,
INTENT(OUT) :: IERR
626 INTEGER(GRIDMAN_SP) :: NRKNOT,NTRII
628 INTEGER(GRIDMAN_SP),
ALLOCATABLE :: NECKE(:,:),NCHBAR(:,:),
629 i nseite(:,:),itri(:,:)
630 REAL(GRIDMAN_DP),
ALLOCATABLE :: XYTRIAN(:,:)
633 f
WRITE(gridman_unit,*)
"Starting GRIDMAN_TRIA_WRITE_GRID"
637 ALLOCATE(xytrian(2,nrknot),necke(3,ntrii),
638 a nchbar(3,ntrii),nseite(3,ntrii),
639 a itri(5,ntrii),stat=is)
641 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_TRIA_WRITE_GRID",
642 w
"can not allocate temporary arrays"
643 WRITE(gridman_unit,*)
" NTRII, NRKNOT ", ntrii,nrknot
645 CALL deallocate_all()
650 s nchbar,nseite,itri,ierr)
652 CALL deallocate_all()
653 WRITE(gridman_unit,*)
"GRIDMAN_TRIA_WRITE_GRID terminated"
657 s necke,nchbar,nseite,itri,ierr)
658 CALL deallocate_all()
661 WRITE(gridman_unit,*)
"GRIDMAN_TRIA_WRITE_GRID terminated"
666 f
WRITE(gridman_unit,*)
"GRIDMAN_TRIA_WRITE_GRID finished"
670 SUBROUTINE deallocate_all
671 IF(
ALLOCATED(necke))
DEALLOCATE(necke)
672 IF(
ALLOCATED(nchbar))
DEALLOCATE(nchbar)
673 IF(
ALLOCATED(nseite))
DEALLOCATE(nseite)
674 IF(
ALLOCATED(xytrian))
DEALLOCATE(xytrian)
675 IF(
ALLOCATED(itri))
DEALLOCATE(itri)
676 END SUBROUTINE deallocate_all
integer, parameter, public gridman_dp
Kind parameter for real numbers.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine gridman_grid_allocate(GRID, TYPE, NEDGES, NPOINTS, NCELLS, IERR, NEDGEINDEX, NCELLINDEX)
Allocate GRIDMAN_GRID object.
subroutine gridman_grid2d_chains(GRID, CHAINS, IERR)
Find closed chain of points which form each cell.
subroutine gridman_grid_cells(EDGES, GRID, IERR)
Create a list of edges which belong to each cell.
subroutine gridman_grid2d_check(GRID, RES, IERR)
Check correctness of the 2D grid object.
subroutine gridman_indlist_deallocate(INDLIST, IERR)
Deallocate list of indices.
subroutine gridman_tria_read_grid(GRID, FNAMES, IERR)
Read EIRENE triangular grid from fort.33-35, returns GRID object.
Data-type which describes a grid as a set of edges, methods in grid.f.
subroutine gridman_grid2tria(GRID, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Convert GRIDMAN_GRID grid object into EIRENE triangular grid.
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
subroutine gridman_tria2grid(GRID, NRKNOT, NTRII, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Convert EIRENE triangular grid into GRIDMAN_GRID grid object (type=GRID2D)
subroutine gridman_index_allocate(INDEX, NINDEX, NELEMENTS, IERR)
Allocate index object.
subroutine gridman_tria_write_grid(GRID, FNAMES, IERR)
Write EIRENE triangular grid - defined as GRID object - into fort.33-35.
Data-type which describes lists of elements with variable number of indices for each element...
Definition of data types, global constants and variables.
subroutine gridman_index_deallocate(INDEX, IERR)
Allocate index object.
integer, parameter, public gridman_sp
Kind parameter for integer numbers.