GRIDMAN
grid managment library
mergegrid.f
Go to the documentation of this file.
1 C> @file apps/mergegrid.f
2 C> Combine two grids onto one.
3 C>
4 C> Based on GRIDMAN library
5 C Author: Vladislav Kotov, v.kotov@fz-juelich.de
6 
7 ! Copyright (c) 2017 Forschungszentrum Juelich GmbH
8 ! Vladislav Kotov
9 !
10 ! This file is part of GRIDMAN.
11 !
12 ! GRIDMAN is free software: you can redistribute it and/or modify
13 ! it under the terms of the GNU General Public License as published by
14 ! the Free Software Foundation, either version 3 of the License, or
15 ! (at your option) any later version.
16 !
17 ! GRIDMAN is distributed in the hope that it will be useful,
18 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ! GNU General Public License for more details.
21 !
22 ! You should have received a copy of the GNU General Public License
23 ! along with GRIDMAN. If not, see <http://www.gnu.org/licenses/>.
24 
25 C***************************************************************************************
26 C> Marging two grids, main program
27 C>
28 C> Usage ./mergegrid < mergegrid.parameters (namelist initialization)
29 C> Input parameters are described in mergegrid.parameters.description
30 C***************************************************************************************
31  PROGRAM mergegrid
33  u gridman_dbg,gridman_unit,gridman_check
34  IMPLICIT NONE
35  INTRINSIC len_trim,get_command_argument,adjustl,trim
36 C
37  INTERFACE
38  SUBROUTINE mergegrid_read(GRID1_IN,GRID2_IN,
39  c grid1,grid2)
40  USE gridman,ONLY:gridman_grid
41  CHARACTER(LEN=256) :: GRID1_IN,GRID2_IN
42  TYPE(gridman_grid) :: GRID1,GRID2
43  END SUBROUTINE mergegrid_read
44 C
45  SUBROUTINE mergegrid_merge(GRID1,GRID2,MTOL,GRID3)
47  TYPE(gridman_grid) :: GRID1,GRID2
48  REAL(GRIDMAN_DP) :: MTOL
49  TYPE(gridman_grid) :: GRID3
50  END SUBROUTINE mergegrid_merge
51 C
52  SUBROUTINE mergegrid_combine(GRID1,GRID2,GRID3)
53  USE gridman,ONLY:gridman_grid
54  TYPE(gridman_grid) :: GRID1,GRID2
55  TYPE(gridman_grid) :: GRID3
56  END SUBROUTINE mergegrid_combine
57 C
58  SUBROUTINE mergegrid_write(GRID3_OUT,GRID3)
59  USE gridman,ONLY:gridman_grid
60  CHARACTER(LEN=256) :: GRID3_OUT
61  TYPE(gridman_grid) :: GRID3
62  END SUBROUTINE mergegrid_write
63  END INTERFACE
64 C INPUT PARAMETERS
65  CHARACTER(LEN=256) :: GRID1_IN,GRID2_IN,GRID3_OUT
66  LOGICAL :: DBGMOD,LCHECK
67  REAL(GRIDMAN_DP) :: MTOL
68 C LOCAL PARAMETERS
69  TYPE(gridman_grid) :: GRID1,GRID2,GRID3
70  CHARACTER(LEN=8) :: FTMP
71 
72  CALL get_command_argument(1,ftmp)
73  IF(len_trim(ftmp).GT.0) THEN
74  IF(adjustl(trim(ftmp)).EQ.'help') THEN
75  CALL print_description
76  stop
77  END IF
78  ELSE
79 C 1. READ INPUT FROM NAMELIST
80  CALL read_input
81  END IF
82 
83 C
84 C 2. READ INPUT
85 C
86  CALL mergegrid_read(grid1_in,grid2_in,grid1,grid2)
87 
88 C
89 C 3. MERGE GRIDS
90 C
91  WRITE(gridman_unit,*) "MERGEGRID: merging grids"
92  CALL mergegrid_merge(grid1,grid2,mtol,grid3)
93 C
94 C 4. OUTPUT
95 C
96  CALL mergegrid_write(grid3_out,grid3)
97 
98  WRITE(gridman_unit,*) "MERGEGRID COMPLETED"
99 
100  CONTAINS
101 
102 C********************************************************************
103 C Read namelist from standard input
104 C********************************************************************
105  SUBROUTINE read_input
106  namelist /mergegrid/ grid1_in,grid2_in,grid3_out,
107  c dbgmod,lcheck,mtol
108  INTEGER :: IO
109 
110  grid1_in=''
111  grid2_in=''
112  grid3_out=''
113  dbgmod=.false.
114  lcheck=.false.
115  mtol=1e-5
116 
117  rewind(5)
118  READ(5,nml=mergegrid,iostat=io)
119  IF(io.NE.0)
120  f CALL mergegrid_error("can not read namelist MERGEGRID")
121 
122  gridman_dbg=dbgmod
123  gridman_check=lcheck
124 
125  IF(gridman_dbg)
126  w WRITE(gridman_unit,*) "MERGE_GRID: READ_INPUT finished"
127 
128  END SUBROUTINE read_input
129 
130 C
131  SUBROUTINE print_description
132  INTRINSIC index,len,trim
133  INTEGER,PARAMETER :: FILE_LENGTH=1024
134  CHARACTER(LEN=FILE_LENGTH) :: PATH
135  CHARACTER(LEN=128) :: STR
136  INTEGER :: I,IO
137  CALL get_command_argument(0,path)
138  i=index(path,'/',.true.)
139  IF(i.GT.len(path)) THEN
140  path=''
141  ELSE
142  path=path(1:i)
143  END IF
144 
145  IF(gridman_dbg) WRITE(gridman_unit,*) " PATH:",trim(path)
146 
147  OPEN(unit=3,file=trim(path)//'mergegrid.parameters.description',
148  o status='OLD',iostat=io)
149  IF(io.NE.0) GOTO 100
150 
151  DO
152  READ(3,'(A)',iostat=io,end=200) str
153  IF(io.NE.0) GOTO 200
154  WRITE(*,*) trim(str)
155  END DO
156  200 RETURN
157 
158  100 WRITE(gridman_unit,*)
159  w "Could not find mergegridg.parameters.description",
160  w trim(path)
161  WRITE(gridman_unit,*)
162  w "Use 'which mergegrid' to invoke via the full path"
163 
164  END SUBROUTINE print_description
165  END PROGRAM mergegrid
166 
167 C********************************************************************
168 C Read grids and mappings
169 C********************************************************************
170  SUBROUTINE mergegrid_read(GRID1_IN,GRID2_IN,GRID1,GRID2)
171  USE gridman
172  USE gridman_lib
173  IMPLICIT NONE
174  INTRINSIC len_trim
175 C INPUT PARAMETERS
176  CHARACTER(LEN=256) :: GRID1_IN,GRID2_IN
177 C OUTPUT PARAMETERS
178  TYPE(gridman_grid) :: GRID1,GRID2
179 C LOCAL PARAMETERS
180  INTEGER :: LT,IERR
181 
182  IF(gridman_dbg)
183  w WRITE(gridman_unit,*) "MERGEGRID: starting MERGEGRID_READ"
184 
185  lt=len_trim(grid1_in)
186  IF(lt.GT.0) THEN
187  WRITE(gridman_unit,*) "MERGEGRID: reading file ",grid1_in(1:lt)
188  CALL gridman_grid_read(grid1,grid1_in,ierr)
189  IF(ierr.NE.0) CALL mergegrid_error('')
190  ELSE
191  CALL mergegrid_error('1st grid is not defined')
192  END IF
193  lt=len_trim(grid2_in)
194  IF(lt.GT.0) THEN
195  WRITE(gridman_unit,*) "MERGEGRID: reading file ",grid2_in(1:lt)
196  CALL gridman_grid_read(grid2,grid2_in,ierr)
197  IF(ierr.NE.0) CALL mergegrid_error('')
198  ELSE
199  CALL mergegrid_error('2nd grid is not defined')
200  END IF
201 
202  IF(gridman_dbg)
203  w WRITE(gridman_unit,*) "MERGEGRID: MERGEGRID_READ finished"
204 
205  END SUBROUTINE mergegrid_read
206 
207 
208 C***************************************************************************************
209 C Merge grids
210 C***************************************************************************************
211  SUBROUTINE mergegrid_merge(GRID1,GRID2,MTOL,GRID3)
213  u gridman_dbg,gridman_unit,gridman_check
215  IMPLICIT NONE
216 C INPUT PARAMETERS
217  TYPE(gridman_grid) :: GRID1,GRID2
218  REAL(GRIDMAN_DP) :: MTOL
219 C OUTPUT PARAMETERS
220  TYPE(gridman_grid) :: GRID3
221 C LOCAL PARAMETERS
222  INTEGER :: IERR
223  LOGICAL :: LCHECK
224 
225  IF(gridman_dbg)
226  w WRITE(gridman_unit,*) "MERGEGRID: starting MERGEGRID_MERGE"
227 
228  lcheck=gridman_check
229  gridman_check=.true.
230  CALL gridman_grid2d_merge(grid3,grid1,grid2,mtol,ierr)
231  IF(ierr.EQ.400) WRITE(gridman_unit,*)
232  w "You may try to increase or decrease parameter MTOL ",mtol
233  IF(ierr.NE.0) CALL mergegrid_error('')
234  gridman_check=lcheck
235 
236  IF(gridman_dbg)
237  w WRITE(gridman_unit,*) "MERGEGRID: MERGEGRID_MERGE finished"
238 
239  END SUBROUTINE mergegrid_merge
240 
241 C***************************************************************************************
242 C Writing requested output
243 C***************************************************************************************
244  SUBROUTINE mergegrid_write(GRID3_OUT,GRID3)
246  USE gridman_lib,ONLY:gridman_grid_write
247  IMPLICIT NONE
248  INTRINSIC len_trim
249 C INPUT PARAMETERS
250  CHARACTER(LEN=256) :: GRID3_OUT
251  TYPE(gridman_grid) :: GRID3
252 
253 C LOCAL PARAMETERS
254  INTEGER :: LT,IERR
255 
256  IF(gridman_dbg)
257  w WRITE(gridman_unit,*) "MERGEGRID: starting MERGEGRID_WRITE"
258 
259  lt=len_trim(grid3_out)
260  IF(lt.GT.0) THEN
261  WRITE(gridman_unit,*) "MERGEGRID: writing file ",grid3_out(1:lt)
262  CALL gridman_grid_write(grid3,grid3_out,ierr)
263  IF(ierr.NE.0) CALL mergegrid_error('')
264  END IF
265 
266  IF(gridman_dbg)
267  w WRITE(gridman_unit,*) "MERGEGRID: starting MERGEGRID_FINISHED"
268 
269  END SUBROUTINE mergegrid_write
270 
271 C***************************************************************************************
272 C Print error message and exit
273 C***************************************************************************************
274  SUBROUTINE mergegrid_error(STR)
275  USE gridman,ONLY:gridman_unit
276  IMPLICIT NONE
277  CHARACTER(*),INTENT(IN) :: STR
278  INTEGER :: LT
279  INTRINSIC len_trim
280  lt=len_trim(str)
281  IF(lt.GT.0)
282  w WRITE(gridman_unit,*) "ERROR in MERGEGRID: "//str(1:lt)
283  stop "ERROR in MERGEGRID - see log output"
284  END SUBROUTINE mergegrid_error
program mergegrid
Marging two grids, main program.
Definition: mergegrid.f:31
integer, save, public gridman_unit
Index of the standard output unit.
Definition: gridman.f:116
subroutine gridman_grid2d_merge(GRID, GRID1, GRID2, TOL, IERR)
Merge two 2D grids by connecting their boundary edges.
Definition: merge.f:39
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
Data-type which describes a grid as a set of edges, methods in grid.f.
Definition: gridman.f:168
logical, save, public gridman_dbg
Switch for debugging mode.
Definition: gridman.f:122
subroutine print_description
Print manual.
Definition: convgrid.f:690
Definition of data types, global constants and variables.
Definition: gridman.f:83