4 &(mesh,ikle,nelmax,ifabor,f,u,v,qvc,ca,cv,h,s,lt)
32 & bm1,bm2,cv1,cv2,cv3,cv4,ind_fra,
33 & clog_tlgth,nfrclog,t4,t5,un1,un2,
38 INTEGER,
INTENT(IN) :: NELMAX,LT
39 INTEGER,
INTENT(IN) :: IKLE(nelmax,*),IFABOR(nelmax,*)
40 DOUBLE PRECISION,
INTENT(INOUT) :: QVC(
nseclog)
42 TYPE(bief_obj),
INTENT(IN) :: F,U,V,H,S
43 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
47 INTEGER,
PARAMETER :: NSEMAX = 200
49 INTEGER NCP,ISEC,DEP,ARR,PT,IELEM,I1,I2,I3,ELBEST,IGBEST,ILBEST
50 INTEGER ILPREC,ISEG,J1,J2,J3,ERR,IEL,IELMH,IELMU,II
51 DOUBLE PRECISION SUR6,DIST,DIST1,DIST2,DIST3,X1,X2
52 DOUBLE PRECISION Y1,Y2,NORM,L2(
nseclog),DTMP1,DTMP2
58 CALL os(
'X=C ', x=
t3, c=1.d0)
59 CALL os(
'X=Y ', x=
t2, y=h )
60 CALL os(
'X=YZ ', x=
t1, y=h, z=f%ADR(ind_fra)%P )
69 ALLOCATE(nseg_fs(ncp) ,stat=err)
70 ALLOCATE(liste_fs(ncp,nsemax,2) ,stat=err)
71 CALL check_allocate(err,
"SEC_KHIONE:LISTE_FS")
103 norm = sqrt((x1-x2)**2+(y1-y2)**2)
104 IF(norm.LE.0.d0)
THEN 105 WRITE(
lu,*)
'SECTION_KHIONE: SECTION TOO SHORT ' 106 WRITE(
lu,*)
' PROBABLY BECAUSE N_START=N_END' 110 clog_tlgth(isec+nfrclog) = norm
111 un1(isec) = (y1 - y2) / norm
112 un2(isec) = (x2 - x1) / norm
114 IF(dep.EQ.0.AND.arr.EQ.0)
THEN 118 IF((dep.EQ.0.AND.arr.NE.0).OR.(dep.NE.0.AND.arr.EQ.0))
THEN 125 dist=(mesh%X%R(dep)-mesh%X%R(arr))**2+
126 & (mesh%Y%R(dep)-mesh%Y%R(arr))**2
131 DO ielem =1,mesh%NELEM
137 IF(pt.EQ.i1.OR.pt.EQ.i2.OR.pt.EQ.i3)
THEN 138 dist1 = (mesh%X%R(i1)-mesh%X%R(arr))**2 +
139 & (mesh%Y%R(i1)-mesh%Y%R(arr))**2
140 dist2 = (mesh%X%R(i2)-mesh%X%R(arr))**2 +
141 & (mesh%Y%R(i2)-mesh%Y%R(arr))**2
142 dist3 = (mesh%X%R(i3)-mesh%X%R(arr))**2 +
143 & (mesh%Y%R(i3)-mesh%Y%R(arr))**2
144 IF(dist1.LT.dist)
THEN 149 IF(i1.EQ.pt) ilprec = 1
150 IF(i2.EQ.pt) ilprec = 2
151 IF(i3.EQ.pt) ilprec = 3
153 IF(dist2.LT.dist)
THEN 158 IF(i1.EQ.pt) ilprec = 1
159 IF(i2.EQ.pt) ilprec = 2
160 IF(i3.EQ.pt) ilprec = 3
162 IF(dist3.LT.dist)
THEN 167 IF(i1.EQ.pt) ilprec = 1
168 IF(i2.EQ.pt) ilprec = 2
169 IF(i3.EQ.pt) ilprec = 3
175 IF(igbest.EQ.pt)
THEN 177 33
FORMAT(1x,
'SECTION_KHIONE : ALGORITHM FAILED')
183 IF(iseg.GT.nsemax)
THEN 184 WRITE(
lu,*)
'SECTION_KHIONE: TOO MANY SEGMENTS IN A ' 185 WRITE(
lu,*)
' SECTION. INCREASE NSEMAX' 189 liste_fs(isec,iseg,1) = ikle(elbest,ilprec)
190 liste_fs(isec,iseg,2) = ikle(elbest,ilbest)
191 IF(igbest.NE.arr)
GO TO 10
197 IF(nseg_fs(isec).GE.1)
THEN 203 msksec%ADR(isec)%P%R(iel)=0.d0
207 DO iseg=1,nseg_fs(isec)
208 i1 = liste_fs(isec,iseg,1)
209 i2 = liste_fs(isec,iseg,2)
211 IF ( (j1.EQ.i1.AND.j2.EQ.i2) .OR.
212 & (j2.EQ.i1.AND.j3.EQ.i2) .OR.
213 & (j3.EQ.i1.AND.j1.EQ.i2) )
THEN 214 msksec%ADR(isec)%P%R(iel)=1.d0
216 ELSEIF( (j1.EQ.i2.AND.j2.EQ.i1) .OR.
217 & (j2.EQ.i2.AND.j3.EQ.i1) .OR.
218 & (j3.EQ.i2.AND.j1.EQ.i1) )
THEN 219 msksec%ADR(isec)%P%R(iel)=-1.d0
233 DO iseg=1,nseg_fs(isec)
234 i1 = liste_fs(isec,iseg,1)
235 i2 = liste_fs(isec,iseg,2)
236 IF((j1.EQ.i1.OR.j2.EQ.i1.OR.j3.EQ.i1.OR.
237 & j1.EQ.i2.OR.j2.EQ.i2.OR.j3.EQ.i2).AND.
238 & abs(
msksec%ADR(isec)%P%R(iel)).LT.0.5d0)
THEN 240 IF(ifabor(iel,1).GT.0)
THEN 242 IF(abs(
msksec%ADR(isec)%P%R(ielem)).GT.0.5d0)
THEN 243 msksec%ADR(isec)%P%R(iel)=
244 &
msksec%ADR(isec)%P%R(ielem)
247 IF(ifabor(iel,2).GT.0)
THEN 249 IF(abs(
msksec%ADR(isec)%P%R(ielem)).GT.0.5d0)
THEN 250 msksec%ADR(isec)%P%R(iel)=
251 &
msksec%ADR(isec)%P%R(ielem)
254 IF(ifabor(iel,3).GT.0)
THEN 256 IF(abs(
msksec%ADR(isec)%P%R(ielem)).GT.0.5d0)
THEN 257 msksec%ADR(isec)%P%R(iel)=
258 &
msksec%ADR(isec)%P%R(ielem)
261 IF(abs(
msksec%ADR(isec)%P%R(iel)).LT.0.5d0) ok=.false.
286 IF(nseg_fs(isec).GE.1)
THEN 288 CALL os(
'X=C ', x=t4, c=un1(isec))
289 CALL os(
'X=C ', x=t5, c=un2(isec))
293 CALL matrix(bm1,
'M=N ',
'MATFGR X',ielmh,ielmu,
294 & 1.d0,
t1,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
295 CALL matrix(bm2,
'M=N ',
'MATFGR Y',ielmh,ielmu,
296 & 1.d0,
t1,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
298 CALL matvec(
'X=AY ',cv1,bm1,u,0.d0,mesh)
299 CALL matvec(
'X=X+AY ',cv1,bm2,v,0.d0,mesh)
300 CALL matvec(
'X=AY ',cv4,bm1,t4,0.d0,mesh)
301 CALL matvec(
'X=X+AY ',cv4,bm2,t5,0.d0,mesh)
303 CALL matrix(bm1,
'M=N ',
'MATFGR X',ielmh,ielmu,
304 & 1.d0,
t2,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
305 CALL matrix(bm2,
'M=N ',
'MATFGR Y',ielmh,ielmu,
306 & 1.d0,
t2,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
308 CALL matvec(
'X=AY ',cv2,bm1,t4,0.d0,mesh)
309 CALL matvec(
'X=X+AY ',cv2,bm2,t5,0.d0,mesh)
311 CALL matrix(bm1,
'M=N ',
'MATFGR X',ielmh,ielmu,
312 & 1.d0,
t3,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
313 CALL matrix(bm2,
'M=N ',
'MATFGR Y',ielmh,ielmu,
314 & 1.d0,
t3,s,s,s,s,s,mesh,.true.,
msksec%ADR(isec)%P)
316 CALL matvec(
'X=AY ',cv3,bm1,t4,0.d0,mesh)
317 CALL matvec(
'X=X+AY ',cv3,bm2,t5,0.d0,mesh)
324 DO iseg = 1 , nseg_fs(isec)
325 i1 = liste_fs(isec,iseg,1)
326 qvc(isec) = qvc(isec) + cv1%R(i1)
327 ca(isec) = ca(isec) + cv2%R(i1)
328 l2(isec) = l2(isec) + cv3%R(i1)
329 cv(isec) = cv(isec) + cv4%R(i1)
332 i2 = liste_fs(isec,nseg_fs(isec),2)
333 qvc(isec) = qvc(isec) + cv1%R(i2)
334 ca(isec) = ca(isec) + cv2%R(i2)
335 l2(isec) = l2(isec) + cv3%R(i2)
336 cv(isec) = cv(isec) + cv4%R(i2)
341 qvc(isec)=abs(qvc(isec)*0.5d0)/clog_tlgth(isec+nfrclog)
342 l2(isec) = abs(l2(isec)*0.5d0)
343 ca(isec)=abs(ca(isec)*0.5d0)/l2(isec)*clog_tlgth(isec+nfrclog)
344 cv(isec)=abs(cv(isec)*0.5d0)/l2(isec)*clog_tlgth(isec+nfrclog)
347 IF (ncsize.GT.1)
THEN 348 ii =
p_imin(nseg_fs(isec))
352 qvc(isec) = dtmp1+dtmp2
355 ca(isec) = dtmp1+dtmp2
358 cv(isec) = dtmp1+dtmp2
type(bief_obj), pointer t2
double precision function p_dmax(MYPART)
integer, dimension(:), allocatable seclog
subroutine section_khione(MESH, IKLE, NELMAX, IFABOR, F, U, V, QVC, CA, CV, H, S, LT)
integer function global_to_local_point(IPOIN, MESH)
type(bief_obj), target msksec
type(bief_obj), pointer t1
subroutine matrix(M, OP, FORMUL, IELM1, IELM2, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL)
double precision function p_dsum(MYPART)
double precision function p_dmin(MYPART)
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine matvec(OP, X, A, Y, C, MESH, LEGO)
type(bief_obj), pointer t3
integer function p_imin(MYPART)