47
48
49
50 USE my_alloc_mod
58
59
60
61#include "implicit_f.inc"
62
63
64
65#include "com01_c.inc"
66#include "com04_c.inc"
67#include "scr17_c.inc"
68#include "r2r_c.inc"
69
70
71
72 INTEGER ,INTENT(IN) :: ITABM1(*),IPART(LIPART1,*),FLAG
74 my_real ,
INTENT(INOUT) :: ms(*),totaddmas
75 TYPE(SUBMODEL_DATA),DIMENSION(*) ,INTENT(IN) :: LSUBMODEL
76 TYPE (UNIT_TYPE_),INTENT(IN) :: UNITAB
77
78 TYPE (GROUP_) , DIMENSION(NGRNOD) ,INTENT(IN) :: IGRNOD
79 TYPE (GROUP_) , DIMENSION(NGRPART) ,INTENT(IN) :: IGRPART
80 TYPE (SURF_) , DIMENSION(NSURF) ,INTENT(IN) :: IGRSURF
81 TYPE (ADMAS_) , DIMENSION(NODMAS) ,INTENT(INOUT):: IPMAS
82
83
84
85 INTEGER I,J,K,ITYPE,ID,UID,IGR,IGRS,NOSYS,ISU,NNOD,
86 . ISS,NN,IBUFN(4),CAPT,ITY,IPA,IP,IGRPA,IDP,
87 . NEL,IFLAG,JCURR,CPT_LAST,IMS,ENTITYMAX
89 . amas,coeff_r2r
90 LOGICAL LOOP_2
91
92 CHARACTER(nchartitle) :: TITR,MESS
93 LOGICAL :: IS_AVAILABLE
94
95 INTEGER, ALLOCATABLE, DIMENSION(:) :: ENTITY_MULTI,IFLAG_MULTI
96 my_real,
ALLOCATABLE,
DIMENSION(:) :: amas_multi
97
98
99
100 INTEGER USR2SYS
101 DATA mess/'ADDED MASS DEFINITION '/
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 is_available = .false.
125
126
127
128
130
131
132
133 imasadd = 0
134
135 jcurr = 1
136
137 DO i=1,nodmas
138 titr = ''
139 ims = 0
140
141
142
145 . unit_id = uid,
146 . option_titr = titr)
147
148 CALL hm_get_intv(
'type' ,itype ,is_available,lsubmodel)
149
150
151 ipmas(i)%TITLE = titr
153 ipmas(i)%TYPE = itype
154
155 IF (itype == 0 .or. itype == 1) THEN
156
157
158
159
160 IF (flag == 0) THEN
161 CALL hm_get_floatv(
'masses' ,amas ,is_available ,lsubmodel ,unitab)
162 CALL hm_get_intv(
'grnd_ID' ,igr ,is_available ,lsubmodel)
163
164 IF(amas < zero)THEN
166 . msgtype=msgwarning,
167 . anmode=aninfo_blind_1,
169 . c1=titr)
170 ENDIF
171
172 IF(igr == 0)THEN
174 . msgtype=msgerror,
175 . anmode=aninfo,
176 . c1='/ADMAS',
177 . c2='/ADMAS',
178 . c3=titr,
180 ENDIF
181
182 igrs=0
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 cpt_last = ngrnod
201 loop_2 = .false.
202110 CONTINUE
203 DO j=jcurr,cpt_last
204 IF (igr == igrnod(j)%ID) THEN
205 igrs = j
206 jcurr = j
207
208 GOTO 100
209 ENDIF
210 IF (j == ngrnod) THEN
211 IF(loop_2)THEN
212
213 GOTO 100
214 ELSE
215
216 loop_2 = .true.
217 ENDIF
218 cpt_last = jcurr
219 jcurr = 1
220
221 GOTO 110
222 ENDIF
223 ENDDO
224
225
226
227100 CONTINUE
228
229 IF (itype == 1) THEN
230 coeff_r2r = 1
231 nnod = igrnod(igrs)%NENTITY
232
233 IF (nsubdom > 0) THEN
234 IF (ipid==0) nnod = nnod-igrnod(igrs)%R2R_SHARE
235 coeff_r2r=(1.00*nnod)/(1.00*
max(1,igrnod(igrs)%R2R_ALL))
236 ENDIF
237 amas = coeff_r2r*amas/
max(1,nnod)
238 ENDIF
239
240 IF (igrs /= 0) THEN
241 DO j=1,igrnod(igrs)%NENTITY
242 nosys=igrnod(igrs)%ENTITY(j)
243
244 IF ((nsubdom > 0).AND.(ipid == 0)) THEN
245 IF (
tagno(npart+nosys) > 1)
GOTO 150
246 ENDIF
247 ms(nosys) = ms(nosys) + amas
248 totaddmas = totaddmas + amas
249 150 CONTINUE
250 ENDDO
251 nnod = igrnod(igrs)%NENTITY
252 ELSE
254 . msgtype=msgerror,
255 . anmode=aninfo,
256 . c1='IN /ADMAS OPTION',
257 . i1=igr)
258 ENDIF
259 ENDIF
260
261 ELSEIF (itype == 2) THEN
262
263
264
265
266 IF (flag == 0) THEN
267 isu = 0
268 CALL hm_get_floatv(
'masses' ,amas ,is_available ,lsubmodel ,unitab)
269 CALL hm_get_intv(
'surf_ID' ,isu ,is_available ,lsubmodel)
270
271 IF (amas < zero) THEN
273 . msgtype=msgwarning,
274 . anmode=aninfo_blind_1,
276 . c1=titr,
277 . r1=amas)
278 ENDIF
279
280 IF (isu == 0) THEN
282 . msgtype=msgerror,
283 . anmode=aninfo,
285 . c1=titr)
286 ENDIF
287 iss=0
288 nn =0
289 DO j=1,nsurf
290 IF (isu == igrsurf(j)%ID) THEN
291 iss=j
292 nn = igrsurf(iss)%NSEG
293 EXIT
294 ENDIF
295 ENDDO
296
297 IF (nsubdom > 0) THEN
299 ENDIF
300
301 IF (iss /= 0) THEN
302 DO j=1,nn
303 IF (iddom > 0) THEN
304
305 capt=0
306 DO k=1,4
307 capt=capt+
tagno(npart+igrsurf(iss)%NODES(j,k))
308 ENDDO
309 IF (capt == 8) GOTO 160
310 ENDIF
311
312 ity=igrsurf(iss)%ELTYP(j)
313
314 ibufn(1)=igrsurf(iss)%NODES(j,1)
315 ibufn(2)=igrsurf(iss)%NODES(j,2)
316 ibufn(3)=igrsurf(iss)%NODES(j,3)
317 IF (igrsurf(iss)%NODES(j,3) ==
318 . igrsurf(iss)%NODES(j,4)) ity = 7
319 IF (ity == 7) THEN
320
321 ibufn(4)=0
322 ELSE
323 ibufn(4)=igrsurf(iss)%NODES(j,4)
324 ENDIF
325
326 CALL surfmas(ms,ibufn,ity,amas,x,igrsurf(iss)%ID,totaddmas,
id,titr)
327
328 160 CONTINUE
329 ENDDO
330 ELSE
332 . msgtype=msgerror,
333 . anmode=aninfo,
335 . c1=titr,
336 . i2=isu)
337 ENDIF
338 ENDIF
339
340 ELSEIF (itype == 3 .or. itype == 4) THEN
341
342
343
344 CALL hm_get_floatv(
'masses' ,amas ,is_available ,lsubmodel ,unitab)
345 CALL hm_get_intv(
'grpart_ID' ,igrpa ,is_available ,lsubmodel)
346 CALL hm_get_intv(
'iflags' ,iflag ,is_available ,lsubmodel)
347
348 IF (amas < zero .and. flag == 0) THEN
350 . msgtype=msgwarning,
351 . anmode=aninfo_blind_1,
353 . c1=titr,
354 . r1=amas)
355 ENDIF
356
357 IF (igrpa == 0 .and. flag == 0) THEN
359 . msgtype=msgerror,
360 . anmode=aninfo,
362 . c1=titr)
363 ENDIF
364 IF (iflag /= 0 .and. iflag /= 1) iflag = 0
365 ipmas(i)%WEIGHT_FLAG = iflag
366 igrs = 0
367
368 DO j=1,ngrpart
369 IF (igrpa == igrpart(j)%ID) THEN
370 igrs=j
371 EXIT
372 ENDIF
373 ENDDO
374
375 IF (flag == 0) THEN
376 IF (igrs /= 0) THEN
377 nel = igrpart(igrs)%NENTITY
378 ipmas(i)%NPART = nel
379
380 if (.not.allocated(ipmas(i)%PART)) ALLOCATE(ipmas(i)%PART(nel))
381 if (.not.allocated(ipmas(i)%PARTID))ALLOCATE(ipmas(i)%PARTID(nel))
382 ELSE
384 . msgtype=msgerror,
385 . anmode=aninfo,
387 . c1=titr,
388 . i2=igrpa)
389 ENDIF
390 ELSEIF(flag == 1)THEN
391 IF (igrs /= 0) THEN
392 imasadd = imasadd + 1
393
394 nel = igrpart(igrs)%NENTITY
395
396 IF ((nsubdom > 0) .AND.(nel /= igrpart(igrs)%R2R_ALL).AND.(nel > 0)) THEN
398 . msgtype=msgerror,
399 . anmode=aninfo,
401 ENDIF
402 DO j=1,nel
403 idp=igrpart(igrs)%ENTITY(j)
404 ipmas(i)%PARTID(j) = idp
405 ipmas(i)%PART(j)%RPMAS = amas
406 ENDDO
407 ENDIF
408 ENDIF
409
410 ELSEIF (itype == 5) THEN
411
412
413
414 IF (flag == 0) THEN
415 CALL hm_get_intv(
'entityidsmax' ,entitymax ,is_available ,lsubmodel)
416
417 ALLOCATE(amas_multi(entitymax))
418 amas_multi(1:entitymax) = zero
419 ALLOCATE(entity_multi(entitymax))
420 entity_multi(1:entitymax) = 0
421 DO j=1,entitymax
424
425 IF (amas_multi(j) < zero) THEN
427 . msgtype=msgwarning,
428 . anmode=aninfo_blind_1,
430 . c1=titr,
431 . r1=amas_multi(j))
432 ENDIF
433
434 IF (entity_multi(j) <= 0)THEN
436 . msgtype=msgerror,
437 . anmode=aninfo,
439 . c1=titr,
440 . i2=entity_multi(j))
441 ENDIF
442 nosys =
usr2sys(entity_multi(j),itabm1,mess,
id)
443
444 IF ((nsubdom > 0) .AND. (ipid == 0)) THEN
445 IF (
tagno(npart+nosys) > 1)
GOTO 170
446 ENDIF
447 ms(nosys) = ms(nosys) + amas_multi(j)
448 totaddmas = totaddmas + amas_multi(j)
449 170 CONTINUE
450 ENDDO
451 IF (ALLOCATED(amas_multi)) DEALLOCATE(amas_multi)
452 IF (ALLOCATED(entity_multi)) DEALLOCATE(entity_multi)
453 ENDIF
454
455 ELSEIF (itype == 6 .or. itype == 7) THEN
456
457
458
459 CALL hm_get_intv(
'entityidsmax' ,entitymax ,is_available ,lsubmodel)
460
461 ALLOCATE(amas_multi(entitymax))
462 amas_multi(1:entitymax) = zero
463 ALLOCATE(entity_multi(entitymax))
464 entity_multi(1:entitymax) = 0
465 ALLOCATE(iflag_multi(entitymax))
466 iflag_multi(1:entitymax) = 0
467
468 IF (flag == 0) THEN
469 ipmas(i)%NPART = entitymax
470
471 if (.not.allocated(ipmas(i)%PART)) ALLOCATE(ipmas(i)%PART(entitymax))
472 if (.not.allocated(ipmas(i)%PARTID))ALLOCATE(ipmas(i)%PARTID(entitymax))
473 ENDIF
474
475 ipa = 0
476 DO j=1,entitymax
480
481 IF (amas_multi(j) < zero .and. flag == 0) THEN
483 . msgtype=msgwarning,
484 . anmode=aninfo_blind_1,
486 . c1=titr,
487 . r1=amas_multi(j))
488 ENDIF
489
490 IF (entity_multi(j) == 0 .and. flag == 0) THEN
492 . msgtype=msgerror,
493 . anmode=aninfo,
495 . c1=titr)
496 ENDIF
497 IF (iflag_multi(j) /= 0 .and. iflag_multi(j) /= 1) iflag_multi(j) = 0
498 ipmas(i)%WEIGHT_FLAG = iflag_multi(j)
499
500 ip = 0
501 IF (flag == 1) THEN
502 DO k=1,npart
503 IF (entity_multi(j) == ipart(4,k)) THEN
504 ip = k
505 EXIT
506 ENDIF
507 ENDDO
508
509
510 IF (nsubdom > 0) THEN
512 ipmas(i)%NPART = ipmas(i)%NPART -1
513 GOTO 180
514 ENDIF
515 ENDIF
516
517 IF (ip > 0) THEN
518 imasadd = imasadd + 1
519 ims = ims + 1
520 ipmas(i)%PARTID(ims) = ip
521 ipmas(i)%PART(ims)%RPMAS = amas_multi(j)
522 ELSE
524 . msgtype=msgerror,
525 . anmode=aninfo,
527 . c1=titr,
528 . i2=entity_multi(j))
529 ENDIF
530180 CONTINUE
531 ENDIF
532
533 ENDDO
534 IF (ALLOCATED(amas_multi)) DEALLOCATE(amas_multi)
535 IF (ALLOCATED(entity_multi)) DEALLOCATE(entity_multi)
536 IF (ALLOCATED(iflag_multi)) DEALLOCATE(iflag_multi)
537
538 ENDIF
539
540 ENDDO
541
542 RETURN
subroutine hm_get_float_array_index(name, rval, index, is_available, lsubmodel, unitab)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_int_array_index(name, ival, index, is_available, lsubmodel)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
integer, dimension(:), allocatable tagno
integer, dimension(:), allocatable tag_part
integer, dimension(:,:), allocatable isurf_r2r
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)
integer function usr2sys(iu, itabm1, mess, id)
subroutine surfmas(ms, ibufn, ity, amasu, x, id, addmas, admid, titr)