41 1 IPART ,RNOISE ,IGRPART ,IPM ,IPARTS ,
42 2 PERTURB ,LSUBMODEL,UNITAB ,IDPERTURB,INDEX ,
43 3 INDEX_ITYP,NPART_SOLID ,OFFS ,QP_IPERTURB,
57#include "implicit_f.inc"
69 TYPE (UNIT_TYPE_),
INTENT(IN) ::UNITAB
71 . RNOISE(NPERTURB,NUMELC+NUMELTG+NUMELS+NUMSPH),
72 . QP_RPERTURB(NPERTURB,4)
74 . ipm(npropmi,*),offs,
75 . iparts(*),perturb(nperturb),
76 . idperturb(nperturb),index
77 . index_ityp(numelc+numeltg+numels+numsph),npart_solid,
78 . qp_iperturb(nperturb,6)
81 TYPE (GROUP_) ,
DIMENSION(NGRPART) :: IGRPART
85 INTEGER I,J,K,NUMA,I_METHOD,MAX_PART,
86 . CPT_PART,NB_RANDOM,I_SEED,DISTRIB(50),
87 . II,NB_INTERV,N,IOK,SEED,SEED_RANDOM,
88 . ITYP,L,I_PERTURB_VAR,IGRPRTS,SIZEY
89 CHARACTER(LEN=NCHARTITLE) :: TITR
90 CHARACTER(LEN=NCHARKEY) :: KEY
92 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: TAB_PART
93 INTEGER,
DIMENSION(:),
ALLOCATABLE :: A_SEED
94 INTEGER,
DIMENSION(1:8) :: DT_SEED
96 . mean,sd,mean_input,sd_input,max_distrib,temp,min_value,
97 . max_value,interv,
VALUE,max_value1,minval,maxval,bid
98 my_real,
DIMENSION(:),
ALLOCATABLE :: array
99 CHARACTER*100 CHAR(100)
100 CHARACTER*100 CHAR1(100)
103 CHARACTER(LEN=NCHARFIELD)::CHVAR
108 DATA mess/
'PERTURBATION DEFINITION '/
117 is_available = .false.
122 DO i=1+offs,npart_solid+offs
127 . option_id = idperturb(i),
128 . option_titr = titr)
139 CALL hm_get_intv(
'grpart_ID',igrprts,is_available,lsubmodel)
141 IF (chvar(1:4) ==
'dens' .OR. chvar(1:4) ==
'DENS') i_perturb_var = 1
144 IF (i_perturb_var /= 1)
CALL ancmsg(msgid=1194,
152 IF (igrprts /= 0)
THEN
154 IF (igrpart(n)%ID == igrprts)
THEN
174 . c2=
'GROUP OF PART')
175 ELSEIF (iok == 1)
THEN
176 cpt_part = igrpart(igrprts)%NENTITY
178 max_part =
max(max_part,cpt_part)
181 ALLOCATE(tab_part(nperturb,max_part))
187 DO i=1+offs,npart_solid+offs
190 index(1:(numelc+numeltg+numels+numsph)) = 0
191 index_ityp(1:numelc+numeltg+numels+numsph) = 0
196 . option_id = idperturb(i),
197 . option_titr = titr)
203 CALL hm_get_floatv(
'F_Mean' ,mean ,is_available, lsubmodel, unitab)
204 CALL hm_get_floatv(
'Deviation' ,sd ,is_available, lsubmodel, unitab)
205 CALL hm_get_floatv(
'Min_cut' ,minval ,is_available, lsubmodel, unitab)
206 CALL hm_get_floatv(
'Max_cut' ,maxval ,is_available, lsubmodel, unitab)
207 CALL hm_get_intv(
'Seed' ,seed ,is_available, lsubmodel)
208 CALL hm_get_intv(
'Idistri' ,i_method,is_available, lsubmodel)
211 IF(i_method == 0) i_method = 2
212 IF(minval == zero .AND. maxval == zero)
THEN
213 IF(i_method == 1)
THEN
214 ELSEIF(i_method == 2)
THEN
223 qp_iperturb(i,1) = idperturb(i)
224 qp_iperturb(i,2) = ityp
225 qp_iperturb(i,3) = seed
226 qp_iperturb(i,4) = i_method
227 qp_rperturb(i,1) = mean
228 qp_rperturb(i,2) = sd
229 qp_rperturb(i,3) = minval
230 qp_rperturb(i,4) = maxval
238 CALL hm_get_intv(
'grpart_ID' ,igrprts ,is_available,lsubmodel)
239 qp_iperturb(i,5) = igrprts
241 IF (chvar(1:4) ==
'dens' .OR. chvar(1:4) ==
'DENS') qp_iperturb(i,6) = 1
244 IF (igrprts /= 0)
THEN
246 IF (igrpart(n)%ID == igrprts)
THEN
258 DO j=1,igrpart(igrprts)%NENTITY
259 cpt_part = cpt_part + 1
260 numa = igrpart(igrprts)%ENTITY(j)
261 tab_part(i,cpt_part) = numa
266 IF(i_method == 2)
THEN
268 . idperturb(i),
'GAUSSIAN',mean_input,sd_input,seed
269 WRITE (iout,
'(10I10)') ipart(4,tab_part(i,1:cpt_part
272 ELSEIF(I_METHOD == 1) THEN
274 . IDPERTURB(I),'random
',SEED
275 WRITE (IOUT,'(10i10)
') IPART(4,TAB_PART(I,1:CPT_PART))
280 ! Filling the index table
284 IF(IPARTS(II) == TAB_PART(I,K)) THEN
285 NB_RANDOM = NB_RANDOM + 1
286 INDEX(NB_RANDOM) = II
287 INDEX_ITYP(NB_RANDOM) = 1
294 CALL RANDOM_SEED(SIZE=I_SEED)
295 ALLOCATE(A_SEED(1:I_SEED))
296 CALL RANDOM_SEED(GET=A_SEED)
297 CALL DATE_AND_TIME(values=DT_SEED)
298 A_SEED=DT_SEED(8)*DT_SEED(7)*DT_SEED(6)
299 SEED=DT_SEED(8)*DT_SEED(7)*DT_SEED(6)
300 CALL RANDOM_SEED(PUT=A_SEED)
304 CALL RANDOM_SEED(SIZE=I_SEED)
305 ALLOCATE(A_SEED(1:I_SEED))
307 CALL RANDOM_SEED(PUT=A_SEED)
312 ! Build uniform distribution
317 ALLOCATE(ARRAY(NB_RANDOM+2))
318 CALL RANDOM_NUMBER(ARRAY)
320 ! Build normal distribution
323 IF ( I_METHOD == 2) THEN
324 DO II = 1, NB_RANDOM+1, 2
325 TEMP = SD * SQRT(-2.0*LOG(ARRAY(II))) * COS(2*pi*array(II+1)) + MEAN
326 ARRAY(II+1) = SD * SQRT(-2.0*LOG(ARRAY(II))) * SIN(2*pi*ARRAY(II+1)) + MEAN
330 ARRAY(II) = MAX(MIN(MAXVAL,ARRAY(II)),MINVAL)
331 MAX_VALUE = MAX(ARRAY(II),MAX_VALUE)
332 MIN_VALUE = MIN(ARRAY(II),MIN_VALUE)
334 ELSEIF(I_METHOD == 1)THEN
336 ARRAY(II) = ARRAY(II)*(MAXVAL-MINVAL)+MINVAL
337 MAX_VALUE = MAX(ARRAY(II),MAX_VALUE)
338 MIN_VALUE = MIN(ARRAY(II),MIN_VALUE)
342 ! Filling RNOISE table
344 IF (INDEX_ITYP(II) == 1) THEN
345 RNOISE(I,INDEX(II)+NUMELC+NUMELTG) = ARRAY(II)
349 ! Check mean and standard deviation
350 MEAN = SUM(ARRAY)/NB_RANDOM
351 SD = SQRT(SUM((ARRAY - MEAN)**2)/NB_RANDOM)
353 ! Plot the normal distribution
354 IF(I_METHOD == 2) THEN
355 MAX_DISTRIB = ONE /(SD*SQRT(TWO * pi))
356 ELSEIF(I_METHOD == 1) THEN
357 MAX_DISTRIB = ONE /(MAX_VALUE-MIN_VALUE)
363.AND.
IF (MINVAL /= -EP30 MAXVAL /= EP30)THEN
367 CALL PLOT_DISTRIB( ARRAY,NB_RANDOM, NB_INTERV,SIZEY,MIN_VALUE,
368 . MAX_VALUE,MAX_DISTRIB,'#
')
369 IF(I_METHOD == 2) THEN
370 WRITE (IOUT,2000) MEAN,SD
371 ELSEIF(I_METHOD == 1) THEN
372 WRITE (IOUT,2050) MEAN
374 IF(SEED_RANDOM == 1) WRITE (IOUT,2100) SEED
377 IF (ALLOCATED(ARRAY)) DEALLOCATE(ARRAY)
381 6000 FORMAT(/' perturbation
id',I10/
382 + ' ---------------
'/
383 + ' TYPE . . . . . . . . . . . . . . .
',A/
384 + ' input mean
VALUE . . . . . . . . .
',1PG20.13/
385 + ' input standard deviation . . . . .
',1PG20.13/
386 + ' input seed
VALUE . . . . . . . . .
',I10/
387 + ' solid densities, parts:
')
388 6100 FORMAT(/' perturbation
id',I10/
389 + ' ---------------
'/
390 + ' TYPE . . . . . . . . . . . . . . .
',A/
391 + ' input seed
VALUE . . . . . . . . .
',I10/
392 + ' solid densities, parts:
')
395 + ' generated mean
VALUE . . . . . . .
',1PG20.13/
396 + ' generated standard deviation . . .
',1PG20.13)
398 + ' generated mean
VALUE . . . . . . .
',1PG20.13)
400 + ' generated seed
VALUE . . . . . . .
',I10/)
403 + ' distribution of scale factors applied to densities of solids
')
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)