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(LFACLOAD,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_ITA_SHIFT,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
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,ID,SURF_ID,internal_SURF_ID
123 INTEGER IABAC,,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)
225 pblast%PBLAST_DT%TA_INF
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
241 CALL hm_option_read_key(lsubmodel, option_titr = titr, option_id = id, submodel_id = sub_id)
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
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
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
551 !
norm is strictly positive : because there is a
starter check from reader, error message 891 otherwise
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-base_z)
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=aninfo,c1=trim(titr),i1=id,c2=msgout1,c3=msgout2)
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
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
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
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
GOTO
717 ALLOCATE (pblast%PBLAST_TAB(ild_pblast)%decay_refl(numseg) ,stat=ierr1);
IF (ierr1 /= 0)
GOTO 1
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
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
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.
806 IF( iabac == 1 )
THEN
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)"
816WRITE'(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
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
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)
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)*nz_surf
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
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="" 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(n1),itab(n2),itab(n3),itab(n4)
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.OR.
IF (N4 == 0 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 IF(n4 == 0 .OR. 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
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
1078 ta_pblast =
min(ta_pblast, t_a)
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)
1096 b_max =
max(b_max, decay_refl)
1102 pblast%PBLAST_TAB(ild_pblast)%DTMIN = dtmin
1104 facloadp(7,k) = ta_pblast
1105 pblast%PBLAST_DT%TA_INF =
min(pblast%PBLAST_DT%TA_INF, ta_pblast)
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 IF(imodel == 2 .AND. 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
1135 IF(.NOT.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)
1145 facloadp(7,k) =
max(zero, ta_pblast-pblast%PBLAST_DT%TA_INF)
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
1216 IF(pblast%NLOADP_B>=2)
THEN
1217 WRITE(iout,2035)pblast%PBLAST_DT%TA_INF
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,
' '