OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_pblast.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| hm_read_pblast ../starter/source/loads/pblast/hm_read_pblast.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| arret ../starter/source/system/arret.F
30!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
31!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.f
32!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
33!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
34!|| ngr2usr ../starter/source/system/nintrr.F
35!|| subrotpoint ../starter/source/model/submodel/subrot.F
36!|| usr2sys ../starter/source/system/sysfus.F
37!||--- uses -----------------------------------------------------
38!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
39!|| message_mod ../starter/share/message_module/message_mod.F
40!|| r2r_mod ../starter/share/modules1/r2r_mod.F
41!|| submodel_mod ../starter/share/modules1/submodel_mod.F
42!||====================================================================
43 SUBROUTINE hm_read_pblast(PBLAST,
44 . ITAB ,ITABM1 ,UNITAB ,IGRSURF ,NUMLOADP,
45 . ILOADP ,LLOADP ,FACLOADP ,X ,BUFSF ,
46 . LSUBMODEL ,RTRANS)
47C
48C-----------------------------------------------
49C READER SUBROUTINE FOR OPTION /LOAD/PBLAST
50C -----------------------------------------
51C IT READS USER PARAMETER
52C IT DEDUCE WAVE CHARACTERISTIC PARAMETERS FROM TABLES (incident/reflected Pressure, Impulse ; arrival time, etc ...)
53C
54C FAC_M FACL FAC_T : enable to convert (custom) input unit to working unit system
55C FAC_MASS, FAC_LENGTH, FAC_TIME : enable to convert working unit system into International Unit system
56C
57C 'Exp_data" = IABAC = 1 --> FREE AIR
58C 'Exp_data" = IABAC = 2 --> SURFACE BURST
59C 'Exp_data" = IABAC = 3 --> AIR BURST
60C
61C-----------------------------------------------
62C M o d u l e s
63C-----------------------------------------------
64 USE unitab_mod
65 USE r2r_mod
66 USE message_mod
67 USE pblast_mod
68 USE groupdef_mod
69 USE submodel_mod
72C-----------------------------------------------
73C I m p l i c i t T y p e s
74C-----------------------------------------------
75#include "implicit_f.inc"
76C-----------------------------------------------
77C C o m m o n B l o c k s
78C-----------------------------------------------
79#include "param_c.inc"
80#include "com04_c.inc"
81#include "units_c.inc"
82#include "tabsiz_c.inc"
83C-----------------------------------------------
84C D u m m y A r g u m e n t s
85C-----------------------------------------------
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
95C-----------------------------------------------
96C L o c a l V a r i a b l e s
97C-----------------------------------------------
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
101
102 CHARACTER(LEN=NCHARLINE) :: MSGOUT1
103 CHARACTER(LEN=NCHARLINE) :: MSGOUT2
104 CHARACTER(LEN=NCHARTITLE)::TITR
105
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 !ground
111 my_real hc ! height of charge
112 my_real zc ! scaled height of charge
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
117 my_real b_min, b_max
118 my_real dtmin
119 my_real,ALLOCATABLE,DIMENSION(:,:) :: output_user_params
120
121 INTEGER I,J,K,NUMSEG,K_BLAST
122 INTEGER IAD,ID,SURF_ID,internal_SURF_ID
123 INTEGER IABAC,IADPL,itmp,IS,SUB_ID
124 INTEGER ITA_SHIFT
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
129 INTEGER :: ISHAPE
130 INTEGER :: NWARN !< number of segment for which it is not possible to correlate the positive impulse. It may happen that for a given Pmax and dt0 value even building a triangle shape leads to a lower impulse that the targeted one.
131 TYPE(friedlander_params_) :: FRIEDLANDER_PARAMS
132C-----------------------------------------------
133C C o n s t a n t V a l u e s
134C-----------------------------------------------
135 CHARACTER :: MESS*40
136 my_real :: cst_180
137 my_real PI_,Z1_ !tmp
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 '/
146C-----------------------------------------------
147C E x t e r n a l F u n c t i o n s
148C-----------------------------------------------
149 INTEGER,EXTERNAL :: DICHOTOMIC_SEARCH_R_DESC,DICHOTOMIC_SEARCH_R_ASC,USR2SYS,NGR2USR
150C----------------------------------------------------------------------------------
151C C o m m e n t s
152C----------------------------------------------------------------------------------
153C /LOAD/PFLUID /LOAD/PBLAST
154C
155C LLOADP(1,K) : K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B : . . . SEGMENT STORAGE (surface)
156C ILOADP(1,K) : K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B : . . . INTEGER STORAGE (option parameters)
157C FACLOADP(1,K) : K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B : . . . REAL STORAGE (option parameters)
158C
159C----------------------------------------------------------------------------------
160C /LOAD/PFLUID /LOAD/PBLAST
161C K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B
162C----------------------------------------------------------------------------------
163C ILOADP(1:SIZLOADP,K) : INTEGER STORAGE (option parameters)
164C----------------------------------------------------------------------------------
165C K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B
166C
167C ILOADP(1,K) : 4*NUMSEG (4 * Nb of segments) 4*NUMSEG
168C ILOADP(2,K) : ID IS
169C ILOADP(3,K) : - -
170C ILOADP(4,K) : IAD Address of segments in LLOADP IAD
171C ILOADP(5,K) : 2 3
172C ILOADP(6,K) : Sensor id IZ_UPDATE
173C ILOADP(7,K) : FCT_HSP function No IABAC
174C ILOADP(8,K) : Dir_hsp (1, 2, 3) ID
175C ILOADP(9,K) : frahsp id ITA_SHIFT
176C ILOADP(10,K): FCT_CX function No NDT
177C ILOADP(11,K): FCT_VEL function No IMODEL
178C ILOADP(12,K): Dir_vel (1, 2, 3) -
179C ILOADP(13,K): fravel id -
180C----------------------------------------------------------------------------------
181C /LOAD/PFLUID /LOAD/PBLAST
182C K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B
183C----------------------------------------------------------------------------------
184C LLOADP(1:SLLOADP,K) : SEGMENT STORAGE (surface)
185C----------------------------------------------------------------------------------
186C K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B
187C
188C LLOADP(1,K) : NODE1 NODE1
189C LLOADP(2,K) : NODE2 NODE2
190C LLOADP(3,K) : NODE3 NODE3
191C LLOADP(4,K) : NODE4 NODE4
192C----------------------------------------------------------------------------------
193C /LOAD/PFLUID /LOAD/PBLAST
194C K=1,NLOADP_F K=1+NLOADP_F,NLOADP_F+NLOADP_B
195C----------------------------------------------------------------------------------
196C FACLOADP(LFACLOAD,K) : REAL STORAGE (option parameters)
197C----------------------------------------------------------------------------------
198C
199C FACLOADP( 1,K) = Fscaley_hsp TDET
200C FACLOADP( 2,K) = ONE/Ascalex_hsp XDET
201C FACLOADP( 3,K) = Fscaley_pc YDET
202C FACLOADP( 4,K) = ONE/Ascalex_pc ZDET
203C FACLOADP( 5,K) = Fscaley_vel WTNT
204C FACLOADP( 6,K) = ONE/Ascalex_vel P0_REF
205C FACLOADP( 7,K) = - ZERO ! TA_SHIFT
206C FACLOADP( 8,K) = - Nx_SURF
207C FACLOADP( 9,K) = - Ny_SURF
208C FACLOADP(10,K) = - Nz_SURF
209C FACLOADP(11,K) = - HC
210C FACLOADP(12,K) = - alpha_zc
211C FACLOADP(13,K) = - TSTOP
212C----------------------------------------------------------------------------------
213
214C-----------------------------------------------
215C S o u r c e L i n e s
216C-----------------------------------------------
217 base_x = -huge(base_x)
218 base_y = -huge(base_y)
219 base_z = -huge(base_z)
220
221 !init tables
222 CALL pblast_init_tables(pblast%PBLAST_DATA)
223 tmp(1:3) = huge(tmp(1))
224 !Init.
225 pblast%PBLAST_DT%TA_INF = ep20
226 numseg = 0
227 ild_pblast = 0 !numbering
228 alpha_zc = zero
229 hc = zero
230 bool_skip_calc = .false.
231 is_ita_shift = .false.
232 nwarn = 0
233
234 ALLOCATE( output_user_params(6,pblast%NLOADP_B))
235 output_user_params(:,:) = zero
236
237 CALL hm_option_start('/LOAD/PBLAST')
238
239 DO k = 1+nloadp_f, nloadp_f+pblast%NLOADP_B
240 k_blast = k-nloadp_f
241 CALL hm_option_read_key(lsubmodel, option_titr = titr, option_id = id, submodel_id = sub_id)
242 iad = numloadp + 1
243 surf_id = 0 !target surface id
244 surf_id_ground = 0 !ground surface id
245 internal_surf_id = 0
246 seg_underground = 0
247 bool_underground_current_load = .false.
248 ! detonation point
249 xdet = zero
250 ydet = zero
251 zdet = zero
252 tdet = zero
253 tstop = zero
254 wtnt = zero
255 ta_pblast = ep20 ! for current K, PBLAST_DT%TA_INF is global
256
257 !--------------------------------------------------------------
258 ! R e a d i n g I n p u t P a r a m e t e r s
259 !--------------------------------------------------------------
260 !input reading
261 !---line-1
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)
269 !---line-2
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)
275 !---line-3
276 CALL hm_get_floatv('Pmin', pmin, is_available, lsubmodel, unitab)
277 CALL hm_get_floatv('Tstop',tstop,is_available_tstop, lsubmodel, unitab)
278 !---line-4
279 CALL hm_get_intv('surf_ground_ID', surf_id_ground, is_available, lsubmodel)
280 CALL hm_get_intv('Ishape', ishape, is_available, lsubmodel)
281
282 output_user_params(1,k_blast)=surf_id
283 output_user_params(2,k_blast)=surf_id_ground
284
285 bool_coord=.false.
286 IF(xdet/=zero .OR. ydet/=zero .OR. zdet/=zero)THEN
287 bool_coord=.true.
288 ENDIF
289
290 IF(sub_id /= 0)CALL subrotpoint(xdet,ydet,zdet,rtrans,sub_id,lsubmodel)
291
292 !units
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 !/FAC_M_bb**THIRD
298 w13 = (wtnt*fac_m_bb)**third
299
300 !--------------------------------------------------------------
301 ! D e f a u l t V a l u e s
302 !--------------------------------------------------------------
303
304 IF(tstop == zero)tstop=ep20
305 IF(ndt == 0) ndt=100
306
307 IF(pmin < zero)THEN
308 msgout1=''
309 msgout1='PMIN PARAMETER IS NEGATIVE. PLEASE CHECK THE LOAD HISTORY FOR NEGATIVE PRESSURE,'
310 msgout2=''
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)
313 ENDIF
314
315 IF(wtnt == zero)THEN
316 msgout1=''
317 msgout1='TNT MASS MUST BE DEFINED.'
318 msgout2=''
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)
321 ENDIF
322
323 IF(node_id > 0)THEN
324 node_id=usr2sys(node_id,itabm1,mess,id)
325 IF(node_id > 0)THEN
326 xdet = x(1,node_id)
327 ydet = x(2,node_id)
328 zdet = x(3,node_id)
329 ENDIF
330 output_user_params(5,k_blast)=node_id
331 IF(bool_coord)THEN
332 msgout1=''
333 msgout1='NODE IDENTIFIER IS PROVIDED.'
334 msgout2=''
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)
337 ENDIF
338 ENDIF
339
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)
343
344 IF(iabac >= 2 .AND. surf_id_ground /= 0)THEN
345 IF(internal_surf_id_ground == 0)THEN
346 !user surface not found in input file
347 !display error message : ground_id not found
348 msgout1=''
349 msgout1='SURFACE IDENTIFIER FOR GROUND DEFINITION WAS NOT FOUND'
350 msgout2=''
351 msgout2='SURF ID:'
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.
355 ENDIF
356 ENDIF
357
358 IF(surf_id == 0)THEN
359 !user forgot to input surf_id
360 ! display error message : surf_id missing
361 msgout1=''
362 msgout1='SURFACE IDENTIFIER IS NOT PROVIDED'
363 msgout2=''
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.
367 ELSE
368 IF(internal_surf_id == 0)THEN
369 !surface is not existing
370 ! display error message : surf_id not found
371 msgout1=''
372 msgout1='INVALID SURFACE IDENTIFIER'
373 msgout2=''
374 msgout2='SURF ID:'
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.
378 ENDIF
379 ENDIF
380
381 !ITA_SHIFT : BLAST ARRIVAL
382 !---1:no shift (default)
383 !---2:shift loading starts from the first cycle T=0 is shift to time on which first targeted segment is reached (within all pblast options)
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.
387
388 ! IMODEL : flag for blast model
389 !---1:Friedlander
390 !---2:modified Friedlander (default)
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.
394
395 ! IZ : Z update during Engine
396 !---1 : do not update (default)
397 !---2 : update blast characteristing during Engine (because target may have move)
398 IF(iz_update == 0)iz_update=1
399 IF(iz_update >=3)iz_update=1
400
401 !IABAC flag : MODEL TYPE
402 ! 1: FREE AIR (default)
403 ! 2: SURFACE BURST
404 ! 3: AIR BURST
405 IF(iabac <= 0)iabac=1
406 IF(iabac >= 4)iabac=1
407
408 !ISHAPE
409 ! 1: spherical (with ground) - default
410 ! 2: spherical (without ground)
411 ! 3: cylindrical (with ground)
412 IF(ishape <= 0 .OR. ishape >= 4) ishape=1
413
414 !--------------------------------------------------------------
415 ! S u r f a c e S e g m e n t s
416 !--------------------------------------------------------------
417 IF(internal_surf_id /= 0)THEN
418 numseg = igrsurf(internal_surf_id)%NSEG
419 DO j=1,numseg
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
425 ENDDO
426 ELSE
427 numseg = 0
428 ENDIF
429
430 !--------------------------------------------------------------
431 ! Normal Vector for ground (IABAC==2 or 3)
432 ! Scaled Height of Charge (IABAC==3)
433 !--------------------------------------------------------------
434 zc = zero
435 norm = zero
436 IF(iabac >= 2 )THEN !AIR BURST ONLY
437 IF(surf_id_ground == 0)THEN
438 base_x=zero
439 base_y=zero
440 base_z=zero
441 nx_surf=zero
442 ny_surf=zero
443 nz_surf=zero
444 IF(iabac == 3)THEN
445 nz_surf=-zdet
446 nn2 = nx_surf*nx_surf+ny_surf*ny_surf+nz_surf*nz_surf
447 norm = sqrt(nn2)
448 nz_surf=one
449 ELSE
450 base_z=zdet
451 nz_surf=one
452 nn2=one
453 norm=one
454 msgout1=''
455 msgout1='MISSING GROUND_ID IDENTIFIER'
456 msgout2=''
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)
459 ENDIF
460 IF(zdet == zero .AND. iabac == 3)THEN
461 msgout1=''
462 msgout1='ZDET IS NULL. IT IS NOT POSSIBLE TO DETERMINE DEFAULT SURFACE FOR GROUND DEFINITION'
463 msgout2=''
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.
467 nz_surf=-one ! Starter must go on up to normal termination
468 nn2=one
469 norm=one
470 ELSE
471 IF(iabac == 3)THEN
472 msgout1=''
473 msgout1='MISSING GROUND_ID IDENTIFIER'
474 msgout2=''
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)
477 ENDIF
478
479 !NORM IS STRICTLY POSITIVE : BECAUSE THERE IS A STARTER CHECK FROM READER, ERROR MESSAGE 891 OTHERWISE
480
481 !vector to find ground basis point from charge
482 nx_surf=nx_surf/norm !lambda*NX_
483 ny_surf=ny_surf/norm !lambda*NY_
484 nz_surf=nz_surf/norm !lambda*NZ_
485
486 IF(iabac == 3)THEN
487 !Determine Height
488 ! find Projection along line generated by n (ground vector) and over the gound plan
489 ! Proj=lambda.n
490 ! <z-Proj,n>=0
491 lambda=(nx_surf*xdet + ny_surf*ydet + nz_surf*zdet - nx_surf*base_x-ny_surf*base_y-nz_surf*base_z)/nn2
492 !Height is length Proj->Det. Storing Det->Proj into NN array
493 hc=lambda*norm
494 nx_surf=hc*nx_surf
495 ny_surf=hc*ny_surf
496 nz_surf=hc*nz_surf
497 ENDIF
498
499 !Scaled Height of Charge
500 zc = hc/w13
501 zc = zc * fac_l_bb
502
503 ENDIF
504 ELSE
505 lfound = .false.
506 DO is=1,nsurf
507 IF (surf_id_ground == igrsurf(is)%ID)THEN
508 SELECT CASE(igrsurf(is)%TYPE)
509 CASE DEFAULT
510 !Surface type is not matching. Setting Default ground definition
511 IF (zdet <= zero)THEN
512 msgout1=''
513 msgout1='SURFACE TYPE FOR GROUND DEFINITION IS NOT MATCHING'
514 msgout2=''
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.
518 ELSE
519 msgout1=''
520 msgout1='EXPECTED TYPE FOR GROUND SURFACE IS /SURF/PLANE.'
521 msgout2=''
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)
524 ENDIF
525 iadpl = 0
526 lfound = .true.
527 base_x = zero
528 base_y = zero
529 base_z = zero
530 hc = zdet
531 zc = hc * fac_l_bb/w13
532 nx_surf=zero
533 ny_surf=zero
534 nz_surf=-zdet
535 IF(zdet == zero)THEN
536 nz_surf = -one
537 ENDIF
538 EXIT
539 CASE(200)
540 !Surface type is matching:setting ground from surface definition
541 iadpl = igrsurf(is)%IAD_BUFR
542 lfound = .true.
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
550 norm = sqrt(nn2)
551 !norm is strictly positive : because there is a starter check from reader, error message 891 otherwise
552
553 IF(nn2 == zero)THEN
554 !Starter must go on up to normal termination.
555 !ERROR ID : 891 already printed (surface definition)
556 nz_surf=-one
557 nn2=one
558 norm=one
559 ENDIF
560
561 !vector to find ground basis point from charge
562 nx_surf=nx_surf/norm !NX_
563 ny_surf=ny_surf/norm !NY_
564 nz_surf=nz_surf/norm !NZ_
565 IF(iabac == 3)THEN
566 !Determine Height
567 ! find Projection along line generated by n (ground vector) and over the gound plan
568 ! Proj=lambda.n
569 ! <z-Proj,n>=0
570 lambda=(nx_surf*xdet + ny_surf*ydet + nz_surf*zdet - nx_surf*base_x-ny_surf*base_y-nz_surf*base_z)
571 !Height is length Proj->Det. Storing Det->Proj into NN array
572 hc = lambda ! |N_SURF|=1.0
573 ! N_Surf becomes vector from detonation point to ground surface
574 nx_surf=-hc*nx_surf !lambda*NX_
575 ny_surf=-hc*ny_surf !lambda*NY_
576 nz_surf=-hc*nz_surf !lambda*NZ_
577 ENDIF
578 !Scaled Height of Charge
579 zc = hc * fac_l_bb/w13
580 EXIT
581 END SELECT
582 ENDIF
583 ENDDO
584 ! Provided ID is referring to an nonexistent surface
585 IF (.NOT.lfound) THEN
586 nx_surf=zero
587 ny_surf=zero
588 nz_surf=-one
589 nn2=one
590 norm=one
591 hc=one
592 zc=one
593 ENDIF
594 ENDIF
595 ELSE
596 !initialized to zero but not used
597 nx_surf=zero
598 ny_surf=zero
599 nz_surf=zero
600 zc = zero
601 base_x = zero
602 base_y = zero
603 base_z = zero
604 ENDIF
605
606 !check that DEtonation Point belongs the ground
607 IF(iabac == 2)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
615 msgout1=''
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)
622 ENDIF
623 ENDIF
624
625 IF(iabac == 3)THEN
626 !Scaled Height of triple point
627 ! curve_id 1 2 3 4 5 6 7 8 9 10
628 ! 10 curves for ZC : {1.0; 1.5; 2.0; 2.5; 3.0; 3.5; 4.0; 5.0; 6.0; 7.0}
629 ! <--------curve_id=[2x-1]---------><----[x+3]----->
630 !
631 !get curve_id and interpolation factor. No matter unit system (curve_id1 and alpha_zc are dimensionless)
632
633 IF(hc<=zero)THEN
634 msgout1=''
635 msgout1=' DETONATION CENTER MUST BE ABOVE THE GROUND'
636 msgout2=''
637 CALL ancmsg(msgid=2047,msgtype=msgerror,anmode=aninfo,c1=trim(titr),i1=id,c2=msgout1,c3=msgout2)
638 bool_skip_calc = .true.
639 hc = one
640 ENDIF
641
642 tmp(1)=zc
643 zc=zc/fac_unit
644 IF(zc < 4)THEN
645 itmp = int( 2.*(zc)-1. )
646 curve_id1 = max(1,itmp)
647 curve_id2 = curve_id1+1
648 IF(itmp < 1)THEN
649 !message out of bounds. curve 1 will be used. no extrapolation
650 alpha_zc = zero
651 ELSE
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) )
654 ENDIF
655 ELSE
656 itmp = int( zc+3. )
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
661 alpha_zc = zero
662 ELSE
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) )
665 ENDIF
666 ENDIF
667 alpha_zc = curve_id1+alpha_zc !integer part is curve id1, digits are standing for interpolation factor between curve_id1 & curve_id2
668 ENDIF
669 zc = tmp(1)
670
671 !--------------------------------------------------------------
672 ! B u f f e r S t o r a g e (Transmitted to Engine)
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
678 iloadp( 4,k) = iad
679 iloadp( 5,k) = 3
680 iloadp( 6,k) = iz_update
681 iloadp( 7,k) = iabac
682 iloadp( 8,k) = id
683 iloadp( 9,k) = ita_shift
684 iloadp(10,k) = ndt
685 iloadp(11,k) = imodel
686 !ILOADP(12,K) = curve_id1 ! getting interpolated SHTP from figure 2_13
687 iad = iad + 3*numseg
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 !TA_PBLAST initialized below
695 facloadp( 8,k) = nx_surf
696 facloadp( 9,k) = ny_surf
697 facloadp(10,k) = nz_surf
698 hc = abs(hc)
699 facloadp(11,k) = hc
700 facloadp(12,k) = alpha_zc ! inteprolation factor for curve if on figure 2_13 in [0,1[ + curve_id1 (no matter are units ft/lb**1/3 or cm/g**1/3)
701 facloadp(13,k) = tstop
702 ENDIF
703
704 !--------------------------------------------------------------
705 ! C o m p u t e W a v e P a r a m e t e r s
706 !--------------------------------------------------------------
707 IF(internal_surf_id /= 0 .AND. .NOT.bool_skip_calc)THEN
708 numseg = igrsurf(internal_surf_id)%NSEG
709 iad = iloadp(4,k)
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
720
721 ! Coordinates of detonation point projection = DETPOINT + HC*n !N_SURF is here -HC*n where n is normal unitary vector of the plane
722 IF(iabac == 3)THEN
723 projdet(1)=xdet+ nx_surf
724 projdet(2)=ydet+ ny_surf
725 projdet(3)=zdet+ nz_surf
726 ELSE
727 projdet(1) = xdet
728 projdet(2) = ydet
729 projdet(3) = zdet
730 ENDIF
731
732 b_min = ep20
733 b_max = -ep20
734 dtmin = ep20
735 DO i=1,numseg
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
741 ! 4 NODE SEGMENT
742 npt = four
743 ! Segment Zentrum
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)
747 zx = zx*fourth
748 zy = zy*fourth
749 zz = zz*fourth
750 ! Normal vectors
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)
755 ELSE
756 ! 3 NODE SEGMENT
757 npt = three
758 IF(n4==0)THEN
759 ! nothing to do
760 ELSEIF(n1 == n2)THEN
761 n2 = n3
762 n3 = n4
763 n4 = 0
764 ELSEIF(n2 == n3)THEN
765 n3 = n4
766 n4 = 0
767 ELSEIF(n3 == n4)THEN
768 n4 = 0
769 ELSEIF(n4 == n1)THEN
770 n4 = 0
771 ENDIF
772 ! Segment Zentrum
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)
776 zx = zx*third
777 zy = zy*third
778 zz = zz*third
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)
783 ENDIF
784
785 ! Dist
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) ! *FAC_L_bb cm->work unit /FAC_L_bb : WORK_UNIT -> cm
790
791 !init
792 p_inci = zero
793 i_inci = zero
794 p_refl = zero
795 i_refl = zero
796 dt_0 = zero
797 t_a = zero
798 cos_theta = zero
799 decay_inci = one
800 decay_refl = one
801 bool_underground_current_seg = .false.
802
803 !--------------------------------------------------------
804 ! Free Air
805 !--------------------------------------------------------
806 IF( iabac == 1 ) THEN
807 !=== SPHERICAL CHARGE IN FREE FIELD ===!
808
809 ! scaled distance
810 z = dnorm / w13 !in abac unit ID g,cm,mus
811
812 !Warning Message if Z is out of bounds (precondition for subroutine BLAST_PARAMETERS__FREE_AIR_MODEL)
813 IF(z > 0.5 .AND. z < 400.)THEN
814 ELSEIF(z <= 0.5)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)
822 ELSE
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)
825 ENDIF
826 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
827
828 ELSEIF(z > 400.)THEN
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)
836 ELSE
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)
839 ENDIF
840 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
841 ENDIF
842
843 !Angle from detonation point
844 cos_theta = dx*nx_seg + dy*ny_seg + dz*nz_seg
845 cos_theta = cos_theta/max(em20,norm_*dnorm)
846
847 hz = zero ! not used with this formulation
848 !------------------------------------------------------------!
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)
853
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
862 !------------------------------------------------------------!
863
864
865 !--------------------------------------------------------
866 ! Surface Burst
867 !--------------------------------------------------------
868 ELSEIF( iabac == 2 ) THEN
869
870 !=== HEMISPHERICAL CHARGE WITH GROUND REFLECTION ===!
871
872 hz = ( nx_surf*zx + ny_surf*zy + nz_surf*zz - nx_surf*xdet - ny_surf*ydet - nz_surf*zdet )
873
874 IF(hz < -em10 .AND. ishape /= 2)THEN
875
876 !FACE IS UNDERGROUND
877 p_inci = zero
878 i_inci = zero
879 p_refl = zero
880 i_refl = zero
881 dt_0 = ep20
882 t_a = ep20
883 decay_inci = one
884 decay_refl = one
885 cos_theta = zero
886
887 seg_underground = seg_underground + 1
888 bool_underground_current_load = .true.
889 bool_underground_current_seg = .true.
890
891 ELSE
892
893 !FACE IS OVERGROUND
894
895 !Planar Wave : angle with targeted face
896 lambda = (base_x-zx)*nx_surf + (base_y-zy)*ny_surf + (base_z-zz)*nz_surf
897
898 projz(1) = zx + lambda*nx_surf
899 projz(2) = zy + lambda*ny_surf
900 projz(3) = zz + lambda*nz_surf
901
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))
906 zg = lg*fac_l_bb/w13
907
908 ! scaled distance
909 SELECT CASE(ishape)
910 CASE (1,2)
911 z = dnorm / w13 !spherical
912 !Angle from detonation point
913 cos_theta = dx*nx_seg + dy*ny_seg + dz*nz_seg
914 cos_theta = cos_theta/max(em20,norm_*dnorm)
915 CASE(3)
916 z = zg !cylindrical - in abac unit ID g,cm,mus
917 !Angle from detonation point
918 ! is here cos between (Det-ProjZ) and normal
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_)
921 END SELECT
922
923 !finding index for TM5-1300 abacuses from bijection.
924 IF(z > 0.5 .AND. z < 400.)THEN
925 !inside interpolation table
926
927 ELSEIF(z <= 0.5)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(n2),itab(n3)
935 ELSE
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)
938 ENDIF
939 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
940
941 ELSEIF(z > 400.)THEN
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)
949 ELSE
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)
952 ENDIF
953 PBLAST%PBLAST_TAB(ILD_PBLAST)%TAGMSG(I) = 1
954 ENDIF
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 !------------------------------------------------------------!
969 ENDIF
970
971 !--------------------------------------------------------
972 ! Free Air Burst
973 !--------------------------------------------------------
974 ELSEIF(IABAC == 3)THEN
975 !--- Determine Height of centroid (structure face) : HZ
976
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
979
980 IF(HZ < ZERO)THEN
981
982 P_inci = zero
983 I_inci = zero
984 P_refl = zero
985 I_refl = zero
986 DT_0 = EP20
987 T_A = EP20
988 DECAY_inci = ONE
989 DECAY_refl = ONE
990 cos_theta = ZERO
991
992 SEG_UNDERGROUND = SEG_UNDERGROUND + 1
993 BOOL_UNDERGROUND_CURRENT_LOAD = .TRUE.
994 BOOL_UNDERGROUND_CURRENT_SEG = .TRUE.
995
996 ELSE
997
998 Z_struct = HZ*FAC_L_bb/W13 ! scaled value in same unit system as hardcoded tables {g,cm,mus,Mbar}
999
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)
1003
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}
1014
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_)
1018
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'
1034 ELSE
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'
1037 ENDIF
1038 angle_g = zero
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/))
1048 ELSE
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/))
1051 ENDIF
1052 angle_g = 85.00000
1053 pblast%PBLAST_TAB(ild_pblast)%TAGMSG(i) = 1
1054 ENDIF
1055
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,
1060 + id,'LOAD',.true.,
1061 + friedlander_params,nwarn)
1062
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 !------------------------------------------------------------!
1072
1073
1074 endif!(HZ >= ZERO)
1075
1076 endif! IABAC==3
1077
1078 ta_pblast = min(ta_pblast, t_a)
1079
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
1091
1092 b_min = min(b_min, decay_inci)
1093 b_min = min(b_min, decay_refl)
1094
1095 b_max = max(b_max, decay_inci)
1096 b_max = max(b_max, decay_refl)
1097
1098 dtmin = min(dtmin, dt_0/ndt)
1099
1100 enddo! I=1,NUMSEG
1101
1102 pblast%PBLAST_TAB(ild_pblast)%DTMIN = dtmin
1103
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
1110 msgout1=''
1111 WRITE(msgout1,fmt='(I0,A)') seg_underground,' SEGMENT(S) ON TARGET SURFACE ARE BELOW THE GROUND'
1112 msgout2=''
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)
1115 ENDIF
1116 IF(imodel == 2 .AND. nwarn > 0)THEN
1117 msgout1=''
1118 WRITE(msgout1,fmt='(I0,A)') nwarn,
1119 . ' SEGMENT(S) HAS EXCESSIVE POSITIVE IMPULSE REGARDING THE PEAK PRESSURE AND POSITIVE DURATION.'
1120 msgout2=''
1121 msgout2=
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)
1124 ENDIF
1125
1126
1127 ENDIF
1128
1129 numloadp=numloadp+4*numseg ! /LOAD/PBLAST
1130
1131C-----------
1132 enddo!next K (/LOAD/PBLAST)
1133
1134!Set (shifted arrival time) for all blast loading
1135 IF(.NOT.is_ita_shift)THEN
1136 pblast%PBLAST_DT%TA_INF = zero
1137 ELSE
1138 DO k = 1+nloadp_f, nloadp_f+pblast%NLOADP_B
1139 k_blast = k-nloadp_f
1140 iloadp(9,k) = 2
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
1146 ENDDO
1147 ENDIF
1148
1149
1150
1151C-----------OUTPUT IN LISTING FILE
1152C---------------------------------
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)
1157 iabac = iloadp(7,k)
1158 id = iloadp(8,k)
1159 ita_shift = iloadp(9,k)
1160 ndt = iloadp(10,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)
1169 hc = facloadp(11,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)
1177 WRITE (iout,2000)
1178 SELECT CASE (iabac)
1179 CASE(1)
1180 WRITE(iout,2001)
1181 CASE(2)
1182 WRITE(iout,2002)
1183 CASE(3)
1184 WRITE(iout,2003)
1185 END SELECT
1186 WRITE(iout,2010)
1187 IF(iabac==1)THEN
1188 WRITE (iout,2011)id,surf_id,numseg,iabac,iz_update,imodel,ita_shift,xdet,ydet,zdet,tdet,wtnt,pmin
1189 ELSE
1190 WRITE (iout,2211)id,surf_id,numseg,seg_underground, iabac,iz_update,imodel,ita_shift,
1191 . xdet,ydet,zdet,tdet,wtnt,pmin
1192 ENDIF
1193
1194 WRITE (iout,2033)dtmin
1195 IF(imodel == 2)THEN
1196 WRITE (iout,2031)b_min
1197 WRITE (iout,2032)b_max
1198 ENDIF
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
1202 IF(iabac >=2)THEN
1203 WRITE(iout,2034)nx_surf,ny_surf,nz_surf
1204 ENDIF
1205 IF(iabac == 2)THEN
1206 WRITE(iout,2036)ishape
1207 ENDIF
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
1212 ELSE
1213 WRITE (iout,2013)ta_pblast
1214 ENDIF
1215 !DISPLAY MINIMUM VALUE WITHIN ALL PBLAST OPTIONS
1216 IF(pblast%NLOADP_B>=2)THEN
1217 WRITE(iout,2035)pblast%PBLAST_DT%TA_INF
1218 ENDIF
1219
1220 enddo!next K (/LOAD/PBLAST)
1221
1222
1223
1224C--------------------------------------------------------------------------------C
1225 DEALLOCATE( output_user_params)
1226 RETURN
1227C--------------------------------------------------------------------------------C
1228 2000 FORMAT(
1229 . //
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}'/)
1236 2011 FORMAT(
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)
1250 2211 FORMAT(
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)
1265 2012 FORMAT(
1266 . 5X,'time of arrival(shifted). . . . . . .=',E12.4)
1267 2013 FORMAT(
1268 . 5X,'time of arrival . . . . . . . . . . . =',E12.4)
1269 2014 FORMAT(
1270 . 5X,'ndt . . . . . . . . . . . . . . . . .=',I10)
1271 2015 FORMAT(
1272 . 5X,'node identifier. . . . . . . . . . . .=',I10)
1273 2023 FORMAT(
1274 . 5X,'charge height. . . . . . . . . . . . .=',E12.4)
1275 2024 FORMAT(
1276 . 5X,'stop time . . . . .. . . . . . . . . .=',E12.4/)
1277 2031 FORMAT(
1278 . 5X,'computed minimum decay PARAMETER . . .=',E12.4)
1279 2032 FORMAT(
1280 . 5X,'computed maximum decay PARAMETER . . .=',E12.4)
1281 2033 FORMAT(
1282 . 5X,'computed minimum time step . . . . . .=',E12.4)
1283 2034 FORMAT(
1284 . 5X,'ground nx . . . . . . . . . . . . . .=',E12.4/,
1285 . 5X,'ground ny . . . . . . . . . . . . . . =',E12.4/,
1286 . 5X,'ground nz . . . . . . . . . . . . . . =',E12.4)
1287 2035 FORMAT(
1288 . 5X,'time shift VALUE',/,
1289 . 5X,' (minimum among all pblast options). =',e12.4//)
1290 2036 FORMAT(
1291 . 5x,'ISHAPE FLAG . . . . . . . . . . . . =',i10)
1292
1293C-----------------------------------------------
1294 1000 CONTINUE
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,' '
1298 CALL arret(2)
1299 END IF
1300C-----------------------------------------------
1301
1302 END
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
subroutine hm_read_pblast(pblast, itab, itabm1, unitab, igrsurf, numloadp, iloadp, lloadp, facloadp, x, bufsf, lsubmodel, rtrans)
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
for(i8=*sizetab-1;i8 >=0;i8--)
integer, parameter nchartitle
integer, parameter ncharline
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)
Definition message.F:889
subroutine arret(nn)
Definition arret.F:87
program starter
Definition starter.F:39
subroutine subrotpoint(x, y, z, rtrans, sub_id, lsubmodel)
Definition subrot.F:180