29 s ierr,nedgeindex,ncellindex)
37 INTEGER,
INTENT(IN) ::
TYPE
39 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NCELLS
41 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NEDGES
43 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NPOINTS
45 INTEGER,
INTENT(OUT) :: IERR
49 INTEGER,
INTENT(IN),
OPTIONAL :: NEDGEINDEX
53 INTEGER,
INTENT(IN),
OPTIONAL :: NCELLINDEX
63 IF(ierr.NE.0)
GOTO 1000
66 CALL dimensions(
TYPE,GRID%PDIM,GRID%EDIM,IERR)
67 IF(ierr.GT.0)
GOTO 1000
71 w
"ERROR in GRIDMAN_GRID_ALLOCATE: incorrect number of edges"
77 ALLOCATE(grid%CELLS(2,nedges),
78 a grid%POINTS(grid%EDIM,nedges),stat=st)
81 w
"ERROR in GRIDMAN_GRID_ALLOCATE: cannot allocate edge arrays"
89 w
"ERROR in GRIDMAN_GRID_ALLOCATE: incorrect number of points"
95 ALLOCATE(grid%X(grid%PDIM,npoints),stat=st)
97 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_ALLOCATE: ",
98 w
"cannot allocate coordinate arrays"
106 IF(
PRESENT(nedgeindex))
THEN
107 IF(nedgeindex.LT.1)
THEN
110 grid%NEDGEINDEX=nedgeindex
111 ALLOCATE(grid%EDGEINDEX(nedgeindex),stat=st)
113 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_ALLOCATE: ",
114 w
"cannot allocate edge indices"
123 IF(
PRESENT(ncellindex))
THEN
124 IF(ncellindex.LT.1)
THEN
127 grid%NCELLINDEX=ncellindex
128 ALLOCATE(grid%CELLINDEX(ncellindex),stat=st)
130 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_ALLOCATE: ",
131 w
"cannot allocate edge indices"
143 grid%DESCRIPTION=
'Created by GRIDMAN_GRID_ALLOCATE'
146 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_ALLOCATE finished"
150 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_ALLOCATE is terminated"
157 SUBROUTINE dimensions(TYPE,PDIM,EDIM,IERR)
159 INTEGER,
INTENT(IN) ::
TYPE
160 INTEGER,
INTENT(OUT) :: PDIM,EDIM,IERR
172 w
"ERROR in GRIDMAN_GRID_DIMENSIONS: unknown grid type"
176 END SUBROUTINE dimensions
191 INTEGER,
INTENT(OUT) :: IERR
196 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_DEALLOCATE"
200 IF(
ALLOCATED(grid%CELLS))
THEN
201 DEALLOCATE(grid%CELLS,stat=st)
205 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
206 w
"can not deallocate CELLS"
210 IF(
ALLOCATED(grid%POINTS))
THEN
211 DEALLOCATE(grid%POINTS,stat=st)
215 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
216 w
"can not deallocate POINTS"
220 IF(
ALLOCATED(grid%X))
THEN
221 DEALLOCATE(grid%X,stat=st)
225 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
226 w
"can not deallocate coordinates X"
230 IF(
ALLOCATED(grid%EDGEINDEX))
THEN
231 DO i=1,
SIZE(grid%EDGEINDEX)
235 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
236 w
"can not deallocate EDGEINDEX(I), I ",i
239 DEALLOCATE(grid%EDGEINDEX,stat=st)
243 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
244 w
"can not deallocate EDGEINDEX"
248 IF(
ALLOCATED(grid%CELLINDEX))
THEN
249 DO i=1,
SIZE(grid%CELLINDEX)
253 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
254 w
"can not deallocate CELLINDEX(I), I ",i
257 DEALLOCATE(grid%CELLINDEX,stat=st)
261 w
"WARNING from GRIDMAN_GRID_DEALLOCATE: ",
262 w
"can not deallocate CELLINDEX"
267 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_DEALLOCATE finished"
293 INTRINSIC SIZE,tiny,
ALLOCATED
297 INTEGER,
INTENT(OUT) :: RES
299 INTEGER,
INTENT(OUT) :: IERR
301 INTEGER (GRIDMAN_SP) :: N1,N2,ICELL,I1,I2,IE,IEDGE,NCELLS_MAX
309 IF(.NOT.
ALLOCATED(grid%CELLS).OR.
310 . .NOT.
ALLOCATED(grid%POINTS).OR.
311 . .NOT.
ALLOCATED(grid%X))
THEN
314 w
" GRIDMAN_GRID_CHECK: grid is not allocated"
319 IF(grid%NCELLS.LT.0.OR.grid%NEDGES.LT.1.OR.
320 f grid%NPOINTS.LT.1.OR.grid%EDIM.LT.1.OR.grid%PDIM.LT.1)
THEN
323 w
" GRIDMAN_GRID_CHECK: incorrect dimensions"
325 w
"NCELL, NEDGES, NPOINTS, PDIM, EDIM ",
326 w grid%NCELLS,grid%NEDGES,grid%NPOINTS,
327 w grid%PDIM,grid%EDIM
332 n1=
SIZE(grid%CELLS,1)
333 n2=
SIZE(grid%CELLS,2)
334 IF(n1.NE.2.OR.n2.LT.grid%NEDGES)
THEN
337 w
" GRIDMAN_GRID_CHECK: array size mismatch, CELLS"
338 WRITE(
gridman_unit,*)
" NEDGES, SIZE(CELLS) ",grid%NEDGES,n1,n2
341 n1=
SIZE(grid%POINTS,1)
342 n2=
SIZE(grid%POINTS,2)
343 IF(n1.NE.grid%EDIM.OR.n2.LT.grid%NEDGES)
THEN
346 w
" GRIDMAN_GRID_CHECK: array size mismatch, POINTS"
348 w grid%EDIM,grid%NEDGES,n1,n2
353 IF(n1.NE.grid%PDIM.OR.n2.LT.grid%NPOINTS)
THEN
356 w
" GRIDMAN_GRID_CHECK: array size mismatch, X"
358 w grid%PDIM,grid%NPOINTS,n1,n2
363 DO iedge=1,grid%NEDGES
364 i1=grid%CELLS(1,iedge)
365 i2=grid%CELLS(2,iedge)
366 IF(i1.GT.grid%NCELLS.OR.i1.LT.-grid%NEDGES.OR.
367 w i2.GT.grid%NCELLS.OR.i2.LT.-grid%NEDGES)
THEN
370 w
" GRIDMAN_GRID_CHECK: cells out of bounds ",
371 w
" IEDGE ,CELLS, NCELLS, NEDGES",
372 w iedge,grid%CELLS(:,iedge),grid%NCELLS,grid%NEDGES
375 IF(i2.EQ.i1.AND.i1.NE.0.AND.i2.NE.0)
THEN
379 w
" GRIDMAN_GRID_CHECK:",
380 w
" duplicate cell index for an edge ",
381 w
" IEDGE ,CELLS, ",iedge,grid%CELLS(:,iedge)
388 DO iedge=1,grid%NEDGES
389 icell=grid%CELLS(1,iedge)
390 IF(icell.GT.ncells_max) ncells_max=icell
391 icell=grid%CELLS(2,iedge)
392 IF(icell.GT.ncells_max) ncells_max=icell
394 IF(ncells_max.NE.grid%NCELLS)
THEN
397 w
" GRIDMAN_GRID_CHECK: NCELLS and CELLS do not match"
399 w grid%NCELLS,ncells_max
404 DO iedge=1,grid%NEDGES
406 IF(grid%POINTS(ie,iedge).GT.grid%NPOINTS.OR.
407 f grid%POINTS(ie,iedge).LT.1)
THEN
410 w
" GRIDMAN_GRID_CHECK: point index is out of bounds ",
411 w
" IEDGE, IE, POINTS, NPOINTS ",
412 w iedge, ie, grid%POINTS(ie,iedge),grid%NPOINTS
419 IF(grid%UNIT2SI.LT.tiny(grid%UNIT2SI))
THEN
422 w
" GRIDMAN_GRID_CHECK: incorrect unit scale"
428 IF(
ALLOCATED(grid%EDGEINDEX))
THEN
429 IF(grid%NEDGEINDEX.LT.1)
THEN
432 w
"incorrect number of the groups of edge indices"
436 n1=
SIZE(grid%EDGEINDEX)
437 IF(n1.NE.grid%NEDGEINDEX)
THEN
440 w
"array size mismatch, EDGEINDEX"
442 w grid%NEDGEINDEX, n1
445 DO id=1,grid%NEDGEINDEX
447 IF(res.NE.0.OR.ierr.NE.0)
THEN
450 w
"incorrect index object ",id
453 DO ie=1,grid%EDGEINDEX(id)%NELEMENTS
454 iedge=grid%EDGEINDEX(id)%INDEXES(0,ie)
455 IF(iedge.LT.0.OR.iedge.GT.grid%NEDGES)
THEN
458 w
"incorrect index object ",id
461 w ie, iedge, grid%NEDGES
467 IF(grid%NEDGEINDEX.GT.1)
THEN
470 WRITE(
gridman_unit,*)
" edge indices are not allocated, ",
471 w
" but NEDGEINDEX>1 ",grid%NEDGEINDEX
477 IF(
ALLOCATED(grid%CELLINDEX))
THEN
478 IF(grid%NCELLINDEX.LT.1)
THEN
481 w
"incorrect number of the groups of cell indices"
485 n1=
SIZE(grid%CELLINDEX)
486 IF(n1.NE.grid%NCELLINDEX)
THEN
489 w
"array size mismatch, CELLINDEX"
491 w grid%NCELLINDEX, n1
494 DO id=1,grid%NCELLINDEX
496 IF(res.NE.0.OR.ierr.NE.0)
THEN
499 w
"incorrect index object ",id
502 DO ie=1,grid%CELLINDEX(id)%NELEMENTS
503 icell=grid%CELLINDEX(id)%INDEXES(0,ie)
504 IF(icell.LT.0.OR.icell.GT.grid%NCELLS)
THEN
507 w
"incorrect index object ",id
510 w ie, icell, grid%NCELLS
516 IF(grid%NCELLINDEX.GT.1)
THEN
519 WRITE(
gridman_unit,*)
" edge indices are not allocated, ",
520 "but NCELLINDEX>1 ",grid%NCELLINDEX
542 u gridman_dbg,gridman_check,
543 u gridman_length,gridman_ver
550 INTEGER,
INTENT(IN) :: IOUT
552 INTEGER,
INTENT(OUT) :: IERR
555 INTEGER(GRIDMAN_SP) :: IEDGE,IPOINT
559 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_UNITWRITE"
563 IF(gridman_check)
THEN
565 IF(res.NE.0.OR.ierr.GT.0)
THEN
567 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITWRITE: ",
568 w
"incorrect grid object"
576 WRITE(iout,
'(A)',iostat=io)
'DATA-TYPE GRIDMAN_GRID'
578 WRITE(iout,
'(A)',iostat=io)
'VERSION'
580 WRITE(iout,
'(I7)',iostat=io) gridman_ver
582 WRITE(iout,
'(A)',iostat=io)
"GRIDMAN_LENGTH"
584 WRITE(iout,
'(I6)',iostat=io) gridman_length
586 WRITE(iout,
'(A)',iostat=io)
'DESCRIPTION'
588 WRITE(frm,210) gridman_length
589 210
FORMAT(
'(A',i4,
')')
590 WRITE(iout,frm,iostat=io) grid%DESCRIPTION
595 w
" GRIDMAN_GRID_UNITWRITE. Header finished"
598 WRITE(iout,
'(A)',iostat=io)
'EDIM, PDIM'
600 WRITE(iout,
'(2I7)',iostat=io) grid%EDIM,grid%PDIM
602 WRITE(iout,
'(A)',iostat=io)
'TYPE, NEDGES, NCELLS, NPOINTS'
604 WRITE(iout,
'(4I7)',iostat=io)
605 w grid%TYPE,grid%NEDGES,grid%NCELLS,grid%NPOINTS
608 WRITE(iout,
'(A)',iostat=io)
'NEDGEINDEX, NCELLINDEX'
610 WRITE(iout,
'(2I7)',iostat=io) grid%NEDGEINDEX,grid%NCELLINDEX
615 w
" GRIDMAN_GRID_UNITWRITE. Dimensions finished"
617 WRITE(iout,
'(A)',iostat=io)
'CELLS(1,:), CELLS(2,:)'
619 DO iedge=1,grid%NEDGES
620 WRITE(iout,
'(2I7)',iostat=io) grid%CELLS(1:2,iedge)
624 WRITE(iout,
'(A)',iostat=io)
'POINTS'
626 WRITE(frm,220) grid%EDIM
627 220
FORMAT(
'(',i4,
'I7)')
628 DO iedge=1,grid%NEDGES
629 WRITE(iout,frm,iostat=io) grid%POINTS(1:grid%EDIM,iedge)
635 w
" GRIDMAN_GRID_UNITWRITE. Topology finished"
637 WRITE(iout,
'(A)',iostat=io)
'UNITS'
639 WRITE(frm,230) gridman_length
640 230
FORMAT(
'(E20.12,1X,A',i4,
')')
641 WRITE(iout,frm,iostat=io) grid%UNIT2SI,grid%UNITS
643 WRITE(iout,
'(A)',iostat=io)
'X'
645 WRITE(frm,240) grid%EDIM
646 240
FORMAT(
'(',i4,
'E16.8)')
647 DO ipoint=1,grid%NPOINTS
648 WRITE(iout,frm,iostat=io) grid%X(1:grid%PDIM,ipoint)
654 w
" GRIDMAN_GRID_UNITWRITE. Coordinates finished"
656 DO ii=1,grid%NEDGEINDEX
657 IF(.NOT.
ALLOCATED(grid%EDGEINDEX(ii)%INDEXES))
THEN
658 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITWRITE: "
659 WRITE(
gridman_unit,*)
"Group of edge incices is not allocated"
664 IF(ierr.NE.0)
GOTO 1000
667 DO ii=1,grid%NCELLINDEX
668 IF(.NOT.
ALLOCATED(grid%CELLINDEX(ii)%INDEXES))
THEN
669 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITWRITE: "
670 WRITE(
gridman_unit,*)
"Group of cell incices is not allocated"
675 IF(ierr.NE.0)
GOTO 1000
678 WRITE(iout,
'(A)',iostat=io)
"END OF DATA-TYPE GRIDMAN_GRID"
682 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_UNITWRITE finished"
687 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITWRITE: ",
688 w
"cannot write to the file"
692 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_UNITWRITE terminated"
712 CHARACTER(*) :: FNAME
714 INTEGER,
INTENT(OUT) :: IERR
716 LOGICAL :: LE1,LE2,LO
719 w
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_FILEWRITE"
723 INQUIRE(file=
'fort.3',exist=le1)
724 INQUIRE(file=
'FORT.3',exist=le2)
726 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_FILEWRITE: ",
727 w
"can not attach file to UNIT=3 " ,
728 w
"because file fort.3 already exists"
733 INQUIRE(unit=3,opened=lo)
735 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_FILEWRITE: ",
736 w
"can not attach file to UNIT=3 ",
737 w
"because this unit already opened"
742 OPEN(unit=3,file=trim(fname),status=
'REPLACE',iostat=io)
744 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_FILEWRITE: ",
745 w
"cannot open file ",trim(fname)
754 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_FILEWRITE finished"
769 u gridman_dbg,gridman_check,gridman_length
777 INTEGER,
INTENT(IN) :: IIN
779 INTEGER,
INTENT(OUT) :: IERR
782 CHARACTER*128 :: SBUFF
783 CHARACTER(LEN=GRIDMAN_LENGTH) :: DESCRIPTION
784 INTEGER :: IO,LENGTH,EDIM,PDIM,NTYPE,
785 i nedgeindex,ncellindex,ii,ierr0,res
786 INTEGER(GRIDMAN_SP) :: VER,NEDGES,NCELLS,NPOINTS,IEDGE,IPOINT
789 f
"Starting GRIDMAN_GRID_UNITREAD"
796 READ(iin,*,iostat=io) sbuff
798 READ(iin,*,iostat=io) sbuff
800 READ(iin,
'(I7)',iostat=io) ver
802 READ(iin,*,iostat=io) sbuff
804 READ(iin,
'(I6)',iostat=io) length
806 length=min(length,gridman_length)
807 READ(iin,*,iostat=io) sbuff
809 WRITE(frm,210) length
810 210
FORMAT(
'(A',i4,
')')
811 READ(iin,frm,iostat=io) description
815 f
WRITE(
gridman_unit,*)
" GRIDMAN_GRID_UNITREAD. Header finished"
817 READ(iin,*,iostat=io) sbuff
818 READ(iin,
'(2I7)',iostat=io) edim,pdim
821 READ(iin,*,iostat=io) sbuff
823 READ(iin,
'(4I7)',iostat=io) ntype,nedges,ncells,npoints
826 READ(iin,*,iostat=io) sbuff
828 READ(iin,
'(2I7)',iostat=io) nedgeindex,ncellindex
833 w
" GRIDMAN_GRID_UNITREAD. Dimensions finished"
836 c nedgeindex,ncellindex)
837 IF(ierr.NE.0)
GOTO 1000
839 grid%DESCRIPTION=description
841 READ(iin,*,iostat=io) sbuff
843 DO iedge=1,grid%NEDGES
844 READ(iin,
'(3I7)',iostat=io) grid%CELLS(1:2,iedge)
848 READ(iin,*,iostat=io) sbuff
850 WRITE(frm,220) grid%EDIM
851 220
FORMAT(
'(',i4,
'I7)')
853 DO iedge=1,grid%NEDGES
854 READ(iin,frm,iostat=io) grid%POINTS(1:grid%EDIM,iedge)
860 w
" GRIDMAN_GRID_UNITREAD. Topology finished"
862 READ(iin,*,iostat=io) sbuff
864 WRITE(frm,230) length
865 230
FORMAT(
'(E20.12,1X,A',i4,
')')
866 READ(iin,frm,iostat=io) grid%UNIT2SI,grid%UNITS
869 READ(iin,*,iostat=io) sbuff
871 WRITE(frm,240) grid%PDIM
872 240
FORMAT(
'(',i4,
'E16.8)')
873 DO ipoint=1,grid%NPOINTS
874 READ(iin,frm,iostat=io) grid%X(1:grid%PDIM,ipoint)
880 w
" GRIDMAN_GRID_UNITWRITE. Coordinates finished"
882 DO ii=1,grid%NEDGEINDEX
884 IF(ierr.NE.0)
GOTO 1000
887 DO ii=1,grid%NCELLINDEX
889 IF(ierr.NE.0)
GOTO 1000
892 READ(iin,*,iostat=io) sbuff
895 IF(gridman_check)
THEN
897 IF(res.NE.0.OR.ierr.GT.0)
THEN
899 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITREAD: ",
900 w
"incorrect resulting grid"
908 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_UNITREAD finished"
913 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_UNITREAD: ",
914 w
"can not read data"
916 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_UNITREAD is terminated"
939 CHARACTER(*),
INTENT(IN) :: FNAME
941 INTEGER,
INTENT(OUT) :: IERR
946 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_FILEREAD"
950 INQUIRE(unit=3,opened=lo)
952 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_FILEWRITE: ",
953 w
"can not attach file to UNIT=3 ",
954 w
"because this unit already opened"
959 OPEN(unit=3,file=trim(fname),status=
'OLD',iostat=io)
961 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_FILEREAD: ",
962 w
"can not open file ",trim(fname)
971 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_FILEREAD finished"
982 u gridman_dbg,gridman_check
991 INTEGER,
INTENT(OUT) :: IERR
993 INTEGER :: II,RES,IERR0
995 IF(gridman_dbg)
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_COPY"
999 IF(gridman_check)
THEN
1001 IF(res.NE.0.OR.ierr.GT.0)
THEN
1004 w
"incorrect input grid object"
1010 s grid1%NPOINTS,grid1%NCELLS,ierr,
1011 s grid1%NEDGEINDEX,grid1%NCELLINDEX)
1012 IF(ierr.NE.0)
GOTO 1000
1014 grid2%DESCRIPTION=grid1%DESCRIPTION
1015 grid2%CELLS=grid1%CELLS
1016 grid2%POINTS=grid1%POINTS
1017 grid2%UNIT2SI=grid1%UNIT2SI
1018 grid2%UNITS=grid1%UNITS
1021 DO ii=1,grid2%NEDGEINDEX
1023 c grid1%EDGEINDEX(ii),ierr)
1024 IF(ierr.NE.0)
GOTO 1000
1027 DO ii=1,grid2%NCELLINDEX
1029 c grid1%CELLINDEX(ii),ierr)
1030 IF(ierr.NE.0)
GOTO 1000
1033 IF(gridman_check)
THEN
1035 IF(res.NE.0.OR.ierr.GT.0)
THEN
1038 w
"incorrect resulting grid object"
1044 IF(gridman_dbg)
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_COPY finished"
1048 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_COPY is terminated"
1069 u gridman_check,gridman_dbg
1072 INTRINSIC llt,lgt,trim
1078 INTEGER,
INTENT(OUT) :: RES
1080 INTEGER,
INTENT(OUT) :: IERR
1082 INTEGER(GRIDMAN_SP) :: IEDGE,IPOINT
1083 INTEGER :: IP,II,RES1
1086 w
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_COMPARE"
1090 IF(gridman_check)
THEN
1092 IF(res.NE.0.OR.ierr.GT.0)
THEN
1095 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_COMPARE: ",
1100 IF(res.NE.0.OR.ierr.GT.0)
THEN
1103 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID_COMPARE: ",
1110 IF(grid1%TYPE.NE.grid2%TYPE)
THEN
1112 WRITE(
gridman_unit,*)
"GRIDMAN_GRID_COMPARE: types are different"
1117 IF((grid1%NEDGES.NE.grid2%NEDGES).OR.
1118 f (grid1%NPOINTS.NE.grid2%NPOINTS).OR.
1119 f (grid1%NCELLS.NE.grid2%NCELLS).OR.
1120 f (grid1%EDIM.NE.grid2%EDIM).OR.
1121 f (grid1%PDIM.NE.grid2%PDIM))
THEN
1124 w
"GRIDMAN_GRID_COMPARE: dimensions are different"
1126 w grid1%EDIM,grid2%EDIM
1128 w grid1%PDIM,grid2%PDIM
1130 w grid1%NEDGES,grid2%NEDGES
1132 w grid1%NPOINTS,grid2%NPOINTS
1134 w grid1%NCELLS,grid2%NCELLS
1139 DO iedge=1,grid1%NEDGES
1140 IF( ( grid1%CELLS(1,iedge).NE.grid2%CELLS(1,iedge) ).OR.
1141 f ( grid1%CELLS(2,iedge).NE.grid2%CELLS(2,iedge) ) )
THEN
1144 w
"GRIDMAN_GRID_COMPARE: topology (CELLs) is different"
1151 IF(grid1%POINTS(ip,iedge).NE.grid2%POINTS(ip,iedge))
THEN
1154 w
"GRIDMAN_GRID_COMPARE: topology (POINTs) is different"
1157 w grid1%POINTS(ip,iedge),
1158 w grid2%POINTS(ip,iedge)
1165 IF(diff_real(grid1%UNIT2SI,grid2%UNIT2SI).OR.
1166 f llt(grid1%UNITS,grid2%UNITS).OR.
1167 f lgt(grid1%UNITS,grid2%UNITS) )
THEN
1170 w
"GRIDMAN_GRID_COMPARE: units are different"
1172 w grid1%UNIT2SI,grid2%UNIT2SI
1174 w trim(grid1%UNITS),trim(grid2%UNITS)
1179 DO ipoint=1,grid1%NPOINTS
1181 IF(diff_real(grid1%X(ip,ipoint),grid2%X(ip,ipoint)))
THEN
1184 w
"GRIDMAN_GRID_COMPARE: coordinates (X) are different"
1187 w grid2%X(ip,ipoint)
1194 IF(llt(grid1%DESCRIPTION,grid2%DESCRIPTION).OR.
1195 f lgt(grid1%DESCRIPTION,grid2%DESCRIPTION))
THEN
1198 w
"GRIDMAN_GRID_COMPARE: descriptions are different"
1199 WRITE(
gridman_unit,*)
" DESCRIPTION1: ",trim(grid1%DESCRIPTION)
1200 WRITE(
gridman_unit,*)
" DESCRIPTION2: ",trim(grid2%DESCRIPTION)
1205 IF(grid1%NEDGEINDEX.NE.grid2%NEDGEINDEX)
THEN
1208 w
"number of the edge index groups is different"
1210 w grid1%NEDGEINDEX,grid2%NEDGEINDEX
1213 DO ii=1,grid1%NEDGEINDEX
1215 c grid2%EDGEINDEX(ii),res1,ierr)
1216 IF(res1.NE.0.OR.ierr.NE.0)
THEN
1218 w
"edge indices are different, II ",ii
1225 IF(grid1%NCELLINDEX.NE.grid2%NCELLINDEX)
THEN
1228 w
"number of the edge index groups is different"
1230 w grid1%NCELLINDEX,grid2%NCELLINDEX
1233 DO ii=1,grid1%NCELLINDEX
1235 c grid2%CELLINDEX(ii),res1,ierr)
1236 IF(res1.NE.0.OR.ierr.NE.0)
THEN
1238 w
"edge indices are different, II ",ii
1248 w
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_COMPARE finished"
1254 FUNCTION diff_real(X1,X2)
1258 REAL(GRIDMAN_DP),
INTENT(IN) :: X1,X2
1259 LOGICAL :: DIFF_REAL
1260 REAL(GRIDMAN_DP) :: EPS
1263 IF(abs(x1-x2).GT.
gridman_tol*(abs(x1)+abs(x2)+eps))
THEN
1269 END FUNCTION diff_real
1284 u gridman_dbg,gridman_check
1287 INTRINSIC min,
ALLOCATED,
SIZE
1292 INTEGER,
INTENT(OUT) :: IERR
1294 INTEGER(GRIDMAN_SP) :: N1,N2
1297 IF(gridman_dbg)
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID_TAKE"
1299 IF(gridman_check)
THEN
1301 IF(res.NE.0.OR.ierr.GT.0)
THEN
1304 w
"incorrect grid object"
1311 grid2%DESCRIPTION=grid1%DESCRIPTION
1312 grid2%UNIT2SI=grid1%UNIT2SI
1313 grid2%UNITS=grid1%UNITS
1315 n1=
SIZE(grid2%CELLS,1)
1317 n2=
SIZE(grid2%CELLS,2)
1318 n2=min(grid1%NEDGES,n2)
1319 IF(
ALLOCATED(grid2%CELLS))
THEN
1320 grid2%CELLS(1:n1,1:n2)=grid1%CELLS(1:n1,1:n2)
1323 WRITE(
gridman_unit,*)
"WARNING from GRIDMAN_GRID_TAKE: ",
1324 w
"GRID2%CELLS is not allocated"
1327 n1=
SIZE(grid2%POINTS,1)
1328 n1=min(grid1%EDIM,n1)
1329 n2=
SIZE(grid2%POINTS,2)
1330 n2=min(grid1%NEDGES,n2)
1331 IF(
ALLOCATED(grid2%POINTS))
THEN
1332 grid2%POINTS(1:n1,1:n2)=grid1%POINTS(1:n1,1:n2)
1335 WRITE(
gridman_unit,*)
"WARNING from GRIDMAN_GRID_TAKE: ",
1336 w
"GRID2%POINTS is not allocated"
1340 n1=min(grid1%PDIM,n1)
1342 n2=min(grid1%NPOINTS,n2)
1343 IF(
ALLOCATED(grid2%X))
THEN
1344 grid2%X(1:n1,1:n2)=grid1%X(1:n1,1:n2)
1347 WRITE(
gridman_unit,*)
"WARNING from GRIDMAN_GRID_TAKE: ",
1348 w
"GRID2%X is not allocated"
1351 IF(gridman_dbg)
WRITE(
gridman_unit,*)
"GRIDMAN_GRID_TAKE finished"
1361 u gridman_dbg,gridman_check
1368 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NCOUNT
1370 INTEGER,
INTENT(OUT) :: IERR
1372 INTEGER(GRIDMAN_SP) :: IEDGE
1376 w
"Starting GRIDMAN_GRID_COUNT"
1380 IF(gridman_check)
THEN
1382 IF(res.NE.0.OR.ierr.GT.0)
THEN
1385 w
"incorrect grid object"
1390 ncount=max(grid%NCELLS,0)
1391 DO iedge=1,grid%NEDGES
1392 IF(grid%CELLS(1,iedge).LT.1.AND.
1393 f grid%CELLS(2,iedge).LT.1) ncount=ncount+1
1397 w
"GRIDMAN_GRID_COUNT finished"
1408 u gridman_dbg,gridman_unit
1409 INTRINSIC sum,trim,minval,maxval
1413 CHARACTER(GRIDMAN_LENGTH),
ALLOCATABLE :: TEXT(:)
1415 INTEGER,
INTENT(OUT) :: NT
1417 INTEGER,
INTENT(OUT) :: IERR
1419 INTEGER :: IS,I,K,J,N
1421 IF(gridman_dbg)
WRITE(gridman_unit,*)
1422 w
"Starting GRIDMAN_GRID_METADATA_TEXT"
1427 IF(grid%NCELLINDEX.GT.0)
1428 f nt=nt+grid%NCELLINDEX*5+sum(grid%CELLINDEX(:)%NINDEX)
1429 IF(grid%NEDGEINDEX.GT.0)
1430 f nt=nt+grid%NEDGEINDEX*5+sum(grid%EDGEINDEX(:)%NINDEX)
1432 ALLOCATE(text(nt),stat=is)
1434 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID_METADATA_TEXT: ",
1435 w
"cannot allocate array of strings"
1441 WRITE(text(1),
'(A,A)')
'Description: ',trim(grid%DESCRIPTION)
1442 WRITE(text(2),
'(A,I0)')
'Dimensionality: ',grid%PDIM
1443 WRITE(text(3),
'(A,I0)')
'Number of cells: ',grid%NCELLS
1444 WRITE(text(4),
'(A,I0)')
'Number of edges: ',grid%NEDGES
1445 WRITE(text(5),
'(A,I0)')
'Number of points: ',grid%NPOINTS
1446 WRITE(text(6),
'(A,A)')
'Units: ',trim(grid%UNITS)
1447 WRITE(text(7),*)
'Minimal values of coordinates: ',
1448 w (minval(grid%X(j,:)),j=1,grid%PDIM)
1449 WRITE(text(8),*)
'Maximal values of coordinates: ',
1450 w (maxval(grid%X(j,:)),j=1,grid%PDIM)
1453 DO i=1,grid%NCELLINDEX
1455 WRITE(text(k),
'(A,I0)')
'Cell index ',i
1457 WRITE(text(k),
'(A,A)')
' Description: ',
1458 w trim(grid%CELLINDEX(i)%DESCRIPTION)
1459 n=grid%CELLINDEX(i)%NINDEX
1462 WRITE(text(k),
'(A,I0,A,A)')
' Column ',i,
': ',
1463 w trim(grid%CELLINDEX(i)%COLUMNS(j))
1466 WRITE(text(k),
'(A,I0)')
' Number of elements: ',
1467 w grid%CELLINDEX(i)%NELEMENTS
1469 WRITE(text(k),*)
' Minimal value(s): ',
1470 w (minval(grid%CELLINDEX(i)%INDEXES(j,:)),j=1,n)
1472 WRITE(text(k),*)
' Maximal value(s): ',
1473 w (maxval(grid%CELLINDEX(i)%INDEXES(j,:)),j=1,n)
1476 DO i=1,grid%NEDGEINDEX
1478 WRITE(text(k),
'(A,I0)')
'Edge index ',i
1480 WRITE(text(k),
'(A,A)')
' Description: ',
1481 w trim(grid%EDGEINDEX(i)%DESCRIPTION)
1482 n=grid%EDGEINDEX(i)%NINDEX
1485 WRITE(text(k),
'(A,I0,A,A)')
' Column ',i,
': ',
1486 w trim(grid%EDGEINDEX(i)%COLUMNS(j))
1489 WRITE(text(k),
'(A,I0)')
' Number of elements: ',
1490 w grid%EDGEINDEX(i)%NELEMENTS
1492 WRITE(text(k),*)
' Minimal value(s): ',
1493 w (minval(grid%EDGEINDEX(i)%INDEXES(j,:)),j=1,n)
1495 WRITE(text(k),*)
' Maximal value(s): ',
1496 w (maxval(grid%EDGEINDEX(i)%INDEXES(j,:)),j=1,n)
1499 IF(gridman_dbg)
WRITE(gridman_unit,*)
1500 w
"GRIDMAN_GRID_METADATA_TEXT finished"
1511 u gridman_dbg,gridman_unit
1517 INTEGER,
INTENT(IN) :: IUNIT
1519 INTEGER,
INTENT(OUT) :: IERR
1521 CHARACTER(GRIDMAN_LENGTH),
ALLOCATABLE :: TEXT(:)
1524 IF(gridman_dbg)
WRITE(gridman_unit,*)
1525 w
"Starting GRIDMAN_GRID_METADATA_UNIT"
1531 WRITE(gridman_unit,*)
"GRIDMAN_GRID_METADATA_UNIT terminated"
1536 WRITE(iunit,*,iostat=is) trim(text(i))
1538 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_GRID_METADATA_UNIT: ",
1539 w
"printing failed, line ",i
1546 DEALLOCATE(text,stat=is)
1549 WRITE(gridman_unit,*)
1550 w
"WARNING from GRIDMAN_GRID_METADATA_UNIT: ",
1551 w
"memory deallocation error"
1554 IF(gridman_dbg)
WRITE(gridman_unit,*)
1555 w
"GRIDMAN_GRID_METADATA_UNIT finished"
subroutine gridman_grid_check(GRID, RES, IERR)
Check consistency of the grid data.
subroutine gridman_index_check(INDEX, RES, IERR)
Check index object.
integer, parameter, public gridman_length
Length of the description strings.
integer, save, public gridman_unit
Index of the standard output unit.
real(gridman_dp), save, public gridman_tol
Tolerance parameter which is used to compare two real numbers.
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_index_compare(INDEX1, INDEX2, RES, IERR)
Compare two index objects.
subroutine gridman_index_copy(INDEX2, INDEX1, IERR)
Create a copy of the index object.
subroutine gridman_grid_unitread(GRID, IIN, IERR)
Read grid object from file defined by unit number.
subroutine gridman_grid_take(GRID2, GRID1, IERR)
Take data from one grid object to another.
subroutine gridman_grid_count(GRID, NCOUNT, IERR)
Return the number of cells plus the number of edges not belonging to any cell.
Data-type which describes a grid as a set of edges, methods in grid.f.
subroutine gridman_grid_metadata_unit(GRID, IUNIT, IERR)
Print metadata into unit - shell for GRIDMAN_GRID_METADATA_TEXT.
subroutine gridman_grid_deallocate(GRID, IERR)
Deallocate grid object.
subroutine gridman_grid_copy(GRID2, GRID1, IERR)
Create a copy of the grid object.
subroutine gridman_grid_unitwrite(GRID, IOUT, IERR)
Save grid object in a file defined by the unit index.
logical, save, public gridman_dbg
Switch for debugging mode.
subroutine gridman_grid_metadata_text(GRID, TEXT, NT, IERR)
Print metadata into text array.
subroutine gridman_grid_fileread(GRID, FNAME, IERR)
Read grid object from file defined by file name.
subroutine gridman_grid_filewrite(GRID, FNAME, IERR)
Save grid object in a file defined by the file name.
subroutine gridman_index_read(INDEX, IIN, IERR)
Read index object from file.
subroutine gridman_index_write(INDEX, IOUT, IERR)
Save index object in a file.
Definition of data types, global constants and variables.
subroutine gridman_index_deallocate(INDEX, IERR)
Allocate index object.
subroutine gridman_grid_compare(GRID1, GRID2, RES, IERR)
Compare two grid objects.
integer, parameter, public gridman_sp
Kind parameter for integer numbers.