42 . IPART ,RNOISE ,IPARTC ,IPARTG ,IPARTSP ,
43 . IGRPART ,IPARTS ,PERTURB ,IDPERTURB,
44 . INDEX ,INDEX_ITYP,NPART_SHELL,OFFS ,QP_IPERTURB,
45 . QP_RPERTURB,LSUBMODEL,UNITAB)
59#include "implicit_f.inc"
72 my_real :: RNOISE(NPERTURB,NUMELC+NUMELTG+NUMELS+NUMSPH),
73 . QP_RPERTURB(NPERTURB,4)
74 INTEGER IPART(LIPART1,*),IPARTC(*),IPARTSP(*),IPARTG(*),IPARTS(*),
76 . idperturb(nperturb),index(numelc+numeltg+numels+numsph),
77 . index_ityp(numelc+numeltg+numels+numsph),npart_shell,
78 . qp_iperturb(nperturb,6)
79 TYPE (UNIT_TYPE_) ,
INTENT(IN) :: UNITAB
80 TYPE (SUBMODEL_DATA) ,
INTENT(IN) :: LSUBMODEL(*)
81 TYPE (GROUP_) ,
DIMENSION(NGRPART):: IGRPART
82 TYPE (MATPARAM_STRUCT_) ,
DIMENSION(NUMMAT) ,
INTENT(INOUT) :: MAT_PARAM
86 INTEGER ICOUNT,II,J,K,N,I_METHOD,MAX_PART,OPT_ID,FAIL_ID,,KLEN,
87 . CPT_PART,NB_RANDOM,I_SEED,NPERTURB_FAIL,
88 . NB_INTERV,SEED,SEED_RANDOM,IFAILMAT,IFAILTYPE,ITYP,I_PERTURB_VAR,SIZEY
89 INTEGER,
DIMENSION(50) :: DISTRIB
90 INTEGER,
DIMENSION(8) :: DT_SEED
91 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: TAB_PART
92 INTEGER,
DIMENSION(:),
ALLOCATABLE :: A_SEED
94 . mean,stdev,mean_input,sd_input,max_distrib,temp,min_value,
95 . max_value,minval,maxval
96 my_real,
DIMENSION(:),
ALLOCATABLE :: array
97 CHARACTER(LEN=NCHARTITLE)::TITR
98 CHARACTER*100 KEY1,KEY2
99 CHARACTER(LEN=NCHARKEY) :: PARAM
102 DATA mess/
'PERTURBATION DEFINITION '/
108 CALL HM_OPTION_START('/perturb/fail
')
110 DO ICOUNT = 1+OFFS,NPERTURB_FAIL+OFFS
114 CALL HM_OPTION_READ_KEY(LSUBMODEL,
115 . OPTION_ID = OPT_ID,
116 . UNIT_ID = UNIT_ID ,
119 . OPTION_TITR = TITR)
121 IDPERTURB(ICOUNT) = OPT_ID
122 KLEN = LEN_TRIM(KEY2)
123 IF (KEY2(1:KLEN) == 'biquad
') THEN
126 CALL ANCMSG(MSGID=1192, MSGTYPE=MSGERROR, ANMODE=ANINFO,
133 CALL HM_GET_INTV ('fail_id
' ,FAIL_ID ,IS_AVAILABLE,LSUBMODEL)
136 IF (FAIL_ID > 0) THEN
138 DO J=1,MAT_PARAM(N)%NFAIL
139 IF (MAT_PARAM(N)%FAIL(J)%FAIL_ID == FAIL_ID)THEN
140 IF (IFAILTYPE /= MAT_PARAM(N)%FAIL(J)%IRUPT) THEN
141 CALL ANCMSG(MSGID=1193, MSGTYPE=MSGERROR, ANMODE=ANINFO,
151 IF (IFAILMAT > 0) EXIT
155 PERTURB(ICOUNT) = ITYP
157 IF (IFAILMAT > 0) THEN
159 IF(IPART(1,N) == IFAILMAT) THEN
160 CPT_PART = CPT_PART + 1
164 CALL ANCMSG(MSGID=1137, MSGTYPE=MSGERROR, ANMODE=ANINFO,
168 . C2='failure criteria
')
170 MAX_PART = MAX (MAX_PART,CPT_PART)
174 ALLOCATE(TAB_PART(NPERTURB,MAX_PART))
179 CALL HM_OPTION_START('/perturb/fail
')
180 DO ICOUNT = 1+OFFS,NPERTURB_FAIL+OFFS
184 CALL HM_OPTION_READ_KEY(LSUBMODEL,
185 . OPTION_ID = OPT_ID,
186 . UNIT_ID = UNIT_ID ,
189 . OPTION_TITR = TITR)
190 IDPERTURB(ICOUNT) = OPT_ID
192 KLEN = LEN_TRIM(KEY2)
193 IF (KEY2(1:KLEN) == 'biquad
') THEN
196 CALL HM_GET_FLOATV('f_mean
' ,MEAN ,IS_AVAILABLE,LSUBMODEL,UNITAB)
197 CALL HM_GET_FLOATV('deviation
' ,STDEV ,IS_AVAILABLE,LSUBMODEL,UNITAB)
198 CALL HM_GET_FLOATV('min_cut
' ,MINVAL ,IS_AVAILABLE,LSUBMODEL,UNITAB)
199 CALL HM_GET_FLOATV('max_cut
' ,MAXVAL ,IS_AVAILABLE,LSUBMODEL,UNITAB)
200 CALL HM_GET_INTV ('seed
' ,SEED ,IS_AVAILABLE,LSUBMODEL)
201 CALL HM_GET_INTV ('idistri
' ,I_METHOD ,IS_AVAILABLE,LSUBMODEL)
203 CALL HM_GET_INTV ('fail_id
' ,FAIL_ID ,IS_AVAILABLE,LSUBMODEL)
204 CALL HM_GET_STRING('parameter' ,PARAM ,ncharkey,IS_AVAILABLE)
208 IF (I_METHOD == 0) I_METHOD = 2
209 IF (I_METHOD == 2) THEN
210.AND.
IF (MINVAL == ZERO MAXVAL == ZERO) THEN
218 QP_IPERTURB(ICOUNT,1) = OPT_ID
219 QP_IPERTURB(ICOUNT,2) = ITYP
220 QP_IPERTURB(ICOUNT,3) = SEED
221 QP_IPERTURB(ICOUNT,4) = I_METHOD
222 QP_IPERTURB(ICOUNT,5) = FAIL_ID
223 QP_RPERTURB(ICOUNT,1) = MEAN
224 QP_RPERTURB(ICOUNT,2) = STDEV
225 QP_RPERTURB(ICOUNT,3) = MINVAL
226 QP_RPERTURB(ICOUNT,4) = MAXVAL
228 IF (PARAM(1:2) == 'c3.or.
' PARAM(1:2) == 'c3
') THEN
230 QP_IPERTURB(ICOUNT,6) = I_PERTURB_VAR
232 CALL ANCMSG(MSGID=1194,MSGTYPE=MSGERROR,ANMODE=ANINFO,
241 DO J=1,MAT_PARAM(N)%NFAIL
242 IF (MAT_PARAM(N)%FAIL(J)%FAIL_ID == FAIL_ID) THEN
247 IF (IFAILMAT > 0) EXIT
250 IF (IFAILMAT > 0) THEN
253 IF(IPART(1,N) == IFAILMAT) THEN
254 CPT_PART = CPT_PART + 1
255 TAB_PART(ICOUNT,CPT_PART) = N
262 IF(I_METHOD == 2) THEN
264 . OPT_ID,'gaussian
',MEAN_INPUT,SD_INPUT,SEED,KEY2,FAIL_ID,PARAM
265 WRITE (IOUT,'(10i10)
') IPART(4,TAB_PART(ICOUNT,1:CPT_PART))
268 ELSEIF(I_METHOD == 1) THEN
269 WRITE (IOUT,4100) OPT_ID,'random
',SEED,KEY2,FAIL_ID,PARAM
270 WRITE (IOUT,'(10i10)') ipart(4,tab_part(icount,1:cpt_part))
278 IF (ipartc(ii) == tab_part(icount,k))
THEN
279 nb_random = nb_random + 1
280 index(nb_random) = ii
281 index_ityp(nb_random) = 3
287 IF(ipartg(ii) == tab_part(icount,k))
THEN
288 nb_random = nb_random + 1
289 index(nb_random) = ii
290 index_ityp(nb_random) = 7
296 IF (iparts(ii) == tab_part(icount,k))
THEN
297 nb_random = nb_random + 1
298 index(nb_random) = ii
299 index_ityp(nb_random) = 1
305 IF (ipartsp(ii) == tab_part(icount,k))
THEN
306 nb_random = nb_random + 1
307 index(nb_random) = ii
308 index_ityp(nb_random) = 51
316 CALL random_seed(size=i_seed)
317 ALLOCATE(a_seed(1:i_seed))
318 CALL random_seed(get=a_seed)
319 CALL date_and_time(values=dt_seed)
320 a_seed=dt_seed(8)*dt_seed(7)*dt_seed(6)
321 seed=dt_seed(8)*dt_seed(7)*dt_seed(6)
322 CALL random_seed(put=a_seed)
326 CALL random_seed(size=i_seed)
327 ALLOCATE(a_seed(1:i_seed))
329 CALL random_seed(put=a_seed)
337 ALLOCATE(array(nb_random+2))
338 CALL random_number(array)
344 IF ( i_method == 2)
THEN
345 DO ii = 1, nb_random+1, 2
346 temp = stdev * sqrt(-2.0*log(array(ii))) * cos(2*pi*array(ii+1)) +
349 . stdev * sqrt(-2.0*log(array(ii))) * sin(2*pi*array(ii+1)) + mean
353 array(ii) =
max(
min(maxval,array(ii)),minval)
354 max_value =
max(array(ii),max_value)
355 min_value =
min(array(ii),min_value)
357 ELSEIF(i_method == 1)
THEN
359 array(ii) = array(ii)*(maxval-minval)+minval
360 max_value =
max(array(ii),max_value)
361 min_value =
min(array(ii),min_value)
366 IF (index_ityp(ii) == 3)
THEN
367 rnoise(icount,index(ii)) = array(ii)
368 ELSEIF (index_ityp(ii) == 7)
THEN
369 rnoise(icount,index(ii)+numelc) = array(ii)
370 ELSEIF (index_ityp(ii) == 1)
THEN
371 rnoise(icount,index(ii)+numelc+numeltg) = array(ii)
372 ELSEIF (index_ityp(ii) == 51)
THEN
373 rnoise(icount,index(ii)+numelc+numeltg+numels) = array(ii)
379 mean = sum(array)/nb_random
380 stdev = sqrt(sum((array - mean)**2)/nb_random)
384 IF (i_method == 2)
THEN
385 max_distrib = one /(stdev*sqrt(two * pi))
386 ELSEIF(i_method == 1)
THEN
387 max_distrib = one /(max_value-min_value)
390 WRITE (iout,5000)
'C3',fail_id
395 IF (minval /= -ep30 .AND. maxval /= ep30)
THEN
399 CALL plot_distrib( array,nb_random, nb_interv,sizey,min_value,
400 . max_value,max_distrib,
'#')
402 IF (i_method == 2)
THEN
403 WRITE (iout,2000) mean,stdev
404 ELSEIF (i_method == 1)
THEN
405 WRITE (iout,2050) mean
408 IF (seed_random == 1)
WRITE (iout,2100) seed
411 IF (
ALLOCATED(array))
DEALLOCATE(array)
420 4000
FORMAT(/
' PERTURBATION ID',i10/
421 .
' ---------------'/
422 .
' TYPE . . . . . . . . . . . . . . .',a/
423 .
' INPUT MEAN VALUE . . . . . . . . .',1pg20.13/
424 .
' INPUT STANDARD DEVIATION . . . . .',1pg20.13/
425 .
' INPUT SEED VALUE . . . . . . . . .',i10/
426 .
' FAILURE CRITERIA . . . . . . . . .',a/
427 .
' FAILURE CRITERIA ID. . . . . . . .',i10/
428 .
' APPLIED ON PARAMETER . . . . . . .',a/
430 4100
FORMAT(/
' PERTURBATION ID',i10/
431 .
' ---------------'/
432 .
' TYPE . . . . . . . . . . . . . . .',a/
433 .
' INPUT SEED VALUE . . . . . . . . .',i10/
434 .
' FAILURE CRITERIA . . . . . . . . .',a/
435 .
' FAILURE CRITERIA ID. . . . . . . .',i10/
436 .
' APPLIED ON PARAMETER . . . . . . .',a/
440 .
' GENERATED MEAN VALUE . . . . . . .',1pg20.13/
441 .
' GENERATED STANDARD DEVIATION . . .',1pg20.13)
443 .
' GENERATED MEAN VALUE . . . . . . .',1pg20.13)
445 .
' GENERATED SEED VALUE . . . . . . .',i10/)
448 .
' DISTRIBUTION OF SCALE FACTORS APPLIED TO ',a,
' VALUE'/
449 . ' of failure criteria
id= . . . . . .
',I10)
subroutine hm_read_perturb_fail(mat_param, ipart, rnoise, ipartc, ipartg, ipartsp, igrpart, iparts, perturb, idperturb, index, index_ityp, npart_shell, offs, qp_iperturb, qp_rperturb, lsubmodel, unitab)