GRIDMAN
grid managment library
tria.f
Go to the documentation of this file.
1 C> @file convert/tria.f
2 C> Converters of GRIDMAN_GRID object to and from EIRENE triangular grid
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 C**********************************************************************************************
24 C> Convert EIRENE triangular grid into GRIDMAN_GRID grid object (type=GRID2D)
25 C**********************************************************************************************
26 C>
27 C> WARNING: if the object GRID already exists it will be overwritten!
28 C>
29 C> Correct XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, are produced by
30 C> GRIDMAN_TRIA_READ
31 C>
32 C> WARNING: if different ITRI(3:5) are defined for the same edge in two different
33 C> triangles, then one of the two values (the last to appear in the list) is taken.
34 C> Only non-zero edge tags are stored.
35 C
36  SUBROUTINE gridman_tria2grid(GRID,NRKNOT,NTRII,XYTRIAN,NECKE,
37  s nchbar,nseite,itri,ierr)
39  u gridman_unit,gridman_dbg,gridman_check,
46  IMPLICIT NONE
47  INTRINSIC mod
48 C> Resulting grid object
49  TYPE(gridman_grid) :: GRID
50 C> Number of nodes
51  INTEGER(GRIDMAN_SP),INTENT(IN) :: NRKNOT
52 C> Number of triangles
53  INTEGER(GRIDMAN_SP),INTENT(IN) :: NTRII
54 C> Coordinates of the nodes
55 C>
56 C> XYTRIAN(1,:) is the X coordinate, XYTRIAN(2,:) is the Y coordinate
57  REAL(GRIDMAN_DP),INTENT(IN) :: XYTRIAN(2,nrknot)
58 C> Indices of nodes for each triangle
59  INTEGER(GRIDMAN_SP),INTENT(IN) :: NECKE(3,ntrii)
60 C> Indices of neigbour cell for each triangle
61  INTEGER(GRIDMAN_SP),INTENT(IN) :: NCHBAR(3,ntrii)
62 C> Indices of sides of neighbours for each triangle
63  INTEGER(GRIDMAN_SP),INTENT(IN) :: NSEITE(3,ntrii)
64 C> Tags from fort.35
65 C>
66 C> ITRI(1,:) and ITRI(2,:) are IXTRI and IYTRI.
67 C> ITRI(3:5,:) are tags of each side of the triange.
68  INTEGER(GRIDMAN_SP),INTENT(IN) :: ITRI(5,ntrii)
69 C> Error code
70  INTEGER,INTENT(OUT) :: IERR
71 
72  INTEGER(GRIDMAN_SP) :: IND(ntrii*3)
73  INTEGER(GRIDMAN_SP) :: ICELL,ICELL1,IS,IS1,IEDGE,IEDGE1,IP,IPOINT,
74  i ie,nedges,nelements
75  INTEGER :: IERR0,RES
76  INTEGER(GRIDMAN_SP),ALLOCATABLE :: IEDGES(:)
77  LOGICAL :: LWITRI
78 
79  IF(gridman_dbg)
80  f WRITE(gridman_unit,*) "Starting GRIDMAN_TRIA2GRID"
81 
82  ierr=0
83 
84 C CHECKING INPUT
85  IF(nrknot.LE.0) THEN
86  ierr=100
87  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
88  w .LE."NRKNOT0"
89  RETURN
90  END IF
91  IF(ntrii.LE.0) THEN
92  ierr=100
93  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
94  w .LE."NTRII0"
95  RETURN
96  END IF
97 
98 C CALCULATE THE NUMBER OF EDGES AND AUXILIARY TABLE
99 C TO CONVERT TRIANGLE-CENTERED EDGE INDICES = (ICELL-1)*3+IS
100 C TO THE EDGE INDICES IN THE RESULTING GRID
101  nedges=0
102  ind=0
103  DO icell=1,ntrii
104  DO is=1,3
105  iedge=(icell-1)*3+is
106  icell1=nchbar(is,icell)
107  is1=nseite(is,icell)
108  IF(icell1.GT.0) THEN
109 C EDGE BETWEEN TWO TRIANGLES
110  IF(is1.LT.1) THEN
111  ierr=100
112  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
113  w "no open side, but ISIDE<=0"
114  WRITE(gridman_unit,*) " ITRIA, ISIDE ",icell,is
115  RETURN
116  END IF
117  iedge1=(icell1-1)*3+is1
118  IF(ind(iedge1).EQ.0) THEN
119 C ADD CLOSED SIDE ONLY IF IT WAS NOT ALREADY ADDED
120  nedges=nedges+1
121  ind(iedge)=nedges
122  ELSE
123 C OTHERWISE DUBLICATE THE INDEX
124  ind(iedge)=ind(iedge1)
125  END IF
126  ELSE
127 C ADD OPEN SIDE OF TRIANGLE
128  nedges=nedges+1
129  ind(iedge)=nedges
130  END IF
131  END DO !DO IS=1,3
132  END DO !DO ICELL=1,NTRII
133 
134 C ALLOCATE GRID OBJECT
135  CALL gridman_grid_allocate(grid,2,nedges,nrknot,ntrii,ierr,1,1)
136  IF(ierr.GT.0) GOTO 100
137  CALL gridman_index_allocate(grid%CELLINDEX(1),2,ntrii,ierr)
138  IF(ierr.NE.0) THEN
139  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
140  w "cannot allocate cell index"
141  GOTO 200
142  END IF
143 C ... edge index is allocated later
144 
145 
146 C DEFINE ARRAY GRID%CELLS
147  grid%CELLS=0
148  DO icell=1,ntrii
149  DO is=1,3
150  iedge=ind((icell-1)*3+is)
151  IF(iedge.LT.1) THEN
152  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
153  w "internal error IND<0"
154  WRITE(gridman_unit,*) " ITRIA, ISIDE, IEDGE ",icell,is,iedge
155  ierr=400
156  GOTO 200
157  END IF
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
162  ELSE
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
168  ierr=100
169  GOTO 200
170  END IF
171  END DO
172  END DO
173 C DEFINE ARRAY GRID%POINTS
174  grid%POINTS=0
175  ALLOCATE(iedges(nedges),stat=is)
176  IF(is.NE.0) THEN
177  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
178  w "cannot allocate temporary array"
179  WRITE(gridman_unit,*) "NEDGES ",nedges
180  GOTO 200
181  END IF
182  iedges=0
183  nelements=0
184  DO icell=1,ntrii
185  DO is=1,3
186  iedge=ind((icell-1)*3+is)
187  is1=is
188  DO ip=1,2
189  ipoint=necke(is1,icell)
190  IF(grid%POINTS(ip,iedge).EQ.0) THEN
191  grid%POINTS(ip,iedge)=ipoint
192  ELSE
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)
200  ierr=100
201  DEALLOCATE(iedges)
202  GOTO 200
203  END IF
204  END IF
205  is1=is1+1
206  IF(is1.GT.3) is1=1
207  END DO
208  IF(itri(2+is,icell).NE.0.AND.iedges(iedge).EQ.0) THEN
209  nelements=nelements+1
210  iedges(iedge)=nelements
211  END IF
212  END DO !DO IS=1,3
213  grid%CELLINDEX(1)%INDEXES(0,icell)=icell
214  grid%CELLINDEX(1)%INDEXES(1,icell)=itri(1,icell) !IXTRI
215  grid%CELLINDEX(1)%INDEXES(2,icell)=itri(2,icell) !IYTRI
216  END DO !DO ICELL=1,NTRII
217 
218 C EDGE INDEX
219  CALL gridman_index_allocate(grid%EDGEINDEX(1),1,nelements,ierr)
220  IF(ierr.NE.0) THEN
221  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
222  w "cannot allocate edge index"
223  GOTO 200
224  END IF
225 
226  lwitri=.false.
227  iedges=0
228  ie=0
229  DO icell=1,ntrii
230  DO is=1,3
231  iedge=ind((icell-1)*3+is)
232  IF(itri(2+is,icell).NE.0) THEN
233  IF(iedges(iedge).EQ.0) THEN
234  ie=ie+1
235  grid%EDGEINDEX(1)%INDEXES(0,ie)=iedge
236  grid%EDGEINDEX(1)%INDEXES(1,ie)=itri(2+is,icell)
237  iedges(iedge)=ie
238  ELSE
239  IF(grid%EDGEINDEX(1)%INDEXES(1,iedges(iedge)).NE.
240  f itri(2+is,icell)) lwitri=.true.
241  END IF
242  END IF
243  END DO
244  END DO
245 
246  DEALLOCATE(iedges,stat=is)
247  IF(is.NE.0) THEN
248  WRITE(gridman_unit,*) "WARNING from GRIDMAN_TRIA2GRID: ",
249  w "cannot deallocate temporary array IEDGES"
250  ierr=-200
251  END IF
252 
253  IF(lwitri) THEN
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"
258  ierr=-100
259  END IF
260 
261 C CORDINATES
262  grid%X=xytrian
263 
264 C UNITS
265  grid%UNIT2SI=1e-2_gridman_dp !CM TO M
266  grid%UNITS='CENTIMETER'
267 C DEFAULT DESCRIPTION
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'
274 
275  IF(gridman_check) THEN
276  CALL gridman_grid2d_check(grid,res,ierr0)
277  IF(res.NE.0.OR.ierr0.GT.0) THEN
278  ierr=100
279  WRITE(gridman_unit,*) "ERROR in GRIDMAN_TRIA2GRID: ",
280  w "the resulting grid is incorrect"
281  GOTO 200
282  END IF
283  END IF
284 
285  IF(gridman_dbg)
286  f WRITE(gridman_unit,*) "GRIDMAN_TRIA2GRID finished"
287  RETURN
288 
289  100 WRITE(gridman_unit,*) "GRIDMAN_TRIA2GRID terminated"
290  200 CALL gridman_grid_deallocate(grid,ierr0)
291  RETURN
292 
293  END SUBROUTINE gridman_tria2grid
294 
295 C**********************************************************************************************
296 C> Convert GRIDMAN_GRID grid object into EIRENE triangular grid
297 C>
298 C> All grid cells must be triangles - this subroutine does not
299 C> do triangulation. For triangulation see \ref GRIDMAN_GRID2D_TRIANG
300 C>
301 C> XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI
302 C> are produced in exactly same format as by GRIDMAN_TRIA_READ.
303 C> Arrays have to be allocated in advance.
304 C>
305 C> ITRI is taken from the 1st cell and edge indices.
306 C> ITRI is not changed if this information is missing.
307 C**********************************************************************************************
308  SUBROUTINE gridman_grid2tria(GRID,XYTRIAN,NECKE,
309  s nchbar,nseite,itri,ierr)
311  u gridman_dp,gridman_sp,
312  u gridman_unit,gridman_dbg,gridman_check
315  IMPLICIT NONE
316  INTRINSIC mod,min
317 C> 2D grid object to be converted into triangular grid
318  TYPE(gridman_grid) :: GRID
319 C> Coordinates of the nodes
320  REAL(GRIDMAN_DP),INTENT(OUT) :: XYTRIAN(2,grid%npoints)
321 C> Indices of nodes for each triangle
322  INTEGER(GRIDMAN_SP),INTENT(OUT) :: NECKE(3,grid%ncells)
323 C> Indices of neigbour cell for each triangle
324  INTEGER(GRIDMAN_SP),INTENT(OUT) :: NCHBAR(3,grid%ncells)
325 C> Indices of sides of neighbours for each triangle
326  INTEGER(GRIDMAN_SP),INTENT(OUT) :: NSEITE(3,grid%ncells)
327 C> Tags from fort.35
328  INTEGER(GRIDMAN_SP),INTENT(OUT) :: ITRI(5,grid%ncells)
329 C> Error code
330  INTEGER,INTENT(OUT) :: IERR
331 
332  TYPE(gridman_indlist) :: CELLS,POINTS
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)
338 
339  IF(gridman_dbg) WRITE(gridman_unit,*) "Starting GRIDMAN_GRID2TRIA"
340 
341  ierr=0
342 
343 C THE GRID MUST BE OF 2D TYPE
344  IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2) THEN
345  ierr=100
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
350  RETURN
351  END IF
352 
353  IF(gridman_check) THEN
354  CALL gridman_grid2d_check(grid,res,ierr)
355  IF(res.NE.0.OR.ierr.GT.0) THEN
356  ierr=100
357  WRITE(gridman_unit,*) "ERROR in GRIDMAN_GRID2TRIA: ",
358  w "the grid is incorrect"
359  RETURN
360  END IF
361  END IF
362 
363  CALL gridman_grid_cells(cells,grid,ierr)
364  IF(ierr.NE.0) GOTO 100
365 
366 C ALL CELLS MUST CONSIST OF EXACTLY 3 EDGES
367  DO icell=1,grid%NCELLS
368  n=cells%ILAST(icell)-cells%IFIRST(icell)
369  IF(n.NE.2) THEN
370  WRITE(gridman_unit,*) "ERROR in GRIDMAN_GRID2TRIA: ",
371  w "cell is not triangle "
372  WRITE(gridman_unit,*) " ICELL, N" ,icell,n+1
373  ierr=100
374  GOTO 200
375  END IF
376  END DO
377 
378 C COORDINATES OF THE CORNERS
379  xytrian=grid%X*grid%UNIT2SI*100_gridman_dp !CONVERT UNITS TO CM
380 
381 C EACH TRIANGLE IS DEFINED IN FORT.34 BY ITS 3 POINTS:
382 C POINT1 POINT2 POINT3
383 C EIRENE ASSUMES THAT SIDE 1 OF THE TRIANGLE LIES BETWEEN POINT1 AND POINT2
384 C SIDE 2 LIES BETWEEN POINT2 AND POINT3 AND
385 C SIDE 2 LIES BETWEEN POINT3 AND POINT1
386 C THOSE SIDE INDECES ARE ASSUMED IN THE LIST OF NEIGHBOURS IN FORT.35
387 C THEN REFERING TO THE SIDE OF THE NEIGHBOURING TRIANGLES
388 C ALSO, EIRENE ASSUMES THAT POINT1 POINT2 POINT3 ARE ARRANGED IN
389 C THE COUNTERCLOCKWISE ORDER
390  CALL gridman_grid2d_chains(grid,points,ierr)
391  IF(ierr.NE.0) GOTO 100
392 
393 C CORNERS OF EACH TRIANGLE
394  DO icell=1,grid%NCELLS
395  i=0
396  DO ie=points%IFIRST(icell),points%ILAST(icell)-1
397  ipoint=points%IND(ie)
398  i=i+1
399  IF(i.GT.3) THEN
400  WRITE(gridman_unit,*) "ERROR in GRIDMAN_GRID2TRIA: ",
401  w "internal erorr - cell has more than 3 points "
402  WRITE(gridman_unit,*) " ICELL" ,icell
403  ierr=400
404  GOTO 200
405  END IF
406  necke(i,icell)=ipoint
407  END DO
408  END DO
409 
410 C CHANGE ORDER OF CORNERS IF THEY ARE NOT IN COUNTERCLOCKWISE ORDER
411  DO icell=1,grid%NCELLS
412  DO i=1,3
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
419  ierr=400
420  GOTO 200
421  END IF
422  x(i)=grid%X(1,ipoint)
423  y(i)=grid%X(2,ipoint)
424  END DO
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))
427  IF(s.LT.0.) THEN
428 C 1 2 3 -> 1 3 2, EXCHANGE 2 and 3
429  itmp=necke(3,icell)
430  necke(3,icell)=necke(2,icell)
431  necke(2,icell)=itmp
432  END IF
433  END DO
434 
435 C TABLE OF NEIGHBOURS
436  indcell=0
437  indside=0
438  DO icell=1,grid%NCELLS
439  DO ie=cells%IFIRST(icell),cells%ILAST(icell)
440  iedge=cells%IND(ie)
441  ipoint1=grid%POINTS(1,iedge)
442  ipoint2=grid%POINTS(2,iedge)
443  iside1=find_side(icell,ipoint1,ipoint2)
444  IF(iside1.LT.1) THEN
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
449  ierr=400
450  GOTO 200
451  END IF
452  icell2=grid%CELLS(1,iedge)
453  IF(icell2.EQ.icell) icell2=grid%CELLS(2,iedge)
454  IF(icell2.LT.1) THEN
455  icell2=0
456  iside2=0
457  ELSE
458  iside2=find_side(icell2,ipoint1,ipoint2)
459  IF(iside2.LT.1) THEN
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
464  ierr=400
465  GOTO 200
466  END IF
467  END IF
468  nchbar(iside1,icell)=icell2
469  nseite(iside1,icell)=iside2
470  indcell(iedge)=icell
471  indside(iedge)=iside1
472  END DO !DO IE=CELLS%IFIRST(ICELL),CELLS%ILAST(ICELL)
473  END DO
474 
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) !IX,IY
481  END IF
482  END DO
483  END IF
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
488  icell=indcell(iedge)
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)
496  END IF
497  END IF
498  END DO
499  END IF
500 
501  CALL gridman_indlist_deallocate(cells,ierr)
502  CALL gridman_indlist_deallocate(points,ierr)
503 
504  IF(gridman_dbg)
505  f WRITE(gridman_unit,*) "GRIDMAN_GRID2TRIA finished"
506 
507  RETURN
508 
509  100 WRITE(gridman_unit,*) "GRIDMAN_GRID2TRIA terminated"
510  200 CALL gridman_indlist_deallocate(cells,ierr0)
511  CALL gridman_indlist_deallocate(points,ierr0)
512 
513  CONTAINS
514 
515 C FIND WHICH SIDE OF TRIANGLE ICELL
516 C CORRESPONDS TO POINTS IPOINT1, IPOINT2
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
521 
522 C EIRENE ASSUMES THAT SIDE 1 OF THE TRIANGLE LIES BETWEEN IP1 AND IP2
523 C SIDE 2 LIES BETWEEN IP2 AND IP3 AND SIDE 3 LIES BETWEEN IP3 AND IP1
524 
525  ip1=necke(1,icell)
526  ip2=necke(2,icell)
527  ip3=necke(3,icell)
528  IF((ipoint1.EQ.ip1.AND.ipoint2.EQ.ip2).OR.
529  f (ipoint1.EQ.ip2.AND.ipoint2.EQ.ip1)) THEN
530  find_side=1
531  ELSE IF((ipoint1.EQ.ip2.AND.ipoint2.EQ.ip3).OR.
532  f (ipoint1.EQ.ip3.AND.ipoint2.EQ.ip2)) THEN
533  find_side=2
534  ELSE IF((ipoint1.EQ.ip3.AND.ipoint2.EQ.ip1).OR.
535  f (ipoint1.EQ.ip1.AND.ipoint2.EQ.ip3)) THEN
536  find_side=3
537  ELSE
538  find_side=0
539  END IF
540  END FUNCTION find_side
541 
542  END SUBROUTINE gridman_grid2tria
543 
544 
545 C**********************************************************************************************
546 C> Read EIRENE triangular grid from fort.33-35, returns GRID object
547 C>
548 C> WARNING: if GRID object elready exists it will be overwritten,
549 C> array ITRI will be re-allocated as well
550 C>
551 C> This subroutine is a shell for GRIDMAN_TRIA_READ_ARRAY
552 C>
553 C> GRIDMAN_TRIA_READ_ARRAY and GRIDMAN_TRIA_READ_GRID
554 C> are combined in the interface GRIDMAN_TRIA_READ
555 C>
556 C**********************************************************************************************
557  SUBROUTINE gridman_tria_read_grid(GRID,FNAMES,IERR)
559  u gridman_dbg,gridman_unit
561  IMPLICIT NONE
562 C> Resulting grid
563  TYPE(gridman_grid) :: GRID
564 C> Strungs with names of three input files
565 C>
566 C> If FNAMES has zero length than standard names are used: fort.33, fort.34, fort.35
567  CHARACTER(*) :: FNAMES(3)
568 C> Error code
569  INTEGER,INTENT(OUT) :: IERR
570 
571  INTEGER(GRIDMAN_SP) :: NRKNOT,NTRII
572  INTEGER :: IS
573  INTEGER(GRIDMAN_SP),ALLOCATABLE :: NECKE(:,:),
574  i nchbar(:,:),nseite(:,:),itri(:,:)
575  REAL(GRIDMAN_DP),ALLOCATABLE :: XYTRIAN(:,:)
576 
577  IF(gridman_dbg)
578  f WRITE(gridman_unit,*) "Starting GRIDMAN_TRIA_READ_GRID"
579 
580  ierr=0
581 
582  CALL gridman_tria_read_array(fnames,nrknot,ntrii,xytrian,
583  s necke,nchbar,nseite,itri,ierr)
584  IF(ierr.NE.0) GOTO 100
585 
586  CALL gridman_tria2grid(grid,nrknot,ntrii,xytrian,necke,
587  s nchbar,nseite,itri,ierr)
588 
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)
594 
595  IF(gridman_dbg)
596  f WRITE(gridman_unit,*) "GRIDMAN_TRIA_READ_GRID finished"
597  RETURN
598 
599  100 WRITE(gridman_unit,*) "GRIDMAN_TRIA_READ_GRID terminated"
600  RETURN
601 
602  END SUBROUTINE gridman_tria_read_grid
603 
604 C**********************************************************************************************
605 C> Write EIRENE triangular grid - defined as GRID object - into fort.33-35
606 C>
607 C> Output of GRIDMAN_TRIA_READ is input of GRIDMAN_TRIA_WRITE
608 C>
609 C> GRIDMAN_TRIA_WRITE_ARRAY and GRIDMAN_TRIA_WRITE_GRID
610 C> are combined in the interface GRIDMAN_TRIA_WRITE
611 C**********************************************************************************************
612  SUBROUTINE gridman_tria_write_grid(GRID,FNAMES,IERR)
614  u gridman_dbg,gridman_unit
616  IMPLICIT NONE
617 C> Grid object to be stored
618  TYPE(gridman_grid) :: GRID
619 C> Strungs with names of three input files
620 C>
621 C> If FNAMES has zero length than standard names are used: fort.33, fort.34, fort.35
622  CHARACTER(*) :: FNAMES(3)
623 C> Error code
624  INTEGER,INTENT(OUT) :: IERR
625 
626  INTEGER(GRIDMAN_SP) :: NRKNOT,NTRII
627  INTEGER :: IS
628  INTEGER(GRIDMAN_SP),ALLOCATABLE :: NECKE(:,:),NCHBAR(:,:),
629  i nseite(:,:),itri(:,:)
630  REAL(GRIDMAN_DP),ALLOCATABLE :: XYTRIAN(:,:)
631 
632  IF(gridman_dbg)
633  f WRITE(gridman_unit,*) "Starting GRIDMAN_TRIA_WRITE_GRID"
634 
635  ntrii=grid%NCELLS
636  nrknot=grid%NPOINTS
637  ALLOCATE(xytrian(2,nrknot),necke(3,ntrii),
638  a nchbar(3,ntrii),nseite(3,ntrii),
639  a itri(5,ntrii),stat=is)
640  IF(is.NE.0) THEN
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
644  ierr=200
645  CALL deallocate_all()
646  RETURN
647  END IF
648  itri=0
649  CALL gridman_grid2tria(grid,xytrian,necke,
650  s nchbar,nseite,itri,ierr)
651  IF(ierr.NE.0) THEN
652  CALL deallocate_all()
653  WRITE(gridman_unit,*) "GRIDMAN_TRIA_WRITE_GRID terminated"
654  RETURN
655  END IF
656  CALL gridman_tria_write_array(fnames,nrknot,ntrii,xytrian,
657  s necke,nchbar,nseite,itri,ierr)
658  CALL deallocate_all()
659 
660  IF(ierr.NE.0) THEN
661  WRITE(gridman_unit,*) "GRIDMAN_TRIA_WRITE_GRID terminated"
662  RETURN
663  END IF
664 
665  IF(gridman_dbg)
666  f WRITE(gridman_unit,*) "GRIDMAN_TRIA_WRITE_GRID finished"
667 
668  CONTAINS
669 C
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
677 
678  END SUBROUTINE gridman_tria_write_grid
integer, parameter, public gridman_dp
Kind parameter for real numbers.
Definition: gridman.f:93
Explicit interfaces to GRIDMAN subroutines and functions.
Definition: gridman.f:251
subroutine gridman_grid_allocate(GRID, TYPE, NEDGES, NPOINTS, NCELLS, IERR, NEDGEINDEX, NCELLINDEX)
Allocate GRIDMAN_GRID object.
Definition: grid1.f:30
subroutine gridman_grid2d_chains(GRID, CHAINS, IERR)
Find closed chain of points which form each cell.
Definition: grid2d.f:266
subroutine gridman_grid_cells(EDGES, GRID, IERR)
Create a list of edges which belong to each cell.
Definition: grid2.f:177
subroutine gridman_grid2d_check(GRID, RES, IERR)
Check correctness of the 2D grid object.
Definition: grid2d.f:37
subroutine gridman_indlist_deallocate(INDLIST, IERR)
Deallocate list of indices.
Definition: indlist.f:106
subroutine gridman_tria_read_grid(GRID, FNAMES, IERR)
Read EIRENE triangular grid from fort.33-35, returns GRID object.
Definition: tria.f:558
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_tria_write_array(FNAMES, NRKNOT, NTRII, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Write EIRENE triangular grid - defined as set of arrays - into fort.33-35.
Definition: tria.f:270
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
subroutine gridman_index_allocate(INDEX, NINDEX, NELEMENTS, IERR)
Allocate index object.
Definition: index.f:28
subroutine gridman_tria_write_grid(GRID, FNAMES, IERR)
Write EIRENE triangular grid - defined as GRID object - into fort.33-35.
Definition: tria.f:613
Data-type which describes lists of elements with variable number of indices for each element...
Definition: gridman.f:225
Definition of data types, global constants and variables.
Definition: gridman.f:83
subroutine gridman_index_deallocate(INDEX, IERR)
Allocate index object.
Definition: index.f:98
integer, parameter, public gridman_sp
Kind parameter for integer numbers.
Definition: gridman.f:95
subroutine gridman_tria_read_array(FNAMES, NRKNOT, NTRII, XYTRIAN, NECKE, NCHBAR, NSEITE, ITRI, IERR)
Read EIRENE triangular grid from fort.33-35, return set of arrays.
Definition: tria.f:38