43 INTRINSIC tiny,max,min
47 INTEGER,
INTENT(OUT) :: RES
49 INTEGER,
INTENT(OUT) :: IERR
51 INTEGER(GRIDMAN_SP) :: ICELL,IE,IE1,I,
52 i ipoint,ipoint1,ipoint2,ipoint0,
53 i ipoint11,ipoint12,ipoint21,ipoint22,
54 i itmp,iedge0,iedge,iedge1,iedge2
56 REAL(GRIDMAN_DP) :: X11,Y11,X12,Y12,X21,Y21,X22,Y22,XI,YI,
66 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
69 w
"the grid is not of 2D type"
71 w grid%TYPE,grid%PDIM,grid%EDIM
76 IF(res.NE.0.OR.ierr.GT.0)
RETURN
79 IF(ierr.NE.0)
GOTO 1000
81 IF(ierr.NE.0)
GOTO 500
85 DO icell=1,grid%NCELLS
87 iedge0=cells%IND(cells%IFIRST(icell))
88 IF(iedge0.LT.1.OR.iedge0.GT.grid%NEDGES)
THEN
90 w
"ERROR in GRIDMAN_GRID2D_CHECK:",
91 w
" internal error - wrong edge index"
95 ipoint0=grid%POINTS(1,iedge0)
96 ipoint=grid%POINTS(2,iedge0)
100 DO i=cells%IFIRST(icell)+1,cells%ILAST(icell)
104 DO ie=points%IFIRST(ipoint),points%ILAST(ipoint)
106 IF(iedge.NE.iedge0)
THEN
107 IF(iedge.LT.1.OR.iedge.GT.grid%NEDGES)
THEN
109 w
"ERROR in GRIDMAN_GRID2D_CHECK:",
110 w
" internal error - wrong edge index"
114 IF(grid%CELLS(1,iedge).EQ.icell.OR.
115 f grid%CELLS(2,iedge).EQ.icell)
THEN
117 ipoint1=grid%POINTS(1,iedge)
118 ipoint2=grid%POINTS(2,iedge)
122 w
"more than two edges ",
123 w
"connected to a point in one cell"
125 w icell, ipoint1, ipoint2
131 IF(ipoint1.NE.ipoint)
THEN
135 IF(ipoint1.NE.ipoint)
THEN
138 w
"ERROR in GRIDMAN_GRID2D_CHECK:",
139 w
" internal error - the found edge is wrong"
141 w
" ICELL, IEDGE, IPOINT, IPOINT1, IPOINT2 ",
142 w icell, iedge, ipoint, ipoint1, ipoint2
151 IF(ipoint2.EQ.0)
THEN
154 w
"the chain is brocken"
156 w icell, ipoint, ipoint0
163 IF(ipoint0.NE.ipoint)
THEN
166 w
"the chain is brocken"
168 w icell, ipoint, ipoint0
176 DO iedge=1,grid%NEDGES
177 ipoint1=grid%POINTS(1,iedge)
178 ipoint2=grid%POINTS(2,iedge)
183 s=(x2-x1)**2+(y2-y1)**2
184 IF(.NOT.s.GT.tiny(x1))
THEN
187 w
"edge with zero length"
197 DO icell=1,grid%NCELLS
198 DO ie1=cells%IFIRST(icell),cells%ILAST(icell)
199 iedge1=cells%IND(ie1)
200 ipoint11=grid%POINTS(1,iedge1)
201 ipoint12=grid%POINTS(2,iedge1)
202 x11=grid%X(1,ipoint11)
203 y11=grid%X(2,ipoint11)
204 x12=grid%X(1,ipoint12)
205 y12=grid%X(2,ipoint12)
206 DO ie=ie1+1,cells%ILAST(icell)
208 ipoint21=grid%POINTS(1,iedge)
209 ipoint22=grid%POINTS(2,iedge)
210 IF(ipoint21.EQ.ipoint11.OR.ipoint21.EQ.ipoint12.OR.
211 f ipoint22.EQ.ipoint11.OR.ipoint22.EQ.ipoint12) cycle
212 x21=grid%X(1,ipoint21)
213 y21=grid%X(2,ipoint21)
214 x22=grid%X(1,ipoint22)
215 y22=grid%X(2,ipoint22)
218 f x21,y21,x22,y22,xi,yi))
THEN
221 w
" intersecting edges"
224 w iedge1,ipoint11,ipoint12
228 w iedge,ipoint21,ipoint22
254 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CHECK terminated"
277 INTEGER,
INTENT(OUT) :: IERR
280 INTEGER(GRIDMAN_SP) :: ICELL,IEDGE0,IEDGE,I,IE,ITMP,
281 i ipoint,ipoint1,ipoint2,n1,n2
285 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_CHAINS"
289 IF(grid%NCELLS.LT.1)
THEN
295 IF(grid%EDIM.NE.2)
THEN
297 WRITE(
gridman_unit,*)
"Error in GRIDMAN_GRID2D_CHAINS: "
298 WRITE(
gridman_unit,*)
"This subroutine is applicable only if ",
299 w
"edges are defined by exactly two points: EDIM=2"
305 IF(ierr.NE.0)
GOTO 1000
307 IF(ierr.NE.0)
GOTO 1000
309 IF(ierr.NE.0)
GOTO 1000
312 DO icell=1,grid%NCELLS
314 iedge0=cells%IND(cells%IFIRST(icell))
315 IF(iedge0.LT.1.OR.iedge0.GT.grid%NEDGES)
THEN
317 w
"ERROR in GRIDMAN_GRID2D_CHAINS:",
318 w
" internal error - wrong edge index"
322 ipoint1=grid%POINTS(1,iedge0)
323 ipoint=grid%POINTS(2,iedge0)
324 chains%ILAST(icell)=chains%IFIRST(icell)
325 chains%IND( chains%ILAST(icell) )=ipoint1
326 chains%ILAST(icell)=chains%ILAST(icell)+1
327 chains%IND( chains%ILAST(icell) )=ipoint
330 DO i=cells%IFIRST(icell)+1,cells%ILAST(icell)
333 DO ie=points%IFIRST(ipoint),points%ILAST(ipoint)
335 IF(iedge.NE.iedge0)
THEN
336 IF(iedge.LT.1.OR.iedge.GT.grid%NEDGES)
THEN
338 w
"ERROR in GRIDMAN_GRID2D_CHAINS:",
339 w
" internal error - wrong edge index"
343 IF(grid%CELLS(1,iedge).EQ.icell.OR.
344 f grid%CELLS(2,iedge).EQ.icell)
THEN
346 ipoint1=grid%POINTS(1,iedge)
347 ipoint2=grid%POINTS(2,iedge)
348 IF(ipoint1.NE.ipoint)
THEN
352 IF(ipoint1.NE.ipoint)
THEN
355 w
"ERROR in GRIDMAN_GRID2D_CHAINS:",
356 w
" internal error - the found edge is wrong"
358 w
" ICELL, IEDGE, IPOINT, IPOINT1, IPOINT2 ",
359 w icell, iedge, ipoint, ipoint1, ipoint2
365 chains%ILAST(icell)=chains%ILAST(icell)+1
366 chains%IND( chains%ILAST(icell) )=ipoint2
374 IF(icell.LT.grid%NCELLS)
375 f chains%IFIRST(icell+1)=chains%ILAST(icell)+1
378 ipoint1=chains%IND(chains%IFIRST(icell))
379 ipoint2=chains%IND(chains%ILAST(icell))
380 IF(ipoint1.NE.ipoint2)
THEN
382 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CHAINS:" ,
383 w
" internal error - no closed chain"
385 w icell, ipoint2, ipoint1
389 n1=chains%ILAST(icell)-chains%IFIRST(icell)
390 n2=cells%ILAST(icell)-cells%IFIRST(icell)
393 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CHAINS:" ,
394 w
" internal error - mismatch between CHAIN and CELLS"
406 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CHAINS finished"
414 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CHAINS terminated"
426 u gridman_dbg,gridman_check
433 REAL(GRIDMAN_DP) :: LEDGES(grid%nedges)
435 INTEGER,
INTENT(OUT) :: IERR
437 INTEGER(GRIDMAN_SP) :: IEDGE,IPOINT
439 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2
442 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_LENGTHS"
444 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
447 w
"the grid is not of 2D type"
449 w grid%TYPE,grid%PDIM,grid%EDIM
453 IF(gridman_check)
THEN
455 IF(res.NE.0.OR.ierr.GT.0)
THEN
457 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_LENGTHS: ",
458 w
"the grid is incorrect"
463 DO iedge=1,grid%NEDGES
464 ipoint=grid%POINTS(1,iedge)
467 ipoint=grid%POINTS(2,iedge)
470 ledges(iedge)=sqrt((x1-x2)**2+(y1-y2)**2)
474 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_LENGTHS completed"
492 REAL(GRIDMAN_DP) :: SCELLS(grid%ncells)
494 INTEGER,
INTENT(OUT) :: IERR
496 INTEGER(GRIDMAN_SP) :: ICELL,IP,IPOINT1,IPOINT2
498 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2,S
502 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_CROSSECT"
506 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
509 w
"the grid is not of 2D type"
511 w grid%TYPE,grid%PDIM,grid%EDIM
515 IF(gridman_check)
THEN
517 IF(res.NE.0.OR.ierr.GT.0)
THEN
519 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CROSSECT: ",
520 w
"the grid is incorrect"
526 IF(ierr.NE.0)
GOTO 1000
528 DO icell=1,grid%NCELLS
530 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
531 ipoint1=chains%IND(ip)
532 ipoint2=chains%IND(ip+1)
539 scells(icell)=0.5*abs(s)
545 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CROSSECT finished"
549 WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CROSSECT terminated"
570 REAL(GRIDMAN_DP) :: XCN(2,grid%ncells)
572 INTEGER,
INTENT(OUT) :: IERR
574 INTEGER(GRIDMAN_SP) :: ICELL,IP,IPOINT,IPOINT1,IPOINT2,N
576 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2,S,S2,XC,YC,XC2,YC2
580 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_CENTER"
584 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
587 w
"the grid is not of 2D type"
589 w grid%TYPE,grid%PDIM,grid%EDIM
593 IF(gridman_check)
THEN
595 IF(res.NE.0.OR.ierr.GT.0)
THEN
597 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CENTER: ",
598 w
"the grid is incorrect"
604 IF(ierr.NE.0)
GOTO 1000
606 DO icell=1,grid%NCELLS
614 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
615 ipoint1=chains%IND(ip)
616 ipoint2=chains%IND(ip+1)
624 xc=xc+(x2+x1)*(x1*y2-x2*y1)
625 xc2=xc2+(x2**2+x1**2+x2*x1)*(y2-y1)
626 yc=yc+(y2+y1)*(x1*y2-x2*y1)
627 yc2=yc2+(y2**2+y1**2+y2*y1)*(x1-x2)
630 IF(abs(s-s2).GT.gridman_tol*(abs(s)+abs(s2)))
THEN
632 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CENTER: ",
633 w
"the area calculation is incorrect"
637 IF(abs(xc-xc2).GT.gridman_tol*(abs(xc)+abs(xc2)))
THEN
639 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CENTER: ",
640 w
"the center coordinate calculation is incorrect"
644 IF(abs(yc-yc2).GT.gridman_tol*(abs(yc)+abs(yc2)))
THEN
646 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CENTER: ",
647 w
"the center coordinate calculation is incorrect"
651 IF(abs(s).GT.tiny(s))
THEN
653 xcn(1,icell)=xc/(3.*s)
654 xcn(2,icell)=yc/(3.*s)
658 w
"WARNING from GRIDMAN_GRID2D_CENTER: ",
659 w
"cell has zero area, ICELL ", icell
662 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
663 ipoint=chains%IND(ip)
664 xc=xc+grid%X(1,ipoint)
665 yc=yc+grid%X(2,ipoint)
667 n=chains%ILAST(icell)-chains%IFIRST(icell)
678 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CENTER finished"
684 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CENTER terminated"
698 INTRINSIC abs,sign,tiny
703 REAL(GRIDMAN_DP) :: VN(2,grid%nedges)
705 INTEGER,
INTENT(OUT) :: IERR
707 INTEGER(GRIDMAN_SP) :: IEDGE,ICELL,IP,IPOINT1,IPOINT2,
710 REAL(GRIDMAN_DP) :: XN,YN,NORM,PROD,X1,Y1,X2,Y2,S
718 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
721 w
"the grid is not of 2D type"
723 w grid%TYPE,grid%PDIM,grid%EDIM
727 IF(gridman_check)
THEN
729 IF(res.NE.0.OR.ierr.GT.0)
THEN
732 w
"the grid is incorrect"
738 IF(ierr.NE.0)
GOTO 1000
740 DO iedge=1,grid%NEDGES
742 ipoint01=grid%POINTS(1,iedge)
743 ipoint02=grid%POINTS(2,iedge)
744 x1=grid%X(1,ipoint01)
745 y1=grid%X(2,ipoint01)
746 x2=grid%X(1,ipoint02)
747 y2=grid%X(2,ipoint02)
760 icell=grid%CELLS(1,iedge)
762 icell=grid%CELLS(2,iedge)
773 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
774 ipoint1=chains%IND(ip)
775 ipoint2=chains%IND(ip+1)
783 IF(ipoint01.EQ.ipoint2.AND.ipoint02.EQ.ipoint1)
THEN
789 norm=sqrt(xn**2+yn**2)
790 IF(abs(norm).LE.10.*tiny(norm)) norm=1.0
792 vn(1,iedge)=-xn*sign(1._gridman_dp,s)/norm
793 vn(2,iedge)=-yn*sign(1._gridman_dp,s)/norm
795 ipoint1=grid%POINTS(1,iedge)
796 ipoint2=grid%POINTS(2,iedge)
802 prod=(x2-x1)*vn(1,iedge)+(y2-y1)*vn(2,iedge)
803 IF(abs(prod).GT.gridman_tol*norm)
THEN
806 w
"the calculation of normal vector is incorrect"
807 WRITE(
gridman_unit,*)
"IEDGE, S, X2-X1, Y2-Y1, XN, YN, ",
808 w iedge,s,x2-x1,y2-y1,vn(1,iedge),vn(2,iedge)
822 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_NORM terminated"
835 INTRINSIC sign,abs,tiny,int
840 LOGICAL :: ISCONVEX(grid%ncells)
842 INTEGER,
INTENT(OUT) :: IERR
844 INTEGER(GRIDMAN_SP) :: ICELL,IP,IPOINT1,IPOINT2,N,N0,NZ
846 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2,VX,VY,VX0,VY0,V
850 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_ISCONVEX"
854 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
857 w
"the grid is not of 2D type"
859 w grid%TYPE,grid%PDIM,grid%EDIM
863 IF(gridman_check)
THEN
865 IF(res.NE.0.OR.ierr.GT.0)
THEN
867 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_ISCONVEX: ",
868 w
"the grid is incorrect"
874 IF(ierr.NE.0)
GOTO 1000
879 DO icell=1,grid%NCELLS
882 ip=chains%ILAST(icell)-1
883 ipoint1=chains%IND(ip)
884 ip=chains%ILAST(icell)
885 ipoint2=chains%IND(ip)
892 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
893 ipoint1=chains%IND(ip)
894 ipoint2=chains%IND(ip+1)
903 IF(abs(v).LT.10.*tiny(v))
THEN
912 n0=chains%ILAST(icell)-chains%IFIRST(icell)
914 IF(abs(n).LT.n0)
THEN
916 isconvex(icell)=.false.
919 isconvex(icell)=.true.
926 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_ISCONVEX finished"
930 WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_ISCONVEX terminated"
945 u gridman_dbg,gridman_check,gridman_pi
948 INTRINSIC sqrt,
PRESENT
952 REAL(GRIDMAN_DP) :: SEDGES(grid%nedges)
954 INTEGER,
INTENT(OUT) :: IERR
956 REAL(GRIDMAN_DP),
OPTIONAL :: ANGLE
958 INTEGER(GRIDMAN_SP) :: IEDGE,IPOINT
960 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2,FANG
963 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_CYLAREAS"
967 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
970 w
"the grid is not of 2D type"
972 w grid%TYPE,grid%PDIM,grid%EDIM
976 IF(gridman_check)
THEN
978 IF(res.NE.0.OR.ierr.GT.0)
THEN
980 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CYLAREAS: ",
981 w
"the grid is incorrect"
986 IF(
PRESENT(angle))
THEN
992 DO iedge=1,grid%NEDGES
993 ipoint=grid%POINTS(1,iedge)
996 ipoint=grid%POINTS(2,iedge)
1000 sedges(iedge)=fang*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
1004 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CYLAREAS finished"
1023 INTRINSIC abs,
PRESENT
1027 REAL(GRIDMAN_DP) :: VCELLS(grid%ncells)
1029 INTEGER,
INTENT(OUT) :: IERR
1031 REAL(GRIDMAN_DP),
OPTIONAL :: ANGLE
1033 INTEGER(GRIDMAN_SP) :: ICELL,IP,IPOINT1,IPOINT2
1034 INTEGER :: RES,IERR0
1035 REAL(GRIDMAN_DP) :: X1,X2,Y1,Y2,VOL,VOL2,FTOR
1040 f
WRITE(
gridman_unit,*)
"Starting GRIDMAN_GRID2D_CYLVOLUMES"
1044 IF(grid%TYPE.NE.2.OR.grid%PDIM.NE.2.OR.grid%EDIM.NE.2)
THEN
1047 w
"the grid is not of 2D type"
1049 w grid%TYPE,grid%PDIM,grid%EDIM
1053 IF(gridman_check)
THEN
1055 IF(res.NE.0.OR.ierr.GT.0)
THEN
1057 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CYLVOLUMES: ",
1058 w
"the grid is incorrect"
1064 IF(ierr.NE.0)
GOTO 1000
1068 IF(
PRESENT(angle))
THEN
1069 ftor=angle/6._gridman_dp
1071 ftor=gridman_pi/3._gridman_dp
1074 DO icell=1,grid%NCELLS
1077 DO ip=chains%IFIRST(icell),chains%ILAST(icell)-1
1078 ipoint1=chains%IND(ip)
1079 ipoint2=chains%IND(ip+1)
1080 x1=grid%X(1,ipoint1)
1081 y1=grid%X(2,ipoint1)
1082 x2=grid%X(1,ipoint2)
1083 y2=grid%X(2,ipoint2)
1084 vol=vol+(x2+x1)*(x1*y2-x2*y1)
1085 vol2=vol2+(x2**2+x1**2+x2*x1)*(y2-y1)
1088 IF(abs(vol-vol2).GT.gridman_tol*(abs(vol)+abs(vol2)))
THEN
1090 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_GRID2D_CYLVOLUMES: ",
1091 w
"the volume calculation is incorrect"
1093 w
" ICELL, VOL1, VOL2, TOL, TOL*(VOL+VOL2)",
1094 w icell,vol,vol2,gridman_tol,gridman_tol*(vol+vol2)
1097 vcells(icell)=abs(vol)*ftor
1103 f
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CYLVOLUMES finished"
1109 1000
WRITE(
gridman_unit,*)
"GRIDMAN_GRID2D_CYLVOLUMES terminated"
subroutine gridman_grid_points(EDGES, GRID, IERR)
Create table of edges connected to each point.
subroutine gridman_grid_check(GRID, RES, IERR)
Check consistency of the grid data.
logical function gridman_intersect2d(X11, Y11, X12, Y12, X21, Y21, X22, Y22, XI, YI)
Intersection of two intervals on a plane.
subroutine gridman_indlist_allocate(INDLIST, N, L, IERR)
Allocate list of elements.
integer, save, public gridman_unit
Index of the standard output unit.
subroutine gridman_grid2d_cylvolumes(GRID, VCELLS, IERR, ANGLE)
Calculate cylindrical cell volumes.
integer, parameter, public gridman_dp
Kind parameter for real numbers.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine gridman_grid2d_chains(GRID, CHAINS, IERR)
Find closed chain of points which form each cell.
subroutine gridman_grid_cells(EDGES, GRID, IERR)
Create a list of edges which belong to each cell.
subroutine gridman_grid2d_check(GRID, RES, IERR)
Check correctness of the 2D grid object.
subroutine gridman_grid2d_cylareas(GRID, SEDGES, IERR, ANGLE)
Calculate cylindrical areas of the cell edges.
subroutine gridman_indlist_deallocate(INDLIST, IERR)
Deallocate list of indices.
Data-type which describes a grid as a set of edges, methods in grid.f.
subroutine gridman_grid2d_center(GRID, XCN, IERR)
Calculate coordinates of the cell centers.
subroutine gridman_grid2d_isconvex(GRID, ISCONVEX, IERR)
Find if cells are convex polygons or not.
subroutine gridman_grid2d_norm(GRID, VN, IERR)
Calculate unit normal vectors to grid edges.
Data-type which describes lists of elements with variable number of indices for each element...
Definition of data types, global constants and variables.
subroutine gridman_grid2d_lengths(GRID, LEDGES, IERR)
Calculate lengths of the cell edges.
subroutine gridman_grid2d_crossect(GRID, SCELLS, IERR)
Calculate cross section area of the cells.
integer, parameter, public gridman_sp
Kind parameter for integer numbers.