The TELEMAC-MASCARET system  trunk
checkmesh.f
Go to the documentation of this file.
1 ! ********************
2  SUBROUTINE checkmesh
3 ! ********************
4 !
5  &(mesh,npoin)
6 !
7 !***********************************************************************
8 ! BIEF V7P1
9 !***********************************************************************
10 !
11 !brief Checks the mesh.
12 !
13 !history J-M HERVOUET (EDF LAB, LNHE)
14 !+ 23/10/2015
15 !+ V7P1
16 !+ First version. Checking the coordinates and the number of
17 !+ neighbours of points.
18 !
19 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 !| MESH |-->| MESH STRUCTURE.
21 !| NPOIN |-->| NUMBER OF POINTS (NPOIN2 IN 3D)
22 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 !
24  USE bief, ex_checkmesh => checkmesh
26 !
28  IMPLICIT NONE
29 !
30 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31 !
32  INTEGER , INTENT(IN) :: NPOIN
33  TYPE(bief_mesh) , INTENT(INOUT) :: MESH
34 !
35 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 !
37  INTEGER I,J,IDISTMIN,JDISTMIN,IELEM,I1,I2,I3,OVER
38  DOUBLE PRECISION, POINTER :: X(:),Y(:)
39  DOUBLE PRECISION DIST2,DIST2MIN
40  INTRINSIC sqrt,nint
41  LOGICAL STOP_ERROR
42 !
43 !-----------------------------------------------------------------------
44 !
45  x=>mesh%X%R
46  y=>mesh%Y%R
47  stop_error=.false.
48 !
49 !-----------------------------------------------------------------------
50 ! CHECKING THE COORDINATES
51 !-----------------------------------------------------------------------
52 !
53  dist2min=1.d20
54  DO i=1,npoin-1
55  DO j=i+1,npoin
56  dist2=(x(i)-x(j))**2+(y(i)-y(j))**2
57  IF(dist2.LT.dist2min) THEN
58  dist2min=dist2
59  idistmin=i
60  jdistmin=j
61  ENDIF
62  ENDDO
63  ENDDO
64  IF(ncsize.GT.1) THEN
65  IF(p_min(dist2min).EQ.dist2min) THEN
66  idistmin=mesh%KNOLG%I(idistmin)
67  jdistmin=mesh%KNOLG%I(jdistmin)
68  ELSE
69  idistmin=0
70  jdistmin=0
71  dist2min=0.d0
72  ENDIF
73  dist2min=p_max(dist2min)
74  idistmin=p_max(idistmin)
75  jdistmin=p_max(jdistmin)
76  ENDIF
77  WRITE(lu,*)
78  WRITE(lu,*) 'CHECKING THE MESH'
79  WRITE(lu,*)
80  WRITE(lu,*) 'SMALLEST DISTANCE BETWEEN TWO POINTS:',
81  & sqrt(dist2min)
82  WRITE(lu,*) 'BETWEEN POINTS: ',idistmin,' AND ',jdistmin
83  IF(dist2min.LT.1.d-3) THEN
84  WRITE(lu,*) 'VALUE TOO SMALL'
85  stop_error=.true.
86  ENDIF
87 !
88 !-----------------------------------------------------------------------
89 ! CHECKING THE NUMBER OF NEIGHBOURS
90 !-----------------------------------------------------------------------
91 !
92  DO i=1,npoin
93  mesh%T%R(i)=0.d0
94  ENDDO
95 !
96  DO ielem=1,mesh%NELEM
97  i1=mesh%IKLE%I(ielem)
98  mesh%T%R(i1)=mesh%T%R(i1)+2.d0
99  i2=mesh%IKLE%I(ielem+mesh%NELMAX)
100  mesh%T%R(i2)=mesh%T%R(i2)+2.d0
101  i3=mesh%IKLE%I(ielem+2*mesh%NELMAX)
102  mesh%T%R(i3)=mesh%T%R(i3)+2.d0
103  ENDDO
104  IF(ncsize.GT.1) CALL parcom(mesh%T,2,mesh)
105 !
106  over=0
107 !
108  DO i=1,npoin
109  IF(mesh%T%R(i).LT.3.d0) THEN
110  IF(ncsize.GT.1) THEN
111  j=mesh%KNOLG%I(i)
112  ELSE
113  j=i
114  ENDIF
115  WRITE(lu,*) 'POINT ',j,' HAS ONLY ',
116  & nint(mesh%T%R(i)),' NEIGHBOURS'
117  IF(mesh%T%R(i).LT.1.d0) THEN
118  stop_error=.true.
119  ELSE
120  over=over+1
121  ENDIF
122  ENDIF
123  ENDDO
124 !
125 ! THIS SUM IS CORRECT BECAUSE A POINt WITH 2 NEIGHBOURS CANNOT
126 ! BELONG TO 2 SUB-DOMAINS
127  IF(ncsize.GT.1) over=p_sum(over)
128 !
129  IF(over.GT.1) THEN
130  WRITE(lu,*) over,' OVERCONSTRAINED TRIANGLES'
131  WRITE(lu,*) 'POSSIBLE BUT NOT RECOMMENDED'
132  ENDIF
133 !
134 !-----------------------------------------------------------------------
135 ! STOPPING IF FATAL ERROR
136 !-----------------------------------------------------------------------
137 !
138  IF(stop_error) THEN
139  WRITE(lu,*) 'ISSUE DETECTED WHILE CHECING THE MESH'
140  CALL plante(1)
141  stop
142  ENDIF
143 !
144 !-----------------------------------------------------------------------
145 !
146  RETURN
147  END
148 
subroutine checkmesh(MESH, NPOIN)
Definition: checkmesh.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
Definition: bief.f:3