34 INTEGER,
PARAMETER :: file_length=1024
40 u gridman_unit,gridman_dbg
44 INTRINSIC len_trim,get_command_argument
47 SUBROUTINE convgrid_read(INPUTMOD,
48 c grid_in,sonnet_in,fort30_in,
49 c fort33_in,fort34_in,fort35_in,
50 c eirene_in,template_in,
54 INTEGER,
INTENT(IN) :: inputmod
55 CHARACTER(LEN=FILE_LENGTH),
INTENT(IN) ::
56 c grid_in,sonnet_in,fort30_in,
57 c fort33_in,fort34_in,fort35_in,
58 c eirene_in,template_in
59 LOGICAL,
INTENT(IN) :: leirene
60 INTEGER,
INTENT(IN) :: rlbnd
62 END SUBROUTINE convgrid_read
64 SUBROUTINE convgrid_indexes(GRID,IEIND,ICIND)
67 INTEGER,
INTENT(IN) :: ieind,icind
68 END SUBROUTINE convgrid_indexes
70 SUBROUTINE convgrid_exclude(NEXCLUDE,IXE,IYE,GRID)
72 INTEGER(GRIDMAN_SP),
INTENT(IN) :: nexclude
73 INTEGER(GRIDMAN_SP),
INTENT(IN) :: ixe(2,nexclude),iye(2,nexclude)
75 END SUBROUTINE convgrid_exclude
77 SUBROUTINE convgrid_triang(GRID)
80 END SUBROUTINE convgrid_triang
82 SUBROUTINE convgrid_output(VTK_OUT,GRID_OUT,
83 s fort33_out,fort34_out,fort35_out,
87 CHARACTER(LEN=FILE_LENGTH),
INTENT(IN) :: vtk_out,grid_out,
88 c fort33_out,fort34_out,fort35_out,template_out
90 END SUBROUTINE convgrid_output
95 INTEGER,
PARAMETER :: nexclude_max=100
96 CHARACTER(LEN=FILE_LENGTH) ::
97 c grid_in,sonnet_in,fort30_in,
98 c fort33_in,fort34_in,fort35_in,
99 c eirene_in,template_in,
100 c vtk_out,grid_out,template_out,
101 c fort33_out,fort34_out,fort35_out
102 CHARACTER(LEN=256) :: description
103 LOGICAL :: leirene,triangulate,dbgmod,lcheck
104 INTEGER(GRIDMAN_SP) :: nexclude,
105 i ixe(2,nexclude_max),iye(2,nexclude_max)
106 INTEGER :: rlbnd,ieind,icind
107 REAL(GRIDMAN_DP) :: fscale
108 CHARACTER(LEN=256) :: units
110 INTEGER :: ierr,inputmod
112 REAL(GRIDMAN_DP) :: ft
113 CHARACTER(LEN=FILE_LENGTH) :: ftmp
123 CALL get_command_argument(1,ftmp)
124 IF(len_trim(ftmp).GT.0)
THEN
125 IF(adjustl(trim(ftmp)).EQ.
'help')
THEN
129 CALL set_input(grid_in,sonnet_in,fort30_in,
130 c fort33_in,fort34_in,fort35_in,
131 c eirene_in,template_in,
132 c vtk_out,template_out,rlbnd,lmeta)
141 inputmod=find_input_mode()
146 CALL convgrid_read(inputmod,
147 c grid_in,sonnet_in,fort30_in,
148 c fort33_in,fort34_in,fort35_in,
149 c eirene_in,template_in,leirene,rlbnd,
154 CALL gridman_grid_metadata(grid,gridman_unit,ierr)
156 WRITE(gridman_unit,*)
"CONVGRID COMPLETED"
163 IF(ieind.GE.0.OR.icind.GE.0)
THEN
164 WRITE(gridman_unit,*)
"CONVGRID: selecting indexes"
165 CALL convgrid_indexes(grid,ieind,icind)
171 IF(nexclude.GT.0)
THEN
172 WRITE(gridman_unit,*)
"CONVGRID: eliminating cells"
173 CALL convgrid_exclude(nexclude,ixe,iye,grid)
178 IF(triangulate.AND.inputmod.NE.4.AND.
179 f grid%NCELLS.GT.0)
THEN
180 WRITE(gridman_unit,*)
"CONVGRID: triangulate"
181 CALL convgrid_triang(grid)
186 IF(len_trim(description).GT.0) grid%DESCRIPTION=description
187 IF(fscale.GT.0.)
THEN
188 WRITE(gridman_unit,*)
"CONVGRID: translating units"
189 ft=grid%UNIT2SI/fscale
197 CALL convgrid_output(vtk_out,grid_out,
198 s fort33_out,fort34_out,fort35_out,
204 WRITE(gridman_unit,*)
"CONVGRID COMPLETED"
211 SUBROUTINE read_input
213 namelist /convgrid/ description,leirene,
214 n grid_in,sonnet_in,fort30_in,
215 n fort33_in,fort34_in,fort35_in,
216 n eirene_in,template_in,
217 n vtk_out,grid_out,template_out,
218 n fort33_out,fort34_out,fort35_out,
219 n triangulate,dbgmod,lcheck,
220 n nexclude,ixe,iye,rlbnd,ieind,icind,
225 w
WRITE(gridman_unit,*)
"CONVGRID: starting READ_INPUT"
228 READ(5,nml=convgrid,iostat=io)
229 IF(io.NE.0)
CALL convgrid_error(
"can not read namelist CONVGRID")
235 w
WRITE(gridman_unit,*)
"CONVGRID: READ_INPUT finished"
237 END SUBROUTINE read_input
240 SUBROUTINE set_defaults
266 END SUBROUTINE set_defaults
271 FUNCTION find_input_mode()
272 INTEGER :: find_input_mode
273 INTEGER :: n,lt,lt1,lt2,lt3
277 w
WRITE(gridman_unit,*)
"CONVGRID: starting FIND_INPUT_MODE"
285 lt=len_trim(sonnet_in)
290 lt=len_trim(fort30_in)
295 lt1=len_trim(fort33_in)
296 lt2=len_trim(fort34_in)
297 lt3=len_trim(fort35_in)
303 lt=len_trim(eirene_in)
308 lt=len_trim(template_in)
314 WRITE(gridman_unit,*)
"N=",n
315 CALL convgrid_error(
"Ambiguity in the list of input files")
317 CALL convgrid_error(
"No input grid is specified")
319 IF(find_input_mode.EQ.4)
THEN
320 IF(lt1.EQ.0.OR.lt2.EQ.0.OR.lt3.EQ.0)
THEN
321 WRITE(gridman_unit,*)
"ERROR in CONVGRID: ",
322 w
"not all files for input as EIRENE triangular grid are defined"
323 WRITE(gridman_unit,*)
" FORT33 ",trim(fort33_in)
324 WRITE(gridman_unit,*)
" FORT34 ",trim(fort34_in)
325 WRITE(gridman_unit,*)
" FORT35 ",trim(fort35_in)
326 CALL convgrid_error(
'')
331 f
WRITE(gridman_unit,*)
"CONVGRID: FIND_INPUT_MODE finished, ",
332 w
"INPUTMOD ", find_input_mode
334 END FUNCTION find_input_mode
341 SUBROUTINE convgrid_read(INPUTMOD,
342 c grid_in,sonnet_in,fort30_in,
343 c fort33_in,fort34_in,fort35_in,
344 c eirene_in,template_in,
345 c leirene,rlbnd,grid)
351 u gridman_addsurf2d_read,
352 u gridman_addsurf3d_read,
353 u gridman_template_read
356 INTRINSIC trim,len_trim
358 INTEGER,
INTENT(IN) :: inputmod
359 CHARACTER(LEN=FILE_LENGTH),
INTENT(IN) ::
360 c grid_in,sonnet_in,fort30_in,
361 c fort33_in,fort34_in,fort35_in,
362 c eirene_in,template_in
363 LOGICAL,
INTENT(IN) :: leirene
364 INTEGER,
INTENT(IN) :: rlbnd
371 w
WRITE(
gridman_unit,*)
"CONVGRID: starting CONVGRID_READ"
373 SELECT CASE(inputmod)
375 WRITE(
gridman_unit,*)
"CONVGRID: reading file ",trim(grid_in)
376 CALL gridman_grid_read(grid,grid_in,ierr)
377 IF(ierr.NE.0)
CALL convgrid_error(
'')
379 WRITE(
gridman_unit,*)
"CONVGRID: reading file ",trim(sonnet_in)
382 IF(ierr.NE.0)
CALL convgrid_error(
'')
384 WRITE(
gridman_unit,*)
"CONVGRID: reading file ",trim(fort30_in)
386 IF(ierr.NE.0)
CALL convgrid_error(
'')
388 WRITE(
gridman_unit,*)
"CONVGRID: reading files ",trim(fort33_in)
390 w
", ",trim(fort35_in)
392 c (/fort33_in,fort34_in,fort35_in/),ierr)
393 IF(ierr.GT.0)
CALL convgrid_error(
'')
395 WRITE(
gridman_unit,*)
"CONVGRID: reading file ",trim(eirene_in)
397 CALL gridman_addsurf2d_read(grid,eirene_in,ierr)
398 ELSEIF(rlbnd.EQ.3)
THEN
399 CALL gridman_addsurf3d_read(grid,eirene_in,ierr)
402 CALL convgrid_error(
'illegal value of variable RLBND')
404 IF(ierr.NE.0)
CALL convgrid_error(
'')
408 CALL gridman_template_read(grid,template_in,ierr)
409 IF(ierr.NE.0)
CALL convgrid_error(
'')
413 w
WRITE(
gridman_unit,*)
"CONVGRID: CONVGRID_READ finished"
415 END SUBROUTINE convgrid_read
420 SUBROUTINE convgrid_indexes(GRID,IEIND,ICIND)
422 u gridman_dbg,gridman_unit
426 INTEGER,
INTENT(IN) :: ieind,icind
432 w
WRITE(gridman_unit,*)
"CONVGRID: starting CONVGRID_INDEXES"
435 IF(ieind.GT.grid%NEDGEINDEX)
THEN
436 WRITE(gridman_unit,*)
" IEIND, NEDGEINDEX ",
437 w ieind, grid%NEDGEINDEX
438 CALL convgrid_error(
'edge index is out of range')
440 indtmp=grid%EDGEINDEX(ieind)
441 DO i=1,grid%NEDGEINDEX
445 DEALLOCATE(grid%EDGEINDEX)
446 ALLOCATE(grid%EDGEINDEX(1),stat=st)
447 IF(st.NE.0)
CALL convgrid_error(
'memory allocation failed')
449 grid%EDGEINDEX(1)=indtmp
450 WRITE(gridman_unit,*)
"CONVGRID: selected edge index ",ieind
451 ELSEIF(ieind.EQ.0)
THEN
452 DO i=1,grid%NEDGEINDEX
455 DEALLOCATE(grid%EDGEINDEX)
457 WRITE(gridman_unit,*)
"CONVGRID: all edge indices are excluded"
461 IF(icind.GT.grid%NCELLINDEX)
THEN
462 WRITE(gridman_unit,*)
" ICIND, NCELLINDEX ",
463 w icind, grid%NCELLINDEX
464 CALL convgrid_error(
'edge index is out of range')
466 indtmp=grid%CELLINDEX(icind)
467 DO i=1,grid%NCELLINDEX
471 DEALLOCATE(grid%CELLINDEX)
472 ALLOCATE(grid%CELLINDEX(1),stat=st)
473 IF(st.NE.0)
CALL convgrid_error(
'memory allocation failed')
475 grid%CELLINDEX(1)=indtmp
476 WRITE(gridman_unit,*)
"CONVGRID: selected cell index ",icind
477 ELSEIF(icind.EQ.0)
THEN
478 DO i=1,grid%NCELLINDEX
481 DEALLOCATE(grid%CELLINDEX)
483 WRITE(gridman_unit,*)
"CONVGRID: all cell indices are excluded"
487 w
WRITE(gridman_unit,*)
"CONVGRID: CONVGRID_INDEXES finished"
489 END SUBROUTINE convgrid_indexes
494 SUBROUTINE convgrid_exclude(NEXCLUDE,IXE,IYE,GRID)
500 INTEGER(GRIDMAN_SP),
INTENT(IN) :: nexclude
501 INTEGER(GRIDMAN_SP),
INTENT(IN) :: ixe(2,nexclude),iye(2,nexclude)
505 LOGICAL,
ALLOCATABLE :: ltake(:)
506 INTEGER(GRIDMAN_SP) :: ie,iel,icell,ix,iy,n
511 w
WRITE(
gridman_unit,*)
"CONVGRID: starting CONVGRID_EXCLUDE"
513 IF(nexclude.LT.1.OR.grid%CELLINDEX(1)%NINDEX.LT.2)
RETURN
515 IF(grid%CELLINDEX(1)%NINDEX.LT.2)
THEN
517 w
"CONVGRID: eliminate skipped - no 2D index found"
520 ALLOCATE(ltake(grid%NCELLS),stat=is)
522 f
CALL convgrid_error(
'Cannot allocate temporary array')
526 DO iel=1,grid%CELLINDEX(1)%NELEMENTS
527 icell=grid%CELLINDEX(1)%INDEXES(0,iel)
528 IF(icell.GT.0.AND.icell.LE.grid%NCELLS)
THEN
529 ix=grid%CELLINDEX(1)%INDEXES(1,iel)
530 iy=grid%CELLINDEX(1)%INDEXES(2,iel)
531 IF(ixe(1,ie).LE.ix.AND.ix.LE.ixe(2,ie).AND.
532 f iye(1,ie).LE.iy.AND.iy.LE.iye(2,ie))
THEN
540 c
CALL convgrid_error(
'no cells left after eliminate')
542 IF(ierr.NE.0)
CALL convgrid_error(
'')
544 IF(ierr.NE.0)
CALL convgrid_error(
'')
549 w
WRITE(
gridman_unit,*)
"CONVGRID: CONVGRID_EXCLUDE finished"
551 END SUBROUTINE convgrid_exclude
556 SUBROUTINE convgrid_triang(GRID)
568 w
WRITE(
gridman_unit,*)
"CONVGRID: starting CONVGRID_TRIANG"
571 IF(ierr.NE.0)
CALL convgrid_error(
'')
574 IF(ierr.NE.0)
CALL convgrid_error(
'')
579 w
WRITE(
gridman_unit,*)
"CONVGRID: CONVGRID_TRIANG finished"
581 END SUBROUTINE convgrid_triang
586 SUBROUTINE convgrid_output(VTK_OUT,GRID_OUT,
587 s fort33_out,fort34_out,fort35_out,
592 u gridman_grid_write,gridman_tria_write,
593 u gridman_template_write
596 INTRINSIC len_trim,max,trim
598 CHARACTER(LEN=FILE_LENGTH),
INTENT(IN) ::
600 c fort33_out,fort34_out,fort35_out,
604 INTEGER :: lt,lt1,lt2,lt3,ierr
607 w
WRITE(
gridman_unit,*)
"CONVGRID: starting CONVGRID_OUTPUT"
612 WRITE(
gridman_unit,*)
"CONVGRID: writing file ",vtk_out(1:lt)
613 IF(grid%TYPE.EQ.2)
THEN
615 c grid%NCELLS,0,0,0,0,ierr)
616 ELSEIF(grid%TYPE.EQ.3)
THEN
618 c grid,grid%NEDGES,0,0,0,0,ierr)
621 CALL convgrid_error(
"unknown grid type")
623 IF(ierr.NE.0)
CALL convgrid_error(
'')
626 lt=len_trim(grid_out)
628 WRITE(
gridman_unit,*)
"CONVGRID: writing file ",trim(grid_out)
629 CALL gridman_grid_write(grid,grid_out,ierr)
630 IF(ierr.NE.0)
CALL convgrid_error(
'')
633 lt1=len_trim(fort33_out)
634 lt2=len_trim(fort34_out)
635 lt3=len_trim(fort35_out)
638 IF(lt1.EQ.0.OR.lt2.EQ.0.OR.lt3.EQ.0)
THEN
640 w
"not all files for output as EIRENE triangular grid are defined"
644 CALL convgrid_error(
'')
651 w
', ',trim(fort35_out)
652 CALL gridman_tria_write(grid,
653 c (/fort33_out,fort34_out,fort35_out/),ierr)
654 IF(ierr.NE.0)
CALL convgrid_error(
'')
657 lt=len_trim(template_out)
661 CALL gridman_template_write(grid,template_out,ierr)
662 IF(ierr.NE.0)
CALL convgrid_error(
'')
666 w
WRITE(
gridman_unit,*)
"CONVGRID: CONVGRID_OUTPUT finished"
668 END SUBROUTINE convgrid_output
673 SUBROUTINE convgrid_error(STR)
676 CHARACTER(*),
INTENT(IN) :: str
681 w
WRITE(
gridman_unit,*)
"ERROR in CONVGRID: "//str(1:lt)
682 stop
"ERROR in CONVGRID - see log output. "//
683 s
"Use 'convgrid help' to print documentation"
684 END SUBROUTINE convgrid_error
692 INTRINSIC index,len,get_command_argument,trim
693 CHARACTER(LEN=FILE_LENGTH) :: PATH
694 CHARACTER(LEN=128) :: STR
696 CALL get_command_argument(0,path)
697 i=index(path,
'/',.true.)
698 IF(i.GT.len(path))
THEN
706 OPEN(unit=3,file=trim(path)//
'convgrid.parameters.description',
707 o status=
'OLD',iostat=io)
711 READ(3,
'(A)',iostat=io,end=200) str
717 100
WRITE(
gridman_unit,*)
"convgrid <opt> <file1,2,3>"//
718 w
" or convgrid < convgrid.parameters"
720 w
"<opt> = -s: Sonnet (Carre); -f: fort.30;"//
721 w
" -t: triangular fort.33,34,35;"
723 w
" -e2: 2D Additional Surfaces, -e3: 3D Additional Surfaces;"
726 w
" Commands -fp, -tp, -ep produce text template files"
728 w
" Commands --s, --f, --t, --e2, --e3, --p, --g ",
729 w
" only printa metadata"
731 w
"Could not find convgrid.parameters.description",
734 w
"Use 'which convgrid' to invoke via the full path"
741 SUBROUTINE set_input(GRID_IN,SONNET_IN,FORT30_IN,
742 c fort33_in,fort34_in,fort35_in,
743 c eirene_in,template_in,
744 c vtk_out,template_out,rlbnd,lmeta)
747 INTRINSIC get_command_argument,trim
748 CHARACTER(LEN=FILE_LENGTH),
INTENT(OUT) ::
749 c grid_in,sonnet_in,fort30_in,
750 c fort33_in,fort34_in,fort35_in,
751 c eirene_in,template_in,
752 c vtk_out,template_out
753 INTEGER,
INTENT(OUT) :: RLBND
754 LOGICAL,
INTENT(OUT) :: LMETA
755 CHARACTER(LEN=4) :: OPT
756 CHARACTER(LEN=FILE_LENGTH) :: FNAME
758 CALL get_command_argument(1,opt)
759 CALL get_command_argument(2,fname)
763 CASE(
'-f',
'-fp',
'--f')
765 CASE(
'-t',
'-tp',
'--t')
767 CALL get_command_argument(3,fname)
769 CALL get_command_argument(4,fname)
771 CASE(
'-e2',
'-ep',
'--e2')
783 CALL convgrid_error(
"unknown input option")
785 IF(opt(3:3).eq.
'p')
THEN
786 template_out=trim(fname)//
'.txt'
788 vtk_out=trim(fname)//
'.vtk'
790 IF(opt(1:1).EQ.
'-'.AND.opt(2:2).EQ.
'-')
THEN
logical, save, public gridman_check
Switch to enforce extra checks of input parameters.
integer, save, public gridman_unit
Index of the standard output unit.
subroutine gridman_grid_eliminate_cells(GRID_NEW, GRID, LTAKE, IERR)
Eliminate cells from GRIDMAN_GRID object.
integer, parameter, public gridman_dp
Kind parameter for real numbers.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine set_input(GRID_IN, SONNET_IN, FORT30_IN, FORT33_IN, FORT34_IN, FORT35_IN, EIRENE_IN, TEMPLATE_IN, VTK_OUT, TEMPLATE_OUT, RLBND, LMETA)
Initialize input from the argument list.
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_vtk_grid2d_write(FNAME, HEADER, GRID, NELEMENTS, NCS, NCV, NPS, NPV, IERR, CELL_SCALAR, CSNAME, CELL_VECTOR, CVNAME, POINT_SCALAR, PSNAME, POINT_VECTOR, PVNAME)
Write 2D grid and data in VTK ASCII legacy format.
subroutine gridman_grid2d_triang(TRIA, GRID, IERR)
Triangulation of 2D grid.
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
subroutine gridman_grid_copy(GRID2, GRID1, IERR)
Create a copy of the grid object.
logical, save, public gridman_dbg
Switch for debugging mode.
Data-type which stores indices defined on the grid cells or edges.
subroutine gridman_carre_readsonnet_grid(GRID, FNAME, IERR, LEIR)
Read CARRE grid in SONNET format, return GRID object.
subroutine print_description
Print manual.
Definition of data types, global constants and variables.
subroutine gridman_index_deallocate(INDEX, IERR)
Allocate index object.
subroutine gridman_vtk_grid3d_write(FNAME, HEADER, GRID, NELEMENTS, NCS, NCV, NPS, NPV, IERR, CELL_SCALAR, CSNAME, CELL_VECTOR, CVNAME, POINT_SCALAR, PSNAME, POINT_VECTOR, PVNAME)
Write 3D grid and data in VTK ASCII legacy format. Only grid w/o cells is implemented at the moment !...
subroutine gridman_carre_read30_grid(GRID, FNAME, IERR, LEIR)
Read B2 (CARRE, SONNET) grid from fort.30, return GRID object.
integer, parameter, public gridman_sp
Kind parameter for integer numbers.