44 . ITAB ,ITABM1 ,UNITAB ,IGRSURF ,NUMLOADP,
45 . ILOADP ,LLOADP ,FACLOADP ,X ,BUFSF ,
75#include "implicit_f.inc"
82#include "tabsiz_c.inc"
86 INTEGER ITAB(NUMNOD), ITABM1(NUMNOD), NUMLOADP, ILOADP(SIZLOADP,NLOADP), LLOADP(SLLOADP)
87 my_real FACLOADP(,NLOADP)
88 my_real,
INTENT(IN) :: X(3,NUMNOD)
89 my_real,
INTENT(INOUT) :: bufsf(sbufsf)
90 my_real,
INTENT(IN) :: rtrans(ntransf,nrtrans)
91 TYPE (SURF_),
TARGET,
DIMENSION(NSURF) :: IGRSURF
92 TYPE (UNIT_TYPE_),
INTENT(IN) ::UNITAB
93 TYPE(
submodel_data),
DIMENSION(NSUBMOD),
INTENT(IN) :: LSUBMODEL
94 TYPE(pblast_),
INTENT(INOUT) :: PBLAST
98 LOGICAL :: IS_AVAILABLE,lFOUND, IS_AVAILABLE_TSTOP, BOOL_COORD, BOOL_SKIP_CALC
99 LOGICAL :: BOOL_UNDERGROUND_CURRENT_LOAD, BOOL_UNDERGROUND_CURRENT_SEG
100 LOGICAL :: ,IS_DECAY_TO_BE_COMPUTED
102 CHARACTER(LEN=NCHARLINE) :: MSGOUT1
103 CHARACTER(LEN=NCHARLINE) :: MSGOUT2
104 CHARACTER(LEN=NCHARTITLE)::TITR
106 my_real xdet,ydet,zdet,tdet,wtnt,pmin
107 my_real dx,dy,dz, z, w13, dnorm,lambda,cos_theta,t_a
108 my_real fac_m_bb,fac_l_bb,fac_t_bb,fac_p_bb,fac_i_bb,
norm, nn2, tmp(3)
109 my_real nx_seg,ny_seg,nz_seg, norm_,npt
110 my_real nx_surf,ny_surf,nz_surf, base_x,base_y,base_z
113 my_real alpha_zc,angle_g,hz
114 my_real lg,zg,tmp_var,z_struct,zx,zy,zz,projz(3),projdet(3)
115 my_real p_inci,p_refl,decay_inci,decay_refl,i_inci,i_refl
116 my_real dt_0,tstop,ta_pblast
119 my_real,
ALLOCATABLE,
DIMENSION(:,:) :: output_user_params
121 INTEGER I,J,K,NUMSEG,K_BLAST
122 INTEGER IAD,,SURF_ID,internal_SURF_ID
123 INTEGER IABAC,IADPL,itmp,IS,SUB_ID
125 INTEGER N1,N2,N3,N4,IERR1,NDT,ILD_PBLAST,IZ_UPDATE,IMODEL,NODE_ID
126 INTEGER SURF_ID_ground,internal_SURF_ID_GROUND
127 INTEGER curve_id1,curve_id2,SEG_UNDERGROUND
128 INTEGER,
DIMENSION(:),
POINTER :: INGR2USR
131 TYPE(friedlander_params_) :: FRIEDLANDER_PARAMS
138 my_real :: cst_255_div_ln_z1_on_zn, log10_, fac_unit
139 DATA cst_180 /180.000000000000000000/
140 DATA pi_/3.141592653589793238462643d0/
141 DATA cst_255_div_ln_z1_on_zn/-38.147316611455952998/
142 DATA log10_ /2.30258509299405000000/
143 DATA z1_/0.50000000000000000/
144 DATA fac_unit/3.966977216838196139019/
145 DATA mess/
'BLAST LOADING DEFINITION '/
149 INTEGER,
EXTERNAL :: DICHOTOMIC_SEARCH_R_DESC,DICHOTOMIC_SEARCH_R_ASC,USR2SYS,NGR2USR
217 base_x = -huge(base_x)
218 base_y = -huge(base_y)
219 base_z = -huge(base_z)
222 CALL pblast_init_tables(pblast%PBLAST_DATA)
223 tmp(1:3) = huge(tmp(1))
225 pblast%PBLAST_DT%TA_INF = ep20
230 bool_skip_calc = .false.
231 is_ita_shift = .false.
234 ALLOCATE( output_user_params(6,pblast%NLOADP_B))
235 output_user_params(:,:) = zero
239 DO k = 1+nloadp_f, nloadp_f+pblast%NLOADP_B
247 bool_underground_current_load = .false.
262 CALL hm_get_intv(
'surf_ID', surf_id, is_available, lsubmodel)
263 CALL hm_get_intv(
'Exp_data', iabac, is_available, lsubmodel)
264 CALL hm_get_intv(
'I_tshift', ita_shift, is_available, lsubmodel)
265 CALL hm_get_intv(
'Ndt', ndt, is_available, lsubmodel)
266 CALL hm_get_intv(
'IZ', iz_update, is_available, lsubmodel)
267 CALL hm_get_intv(
'Imodel', imodel, is_available, lsubmodel)
268 CALL hm_get_intv(
'Node_id', node_id, is_available, lsubmodel)
270 CALL hm_get_floatv(
'Xdet', xdet, is_available, lsubmodel, unitab)
271 CALL hm_get_floatv(
'Ydet', ydet, is_available, lsubmodel, unitab)
272 CALL hm_get_floatv(
'Zdet', zdet, is_available, lsubmodel, unitab)
273 CALL hm_get_floatv(
'Tdet', tdet, is_available, lsubmodel, unitab)
274 CALL hm_get_floatv(
'WTNT', wtnt, is_available, lsubmodel, unitab)
276 CALL hm_get_floatv(
'Pmin', pmin, is_available, lsubmodel, unitab)
277 CALL hm_get_floatv(
'Tstop',tstop,is_available_tstop, lsubmodel, unitab)
279 CALL hm_get_intv(
'surf_ground_ID', surf_id_ground, is_available, lsubmodel)
280 CALL hm_get_intv(
'Ishape', ishape, is_available, lsubmodel)
282 output_user_params(1,k_blast)=surf_id
283 output_user_params(2,k_blast)=surf_id_ground
286 IF(xdet/=zero .OR. ydet/=zero .OR. zdet/=zero)
THEN
290 IF(sub_id /= 0)
CALL subrotpoint(xdet,ydet,zdet,rtrans,sub_id,lsubmodel)
293 fac_m_bb = unitab%FAC_MASS*ep03
294 fac_l_bb = unitab%FAC_LENGTH*ep02
295 fac_t_bb = unitab%FAC_TIME*ep06
296 fac_p_bb = fac_m_bb/fac_l_bb/fac_t_bb/fac_t_bb
297 fac_i_bb = fac_p_bb*fac_t_bb
298 w13 = (wtnt*fac_m_bb)**third
304 IF(tstop == zero)tstop=ep20
309 msgout1=
'PMIN PARAMETER IS NEGATIVE. PLEASE CHECK THE LOAD HISTORY FOR NEGATIVE PRESSURE,'
311 msgout2=
'AS THE PBLAST MODEL IS FITTED ONLY FOR THE POSITIVE PHASE'
312 CALL ancmsg(msgid=1907, msgtype=msgwarning, anmode=aninfo,c1=trim(titr), i1=
id, c2=msgout1, c3=msgout2)
317 msgout1=
'TNT MASS MUST BE DEFINED.'
319 msgout2=
'PLEASE SET VALUE FOR WTNT PARAMETER'
320 CALL ancmsg(msgid=1907, msgtype=msgwarning, anmode=aninfo,c1=trim(titr), i1=
id, c2=msgout1, c3=msgout2)
324 node_id=usr2sys(node_id,itabm1,mess,
id)
330 output_user_params(5,k_blast)=node_id
333 msgout1=
'NODE IDENTIFIER IS PROVIDED.'
335 msgout2=
'COORDINATES (XDET,YDET,ZDET) WILL BE IGNORED'
336 CALL ancmsg(msgid=1907, msgtype=msgwarning, anmode=aninfo,c1=trim(titr), i1=
id, c2=msgout1, c3=msgout2)
340 ingr2usr => igrsurf(1:nsurf)%ID
341 internal_surf_id = ngr2usr(surf_id,ingr2usr,nsurf)
342 internal_surf_id_ground = ngr2usr(surf_id_ground,ingr2usr,nsurf)
344 IF(iabac >= 2 .AND. surf_id_ground /= 0)
THEN
345 IF(internal_surf_id_ground == 0)
THEN
349 msgout1=
'SURFACE IDENTIFIER FOR GROUND DEFINITION WAS NOT FOUND'
352 WRITE(msgout2(9:19),fmt=
'(I10)') surf_id_ground
353 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
354 bool_skip_calc = .true.
362 msgout1=
'SURFACE IDENTIFIER IS NOT PROVIDED'
364 msgout2=
'BLAST CALCULATION WILL BE SKIPPED'
365 CALL ancmsg(msgid=1907,msgtype=msgwarning,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
366 bool_skip_calc = .true.
368 IF(internal_surf_id == 0)
THEN
372 msgout1=
'INVALID SURFACE IDENTIFIER'
375 WRITE(msgout2(9:19),fmt=
'(I10)') surf_id
376 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
377 bool_skip_calc = .true.
384 IF(ita_shift==0) ita_shift = 2
385 IF(ita_shift < 0 .OR. ita_shift >= 3)ita_shift = 1
386 IF(ita_shift == 2)is_ita_shift=.true.
391 IF(imodel <= 0 .OR. imodel > 2)imodel=2
392 is_decay_to_be_computed = .false.
393 IF(imodel == 2)is_decay_to_be_computed = .true.
398 IF(iz_update == 0)iz_update=1
399 IF(iz_update >=3)iz_update=1
405 IF(iabac <= 0)iabac=1
406 IF(iabac >= 4)iabac=1
412 IF(ishape <= 0 .OR. ishape >= 4) ishape=1
417 IF(internal_surf_id /= 0)
THEN
418 numseg = igrsurf(internal_surf_id)%NSEG
420 lloadp(iad+4*(j-1)) = igrsurf(internal_surf_id)%NODES(j,1)
421 lloadp(iad+4*(j-1)+1) = igrsurf(internal_surf_id)%NODES(j,2)
422 lloadp(iad+4*(j-1)+2) = igrsurf(internal_surf_id)%NODES(j,3)
423 lloadp(iad+4*(j-1)+3) = igrsurf(internal_surf_id)%NODES(j,4)
424 IF(igrsurf(internal_surf_id)%ELTYP(j)==7)lloadp(iad+4*(j-1)+3) = 0
437 IF(surf_id_ground == 0)
THEN
446 nn2 = nx_surf*nx_surf+ny_surf*ny_surf+nz_surf*nz_surf
455 msgout1=
'MISSING GROUND_ID IDENTIFIER'
457 msgout2=
'ASSUMING GROUND WITH BASIS=(0,0,ZDET) AND NORMAL=(0,0,1.)'
458 CALL ancmsg(msgid=1907,msgtype=msgwarning,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
460 IF(zdet == zero .AND. iabac == 3)
THEN
462 msgout1=
'ZDET IS NULL. IT IS NOT POSSIBLE TO DETERMINE DEFAULT SURFACE FOR GROUND DEFINITION'
464 msgout2=
'SURFACE IDENTIFIER MUST BE INPUT FOR GROUND DEFINITION'
465 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
466 bool_skip_calc = .true.
473 msgout1=
'MISSING GROUND_ID IDENTIFIER'
475 msgout2=
'ASSUMING GROUND WITH BASIS=(0,0,0) AND NORMAL=(0,0,ZDET)'
476 CALL ancmsg(msgid=1907, msgtype=msgwarning, anmode=aninfo,c1=trim(titr), i1=
id, c2=msgout1,c3=msgout2)
491 lambda=(nx_surf*xdet + ny_surf*ydet + nz_surf*zdet - nx_surf*base_x-ny_surf*base_y-nz_surf*base_z)/nn2
507 IF (surf_id_ground == igrsurf(is)%ID)
THEN
508 SELECT CASE(igrsurf(is)%TYPE)
511 IF (zdet <= zero)
THEN
513 msgout1=
'SURFACE TYPE FOR GROUND DEFINITION IS NOT MATCHING'
515 msgout2=
'EXPECTED SURFACE TYPE:/SURF/PLANE'
516 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
517 bool_skip_calc = .true.
520 msgout1=
'EXPECTED TYPE FOR GROUND SURFACE IS /SURF/PLANE.'
522 msgout2=
'ASSUMING GROUND WITH BASIS=(0,0,0) AND NORMAL=(0,0,ZDET)'
523 CALL ancmsg(msgid=1907, msgtype=msgwarning, anmode=aninfo,c1=trim(titr), i1=
id, c2=msgout1,c3=msgout2)
531 zc = hc * fac_l_bb/w13
541 iadpl = igrsurf(is)%IAD_BUFR
543 base_x = bufsf(iadpl+1)
544 base_y = bufsf(iadpl+2)
545 base_z = bufsf(iadpl+3)
546 nx_surf = bufsf(iadpl+4)-base_x
547 ny_surf = bufsf(iadpl+5)-base_y
548 nz_surf = bufsf(iadpl+6)-base_z
549 nn2 = nx_surf*nx_surf+ny_surf*ny_surf+nz_surf*nz_surf
570 lambda=(nx_surf*xdet + ny_surf*ydet + nz_surf*zdet - nx_surf*base_x-ny_surf*base_y-nz_surf*base_z)
579 zc = hc * fac_l_bb/w13
585 IF (.NOT.lfound)
THEN
608 tmp_var = nx_surf*(xdet-base_x)+ny_surf*(ydet-base_y)+nz_surf*(zdet
609 tmp_var = abs(tmp_var/
norm)
610 IF(tmp_var > em06)
THEN
611 lambda = (base_x-xdet)*nx_surf + (base_y-ydet)*ny_surf + (base_z-zdet)*nz_surf
612 xdet = xdet+lambda*nx_surf
613 ydet = ydet+lambda*ny_surf
614 zdet = zdet+lambda*nz_surf
616 msgout1=
' DETONATION CENTER MUST BE ON THE GROUND'
617 msgout2=
' PROJECTING (Xdet,Ydet,Zdet) TO THE GROUND ( , , )'
618 WRITE(msgout2(47:56),fmt=
'(E10.3)')xdet
619 WRITE(msgout2(58:67),fmt=
'(E10.3)')ydet
620 WRITE(msgout2(69:78),fmt=
'(E10.3)')zdet
621 CALL ancmsg(msgid=1907,msgtype=msgwarning,anmode
635 msgout1=
' DETONATION CENTER MUST BE ABOVE THE GROUND'
637 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=
id,c2=msgout1,c3=msgout2)
638 bool_skip_calc = .true.
645 itmp = int( 2.*(zc)-1. )
646 curve_id1 =
max(1,itmp)
647 curve_id2 = curve_id1+1
652 alpha_zc = (zc - pblast%PBLAST_DATA%Curve_val_2_13(curve_id1)) /
653 . ( pblast%PBLAST_DATA%Curve_val_2_13(curve_id2) - pblast%PBLAST_DATA%Curve_val_2_13(curve_id1) )
657 curve_id1 = int(
min(10,itmp) )
658 curve_id2 = curve_id1+1
659 IF(curve_id1 == 10)
THEN
660 !message out of bounds. curve 10 will be used. no extrapolation
663 alpha_zc = (zc - pblast%PBLAST_DATA%Curve_val_2_13(curve_id1)) /
664 . ( pblast%PBLAST_DATA%Curve_val_2_13(curve_id2) - pblast%PBLAST_DATA%Curve_val_2_13(curve_id1) )
667 alpha_zc = curve_id1+alpha_zc
673 !-------------------------------
674 IF(internal_surf_id /= 0)
THEN
675 iloadp( 1,k) = 4*numseg
676 iloadp( 2,k) = internal_surf_id
677 iloadp( 3,k) = ishape
680 iloadp( 6,k) = iz_update
683 iloadp( 9,k) = ita_shift
685 iloadp(11,k) = imodel
688 facloadp( 1,k) = tdet
689 facloadp( 2,k) = xdet
690 facloadp( 3,k) = ydet
691 facloadp( 4,k) = zdet
692 facloadp( 5,k) = wtnt
693 facloadp( 6,k) = pmin
694 facloadp( 7,k) = zero
695 facloadp( 8,k) = nx_surf
696 facloadp( 9,k) = ny_surf
697 facloadp(10,k) = nz_surf
700 facloadp(12,k) = alpha_zc
701 facloadp(13,k) = tstop
707 IF(internal_surf_id /= 0 .AND. .NOT.bool_skip_calc)
THEN
708 numseg = igrsurf(internal_surf_id)%NSEG
710 ild_pblast = ild_pblast + 1
711 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%cos_theta(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
712 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%P_inci(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
713 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%P_refl(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
714 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%ta(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
715 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%t0(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
716 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%decay_inci(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
717 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%decay_refl(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
718 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%TAGMSG(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1000
719 pblast%PBLAST_TAB(ild_pblast)%SIZ=numseg
723 projdet(1)=xdet+ nx_surf
724 projdet(2)=ydet+ ny_surf
725 projdet(3)=zdet+ nz_surf
736 n1=igrsurf(internal_surf_id)%NODES(i,1)
737 n2=igrsurf(internal_surf_id)%NODES(i,2)
738 n3=igrsurf(internal_surf_id)%NODES(i,3)
739 n4=igrsurf(internal_surf_id)%NODES(i,4)
740 IF(n4 /= 0 .AND. n1 /= n2 .AND. n2 /= n3 .AND. n3 /= n4 .AND. n4 /= n1 )
THEN
744 zx = x(1,n1)+x(1,n2)+x(1,n3)+x(1,n4)
745 zy = x(2,n1)+x(2,n2)+x(2,n3)+x(2,n4)
746 zz = x(3,n1)+x(3,n2)+x(3,n3)+x(3,n4)
751 nx_seg = (x(2,n3)-x(2,n1))*(x(3,n4)-x(3,n2)) - (x(3,n3)-x(3,n1))*(x(2,n4)-x(2,n2))
752 ny_seg = (x(3,n3)-x(3,n1))*(x(1,n4)-x(1,n2)) - (x(1,n3)-x(1,n1))*(x(3,n4)-x(3,n2))
753 nz_seg = (x(1,n3)-x(1,n1))*(x(2,n4)-x(2,n2)) - (x(2,n3)-x(2,n1))*(x(1,n4)-x(1,n2))
754 norm_= sqrt(nx_seg*nx_seg+ny_seg*ny_seg+nz_seg*nz_seg)
773 zx = x(1,n1)+x(1,n2)+x(1,n3)
774 zy = x(2,n1)+x(2,n2)+x(2,n3)
775 zz = x(3,n1)+x(3,n2)+x(3,n3)
779 nx_seg = (x(2,n3)-x(2,n1))*(x(3,n3)-x(3,n2)) - (x(3,n3)-x(3,n1))*(x(2,n3)-x(2,n2))
780 ny_seg = (x(3,n3)-x(3,n1))*(x(1,n3)-x(1,n2)) - (x(1,n3)-x(1,n1))*(x(3,n3)-x(3,n2))
781 nz_seg = (x(1,n3)-x(1,n1))*(x(2,n3)-x(2,n2)) - (x(2,n3)-x(2,n1))*(x(1,n3)-x(1,n2))
782 norm_ = sqrt(nx_seg*nx_seg+ny_seg*ny_seg+nz_seg*nz_seg)
786 dx = (xdet - zx)*fac_l_bb
787 dy = (ydet - zy)*fac_l_bb
788 dz = (zdet - zz)*fac_l_bb
789 dnorm = sqrt(dx*dx+dy*dy+dz*dz)
801 bool_underground_current_seg = .false.
813 IF(z > 0.5 .AND. z < 400.)
THEN
815 WRITE(iout, fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" R/W**(1/3) < 0.5 cm/g**(1/3)"
816 WRITE(istdo,fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" R/W**(1/3) < 0.5 cm/g**(1/3)"
817 WRITE(iout, fmt=
'(A)')
" Radial Distance too close to the charge"
818 WRITE(istdo,fmt=
'(A)')
" Radial Distance too close to the charge"
819 IF (n4 == 0 .OR. n3 == n4)
THEN
820 WRITE(iout, fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
821 WRITE(istdo,fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
823 WRITE(iout, fmt=
'(A,4I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3),itab(n4)
824 WRITE(istdo,fmt=
'(A,4I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3),itab(n4)
826 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
829 WRITE(iout, fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" R/W**(1/3) > 400. cm/g**(1/3)"
830 WRITE(istdo,fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" R/W**(1/3) > 400. cm/g**(1/3)"
831 WRITE(iout, fmt=
'(A)')
" Radial Distance too far from the charge"
832 WRITE(istdo, fmt=
'(A)')
" Radial Distance too far from the charge"
833 IF (n4 == 0 .OR. n3 == n4)
THEN
834 WRITE(iout, fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
835 WRITE(istdo,fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
837 WRITE(iout, fmt=
'(A,4I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3),itab(n4)
838 WRITE(istdo,fmt=
'(A,4I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3),itab(n4)
840 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
844 cos_theta = dx*nx_seg + dy*ny_seg + dz*nz_seg
845 cos_theta = cos_theta/
max(em20,norm_*dnorm)
849 CALL pblast_parameters__free_air(pblast,z, w13, tdet,
850 + fac_p_bb, fac_i_bb, fac_t_bb,
851 + is_decay_to_be_computed,
852 + friedlander_params, nwarn)
854 p_inci = friedlander_params%P_inci
855 p_refl = friedlander_params%P_refl
856 i_inci = friedlander_params%I_inci
857 i_refl = friedlander_params%I_refl
858 t_a = friedlander_params%T_A
859 dt_0 = friedlander_params%DT_0
860 decay_inci = friedlander_params%decay_inci
861 decay_refl = friedlander_params%decay_refl
868 ELSEIF( iabac == 2 )
THEN
872 hz = ( nx_surf*zx + ny_surf*zy + nz_surf*zz - nx_surf*xdet - ny_surf*ydet - nz_surf*zdet )
874 IF(hz < -em10 .AND. ishape /= 2)
THEN
887 seg_underground = seg_underground + 1
888 bool_underground_current_load = .true.
889 bool_underground_current_seg = .true.
896 lambda = (base_x-zx)*nx_surf + (base_y-zy)*ny_surf + (base_z-zz
898 projz(1) = zx + lambda*nx_surf
899 projz(2) = zy + lambda*ny_surf
900 projz(3) = zz + lambda*nz_surf
902 tmp(1) = (projz(1)-projdet(1))
903 tmp(2) = (projz(2)-projdet(2))
904 tmp(3) = (projz(3)-projdet(3))
905 lg = sqrt(tmp(1)*tmp(1)+tmp(2)*tmp(2)+tmp(3)*tmp(3))
913 cos_theta = dx*nx_seg + dy*ny_seg + dz*nz_seg
914 cos_theta = cos_theta/
max(em20,norm_*dnorm)
919 cos_theta = (projdet(1)-projz(1))*nx_seg + (projdet(2)-projz(2))*ny_seg + (projdet(3)-projz(3))*nz_seg
920 cos_theta = cos_theta/
max(em20,lg*norm_)
924 IF(z > 0.5 .AND. z < 400.)
THEN
928 WRITE(iout, fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" Rg/W**(1/3) < 0.5 cm/g**(1/3)"
929 WRITE(istdo,fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" Rg/W**(1/3) < 0.5 cm/g**(1/3)"
930 WRITE(iout, fmt=
'(A)')
" Horizontal Distance on Ground (Rg) is too close to the charge"
931 WRITE(istdo,fmt=
'(A)')
" Horizontal Distance on Ground (Rg) is too close to the charge"
932 IF (n4 == 0 .OR. n3 == n4)
THEN
933 WRITE(iout, fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
934 WRITE(istdo,fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab
936 WRITE(iout, fmt=
'(A,4I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3),itab(n4)
937 WRITE(istdo,fmt=
'(A,4I11)')
" -> Segment nodes : ", itab
939 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
942 WRITE(iout, fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" Rg/W**(1/3) > 400. cm/g**(1/3)"
943 WRITE(istdo,fmt=
'(A,I0,A)')
"Warning : /LOAD/PBLAST id=",
id,
" Rg/W**(1/3) > 400. cm/g**(1/3)"
944 WRITE(iout, fmt=
'(A)')
" Horizontal Distance on Ground (Rg) is too far from the charge"
945 WRITE(istdo,fmt=
'(A)')
" Horizontal Distance on Ground (Rg) is too far from the charge"
946 IF (n4 == 0 .OR. n3 == n4)
THEN
947 WRITE(iout, fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
948 WRITE(istdo,fmt=
'(A,3I11)')
" -> Segment nodes : ", itab(n1),itab(n2),itab(n3)
950 WRITE(iout, fmt=
'(A,4I11)') " -> segment nodes :
", ITAB(N1),ITAB(N2),ITAB(N3),ITAB(N4)
951 WRITE(ISTDO,FMT='(A,4I11)') " -> segment nodes :
", ITAB(N1),ITAB(N2),ITAB(N3),ITAB(N4)
953 PBLAST%PBLAST_TAB(ILD_PBLAST)%TAGMSG(I) = 1
955 !------------------------------------------------------------!
956 CALL PBLAST_PARAMETERS__SURFACE_BURST( PBLAST,Z, W13, TDET,
957 + FAC_P_bb, FAC_I_bb, FAC_T_bb,
958 + IS_DECAY_TO_BE_COMPUTED,
959 + FRIEDLANDER_PARAMS,NWARN )
960 P_inci = FRIEDLANDER_PARAMS%P_inci
961 P_refl = FRIEDLANDER_PARAMS%P_refl
962 I_inci = FRIEDLANDER_PARAMS%I_inci
963 I_refl = FRIEDLANDER_PARAMS%I_refl
964 T_A = FRIEDLANDER_PARAMS%T_A
965 DT_0 = FRIEDLANDER_PARAMS%DT_0
966 decay_inci = FRIEDLANDER_PARAMS%decay_inci
967 decay_refl = FRIEDLANDER_PARAMS%decay_refl
968 !------------------------------------------------------------!
971 !--------------------------------------------------------
973 !--------------------------------------------------------
974 ELSEIF(IABAC == 3)THEN
975 !--- Determine Height of centroid (structure face) : HZ
977 !Height is length Proj->Det. Storing Det->Proj into NN array
978 HZ=-(Nx_SURF*Zx + Ny_SURF*Zy + Nz_SURF*Zz - Nx_SURF*ProjDet(1)-Ny_SURF*ProjDet(2)-Nz_SURF*ProjDet(3))/HC
992 SEG_UNDERGROUND = SEG_UNDERGROUND + 1
993 BOOL_UNDERGROUND_CURRENT_LOAD = .TRUE.
994 BOOL_UNDERGROUND_CURRENT_SEG = .TRUE.
998 Z_struct = HZ*FAC_L_bb/W13 ! scaled value in same unit system as hardcoded tables {g,cm,mus,Mbar}
1000 !Scaled Height of Charge
1001 ZC = HC * FAC_L_bb/W13! scaled value in same unit system as hardcoded tables {g,cm,mus,Mbar}
1002 ZC = ZC/FAC_UNIT ! ft/lb**0.3333 (fig 2-13 : 10 plots, one for a given ZC value)
1004 !Horizontal Distance between Charge and Centroid : LG
1005 ! ZG = scaled distance |ProjC->ProjZ|
1006 ProjZ(1) = Zx + HZ*Nx_SURF/HC
1007 ProjZ(2) = Zy + HZ*Ny_SURF/HC
1008 ProjZ(3) = Zz + HZ*Nz_SURF/HC
1009 tmp(1) = (ProjZ(1)-ProjDet(1))
1010 tmp(2) = (ProjZ(2)-ProjDet(2))
1011 tmp(3) = (ProjZ(3)-ProjDet(3))
1012 LG = SQRT(TMP(1)*TMP(1)+TMP(2)*TMP(2)+TMP(3)*TMP(3))
1013 ZG = LG*FAC_L_bb/W13 !scaled horizontal distance (ground) ; same unit system as hardcoded tables {g,cm,mus,Mbar}
1015 !Angle of structural face (mach wave is planar wave)
1016 cos_theta = (ProjDet(1)-ProjZ(1))*Nx_SEG + (ProjDet(2)-ProjZ(2))*Ny_SEG + (ProjDet(3)-ProjZ(3))*Nz_SEG
1017 cos_theta = cos_theta/MAX(EM20,LG*NORM_)
1019 !determine angle of incidence at ground (AANGLE_g) and interpolation factor (alpha_angle)
1020 tmp(1)=Xdet-ProjZ(1)
1021 tmp(2)=Ydet-ProjZ(2)
1022 tmp(3)=Zdet-ProjZ(3)
1023 tmp_var=SQRT( tmp(1)*tmp(1) + tmp(2)*tmp(2) + tmp(3)*tmp(3) )
1024 ANGLE_g = -( Nx_SURF*tmp(1) + Ny_SURF*tmp(2) + Nz_SURF*tmp(3) ) /Hc/tmp_var !must be between [-PI_,PI_]
1025 ANGLE_g = min(ONE,max(-ONE,ANGLE_g)) ! bound it to expected range (epsilon)
1026 ANGLE_g = acos(ANGLE_g)
1027 ANGLE_g = cst_180/PI_*ANGLE_g !debug purpose
1028 IF(ANGLE_g < ZERO)THEN
1029 WRITE(IOUT,*) 'Warning : /LOAD/PBLAST id=',ID,' NEGATIVE ANGLE,',ANGLE_g
1030 WRITE(ISTDO,*) 'Warning : /LOAD/PBLAST id=',ID,' NEGATIVE ANGLE,',ANGLE_g
1031.OR.
IF(N4 == 0 N3 == N4)THEN
1032 WRITE(IOUT,FMT= '(A,3I11)')' FACE:',ITAB((/N1,N2,N3/)),' SEEMS TO BE BELOW THE GROUND'
1033 WRITE(ISTDO,FMT='(A,3I11)')' FACE:',ITAB((/N1,N2,N3/)),' SEEMS TO BE BELOW THE GROUND'
1035 WRITE(IOUT,FMT= '(A,4I11)')' FACE:',ITAB((/N1,N2,N3,N4/)),' SEEMS TO BE BELOW THE GROUND'
1036 WRITE(ISTDO,FMT='(A,4I11)')' FACE:',ITAB((/N1,N2,N3,N4/)),' SEEMS TO BE BELOW THE GROUND'
1039 PBLAST%PBLAST_TAB(ILD_PBLAST)%TAGMSG(I) = 1
1040 ELSEIF(ANGLE_g > 85.00000)THEN
1041 WRITE(IOUT, FMT='(A,I0,A,E10.4)')
1042 . 'Warning : /LOAD/PBLAST id=',ID,' ANGLE IS OVER THE UPPER BOUND,',ANGLE_g
1043 WRITE(ISTDO,FMT='(A,I0,A,E10.4)')
1044 . 'Warning : /LOAD/PBLAST id=',ID,' ANGLE IS OVER THE UPPER BOUND,',ANGLE_g
1045.OR.
IF(N4 == 0 N3 == N4)THEN
1046 WRITE(IOUT, FMT='(A,3I11)')' ANGLE SET TO 85.00 FOR FACE:',ITAB((/N1,N2,N3/))
1047 WRITE(ISTDO,FMT='(A,3I11)')' ANGLE SET TO 85.00 FOR FACE:',ITAB((/N1,N2,N3/))
1049 WRITE(IOUT, FMT='(A,4I11)')' ANGLE SET TO 85.00 FOR FACE:',ITAB((/N1,N2,N3,N4/))
1050 WRITE(ISTDO,FMT='(A,4I11)')' ANGLE SET TO 85.00 FOR FACE:',ITAB((/N1,N2,N3,N4/))
1053 PBLAST%PBLAST_TAB(ILD_PBLAST)%TAGMSG(I) = 1
1056 !------------------------------------------------------------!
1057 CALL PBLAST_PARAMETERS__AIR_BURST(PBLAST,Z_struct, Zc, Zg, ANGLE_g, W13, TDET,
1058 + FAC_P_bb, FAC_I_bb, FAC_T_bb,
1059 + IS_DECAY_TO_BE_COMPUTED,
1061 + FRIEDLANDER_PARAMS,NWARN)
1063 P_inci = FRIEDLANDER_PARAMS%P_inci
1064 P_refl = FRIEDLANDER_PARAMS%P_refl
1065 I_inci = FRIEDLANDER_PARAMS%I_inci
1066 I_refl = FRIEDLANDER_PARAMS%I_refl
1067 T_A = FRIEDLANDER_PARAMS%T_A
1068 DT_0 = FRIEDLANDER_PARAMS%DT_0
1069 decay_inci = FRIEDLANDER_PARAMS%decay_inci
1070 decay_refl = FRIEDLANDER_PARAMS%decay_refl
1071 !------------------------------------------------------------!
1078 TA_PBLAST = MIN(TA_PBLAST, T_A)
1080 !--------------------------------------------------------
1081 ! Storage of Wave Parameters (transmitted to Engine)
1082 !--------------------------------------------------------
1083 PBLAST%PBLAST_TAB(ILD_PBLAST)%cos_theta(I) = cos_theta
1084 PBLAST%PBLAST_TAB(ILD_PBLAST)%P_inci(I) = P_inci
1085 PBLAST%PBLAST_TAB(ILD_PBLAST)%P_refl(I) = P_refl
1086 PBLAST%PBLAST_TAB(ILD_PBLAST)%ta(I) = T_A
1087 PBLAST%PBLAST_TAB(ILD_PBLAST)%t0(I) = DT_0
1088 PBLAST%PBLAST_TAB(ILD_PBLAST)%decay_inci(I) = decay_inci
1089 PBLAST%PBLAST_TAB(ILD_PBLAST)%decay_refl(I) = decay_refl
1090 PBLAST%PBLAST_TAB(ILD_PBLAST)%TAGMSG(I) = 0
1092 b_min = MIN(b_min, decay_inci)
1093 b_min = MIN(b_min, decay_refl)
1095 b_max = MAX(b_max, decay_inci)
1096 b_max = MAX(b_max, decay_refl)
1098 DTMIN = MIN(DTMIN, DT_0/NDT)
1102 PBLAST%PBLAST_TAB(ILD_PBLAST)%DTMIN = DTMIN
1104 FACLOADP(7,K) = TA_PBLAST ! min(TDET+T_A, I=1..NUMSEG)
1105 PBLAST%PBLAST_DT%TA_INF = MIN(PBLAST%PBLAST_DT%TA_INF, TA_PBLAST)! min( [min(TDET+T_A, I=1..NUMSEG)] , K=1..'numpblast')
1106 OUTPUT_USER_PARAMS(3,K_BLAST) = b_min
1107 OUTPUT_USER_PARAMS(4,K_BLAST) = b_max
1108 OUTPUT_USER_PARAMS(6,K_BLAST) = TA_PBLAST
1109 IF(BOOL_UNDERGROUND_CURRENT_LOAD)THEN
1111 WRITE(MSGOUT1,FMT='(I0,A)') SEG_UNDERGROUND,' SEGMENT(S) ON TARGET SURFACE ARE BELOW THE GROUND'
1113 MSGOUT2='THERE WILL NOT BE LOADED WITH BLAST PRESSURE'
1114 CALL ANCMSG(MSGID=1907,MSGTYPE=MSGWARNING,ANMODE=ANINFO,C1=TRIM(TITR),I1=ID,C2=MSGOUT1,C3=MSGOUT2)
1116.AND.
IF(IMODEL == 2 NWARN > 0)THEN
1118 WRITE(MSGOUT1,FMT='(I0,A)') NWARN,
1119 . ' SEGMENT(S) HAS EXCESSIVE POSITIVE IMPULSE REGARDING THE PEAK PRESSURE AND POSITIVE DURATION.'
1122 . 'A TRIANGULAR WAVEFORM WILL BE USED INSTEAD TO MAXIMIZE THE IMPULSE. DEFINING A PMIN VALUE IS STRONGLY RECOMMENDED'
1123 CALL ANCMSG(MSGID=1907,MSGTYPE=MSGWARNING,ANMODE=ANINFO,C1=TRIM(TITR),I1=ID,C2=MSGOUT1,C3=MSGOUT2)
1129 NUMLOADP=NUMLOADP+4*NUMSEG ! /LOAD/PBLAST
1132 ENDDO!next K (/LOAD/PBLAST)
1134!Set (shifted arrival time) for all blast loading
1135.NOT.
IF(IS_ITA_SHIFT)THEN
1136 PBLAST%PBLAST_DT%TA_INF = ZERO
1138 DO K = 1+NLOADP_F, NLOADP_F+PBLAST%NLOADP_B
1139 K_BLAST = K-NLOADP_F
1141 TA_PBLAST = FACLOADP(7,K)
1142 !shifting trigger time
1143 ! arrival time for segments are not shifted, time will be translated
1144 ! during engine using T* = T + T_shift
1145 FACLOADP(7,K) = MAX(ZERO, TA_PBLAST-PBLAST%PBLAST_DT%TA_INF) !arrival time shifted if requested
1153 !this output is made once all /LOAD/PBLAST options are read in order to display global parameters (min values)
1154 DO K = 1+NLOADP_F, NLOADP_F+PBLAST%NLOADP_B
1155 K_BLAST = K-NLOADP_F
1156 IZ_UPDATE = ILOADP(6,K)
1159 ITA_SHIFT = ILOADP(9,K)
1161 IMODEL = ILOADP(11,K)
1162 TDET = FACLOADP(1,K)
1163 XDET = FACLOADP(2,K)
1164 YDET = FACLOADP(3,K)
1165 ZDET = FACLOADP(4,K)
1166 WTNT = FACLOADP(5,K)
1167 PMIN = FACLOADP(6,K)
1168 TA_PBLAST = FACLOADP(7,K)
1170 TSTOP = FACLOADP(13,K)
1171 NODE_ID = INT(OUTPUT_USER_PARAMS(5,K_BLAST))
1172 SURF_ID = INT(OUTPUT_USER_PARAMS(1,K_BLAST))
1173 SURF_ID_GROUND = INT(OUTPUT_USER_PARAMS(2,K_BLAST))
1174 DTMIN = PBLAST%PBLAST_TAB(ILD_PBLAST)%DTMIN
1175 b_min = OUTPUT_USER_PARAMS(3,K_BLAST)
1176 b_max = OUTPUT_USER_PARAMS(4,K_BLAST)
1188 WRITE (IOUT,2011)ID,SURF_ID,NUMSEG,IABAC,IZ_UPDATE,IMODEL,ITA_SHIFT,XDET,YDET,ZDET,TDET,WTNT,PMIN
1190 WRITE (IOUT,2211)ID,SURF_ID,NUMSEG,SEG_UNDERGROUND, IABAC,IZ_UPDATE,IMODEL,ITA_SHIFT,
1191 . XDET,YDET,ZDET,TDET,WTNT,PMIN
1194 WRITE (IOUT,2033)DTMIN
1196 WRITE (IOUT,2031)b_min
1197 WRITE (IOUT,2032)b_max
1199 IF(IS_AVAILABLE_TSTOP)WRITE (IOUT,2024)TSTOP
1200 IF(NODE_ID /= 0)WRITE (IOUT,2015)NODE_ID
1201 IF(NDT /= 0)WRITE (IOUT,2014)NDT
1203 WRITE(IOUT,2034)NX_SURF,NY_SURF,NZ_SURF
1206 WRITE(IOUT,2036)ISHAPE
1208 IF(IABAC == 3) WRITE(IOUT,2023) HC
1209 IF(ITA_SHIFT == 2)THEN
1210 WRITE (IOUT,2013)OUTPUT_USER_PARAMS(6,K_BLAST)
1211 WRITE (IOUT,2012)TA_PBLAST
1213 WRITE (IOUT,2013)TA_PBLAST
1215 !DISPLAY MINIMUM VALUE WITHIN ALL PBLAST OPTIONS
1216 IF(PBLAST%NLOADP_B>=2)THEN
1217 WRITE(IOUT,2035)PBLAST%PBLAST_DT%TA_INF
1220 ENDDO!next K (/LOAD/PBLAST)
1225 DEALLOCATE( OUTPUT_USER_PARAMS)
1230 . ' BLAST LOADING '/,
1231 . ' -------------- '/)
1232 2001 FORMAT(' FREE AIR BURST')
1233 2002 FORMAT(' SURFACE BURST')
1234 2003 FORMAT(' AIR BURST')
1235 2010 FORMAT(' DEFAULT UNIT SYSTEM IS {g,cm,mus}'/)
1237 . 5X,'ID . . . . . . . . . . . . . . . . . .=',I16/,
1238 . 5X,'SURFACE IDENTIFIER . . . . . . . . . .=',I16/,
1239 . 5X,' > NUMBER OF SEGMENTS . . . . . . .=',I16/,
1240 . 5X,'EXP_DATA (ALGORITHM) . . . . . . . . =',I16/,
1241 . 5X,'IZ FLAG (ENGINE UPDATE) . . . . . . . =',I16/,
1242 . 5X,'IFORM FLAG (FRIEDLANDER MODEL) . . . .=',I16/,
1243 . 5X,'I_TSHIFT (FLAG FOR TIME SHIFTING) . .=',I16/,
1244 . 5X,'X-DET. . . . . . . . . . . . . . . . .=',E12.4/,
1245 . 5X,'Y-DET . . . . . . . . . . . . . . . . =',E12.4/,
1246 . 5X,'Z-DET . . . . . . . . . . . . . . . . =',E12.4/,
1247 . 5X,'TDET . . . . . . . . . . . . . . . . .=',E12.4/,
1248 . 5X,'WTNT . . . . . . . . . . . . . . . .=',E12.4/,
1249 . 5X,'PMIN . . . . . . . . . . . . . . . . .=',E12.4)
1251 . 5X,'ID . . . . . . . . . . . . . . . . . .=',I16/,
1252 . 5X,'SURFACE IDENTIFIER . . . . . . . . . .=',I16/,
1253 . 5X,' > NUMBER OF SEGMENTS . . . . . . .=',I16/,
1254 . 5X,' > UNDERGROUND SEGMENTS. . . . . . .=',I16/,
1255 . 5X,'EXP_DATA (ALGORITHM) . . . . . . . . =',I16/,
1256 . 5X,'IZ FLAG (ENGINE UPDATE) . . . . . . . =',I16/,
1257 . 5X,'IFORM FLAG (FRIEDLANDER MODEL) . . . .=',I16/,
1258 . 5X,'I_TSHIFT (FLAG FOR TIME SHIFTING) . .=',I16/,
1259 . 5X,'X-DET. . . . . . . . . . . . . . . . .=',E12.4/,
1260 . 5X,'Y-DET . . . . . . . . . . . . . . . . =',E12.4/,
1261 . 5X,'Z-DET . . . . . . . . . . . . . . . . =',E12.4/,
1262 . 5X,'TDET . . . . . . . . . . . . . . . . .=',E12.4/,
1263 . 5X,'WTNT . . . . . . . . . . . . . . . .=',E12.4/,
1264 . 5X,'PMIN . . . . . . . . . . . . . . . . .=',E12.4)
1266 . 5X,'TIME OF ARRIVAL (SHIFTED). . . . . . .=',E12.4)
1268 . 5X,'TIME OF ARRIVAL . . . . . . . . . . . =',E12.4)
1270 . 5X,'NDT . . . . . . . . . . . . . . . . .=',I10)
1272 . 5X,'NODE IDENTIFIER. . . . . . . . . . . .=',I10)
1274 . 5X,'CHARGE HEIGHT. . . . . . . . . . . . .=',E12.4)
1276 . 5X,'STOP TIME . . . . .. . . . . . . . . .=',E12.4/)
1278 . 5X,'COMPUTED MINIMUM DECAY PARAMETER . . .=',E12.4)
1280 . 5X,'COMPUTED MAXIMUM DECAY PARAMETER . . .=',E12.4)
1282 . 5X,'COMPUTED MINIMUM TIME STEP . . . . . .=',E12.4)
1284 . 5X,'GROUND NX . . . . . . . . . . . . . .=',E12.4/,
1285 . 5X,'GROUND NY . . . . . . . . . . . . . . =',E12.4/,
1286 . 5X,'GROUND NZ . . . . . . . . . . . . . . =',E12.4)
1288 . 5X,'TIME SHIFT VALUE',/,
1289 . 5X,' (MINIMUM AMONG ALL PBLAST OPTIONS). =',E12.4//)
1291 . 5X,'ISHAPE FLAG . . . . . . . . . . . . =',I10)
1295 IF (IERR1 /= 0) THEN
1296 WRITE(IOUT,*)' ** ERROR IN MEMORY ALLOCATION, /LOAD/PBLAST id=',ID,' '
1297 WRITE(ISTDO,*)' ** ERROR IN MEMORY ALLOCATION, /LOAD/PBLAST id=',ID,' '