GRIDMAN
grid managment library
addsurf.f
Go to the documentation of this file.
1 C> @file convert/addsurf.f
2 C> Converters of EIRENE Additional Surfaces into GRIDMAN_GRID object
3 
4 ! Copyright (c) 2017 Forschungszentrum Juelich GmbH
5 ! Vladislav Kotov
6 !
7 ! This file is part of GRIDMAN.
8 !
9 ! GRIDMAN is free software: you can redistribute it and/or modify
10 ! it under the terms of the GNU General Public License as published by
11 ! the Free Software Foundation, either version 3 of the License, or
12 ! (at your option) any later version.
13 !
14 ! GRIDMAN is distributed in the hope that it will be useful,
15 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ! GNU General Public License for more details.
18 !
19 ! You should have received a copy of the GNU General Public License
20 ! along with GRIDMAN. If not, see <http://www.gnu.org/licenses/>.
21 
22 C**********************************************************************************************
23 C> Convert planar EIRENE Additional Surfaces into grid object
24 C>
25 C> WARNING: grid object which already exists will be overwritten!
26 C>
27 C> 1st edge index GRID%EDGEINDEX(1) contains indices of Additional Surfaces
28 C> from the EIRENE input file
29 C**********************************************************************************************
30  SUBROUTINE gridman_addsurf2grid_2d(GRID,NSURF,X,Y,ISRF,IERR)
32  u gridman_dbg,gridman_unit,gridman_check
36  IMPLICIT NONE
37 C> Resulting grid object
38  TYPE(gridman_grid) :: GRID
39 C> Number of edges
40  INTEGER(GRIDMAN_SP),INTENT(IN) :: NSURF
41 C> X-coordinates of the edge vertices
42  REAL(GRIDMAN_DP),INTENT(IN) :: X(2,nsurf)
43 C> Y-coordinates of the edge vertices
44  REAL(GRIDMAN_DP),INTENT(IN) :: Y(2,nsurf)
45 C> Indices of EIRENE additional surfaces
46  INTEGER(GRIDMAN_SP),INTENT(IN) :: ISRF(nsurf)
47 C> Error code
48  INTEGER,INTENT(OUT) :: IERR
49 
50  INTEGER(GRIDMAN_SP) :: I
51  INTEGER :: RES,IERR0
52 
53  IF(gridman_dbg)
54  f WRITE(gridman_unit,*) "Starting GRIDMAN_ADDSURF2GRID_2D"
55 
56  ierr=0
57 
58  IF(nsurf.LT.1) THEN
59  WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_2D: ",
60  w "incorrect number of edges"
61  WRITE(gridman_unit,*) " NSURF ",nsurf
62  ierr=100
63  RETURN
64  END IF
65 
66  CALL gridman_grid_allocate(grid,2,nsurf,2*nsurf,
67  c 0_gridman_sp,ierr,1,0)
68  IF(ierr.NE.0) GOTO 100
69  CALL gridman_index_allocate(grid%EDGEINDEX(1),1,nsurf,ierr)
70  IF(ierr.NE.0) GOTO 200
71 
72  grid%CELLS=0
73  DO i=1,nsurf
74  grid%POINTS(1,i)=2*i-1 !2*(I-1)+1
75  grid%POINTS(2,i)=2*i !2*(I-1)+2
76  grid%X(1,2*i-1)=x(1,i)
77  grid%X(2,2*i-1)=y(1,i)
78  grid%X(1,2*i)=x(2,i)
79  grid%X(2,2*i)=y(2,i)
80  grid%EDGEINDEX(1)%INDEXES(0,i)=i
81  grid%EDGEINDEX(1)%INDEXES(1,i)=isrf(i)
82  END DO
83 
84 C UNITS
85  grid%UNIT2SI=1e-2_gridman_dp
86  grid%UNITS='CENTIMETER'
87 C DEFAULT DESCRIPTION
88  grid%DESCRIPTION='EIRENE planar Additional Surfaces'
89  grid%EDGEINDEX(1)%DESCRIPTION="Index of EIRENE Additional Surface"
90  grid%EDGEINDEX(1)%COLUMNS(1)='EIRENE_ADDSURF'
91 
92  IF(gridman_check) THEN
93  CALL gridman_grid2d_check(grid,res,ierr)
94  IF(res.NE.0.OR.ierr.GT.0) THEN
95  ierr=100
96  WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_2D: ",
97  w "the resulting grid is incorrect"
98  CALL gridman_grid_deallocate(grid,ierr0)
99  END IF
100  END IF
101 
102  IF(gridman_dbg)
103  f WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2GRID_2D finished"
104 
105  RETURN
106  100 WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2GRID_2D terminated"
107  RETURN
108  200 WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_2D: ",
109  w "cannot allocate edge index"
110  CALL gridman_grid_deallocate(grid,ierr0)
111  RETURN
112 
113  END SUBROUTINE gridman_addsurf2grid_2d
114 
115 C**********************************************************************************************
116 C> Read planar EIRENE Additional Surfaces and convert them into (2D) grid object
117 C>
118 C> WARNING: grid object which already exists will be overwritten!
119 C>
120 C> GRIDMAN_ADDSURF2D_READ_ARRAY and GRIDMAN_ADDSURF2D_READ_GRID
121 C> are combined in the interface GRIDMAN_ADDSURF2D_READ
122 C>
123 C> 1st edge index GRID%EDGEINDEX(1) contains indices of Additional Surfaces
124 C> from the EIRENE input file
125 C>
126 C**********************************************************************************************
127  SUBROUTINE gridman_addsurf2d_read_grid(GRID,FNAME,IERR)
129  u gridman_dbg,gridman_unit
132  IMPLICIT NONE
133 C> Resulting grid object
134  TYPE(gridman_grid) :: GRID
135 C> String containing the name of input file
136  CHARACTER(*),INTENT(IN) :: FNAME
137 C> Error code
138  INTEGER,INTENT(OUT) :: IERR
139 
140  INTEGER(GRIDMAN_SP) :: NSURF
141  INTEGER :: ST
142  INTEGER(GRIDMAN_SP),ALLOCATABLE :: ISRF(:)
143  REAL(GRIDMAN_DP),ALLOCATABLE :: X(:,:),Y(:,:)
144 
145  IF(gridman_dbg)
146  f WRITE(gridman_unit,*) "Starting GRIDMAN_ADDSURF2D_READ_GRID"
147 
148  ierr=0
149 
150  CALL gridman_addsurf2d_read_array(fname,nsurf,x,y,isrf,ierr)
151  IF(ierr.NE.0) GOTO 100
152 
153  CALL gridman_addsurf2grid_2d(grid,nsurf,x,y,isrf,ierr)
154  IF(ierr.NE.0) GOTO 100
155 
156  IF(ALLOCATED(x)) DEALLOCATE(x,stat=st)
157  IF(ALLOCATED(y)) DEALLOCATE(y,stat=st)
158  IF(ALLOCATED(isrf)) DEALLOCATE(isrf,stat=st)
159 
160  IF(gridman_dbg)
161  f WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2D_READ_GRID finished"
162 
163  RETURN
164 
165  100 WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2D_READ_GRID terminated"
166  IF(ALLOCATED(x)) DEALLOCATE(x,stat=st)
167  IF(ALLOCATED(y)) DEALLOCATE(y,stat=st)
168  IF(ALLOCATED(isrf)) DEALLOCATE(isrf,stat=st)
169 
170  END SUBROUTINE gridman_addsurf2d_read_grid
171 
172 C**********************************************************************************************
173 C> Convert triangular elements (EIRENE additional surfaces) into (3D) grid object
174 C>
175 C> WARNING: grid object which already exists will be overwritten!
176 C>
177 C> 1st edge index GRID%EDGEINDEX(1) contains indices of Additional Surfaces
178 C> from the EIRENE input file
179 C**********************************************************************************************
180  SUBROUTINE gridman_addsurf2grid_3d(GRID,NSURF,X,Y,Z,ISRF,IERR)
182  u gridman_dbg,gridman_unit,gridman_check
185  IMPLICIT NONE
186 C> Resulting grid object
187  TYPE(gridman_grid) :: GRID
188 C> Number of edges
189  INTEGER(GRIDMAN_SP),INTENT(IN) :: NSURF
190 C> X-coordinates of the triangle vertices
191  REAL(GRIDMAN_DP),INTENT(IN) :: X(3,nsurf)
192 C> Y-coordinates of the triangle vertices
193  REAL(GRIDMAN_DP),INTENT(IN) :: Y(3,nsurf)
194 C> Z-coordinates of the triangle vertices
195  REAL(GRIDMAN_DP),INTENT(IN) :: Z(3,nsurf)
196 C> Indices of EIRENE additional surfaces
197  INTEGER(GRIDMAN_SP),INTENT(IN) :: ISRF(nsurf)
198 C> Error code
199  INTEGER,INTENT(OUT) :: IERR
200 
201  INTEGER(GRIDMAN_SP) :: I
202  INTEGER :: RES,IERR0
203 
204  IF(gridman_dbg)
205  f WRITE(gridman_unit,*) "Starting GRIDMAN_ADDSURF2GRID_3D"
206 
207  ierr=0
208 
209  IF(nsurf.LT.1) THEN
210  WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_3D: ",
211  w "incorrect number of edges"
212  WRITE(gridman_unit,*) " NSURF ",nsurf
213  ierr=100
214  RETURN
215  END IF
216 
217  CALL gridman_grid_allocate(grid,3,nsurf,3*nsurf,
218  a 0_gridman_sp,ierr,1,0)
219  IF(ierr.NE.0) GOTO 100
220  CALL gridman_index_allocate(grid%EDGEINDEX(1),1,nsurf,ierr)
221  IF(ierr.NE.0) GOTO 200
222 
223  grid%CELLS=0
224  DO i=1,nsurf
225  grid%POINTS(1,i)=3*i-2 !3*(I-1)+1
226  grid%POINTS(2,i)=3*i-1 !3*(I-1)+2
227  grid%POINTS(3,i)=3*i
228  grid%X(1,3*i-2)=x(1,i)
229  grid%X(2,3*i-2)=y(1,i)
230  grid%X(3,3*i-2)=z(1,i)
231  grid%X(1,3*i-1)=x(2,i)
232  grid%X(2,3*i-1)=y(2,i)
233  grid%X(3,3*i-1)=z(2,i)
234  grid%X(1,3*i)=x(3,i)
235  grid%X(2,3*i)=y(3,i)
236  grid%X(3,3*i)=z(3,i)
237  grid%EDGEINDEX(1)%INDEXES(0,i)=i
238  grid%EDGEINDEX(1)%INDEXES(1,i)=isrf(i)
239  END DO
240 
241 C UNITS
242  grid%UNIT2SI=1e-2_gridman_dp
243  grid%UNITS='CENIMETER'
244 C DEFAULT DESCRIPTINON
245  grid%DESCRIPTION='EIRENE triangular Additional Surfaces'
246  grid%EDGEINDEX(1)%DESCRIPTION="Index of EIRENE Additional Surface"
247  grid%EDGEINDEX(1)%COLUMNS(1)='EIRENE_ADDSURF'
248 
249  IF(gridman_check) THEN
250  CALL gridman_grid_check(grid,res,ierr)
251  IF(res.NE.0.OR.ierr.GT.0) THEN
252  ierr=100
253  WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_3D: ",
254  w "the resulting grid is incorrect"
255  CALL gridman_grid_deallocate(grid,ierr0)
256  END IF
257  END IF
258 
259  IF(gridman_dbg)
260  f WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2GRID_3D finished"
261 
262  RETURN
263  100 WRITE(gridman_unit,*) "GRIDMAN_ADDSURF2GRID_3D terminated"
264  RETURN
265  200 WRITE(gridman_unit,*) "ERROR in GRIDMAN_ADDSURF2GRID_3D: ",
266  w "cannot allocate edge index"
267  CALL gridman_grid_deallocate(grid,ierr0)
268  RETURN
269 
270  END SUBROUTINE gridman_addsurf2grid_3d
271 
272 C**********************************************************************************************
273 C> Read triangular EIRENE Additional Surfaces and convert them into (3D) grid object
274 C>
275 C> WARNING: grid object which already exists will be overwritten!
276 C>
277 C> GRIDMAN_ADDSURF3D_READ_ARRAY and GRIDMAN_ADDSURF3D_READ_GRID
278 C> are combined in the interface GRIDMAN_ADDSURF3D_READ
279 C>
280 C> 1st edge index GRID%EDGEINDEX(1) contains indices of Additional Surfaces
281 C> from the EIRENE input file
282 C**********************************************************************************************
283  SUBROUTINE gridman_addsurf3d_read_grid(GRID,FNAME,IERR)
285  u gridman_dbg,gridman_unit
288  IMPLICIT NONE
289 C> Resulting grid object
290  TYPE(gridman_grid) :: GRID
291 C> String containing the name of input file
292  CHARACTER(*),INTENT(IN) :: FNAME
293 C> Error code
294  INTEGER,INTENT(OUT) :: IERR
295 
296  INTEGER(GRIDMAN_SP) :: NSURF
297  INTEGER :: ST
298  INTEGER(GRIDMAN_SP) ,ALLOCATABLE :: ISRF(:)
299  REAL(GRIDMAN_DP),ALLOCATABLE :: X(:,:),Y(:,:),Z(:,:)
300 
301  IF(gridman_dbg)
302  f WRITE(gridman_unit,*) "Starting GRIDMAN_ADDSURF3D_READ_GRID"
303 
304  ierr=0
305 
306  CALL gridman_addsurf3d_read_array(fname,nsurf,x,y,z,isrf,ierr)
307  IF(ierr.NE.0) GOTO 100
308 
309  CALL gridman_addsurf2grid_3d(grid,nsurf,x,y,z,isrf,ierr)
310  IF(ierr.NE.0) GOTO 100
311 
312  IF(ALLOCATED(x)) DEALLOCATE(x,stat=st)
313  IF(ALLOCATED(y)) DEALLOCATE(y,stat=st)
314  IF(ALLOCATED(z)) DEALLOCATE(z,stat=st)
315  IF(ALLOCATED(isrf)) DEALLOCATE(isrf,stat=st)
316 
317  IF(gridman_dbg)
318  f WRITE(gridman_unit,*) "GRIDMAN_ADDSURF3D_READ_GRID finished"
319 
320  RETURN
321 
322  100 WRITE(gridman_unit,*) "GRIDMAN_ADDSURF3D_READ_GRID terminated"
323  IF(ALLOCATED(x)) DEALLOCATE(x,stat=st)
324  IF(ALLOCATED(y)) DEALLOCATE(y,stat=st)
325  IF(ALLOCATED(z)) DEALLOCATE(z,stat=st)
326  IF(ALLOCATED(isrf)) DEALLOCATE(isrf,stat=st)
327 
328  END SUBROUTINE gridman_addsurf3d_read_grid
subroutine gridman_grid_check(GRID, RES, IERR)
Check consistency of the grid data.
Definition: grid1.f:289
integer, parameter, public gridman_dp
Kind parameter for real numbers.
Definition: gridman.f:93
subroutine gridman_addsurf2d_read_grid(GRID, FNAME, IERR)
Read planar EIRENE Additional Surfaces and convert them into (2D) grid object.
Definition: addsurf.f:128
Explicit interfaces to GRIDMAN subroutines and functions.
Definition: gridman.f:251
subroutine gridman_addsurf2grid_2d(GRID, NSURF, X, Y, ISRF, IERR)
Convert planar EIRENE Additional Surfaces into grid object.
Definition: addsurf.f:31
subroutine gridman_grid_allocate(GRID, TYPE, NEDGES, NPOINTS, NCELLS, IERR, NEDGEINDEX, NCELLINDEX)
Allocate GRIDMAN_GRID object.
Definition: grid1.f:30
subroutine gridman_grid2d_check(GRID, RES, IERR)
Check correctness of the 2D grid object.
Definition: grid2d.f:37
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
subroutine gridman_index_allocate(INDEX, NINDEX, NELEMENTS, IERR)
Allocate index object.
Definition: index.f:28
subroutine gridman_addsurf3d_read_grid(GRID, FNAME, IERR)
Read triangular EIRENE Additional Surfaces and convert them into (3D) grid object.
Definition: addsurf.f:284
subroutine gridman_addsurf2grid_3d(GRID, NSURF, X, Y, Z, ISRF, IERR)
Convert triangular elements (EIRENE additional surfaces) into (3D) grid object.
Definition: addsurf.f:181
subroutine gridman_addsurf2d_read_array(FNAME, NSURF, X, Y, ISRF, IERR)
Read planar (2D) Additional Surfaces from EIRENE input file.
Definition: addsurf.f:37
Definition of data types, global constants and variables.
Definition: gridman.f:83
subroutine gridman_addsurf3d_read_array(FNAME, NSURF, X, Y, Z, ISRF, IERR)
Read triangular Additional Surfaces (3.0<=RLBND<4) from EIRENE input file.
Definition: addsurf.f:237
integer, parameter, public gridman_sp
Kind parameter for integer numbers.
Definition: gridman.f:95