48 . IGRNOD , IGRBRIC, ISKN , SKEW , INIVIDS ,
49 . X , UNITAB , LSUBMODEL, RTRANS , XFRAME ,
50 . IFRAME , VFLOW , WFLOW , KXSP , MULTI_FVM ,
51 . FVM_INIVEL, IGRQUAD, IGRSH3N , RBY_MSN, RBY_INIAXIS,
52 . SENSORS ,NINIVELT,INIVEL_T )
80#include "implicit_f.inc"
93 INTEGER ,
INTENT(IN) :: NINIVELT
94 TYPE (UNIT_TYPE_),
INTENT(IN) :: UNITAB
95 INTEGER :: ITAB(*), ITABM1(*),ISKN(LISKN,*),INIVIDS(*),IFRAME(LISKN,*),KXSP(NISP,*),RBY_MSN(2,*)
96 TYPE(SUBMODEL_DATA) LSUBMODEL(*)
97 my_real :: V(3,*),W(3,*),VR(3,*),SKEW(LSKEW,*),X(3,*),RTRANS(NTRANSF,*),XFRAME(NXFRAME,*),VFLOW(3,*) ,WFLOW(3,*)
98 my_real :: rby_iniaxis(7,*)
99 TYPE(multi_fvm_struct) :: MULTI_FVM
100 TYPE(fvm_inivel_struct),
INTENT(INOUT) :: FVM_INIVEL(*)
101 TYPE (SENSORS_) ,
INTENT(IN) :: SENSORS
102 TYPE(inivel_),
DIMENSION(NINIVELT),
INTENT(INOUT) :: INIVEL_T
104 TYPE (GROUP_) ,
DIMENSION(NGRNOD) :: IGRNOD
105 TYPE (GROUP_) ,
DIMENSION(NGRBRIC) :: IGRBRIC
106 TYPE (GROUP_) ,
DIMENSION(NGRQUAD) :: IGRQUAD
107 TYPE (GROUP_) ,
DIMENSION(NGRSH3N) :: IGRSH3N
111 INTEGER :: I,J,K,N,NRB,KPRI,KROT,NNOD,NOSYS,ITYPE,ID,ISK,IGR,IGRS,NBVEL
112 INTEGER :: USER_UNIT_ID,SUB_INDEX,IDIR,SENS_ID,NINIT,SENSID
113 INTEGER :: , IDGRQUAD, IDGRTRIA, IDGRBRICK_LOC, IDGRQUAD_LOC, IDGRTRIA_LOC
114 INTEGER :: NOD_COUNT,NODINIVEL,CPT,SUB_ID
115 INTEGER :: IFRA,IFM,IUN,K1,K2,K3,INOD,NB_NODES, ID_NODE,IOK
116 INTEGER :: NINIVEL_FVM,NINIVEL_TOTAL
117 INTEGER :: FVM_GRBRIC_USER_ID(NINVEL), FVM_GRQUAD_USER_ID(NINVEL), FVM_GRTRIA_USER_ID(NINVEL)
118 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGNO_RBY
119 my_real :: v1, v2, v3, v4, v5, v6, vl1, vl2, vl3,vra, ox, oy, oz, nixj(6),vr1,vr2,vr3,bid
121 CHARACTER(LEN=NCHARTITLE) :: TITR
122 CHARACTER(LEN=NCHARKEY) :: KEY
123 CHARACTER(LEN=NCHARFIELD) ::XYZ
124 CHARACTER*16 :: LABEL
125 LOGICAL IS_AVAILABLE, IS_FOUND_UNIT_ID, IS_FOUND
130 INTEGER,
EXTERNAL :: USR2SYS
131 DATA mess/
'INITIAL VELOCITIES DEFINITION '/
136 is_available = .false.
163 CALL hm_option_read_key(lsubmodel,option_id = id,unit_id = user_unit_id,submodel_index = sub_index,
164 . submodel_id = sub_id,option_titr = titr,keyword2 = key)
167 is_found_unit_id = .false.
169 IF (unitab%UNIT_ID(j) == user_unit_id)
THEN
170 is_found_unit_id = .true.
174 IF (user_unit_id /= 0 .AND. .NOT.is_found_unit_id)
THEN
175 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
176 . i2=user_unit_id,i1=id,c1=
'INITIAL VELOCITY',c2=
'INITIAL VELOCITY',c3=titr)
180 fvm_inivel(i)%FLAG = .false.
184 IF(key(1:3)==
'TRA')
THEN
187 ELSEIF(key(1:3)==
'ROT')
THEN
190 ELSEIF(key(1:3)==
'T+G')
THEN
193 ELSEIF(key(1:3)==
'GRI')
THEN
196 ELSEIF(key(1:4)==
'AXIS')
THEN
197 IF(invers < 120)
THEN
198 CALL ancmsg(msgid=2046,anmode=aninfo,msgtype=msgerror,c1=
'/INIVEL/AXIS',i1=invers)
202 ELSEIF(key(1:3) ==
'FVM')
THEN
206 ELSEIF(key(1:4)==
'NODE')
THEN
219 CALL hm_get_floatv(
'tstart',tstart,is_available,lsubmodel,unitab)
220 CALL hm_get_intv(
'sensor_id',sensid,is_available,lsubmodel)
222 DO j=1,sensors%NSENSOR
223 IF(sensors%SENSOR_TAB(j)%SENS_ID == sensid) sens_id=j
226 CALL ancmsg(msgid=1252,anmode=aninfo,msgtype=msgerror,c1=label, i1=id, c2=label, c3=titr, i2=sensid)
236 ELSEIF (itype <= 3)
THEN
239 CALL hm_get_intv(
'entityid',igr,is_available,lsubmodel)
240 CALL hm_get_intv(
'inputsystem',isk,is_available,lsubmodel)
241 IF(isk == 0 .AND. sub_index /= 0 ) isk = lsubmodel(sub_index)%SKEW
242 CALL hm_get_floatv(
'vector_X',vl1,is_available,lsubmodel,unitab)
243 CALL hm_get_floatv(
'vector_Y',vl2,is_available,lsubmodel,unitab)
244 CALL hm_get_floatv(
'vector_Z',vl3,is_available,lsubmodel,unitab)
245 IF(n2d /= 0 .AND. isk == 0)
THEN
248 CALL ancmsg(msgid=1256, anmode=aninfo, msgtype=msgwarning, c1=label, i1=id, c2=label, c3=titr)
252 IF (tstart>zero .OR. sens_id>0)
THEN
254 inivel_t(ninit)%ID = id
255 inivel_t(ninit)%ITYPE = itype
256 inivel_t(ninit)%GENERAL%TYPE = itype
257 inivel_t(ninit)%GENERAL%SKEW_ID = isk
258 inivel_t(ninit)%GENERAL%GRND_ID = igr
259 inivel_t(ninit)%GENERAL%VX = vl1
260 inivel_t(ninit)%GENERAL%VY = vl2
261 inivel_t(ninit)%GENERAL%VZ = vl3
262 inivel_t(ninit)%GENERAL%SENSOR_ID = sensid
263 inivel_t(ninit)%GENERAL%TSTART = tstart
267 ELSEIF (itype == 4)
THEN
270 CALL hm_get_intv(
'entityid',igr,is_available,lsubmodel)
272 CALL hm_get_floatv(
'vector_X',vl1,is_available,lsubmodel,unitab)
273 CALL hm_get_floatv(
'vector_Y',vl2,is_available,lsubmodel,unitab)
274 CALL hm_get_floatv(
'vector_Z',vl3,is_available,lsubmodel,unitab)
275 CALL hm_get_floatv(
'rad_rotational_velocity',vra,is_available,lsubmodel,unitab)
276 IF(n2d /= 0 .AND. ifra == 0)
THEN
277 IF(vl2 /=0 .OR. vl3 /= 0)
THEN
279 CALL ancmsg(msgid=1256, anmode=aninfo, msgtype
284 IF(ifra == 0 .AND. sub_index /= 0)
CALL subrotvect(vl1,vl2,vl3,rtrans,sub_id,lsubmodel)
285 IF(xyz(1:1)==
'X')
THEN
287 ELSEIF(xyz(1:1)==
'Y')
THEN
289 ELSEIF(xyz(1:1)==
'Z')
THEN
292 CALL ancmsg(msgid=933,msgtype=msgerror,anmode=aninfo,i1=id,c1=titr)
295 IF (tstart>zero .OR. sens_id>0)
THEN
297 inivel_t(ninit)%ID = id
298 inivel_t(ninit)%ITYPE = itype
299 inivel_t(ninit)%AXIS%DIR = idir
300 inivel_t(ninit)%AXIS%FRAME_ID = ifra
301 inivel_t(ninit)%AXIS%GRND_ID = igr
302 inivel_t(ninit)%AXIS%VX = vl1
303 inivel_t(ninit)%AXIS%VY = vl2
304 inivel_t(ninit)%AXIS%VZ = vl3
305 inivel_t(ninit)%AXIS%VR = vra
306 inivel_t(ninit)%AXIS%SENSOR_ID = sensid
307 inivel_t(ninit)%AXIS%TSTART = tstart
311 ELSEIF (itype == 5)
THEN
312 CALL hm_get_floatv(
'Vx', vl1, is_available, lsubmodel, unitab)
313 CALL hm_get_floatv(
'Vy', vl2, is_available, lsubmodel, unitab)
314 CALL hm_get_floatv(
'Vz', vl3, is_available, lsubmodel, unitab)
315 CALL hm_get_intv(
'grbric_ID', idgrbrick, is_available, lsubmodel)
316 CALL hm_get_intv(
'grqd_ID', idgrquad, is_available, lsubmodel)
317 CALL hm_get_intv(
'grtria_ID', idgrtria, is_available, lsubmodel)
318 CALL hm_get_intv(
'skew_ID', isk, is_available, lsubmodel)
319 IF(n2d /= 0 .AND. isk == 0)
THEN
322 CALL ancmsg(msgid=1256, anmode=aninfo, msgtype=msgwarning, c1=label, i1=id, c2=label, c3=titr)
326 IF (tstart>zero .OR. sens_id>0)
THEN
328 inivel_t(ninit)%ID = id
329 inivel_t(ninit)%ITYPE = itype
330 inivel_t(ninit)%FVM%SKEW_ID = isk
331 inivel_t(ninit)%FVM%GRBRIC_ID = idgrbrick
332 inivel_t(ninit)%FVM%GRQD_ID = idgrquad
333 inivel_t(ninit)%FVM%GRTRIA_ID = idgrtria
334 inivel_t(ninit)%FVM%VX = vl1
335 inivel_t(ninit)%FVM%VY = vl2
336 inivel_t(ninit)%FVM%VZ = vl3
337 inivel_t(ninit)%FVM%SENSOR_ID = sensid
338 inivel_t(ninit)%FVM%TSTART = tstart
342 ELSEIF (itype == 6)
THEN
343 CALL hm_get_intv(
'NB_NODES', nb_nodes, is_available, lsubmodel)
353 IF(n2d /= 0 .AND. isk == 0)
THEN
354 IF(vl1 /=0 .OR. vr2 /= 0 .OR. vr3 /= 0)
THEN
356 CALL ancmsg(msgid=1256, anmode=aninfo, msgtype=msgwarning, c1=label, i1=id, c2=label, c3=titr)
364 IF (id_node > 0)
THEN
373 IF (isk == iskn(4,j+1))
THEN
375 v1 = skew(1,isk)*vl1+skew(4,isk)*vl2+skew(7,isk)*vl3
376 v2 = skew(2,isk)*vl1+skew(5,isk)*vl2+skew(8,isk)*vl3
377 v3 = skew(3,isk)*vl1+skew(6,isk)*vl2+skew(9,isk)*vl3
378 v4 = skew(1,isk)*vr1+skew(4,isk)*vr2+skew(7,isk)*vr3
379 v5 = skew(2,isk)*vr1+skew(5,isk)*vr2+skew(8,isk)*vr3
380 v6 = skew(3,isk)*vr1+skew(6,isk)*vr2+skew(9,isk)*vr3
384 IF (iok == 0)
CALL ancmsg(msgid=184,msgtype=msgerror,anmode=aninfo,
385 . i1=id,i2=isk,c1=
'INITIAL VELOCITY''INITIAL VELOCITY'
386 nosys = usr2sys(id_node,itabm1,mess,id)
393 ELSEIF (isk == 0 .AND. ifra == 0)
THEN
394 nosys = usr2sys(id_node,itabm1,mess,id)
412 IF (isk == iskn(4,j+1))
THEN
414 v1 = skew(1,isk)*vl1+skew(4,isk)*vl2+skew(7,isk)*vl3
416 v3 = skew(3,isk)*vl1+skew(6,isk)*vl2+skew(9,isk)*vl3
421 IF(.NOT. is_found)
THEN
422 CALL ancmsg(msgid=184,msgtype=msgerror,anmode=aninfo,i1=id,i2=isk,
423 . c1=
'INITIAL VELOCITY', c2=
'INITIAL VELOCITY', c3=titr)
426 ELSEIF (ifra > 0)
THEN
430 IF(ifra==iframe(4,j))
THEN
431 v1 = xframe(1,j)*vl1+xframe(4,j)*vl2+xframe(7,j)*vl3
432 v2 = xframe(2,j)*vl1+xframe(5,j)*vl2+xframe(8,j)*vl3
433 v3 = xframe(3,j)*vl1+xframe(6,j)*vl2+xframe(9,j)*vl3
438 IF(.NOT. is_found)
THEN
439 CALL ancmsg(msgid=490,msgtype=msgerror,anmode=aninfo,i1=id,i2=ifra,
440 . c1=
'INITIAL VELOCITY',c2=
'INITIAL VELOCITY',c3=titr)
443 ELSEIF (isk == 0 .AND. ifra == 0)
THEN
454 IF (.NOT. multi_fvm%IS_USED)
THEN
455 CALL ancmsg(msgid=1554,msgtype=msgerror,anmode=aninfo,c1=
'IN /INIVEL OPTION')
460 IF (idgrbrick + idgrquad + idgrtria == 0)
THEN
461 CALL ancmsg(msgid=1553, msgtype=msgwarning, anmode=aninfo,c1=
'IN /INIVEL OPTION')
463 IF (idgrbrick /= 0)
THEN
465 IF (idgrbrick == igrbric(j)%ID) idgrbrick_loc = j
467 IF (idgrbrick_loc == -1)
THEN
468 CALL ancmsg(msgid=1554, msgtype=msgerror,anmode=aninfo,c1=
'IN /INIVEL OPTION',i1
471 IF (idgrquad /= 0)
THEN
473 IF (idgrquad == igrquad(j)%ID) idgrquad_loc = j
475 IF (idgrquad_loc == -1)
THEN
476 CALL ancmsg(msgid=1554,msgtype=msgerror,anmode=aninfo,c1=
'IN /INIVEL OPTION',i1=idgrquad)
479 IF (idgrtria /= 0)
THEN
481 IF (idgrtria == igrsh3n(j)%ID) idgrtria_loc = j
483 IF (idgrtria_loc == -1)
THEN
484 CALL ancmsg(msgid=1554,msgtype=msgerror,anmode=aninfo,c1=
'IN /INIVEL OPTION',i1=idgrtria)
490 IF (tstart==zero .AND. sens_id==0)
THEN
491 fvm_inivel(i)%FLAG = .true.
492 fvm_inivel(i)%GRBRICID = idgrbrick_loc
493 fvm_inivel(i)%GRQUADID = idgrquad_loc
494 fvm_inivel(i)%GRSH3NID = idgrtria_loc
495 fvm_inivel(i)%VX = v1
496 fvm_inivel(i)%VY = v2
497 fvm_inivel(i)%VZ = v3
498 fvm_grbric_user_id(i) = idgrbrick
499 fvm_grquad_user_id(i) = idgrquad
500 fvm_grtria_user_id(i) = idgrtria
505 IF (itype /= 5 .AND. itype /= 6)
THEN
508 CALL ancmsg(msgid=668,msgtype=msgerror,anmode=aninfo,c1=
'/INIVEL',c2=
'/INIVEL',c3=titr,i1=id)
511 IF(igr == igrnod(j)%ID) igrs=j
514 IF(tstart==zero .AND. sens_id==0)
THEN
515 DO j=1,igrnod(igrs)%NENTITY
516 nosys=igrnod(igrs)%ENTITY(j)
529 ELSEIF(itype == 1)
THEN
536 ELSEIF(itype == 2)
THEN
553 ELSEIF(itype == 3)
THEN
565 ELSEIF(itype == 4)
THEN
567 IF ((.NOT.
ALLOCATED(tagno_rby)).AND.(nrbody > 0))
THEN
568 ALLOCATE(tagno_rby(numnod))
569 tagno_rby(1:numnod) = 0
571 tagno_rby(rby_msn(2,nrb)) = nrb
582 nixj(1)=xframe(k1,ifm)*(x(2,nosys)-oy)
583 nixj(2)=xframe(k2,ifm)*(x(1,nosys)-ox)
584 nixj(3)=xframe(k2,ifm)*(x(3,nosys)-oz)
585 nixj(4)=xframe(k3,ifm)*(x(2,nosys)-oy)
586 nixj(5)=xframe(k3,ifm)*(x(1,nosys)-ox)
587 nixj(6)=xframe(k1,ifm)*(x(3,nosys)-oz)
589 vr(1,nosys)= vra*xframe(k1,ifm)
590 vr(2,nosys)= vra*xframe(k2,ifm)
591 vr(3,nosys)= vra*xframe(k3,ifm)
608 IF (idir==1) vr(1,nosys)= vra
609 IF (idir==2) vr(2,nosys)= vra
610 IF (idir==3) vr(3,nosys)= vra
613 v(1,nosys)= v1+vra*(nixj(3)-nixj(4))
614 v(2,nosys)= v2+vra*(nixj(5)-nixj(6))
615 v(3,nosys)= v3+vra*(nixj(1)-nixj(2))
617 vflow(1,nosys) = v(1,nosys)
618 vflow(2,nosys) = v(2,nosys)
619 vflow(3,nosys) = v(3,nosys)
620 wflow(1,nosys) = v(1,nosys)
621 wflow(2,nosys) = v(2,nosys)
622 wflow(3,nosys) = v(3,nosys)
627 IF (tagno_rby(nosys) > 0)
THEN
628 rby_iniaxis(1,tagno_rby(nosys)) = one
629 rby_iniaxis(2,tagno_rby(nosys)) = v(1,nosys)
630 rby_iniaxis(3,tagno_rby(nosys)) = v(2,nosys)
631 rby_iniaxis(4,tagno_rby(nosys)) = v(3,nosys)
633 rby_iniaxis(5,tagno_rby(nosys)) = vr(1,nosys)
634 rby_iniaxis(6,tagno_rby(nosys)) = vr(2,nosys)
635 rby_iniaxis(7,tagno_rby(nosys)) = vr(3,nosys)
641 nnod=igrnod(igrs)%NENTITY
644 CALL ancmsg(msgid=53,msgtype=msgerror,anmode=aninfo,c1=
'IN /INIVEL OPTION',i1=igr)
649 IF (
ALLOCATED(tagno_rby))
DEALLOCATE(tagno_rby)
651 CALL udouble(inivids,1,nbvel,mess,0,bid)
656 inod = kxsp(3,first_sphres+n-1)
673 IF (hm_ninvel > 0)
THEN
678 IF(ipri >= 2 .AND. ninivel_total-ninivel_fvm > 0 )
THEN
684 ELSEIF(krot == 0)
THEN
707 IF (v(1,i)/=zero.OR.v(2,i)/=zero.OR.v(3,i)/=zero.OR.vr(1,i)/=zero.OR.vr(2,i)/=zero.OR.vr(3,i)/=zero)
THEN
708 nodinivel=nodinivel+1
709 IF (vr(1,i) /= zero .OR. vr(2,i) /= zero .OR. vr(3,i) /= zero)
THEN
710 WRITE(iout,
'(3X,I10,8X,1P6G20.13)') itab(i),v(1,i),v(2,i),v(3,i),vr(1,i),vr(2,i),vr(3,i)
712 WRITE(iout,
'(3X,I10,8X,1P6G20.13)')itab(i),v(1,i),v(2,i),v(3,i)
716 ELSEIF(v(1,i) /= zero .OR. v(2,i) /= zero .OR. v(3,i) /= zero)
THEN
717 nodinivel=nodinivel+1
718 WRITE(iout,
'(3X,I10,8X,1P6G20.13)')itab(i),v(1,i),v(2,i),v(3,i)
723 ELSEIF(iale /= 0)
THEN
729 IF(v(1,i)/=zero.OR.v(2,i)/=zero.OR.v(3,i)/=zero.OR.w(1,i)/=zero.OR.w(2,i)/=zero.OR.w(3,i)/=zero)
THEN
730 nodinivel=nodinivel+1
731 WRITE(iout,
'(5X,I10,8X,1P6G20.13)') itab(i),v(1,i),v(2,i),v(3,i),w(1,i),w(2,i),w(3,i)
738 WRITE(iout,
'(/,A,I10,//)')
' NUMBER OF NODES WITH INITIAL VELOCITY:',nodinivel
743 IF(ipri >= 2 .AND. ninivel_fvm > 0 )
THEN
748 IF(.NOT. fvm_inivel(i)%FLAG)cycle
752 IF(idgrbrick_loc >0)
THEN
754 WRITE(iout,
'(5X,I10,8X,1P6G20.13)') fvm_grbric_user_id(i),v1,v2,v3
756 IF(idgrquad_loc >0)
THEN
758 WRITE(iout,
'(5X,I10,8X,1P6G20.13)') fvm_grquad_user_id(i),v1,v2,v3
760 IF(idgrtria_loc >0)
THEN
762 WRITE(iout,
'(5X,I10,8X,1P6G20.13)') fvm_grtria_user_id(i),v1,v2,v3
767 IF (ninit > 0 )
WRITE(iout,4000) ninit
774 .
' INITIAL VELOCITIES '/
775 .
' ------------------- '/
776 + 9x,
'NODE',22x,
'VX ',15x,
'VY ',15x,
'VZ '/)
778 .
' INITIAL VELOCITIES '/
779 .
' ------------------- '/
780 + 9x,
'NODE',22x,
'VX ',15x,
'VY ',15x,
'VZ ',
781 + 14x,
'WX ',15x,
'WY ',15x,
'WZ '/)
783 .
' INITIAL VELOCITIES '/
784 .
' ------------------- '/
785 + 9x,
'NODE',22x,
'VX ',15x,
'VY ',15x,
'VZ ',
786 + 14x,
'VRX ',15x,
'VRY ',15x,
'VRZ'/)
788 .
' INITIAL VELOCITIES (FVM) '/
789 .
' ------------------------ ')
791 + 9x,
'GRBRIC',22x,
'VX ',15x,
'VY ',15x,
'VZ ')
793 + 9x,
'GRQUAD',22x,
'VX ',15x,'vy
',15X,'vz
')
795 + 9X,'grtria
',22X,'vx
',15X,'vy
',15X,'vz
')
798 .' initial velocities
'/
799 .' -------------------
'/
800 + I8,3X,'initial velocities will be applied in engine by t_start or sensor
'/)