The TELEMAC-MASCARET system  trunk
org_charac_type_oil.F
Go to the documentation of this file.
1 ! ******************************
2  SUBROUTINE org_charac_type_oil
3 ! ******************************
4 !
5  &(oil_charac)
6 !
7 !***********************************************************************
8 ! PARALLEL V6P3 21/08/2010
9 !***********************************************************************
10 !
11 !brief MPI TYPE FOR TYPE CHARAC_TYPE - CHARACTERISTICS /
12 !
13 !history C. DENIS
14 !+ 01/07/2011
15 !+ V6P1
16 !+
17 !
18 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
19 !+ 13/07/2010
20 !+ V6P0
21 !+ Translation of French comments within the FORTRAN sources into
22 !+ English comments
23 !
24 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
25 !+ 21/08/2010
26 !+ V6P0
27 !+ Creation of DOXYGEN tags for automated documentation and
28 !+ cross-referencing of the FORTRAN sources
29 !
30 !history J-M HERVOUET
31 !+ 22/06/2012
32 !+ V6P2
33 !+ DX,DY and DZ added. Problem of integer 8 treated as a double
34 !+ solved. Much clearer now.
35 !+
36 !history J-M HERVOUET
37 !+ 04/10/2012
38 !+ V6P3
39 !+ NOMB = 0 now allowed
40 !
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !| NOMB |<---| NUMBER OF VARIABLES
43 !| TRACE |<---| IF .TRUE. TRACE EXECUTION
44 !| CHARACTERISTIC |--->| DATATYPE FOR CHARACTERISTIC
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !
51  IMPLICIT NONE
52 !
53 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 !
55  INTEGER, INTENT(INOUT) :: OIL_CHARAC
56 !
57 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 !
59  INTEGER, PARAMETER :: MAX_BASKET_SIZE=10
60 !
61 ! OIL_TYPE IS NOT USED HERE !!! NOT USED SAVE FOR TRACE
62 !
63 ! TYPE OIL_TYPE
64 ! SEQUENCE
65 ! INTEGER :: MYPID ! PARTITION OF THE TRACEBACK ORIGIN (HEAD)
66 ! INTEGER :: NEPID ! THE NEIGHBOUR PARTITION THE TRACEBACK ENTERS TO
67 ! INTEGER :: INE ! THE LOCAL 2D ELEMENT NR THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
68 ! INTEGER :: KNE ! THE LOCAL LEVEL THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
69 ! INTEGER :: IOR ! THE POSITION OF THE TRAJECTORY -HEAD- IN MYPID [THE 2D/3D NODE OF ORIGIN]
70 ! INTEGER :: STATE ! CURRENT RUNGE-KUTTA STEPS PASSED AS COLLECTED
71 ! INTEGER :: TPSECH ! TOTAL RUNGE-KUTTA STEPS
72 ! INTEGER :: IFR ! FREQUENCY
73 ! DOUBLE PRECISION :: SURFACE ! THE (X,Y,Z,F)-POSITION
74 ! DOUBLE PRECISION :: MASS0
75 ! DOUBLE PRECISION :: MASS
76 ! DOUBLE PRECISION :: MASS_EVAP
77 ! DOUBLE PRECISION :: MASS_DISS
78 ! DOUBLE PRECISION :: MASS_HAP(MAX_BASKET_SIZE)
79 ! DOUBLE PRECISION :: MASS_COMPO(MAX_BASKET_SIZE)
80 ! DOUBLE PRECISION :: TB_HAP(MAX_BASKET_SIZE)
81 ! DOUBLE PRECISION :: TB_COMPO(MAX_BASKET_SIZE)
82 ! DOUBLE PRECISION :: SOL_HAP(MAX_BASKET_SIZE)
83 ! DOUBLE PRECISION :: SOL_COMPO(MAX_BASKET_SIZE)
84 ! END TYPE OIL_CHARAC_TYPE
85 !
86 ! ARRAY OF DISPLACEMENTS BETWEEN BASIC COMPONENTS, HERE INITIALISED ONLY
87 !
88 ! INTEGER (KIND=MPI_ADDRESS_KIND), DIMENSION(20) :: CH_DELTA
89  INTEGER (KIND=MY_ADDRESS_KIND), DIMENSION(20) :: CH_DELTA
90 !
91 ! ARRAY OF BLOCKLENGTHS OF TYPE COMPONENTS, BASKET INITIALISED TO 1
92 !
93  INTEGER, DIMENSION(20) :: CH_BLENGTH
94 ! ARRAY OF COMPONENT TYPES IN TERMS OF THE MPI COMMUNICATION
95  INTEGER, DIMENSION(20) :: CH_TYPES
96  INTEGER IER
97 ! INTEGER (KIND=MPI_ADDRESS_KIND) :: EXTENT,ILB,IUB,INTEX
98  INTEGER (KIND=MY_ADDRESS_KIND) :: EXTENT,ILB,IUB,INTEX
99 !
100  INTEGER I
101 !
102  ch_blength=(/1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1/)
103  ch_delta= (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
104 !
105 ! TERMINATE ON MPI PARTS NOT HANDLED BY COMPAD
106 # if defined COMPAD
107  WRITE(lu,*) 'ORG_CHARAC_TYPE_OIL: COMPAD MAYBE CRITICAL',
108  & 'MPI OPERATION'
109  WRITE(lu,*) ' PLEASE CONTACT JR @ ADJOINTWARE'
110  CALL plante(1)
111  stop
112 # endif
113 ! INTEGERS IN THE STRUCTURE
114 !
115  CALL p_mpi_type_get_extent(mpi_integer,ilb,intex,ier)
116  ch_delta(1)=0
117 ! 9 IS THE FIRST DOUBLE PRECISION THAT COMES AFTER AN INTEGER
118  DO i=2,9
119  ch_delta(i)=ch_delta(i-1)+intex
120  ENDDO
121 !
122 ! DOUBLE PRECISION IN THE STRUCTURE
123 !
124 ! Handle components of active data type correctly
125 #ifdef COMPAD
126  CALL p_mpi_type_get_extent(ampi_type,ilb,intex,ier)
127 #else
128  CALL p_mpi_type_get_extent(mpi_double_precision,ilb,intex,ier)
129 #endif
130 ! THE 11 REMAINING DOUBLE PRECISION
131  ch_delta(10)=ch_delta(9)+intex
132  ch_delta(11)=ch_delta(10)+intex
133  ch_delta(12)=ch_delta(11)+intex
134  ch_delta(13)=ch_delta(12)+intex
135  ch_delta(14)=ch_delta(13)+intex
136 ! ADDRESS AFTER THE BASKETCOMPO TABLE
137  ch_delta(15)=ch_delta(14)+intex*max_basket_size
138  ch_delta(16)=ch_delta(15)+intex*max_basket_size
139 ! ADDRESS AFTER THE BASKETHAP TABLE
140  ch_delta(17)=ch_delta(16)+intex*max_basket_size
141  ch_delta(18)=ch_delta(17)+intex*max_basket_size
142  ch_delta(19)=ch_delta(18)+intex*max_basket_size
143 ! ADDRESS AFTER THE LAST HAP TABLE
144  ch_delta(20)=ch_delta(19)+intex*max_basket_size
145 !
146  ch_blength(14) = max_basket_size
147  ch_blength(15) = max_basket_size
148  ch_blength(16) = max_basket_size
149  ch_blength(17) = max_basket_size
150  ch_blength(18) = max_basket_size
151  ch_blength(19) = max_basket_size
152 !
153  ch_types(1)=mpi_integer
154  ch_types(2)=mpi_integer
155  ch_types(3)=mpi_integer
156  ch_types(4)=mpi_integer
157  ch_types(5)=mpi_integer
158  ch_types(6)=mpi_integer
159  ch_types(7)=mpi_integer
160  ch_types(8)=mpi_integer
161 !! COMPAD-DCO BEGIN JR2017
162 !! Handle components of active data type correctly
163 #if defined COMPAD
164  ch_types(9)=ampi_type
165  ch_types(10)=ampi_type
166  ch_types(11)=ampi_type
167  ch_types(12)=ampi_type
168  ch_types(13)=ampi_type
169  ch_types(14)=ampi_type
170  ch_types(15)=ampi_type
171  ch_types(16)=ampi_type
172  ch_types(17)=ampi_type
173  ch_types(18)=ampi_type
174  ch_types(19)=ampi_type
175 #else
176  ch_types(9)=mpi_double_precision
177  ch_types(10)=mpi_double_precision
178  ch_types(11)=mpi_double_precision
179  ch_types(12)=mpi_double_precision
180  ch_types(13)=mpi_double_precision
181  ch_types(14)=mpi_double_precision
182  ch_types(15)=mpi_double_precision
183  ch_types(16)=mpi_double_precision
184  ch_types(17)=mpi_double_precision
185  ch_types(18)=mpi_double_precision
186  ch_types(19)=mpi_double_precision
187 #endif
188  ch_types(20)=mpi_ub ! THE TYPE UPPER BOUND MARKER
189  CALL p_mpi_type_create_struct(20,ch_blength,ch_delta,ch_types,
190  & oil_charac,ier)
191  CALL p_mpi_type_commit(oil_charac,ier)
192  CALL p_mpi_type_get_extent(oil_charac,ilb,extent,ier)
193  iub=ilb+extent
194 !
195  IF(ilb.NE.ch_delta(1).OR.iub.NE.ch_delta(20)) THEN
196  WRITE(lu,*) ' PARALLEL::ORG_CHARAC_TYPE_OIL:'
197  WRITE(lu,*) ' MEMORY PROBLEM WITH THIS COMPILER: '
198  WRITE(lu,*) ' ILB=',ilb,' NOT EQUAL TO CH_DELTA(1)=',
199  & ch_delta(1)
200  WRITE(lu,*) ' OR'
201  WRITE(lu,*) ' IUB=',iub,' NOT EQUAL TO CH_DELTA(20)=',
202  & ch_delta(20)
203  CALL plante(1)
204  stop
205  ENDIF
206 !
207 !----------------------------------------------------------------------
208 !
209  RETURN
210  END SUBROUTINE org_charac_type_oil
integer, parameter mpi_double_precision
subroutine p_mpi_type_get_extent(DATATYPE, LOWER_BOUND, EXTENT, IERR)
integer, parameter mpi_integer
subroutine p_mpi_type_create_struct(NBLOCK, NELEM, DISPL, ELEM_TYPE, NEW_DATATYPE, IERR)
integer, parameter mpi_ub
subroutine p_mpi_type_commit(DATA_TYPE, IERR)
subroutine org_charac_type_oil(OIL_CHARAC)
integer, parameter ampi_type