The TELEMAC-MASCARET system  trunk
propa.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE propa
3 ! ****************
4 !
5  &(f, b, elt, eta, fre, npoin3, npoin2,
6  & ndire, nf, couran, tra01)
7 !
8 !***********************************************************************
9 ! TOMAWAC V7P0
10 !***********************************************************************
11 !
12 !brief ADVECTION STEP.
13 !+ INTERPOLATES AT THE FOOT OF THE CHARACTERISTICS.
14 !
15 !history F. MARCOS (LNH)
16 !+ 05/12/95
17 !+ V1P0
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !
32 !history G.MATTAROLO (EDF - LNHE)
33 !+ 23/06/2011
34 !+ V6P1
35 !+ Translation of French names of the variables in argument
36 !
37 !history J-M HERVOUET (EDF LAB, LNHE)
38 !+ 25/11/2014
39 !+ V7P0
40 !+ Bug corrected: size of array WSHZ for POST_INTERP was not correct
41 !+ in the call, as TRA01(1,2), TRA01(1,4) was needed.
42 !+ Moreover the real size of TRA01 is (NPOIN3,6), not (NPOIN3,8), see
43 !+ point_tomawac.f. Intent completed.
44 !
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !| B |-->| JACOBIAN TO TRANSFORM N(KX,KY) INTO F(FR,TETA)
47 !| COURAN |-->| LOGICAL INDICATING IF THERE IS A CURRENT
48 !| ELT |-->| NUMBERS OF THE ELEMENTS 2D OF THE
49 !| | | POINTS TO BE ADVECTED
50 !| ETA |-->| NUMBERS OF THE LAYERS OF THE
51 !| | | POINTS TO BE ADVECTED
52 !| F |<->| WAVE ACTION DENSITY OR VARIANCE DENSITY
53 !| | | DIRECTIONAL SPECTRUM
54 !| FRE |-->| NUMBER OF THE FREQUENCIES OF THE
55 !| | | POINTS TO BE ADVECTED
56 !| IKLE_EXT |-->| TRANSITION BETWEEN LOCAL AND GLOBAL NUMBERING
57 !| | | OF THE 2D MESH (IN AN EXTENDED FORM)
58 !| NF |-->| NUMBER OF FREQUENCIES
59 !| NDIRE |-->| NUMBER OF DIRECTIONS
60 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
61 !| NPOIN3 |-->| NPOIN2*NDIRE
62 !| SHF |-->| BARYCENTRIC COORDINATES ALONG F OF THE
63 !| | | NODES IN THEIR ASSOCIATED FREQUENCIES "FRE"
64 !| SHP |-->| BARYCENTRIC COORDINATES OF THE NODES IN
65 !| | | THEIR ASSOCIATED 2D ELEMENT "ELT"
66 !| SHZ |-->| BARYCENTRIC COORDINATES ALONG TETA OF THE
67 !| | | NODES IN THEIR ASSOCIATED LAYER "ETA"
68 !| TRA01 |<->| WORK TABLE
69 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70 !
71  USE bief
72  USE interface_tomawac, ex_propa => propa
73  USE streamline, ONLY : post_interp
74  USE declarations_telemac, ONLY : namecode
76  & ststot, itr01, ikle_ext, isub, mesh3d
77 ! STSTOT IS HERE A WORK TABLE
79  IMPLICIT NONE
80 !
81 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
82 !
83  INTEGER, INTENT(IN) :: NPOIN3,NPOIN2,NDIRE,NF
84 !
85  DOUBLE PRECISION, INTENT(INOUT) :: F(npoin2,ndire,nf)
86  DOUBLE PRECISION, INTENT(IN) :: B(npoin2,nf)
87  DOUBLE PRECISION, INTENT(INOUT) :: TRA01(npoin3,nf)
88  INTEGER, INTENT(INOUT) :: ELT(npoin3,nf),ETA(npoin3,nf)
89  INTEGER, INTENT(INOUT) :: FRE(*)
90  LOGICAL, INTENT(IN) :: COURAN
91 !
92 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93 !
94  INTEGER IFF,I,I3,IDIRE
95  INTEGER :: SIZ_ISUB, SIZ_FRE, JF_ISUB, JF_FRE
96  INTEGER, ALLOCATABLE :: TMP_ISUB(:)
97 !
98 !----------------------------------------------------------------------
99 !
100 ! WITH CURRENT ALL FUNCTION MUST BE BUILT BEFORE INTERPOLATION
101 ! AS ALL FREQUENCIES WILL BE USED TOGETHER
102 !
103  IF(couran) THEN
104  DO iff=1,nf
105  DO idire=1,ndire
106  DO i=1,npoin2
107  i3=i+(idire-1)*npoin2+(iff-1)*npoin3
108  ststot%R(i3)=f(i,idire,iff)*b(i,iff)
109  ENDDO
110  ENDDO
111  ENDDO
112  ENDIF
113 !
114 ! NOW FREQUENCY PER FREQUENCY
115 !
116  DO iff=1,nf
117 !
118 ! COPY OF F*B INTO T3_01=TRA02 ?
119 !
120  IF(.NOT.couran) THEN
121  DO idire=1,ndire
122  DO i=1,npoin2
123  i3=i+(idire-1)*npoin2
124  ststot%R(i3)=f(i,idire,iff)*b(i,iff)
125  ENDDO
126  ENDDO
127  ENDIF
128 !
129  IF(ncsize.GT.1) THEN
130  siz_isub = npoin3
131  jf_isub = iff
132  ELSE
133  siz_isub = 1
134  jf_isub = 1
135  ENDIF
136  IF(couran.OR.namecode(1:7).EQ.'TELEMAC') THEN
137  siz_fre = npoin3
138  jf_fre = iff
139  ELSE
140  siz_fre = 1
141  jf_fre = 1
142  ENDIF
143  ! Memory optimisation (intel debug)
144  ALLOCATE(tmp_isub(siz_isub))
145  tmp_isub = isub((jf_isub-1)*siz_isub+1:jf_isub*siz_isub)
146  CALL post_interp(ststot,t3_02,sshp1%ADR(iff)%P%R,
147  & sshz%ADR(iff)%P%R,sshf%ADR(iff)%P%R,
148  & ikle_ext%I,ikle_ext%DIM1,1,
149  & npoin2,elt(1,iff),eta(1,iff),
150  & fre((jf_fre-1)*siz_fre+1:jf_fre*siz_fre),
151  & tmp_isub,
152  & 3,ndire,41,npoin3,
153  & npoin2,tra01,tra01(1,4),
154  & t3_01%R,itr01(1:npoin3),
155  & itr01(npoin3+1:2*npoin3),
156  & itr01(2*npoin3+1:3*npoin3),
157  & npoin3,
158  & .true.,
159 ! PERIODICITY
160  & couran)
161 ! 4D
162  DEALLOCATE(tmp_isub)
163 !
164  IF(ncsize.GT.1) CALL parcom(t3_02,1,mesh3d)
165 !
166 ! FINAL COMPUTATION OF F
167 !
168  DO idire=1,ndire
169  DO i=1,npoin2
170  i3=i+(idire-1)*npoin2
171 ! MAX(..,0.D0) SEEMS NECESSARY, WHERE F BECOMES < 0 ??
172  f(i,idire,iff)=max(t3_02%R(i3)/b(i,iff),0.d0)
173  ENDDO
174  ENDDO
175 !
176  ENDDO
177 !
178 !-----------------------------------------------------------------------
179 !
180  RETURN
181  END
182 
type(bief_obj), target sshz
subroutine propa(F, B, ELT, ETA, FRE, NPOIN3, NPOIN2, NDIRE, NF, COURAN, TRA01)
Definition: propa.f:8
type(bief_obj), pointer t3_02
character(len=24) namecode
type(bief_obj), target sshp1
type(bief_obj), target sshf
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
subroutine, public post_interp(U, UTILD, SHP, SHZ, SHF, IKLE, NELMAX, NOMB, NPOIN2, ELT, ETA, FRE, ISUB, NDP, NPLAN, IELM, NPLOT, DIM1U, WSHP, WSHZ, WSHF, WELT, WETA, WFRE, SIZEBUF, PERIO, YA4D)
Definition: streamline.f:7941
type(bief_obj), pointer t3_01
Definition: bief.f:3