The TELEMAC-MASCARET system  trunk
rpi_invr.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE rpi_invr
3 ! *******************
4 !
5  &( x , y , neigb , nb_close, rk_d , rx_d , ry_d , rxx_d ,
6  & ryy_d , npoin2, i , quo , ac , maxnsp, mindist )
7 !
8 !***********************************************************************
9 ! TOMAWAC V6P2 25/06/2012
10 !***********************************************************************
11 !
12 !brief DIFFRACTION
13 !+ CALCULATION OF THE RADIAL FUNCTION FOR THE
14 !+ FREE-MESH METHOD
15 !
16 !history E. KRIEZI (LNH)
17 !+ 04/12/2006
18 !+ V5P5
19 !+
20 !
21 !history G.MATTAROLO (EDF - LNHE)
22 !+ 23/06/2012
23 !+ V6P2
24 !+ Modification for V6P2
25 !
26 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
27 !| AC |-->| CONSTANT FOR RADIAL FUNCTION COMPUT.
28 !| I |-->| POINT INDEX
29 !| MAXNSP |-->| CONSTANT FOR MESHFREE TECHNIQUE
30 !| MINDIST |-->| CONSTANT FOR RADIAL FUNCTION COMPUT.
31 !| NB_CLOSE |-->| ARRAY USED IN THE MESHFREE TECHNIQUE
32 !| NEIGB |-->| NEIGHBOUR POINTS FOR MESHFREE METHOD
33 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
34 !| QUO |-->| CONSTANT FOR RADIAL FUNCTION COMPUT.
35 !| RK_D |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
36 !| RX_D |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
37 !| RXX_D |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
38 !| RY_D |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
39 !| RYY_D |<->| ARRAY USED IN THE MESHFREE TECHNIQUE
40 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
41 !| Y |-->| ORDINATES OF POINTS IN THE MESH
42 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43 !
45  & rxx_i,ryy_i,rad1
46  USE interface_tomawac, ex_rpi_invr => rpi_invr
47  IMPLICIT NONE
48 !
49 ! VARIABLES IN ARGUMENT
50 !
51  INTEGER, INTENT(IN) :: NPOIN2, MAXNSP, I
52  INTEGER, INTENT(IN) :: NEIGB(npoin2,maxnsp), NB_CLOSE(npoin2)
53  DOUBLE PRECISION, INTENT(IN) :: QUO, AC
54  DOUBLE PRECISION, INTENT(IN) :: X(npoin2), Y(npoin2)
55  DOUBLE PRECISION, INTENT(IN) :: MINDIST(npoin2)
56  DOUBLE PRECISION, INTENT(INOUT) :: RK_D(maxnsp)
57  DOUBLE PRECISION, INTENT(INOUT) :: RX_D(maxnsp), RY_D(maxnsp)
58  DOUBLE PRECISION, INTENT(INOUT) :: RXX_D(maxnsp), RYY_D(maxnsp)
59 !
60 ! LOCAL VARIABLES
61 !
62  INTEGER IP, IPOIN, IP1, IPOIN1, NP
63 
64 !
65  DOUBLE PRECISION DC, WZ, WZX1, WZY1, WZX2, WZY2
66 !
67 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
68 !
69  IF(.NOT.deja_rpi)THEN
70  ALLOCATE(rk_i(maxnsp,maxnsp))
71  ALLOCATE(rn(maxnsp,maxnsp))
72  ALLOCATE(rx_i(maxnsp,maxnsp))
73  ALLOCATE(ry_i(maxnsp,maxnsp))
74  ALLOCATE(rxx_i(maxnsp,maxnsp))
75  ALLOCATE(ryy_i(maxnsp,maxnsp))
76  ALLOCATE(rad1(maxnsp,maxnsp))
77  deja_rpi=.true.
78  ENDIF
79 !
80  DO ip1 =1,nb_close(i)
81  ip=neigb(i,ip1)
82  DO ipoin1 =1,nb_close(i)
83  ipoin=neigb(i,ipoin1)
84  rad1(ip1,ipoin1)=(x(ip)-x(ipoin))**2+(y(ip)-y(ipoin))**2
85  ENDDO
86  ENDDO
87 !
88  DO ip1 =1,nb_close(i)
89  ip=neigb(i,ip1)
90  dc=mindist(i)
91  DO ipoin1 =1,nb_close(i)
92  ipoin=neigb(i,ipoin1)
93  rk_i(ip1,ipoin1)=(rad1(ip1,ipoin1)+(ac*dc)**2)**quo
94 !
95 ! First derivative
96 !
97  ry_i(ip1,ipoin1)=2.d0*quo*(rad1(ip1,ipoin1)+
98  & (ac*dc)**2)**(quo-1.d0)*(y(ip)-y(ipoin))
99 
100  rx_i(ip1,ipoin1)=2.*quo*(rad1(ip1,ipoin1)+
101  & (ac*dc)**2)**(quo-1.d0)*(x(ip)-x(ipoin))
102 !
103 ! Second derivative
104 !
105  ryy_i(ip1,ipoin1) =2.d0*quo*(rad1(ip1,ipoin1)+
106  &(ac*dc)**2)**(quo-1.d0)+4.d0*quo*(quo-1.d0)*
107  &(rad1(ip1,ipoin1)+(ac*dc)**2)**(quo-2.d0)*(y(ip)-y(ipoin))**2
108 !
109  rxx_i(ip1,ipoin1)=2.d0*quo*(rad1(ip1,ipoin1)+
110  &(ac*dc)**2)**(quo-1.d0)+4.d0*quo*(quo-1.d0)*
111  &(rad1(ip1,ipoin1)+(ac*dc)**2)**(quo-2.d0)*(x(ip)-x(ipoin))**2
112  ENDDO
113  ENDDO
114 !
115  rn=rk_i
116  np=nb_close(i)
117 !
118  CALL invert(rn,np,maxnsp)
119 !
120  DO ip1 =1,nb_close(i)
121  wz=0.d0
122  wzx1=0.d0
123  wzy1=0.d0
124  wzx2=0.d0
125  wzy2=0.d0
126  DO ipoin1 =1,nb_close(i)
127  wz=wz+rk_i(1,ipoin1)*rn(ipoin1,ip1)
128  wzx1=wzx1+rx_i(1,ipoin1)*rn(ipoin1,ip1)
129  wzy1=wzy1+ry_i(1,ipoin1)*rn(ipoin1,ip1)
130  wzx2=wzx2+rxx_i(1,ipoin1)*rn(ipoin1,ip1)
131  wzy2=wzy2+ryy_i(1,ipoin1)*rn(ipoin1,ip1)
132  ENDDO
133 ! write RK etc for the right form for each domain in one row
134  rk_d(ip1) = wz
135  rx_d(ip1) = wzx1
136  ry_d(ip1) = wzy1
137  rxx_d(ip1) = wzx2
138  ryy_d(ip1) = wzy2
139  ENDDO
140 !
141  RETURN
142  END
double precision, dimension(:,:), allocatable rx_i
double precision, dimension(:,:), allocatable ry_i
subroutine invert(RN, N, NP)
Definition: invert.f:7
double precision, dimension(:,:), allocatable rk_i
double precision, dimension(:,:), allocatable rn
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