The TELEMAC-MASCARET system  trunk
frmset.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE frmset
3 ! *****************
4 !
5  &( neigb , npoin2, nelem2,
6  & ikle , rk , rx , ry , rxx , ryy )
7 !
8 !***********************************************************************
9 ! TOMAWAC V6P2 25/06/2012
10 !***********************************************************************
11 !
12 !brief DIFFRACTION
13 !+
14 !+ SETTING THE DOMAINS FOR THE FREE-MESH METHOD
15 !
16 !history E. KRIEZI (LNH)
17 !+ 04/12/2006
18 !+ V5P5
19 !+
20 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21 !| IKLE |-->| TRANSITION BETWEEN LOCAL AND GLOBAL NUMBERING
22 !| | | OF THE 2D MESH
23 !| MAXNSP |-->| CONSTANT FOR MESHFREE TECHNIQUE
24 !| NEIGB |<->| NEIGHBOUR POINTS FOR MESHFREE METHOD
25 !| NELEM2 |-->| NUMBER OF ELEMENTS IN 2D MESH
26 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
27 !| RK |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
28 !| RX |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
29 !| RXX |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
30 !| RY |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
31 !| RYY |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
32 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 !
35  & stack,stack2,already_pom,
36  & mindist, deja_frmset,
37  & x, y, nb_close, maxnsp
39  USE interface_tomawac, ex_frmset => frmset
40  IMPLICIT NONE
41 !
42 
43 !.....VARIABLES IN ARGUMENT
44 ! """"""""""""""""""""
45  INTEGER,INTENT(IN) :: NPOIN2, NELEM2
46  INTEGER,INTENT(INOUT) :: NEIGB(npoin2,maxnsp)
47  INTEGER,INTENT(IN) :: IKLE(nelem2,3)
48  DOUBLE PRECISION,INTENT(INOUT):: RK(maxnsp,npoin2)
49  DOUBLE PRECISION,INTENT(INOUT):: RX(maxnsp,npoin2)
50  DOUBLE PRECISION,INTENT(INOUT):: RY(maxnsp,npoin2)
51  DOUBLE PRECISION,INTENT(INOUT):: RXX(maxnsp,npoin2)
52  DOUBLE PRECISION,INTENT(INOUT):: RYY(maxnsp,npoin2)
53 !
54 !.....LOCAL VARIABLES
55 ! """""""""""""""
56 !| NRD |-->| CONSTANT FOR MESHFREE TECHNIQUE
57  INTEGER, PARAMETER :: NRD = 30
58 
59  INTEGER IP, IPOIN, IP2, I
60  INTEGER ICLM, J, IELEM,ILM,CLMAX
61  INTEGER M, ICST, ICST2, NCST, IP_S, ILP, L(2)
62  DOUBLE PRECISION AC,QUO,RAD1
63 !
64 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65 !
66  IF(.NOT.deja_frmset)THEN
67  clmax=0
68  DO ipoin =1, npoin2
69  iclm=0
70  DO ielem=1,nelem2
71  IF (ipoin.EQ.ikle(ielem,1)) THEN
72  iclm=iclm+1
73  ELSEIF (ipoin.EQ.ikle(ielem,2)) THEN
74  iclm=iclm+1
75  ELSEIF (ipoin.EQ.ikle(ielem,3)) THEN
76  iclm=iclm+1
77  ENDIF
78  ENDDO
79  IF(iclm.GT.clmax) clmax=iclm
80  ENDDO
81  ALLOCATE(ilm_poin(npoin2,clmax))
82  ALLOCATE(clm(npoin2))
83  ALLOCATE(kacc(npoin2))
84  ALLOCATE(nb_c(npoin2))
85  ALLOCATE(sur_p(npoin2,clmax))
86  ALLOCATE(stack(npoin2))
87  ALLOCATE(stack2(npoin2))
88  ALLOCATE(already_pom(npoin2))
89  ALLOCATE(mindist(npoin2))
90  deja_frmset=.true.
91  ENDIF
92 !
93 ! ILM_POIN array with the elements to which a point belongs
94 ! CLM(IP) array with the number of elements for each point
95 ! for IP belong to the elements ILM_POIN(CLM(IP-1)+1:CLM(IP))
96 !
97  DO ipoin =1, npoin2
98  iclm=0
99  DO ielem=1,nelem2
100  IF (ipoin.EQ.ikle(ielem,1)) THEN
101  iclm=iclm+1
102  ilm_poin(ipoin,iclm)=ielem
103  ELSEIF (ipoin.EQ.ikle(ielem,2)) THEN
104  iclm=iclm+1
105  ilm_poin(ipoin,iclm)=ielem
106  ELSEIF (ipoin.EQ.ikle(ielem,3)) THEN
107  iclm=iclm+1
108  ilm_poin(ipoin,iclm)=ielem
109  ENDIF
110  ENDDO
111  clm(ipoin)=iclm
112  IF(clm(ipoin).GT.clmax) THEN
113  WRITE(lu,*) 'POINT',ipoin,'HAS TOO MANY NEIGHBOUR: '
114  & ,clm(ipoin)
115  CALL plante(1)
116  stop
117  ENDIF
118  ENDDO
119 !
120 ! searching for the points which are around the point IPOIN
121 ! and add the to a look up array SUR_P(IPOIN,NB_C(IPOIN))
122 !
123 ! Initialize all the arrays and logics for the new subdomain
124  DO ip=1,npoin2
125  already_pom(ip) =.false.
126  ENDDO
127 !
128  DO ipoin=1,npoin2
129  nb_c(ipoin)=0
130  mindist(ipoin)=1.e+6
131  DO ilm=1,clm(ipoin)
132  ielem=ilm_poin(ipoin,ilm)
133 ! loop over 3 nodes of each triangle
134  DO j=1,3
135 ! test if the selected node belongs to the triangle
136  IF (ikle(ielem,j).EQ.ipoin) THEN
137  IF (j.EQ.1) THEN
138  l(1)=ikle(ielem,2)
139  l(2)=ikle(ielem,3)
140  ENDIF
141  IF (j.EQ.2) THEN
142  l(1)=ikle(ielem,1)
143  l(2)=ikle(ielem,3)
144  ENDIF
145  IF (j.EQ.3) THEN
146  l(1)=ikle(ielem,1)
147  l(2)=ikle(ielem,2)
148  ENDIF
149  ENDIF
150  ENDDO
151 !
152  DO m=1,2
153  IF (.NOT.already_pom(l(m))) THEN
154  nb_c(ipoin)=nb_c(ipoin)+1
155  sur_p(ipoin,nb_c(ipoin)) =l(m)
156  already_pom(l(m)) =.true.
157  ENDIF
158  ENDDO
159 !
160  ENDDO
161 !
162 ! CALCULATE DISTANCE of EVERY POINT TO THE NEIGHBOUR POINTS
163  DO j=1,nb_c(ipoin)
164  ip=sur_p(ipoin,j)
165  rad1=sqrt((x(ip)-x(ipoin))**2+(y(ip)-y(ipoin))**2)
166  IF(rad1.LE.mindist(ipoin)) mindist(ipoin)=rad1
167  already_pom(ip) =.false.
168  ENDDO
169 
170  ENDDO
171 !
172 ! make the subdomain search over the nearest point of each point and
173 ! add them in the NEIGB(IPOIN,MAXNSP) aray
174  DO ipoin=1,npoin2
175  nb_close(ipoin)=1
176  neigb(ipoin,1) =ipoin
177  already_pom(ipoin) =.true.
178  ncst=1
179  stack(ncst)=ipoin
180 ! WRITE(LU,*) (SUR_P(STACK(NCST),j),j=1,7)
181 !
182 ! ipoin is the main point of domain ipoin
183 ! around the ipoin do a search in the elements it belongs
184 ! loop around the point of Stack and do what you did before
185 !
186 ! while loop
187  DO
188  icst2=0
189  DO icst =1,ncst
190  ip= stack(icst)
191 
192  DO ilp=1,nb_c(ip)
193  ip_s=sur_p(ip,ilp)
194  IF (.NOT.already_pom(ip_s)) THEN
195  nb_close(ipoin)=nb_close(ipoin)+1
196  neigb(ipoin,nb_close(ipoin)) =ip_s
197  already_pom(ip_s) =.true.
198  IF(nb_close(ipoin).GE.nrd) GOTO 222
199  icst2=icst2+1
200  stack2(icst2)=ip_s
201  ENDIF
202  ENDDO ! ILP
203  ENDDO ! ICST
204  ncst=icst2
205  stack=stack2
206  ENDDO
207 222 CONTINUE
208 ! end of while loop
209 !
210 !subdomain (Ipoin) finish after initializing
211 ! logic goto to the next subdomain
212  DO j=1,nb_close(ipoin)! initialize already for points logic
213  ip2=neigb(ipoin,j)
214  already_pom(ip2) =.false. ! initialize already for points logic
215  ENDDO
216  ENDDO !1,NPOIN2
217 !
218 ! CALCULATE THE RADIAL FUNCTION OF RPI
219 ! AND INVERSE MATRICES OF EACH SUB DOMAIN
220 !
221  quo = 1.03d0
222  ac = 8.d0
223  DO i=1,npoin2
224  CALL rpi_invr(x, y, neigb, nb_close,
225  & rk(1,i), rx(1,i), ry(1,i), rxx(1,i), ryy(1,i),
226  & npoin2, i, quo, ac, maxnsp, mindist)
227 !
228  ENDDO
229 !
230  RETURN
231  END
subroutine frmset(NEIGB, NPOIN2, NELEM2, IKLE, RK, RX, RY, RXX, RYY)
Definition: frmset.f:8
integer, dimension(:,:), allocatable ilm_poin
integer, dimension(:,:), allocatable sur_p
integer, dimension(:), allocatable nb_c
integer, dimension(:), allocatable clm
subroutine rpi_invr(X, Y, NEIGB, NB_CLOSE, RK_D, RX_D, RY_D, RXX_D, RYY_D, NPOIN2, I, QUO, AC, MAXNSP, MINDIST)
Definition: rpi_invr.f:8
integer, dimension(:), allocatable kacc