49 DOUBLE PRECISION :: norm, tan_half_angle
50 CHARACTER(LEN=9) :: GR
55 IF(discrete_element)
THEN 58 WRITE(*,10)
'######################################################################' 60 WRITE(*,10)
'## ===> WARNING: RUNNING CARTESIAN GRID WITH DISCRETE ELEMENT. ##' 61 WRITE(*,10)
'## THIS HAS NOT BEEN FULLY TESTED. ##' 62 WRITE(*,10)
'## PLEASE USE WITH CAUTION. ##' 64 WRITE(*,10)
'######################################################################' 71 IF(coordinates==
'CYLINDRICAL')
THEN 73 WRITE(*,*)
'INPUT ERROR: CARTESIAN GRID OPTION NOT AVAILABLE' 74 WRITE(*,*)
'WITH CYLINDRICAL COORDINATE SYSTEM.' 75 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 85 'ERROR: STL METHOD VALID ONLY IN 3D.' 89 IF(
mype ==
pe_io)
WRITE(*,*)
'ERROR: BOTH QUADRIC(S) AND ',&
90 'STL INPUT ARE SPECIFIED.' 91 IF(
mype ==
pe_io)
WRITE(*,*)
'MFIX HANDLES ONLY ONE TYPE ',&
102 'ERROR: MSH METHOD VALID ONLY IN 3D.' 106 IF(
mype ==
pe_io)
WRITE(*,*)
'ERROR: BOTH QUADRIC(S) AND ',&
107 'MSH INPUT ARE SPECIFIED.' 108 IF(
mype ==
pe_io)
WRITE(*,*)
'MFIX HANDLES ONLY ONE TYPE ',&
116 IF(
mype ==
pe_io)
WRITE(*,*)
'ERROR: POLYGON METHOD ',&
127 WRITE(*,*)
'ERROR: BOTH QUADRIC(S) AND POLYGON(S) ',&
129 WRITE(*,*)
'MFIX HANDLES ONLY ONE TYPE OF SURFACE INPUT.' 135 WRITE(*,*)
'ERROR: BOTH QUADRIC(S) AND USER-DEFINED ',&
137 WRITE(*,*)
'MFIX HANDLES ONLY ONE TYPE OF SURFACE.' 143 WRITE(*,*)
'ERROR: QUADRIC_SCALE MUST BE POSITIVE.' 172 WRITE(*,*)
'ERROR: POLYGON(S) AND USER-DEFINED ',&
174 WRITE(*,*)
'MFIX HANDLES ONLY ONE TYPE OF SURFACE.' 183 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF N_QUADRIC =', &
185 WRITE(*,*)
'MAXIMUM ACCEPTABLE VALUE IS DIM_QUADRIC =', &
187 WRITE(*,*)
'CHANGE MAXIMUM VALUE IN QUADRIC_MOD.F ',&
189 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 205 lambda_z(q) = lambda_z(q)
210 IF(norm <
tol_f)
THEN 212 WRITE(*,*)
'INPUT ERROR: QUADRIC:', q, &
213 ' HAS ZERO COEFFICIENTS.' 214 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 228 IF( norm >
tol_f)
THEN 231 lambda_z(q) = lambda_z(q) / norm
234 WRITE(*,*)
'INPUT ERROR: PLANE:', q, &
235 ' HAS ZERO NORMAL VECTOR.' 236 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 249 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
251 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 266 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
268 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 283 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
285 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 301 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
303 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 318 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
320 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 335 WRITE(*,*)
'INPUT ERROR: CYLINDER:', q, &
337 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 351 WRITE(*,*)
'INPUT ERROR: SPHERE:', q, &
352 ' HAS INVALID RADIUS.' 353 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 366 WRITE(*,*)
'INPUT ERROR: SPHERE:', q, &
367 ' HAS INVALID RADIUS.' 368 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 383 WRITE(*,*)
'INPUT ERROR: CONE:', q, &
384 ' HAS INCORRECT HALF-ANGLE.' 385 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 392 lambda_z(q) =
one/(tan_half_angle)**2
401 WRITE(*,*)
'INPUT ERROR: CONE:', q, &
402 ' HAS INCORRECT HALF-ANGLE.' 403 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 410 lambda_z(q) =
one/(tan_half_angle)**2
419 WRITE(*,*)
'INPUT ERROR: CONE:', q, &
420 ' HAS INCORRECT HALF-ANGLE.' 421 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 438 CASE (
'TORUS_INT',
'TORUS_EXT')
441 WRITE(*,*)
'INPUT ERROR: TORUS:', q, &
442 ' HAS INVALID RADIUS R1:',
torus_r1(q)
443 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 449 WRITE(*,*)
'INPUT ERROR: TORUS:', q, &
450 ' HAS INVALID RADIUS R2:',
torus_r2(q)
451 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 459 WRITE(*,*)
'INPUT ERROR: Y_UCOIL_EXT:', q, &
460 ' HAS INVALID RADIUS R1:',
ucoil_r1(q)
461 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 467 WRITE(*,*)
'INPUT ERROR: Y_UCOIL_EXT:', q, &
468 ' HAS INVALID RADIUS R2:',
ucoil_r2(q)
469 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 476 WRITE(*,*)
'INPUT ERROR: Y_UCOIL_EXT:', q, &
478 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 483 CASE (
'Y_UCOIL2_EXT')
486 WRITE(*,*)
'INPUT ERROR: Y_UCOIL2_EXT:', q, &
487 ' HAS INVALID RADIUS R1:',
ucoil_r1(q)
488 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 494 WRITE(*,*)
'INPUT ERROR: Y_UCOIL2_EXT:', q, &
495 ' HAS INVALID RADIUS R2:',
ucoil_r2(q)
496 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 503 WRITE(*,*)
'INPUT ERROR: Y_UCOIL2_EXT:', q, &
505 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 513 WRITE(*,*)
'INPUT ERROR: XY_BEND_INT:', q, &
514 ' HAS INVALID RADIUS R1:',
bend_r1(q)
515 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 522 WRITE(*,*)
'INPUT ERROR: XY_BEND_INT:', q, &
523 ' HAS INVALID RADIUS R2:',
bend_r2(q)
524 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 531 WRITE(*,*)
'INPUT ERROR: XY_BEND_INT:', q, &
533 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 538 IF((bend_theta2(q) <
zero).OR.(bend_theta2(q)>360.0))
THEN 540 WRITE(*,*)
'INPUT ERROR: XY_BEND_INT:', q, &
541 ' HAS INVALID ANGLE THETA2:',bend_theta2(q)
542 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 550 WRITE(*,*)
'INPUT ERROR: Y_C2C_INT:', q, &
551 ' HAS INVALID RADIUS R1:',
c2c_r1(q)
552 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 559 WRITE(*,*)
'INPUT ERROR: C2C_XY_INT:', q, &
560 ' HAS INVALID RADIUS R2:',
c2c_r2(q)
561 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 568 WRITE(*,*)
'INPUT ERROR: Y_C2C_INT:', q
569 WRITE(*,*)
'MUST HAVE C2C_Y2 >= C2C_Y1.' 571 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 578 WRITE(*,*)
'INPUT ERROR: Y_C2C_INT:', q, &
579 ' C2C_Y1=C2C_Y2 BUT C2C_R1/=C2C_R2:' 582 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 591 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q
592 WRITE(*,*)
'MUST HAVE REACTOR1_Y2 >= REACTOR1_Y1.' 593 WRITE(*,*)
'REACTOR1_Y1,REACTOR1_Y2 =',
reactor1_y1(q),reactor1_y2(q)
594 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 601 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q, &
602 ' REACTOR1_Y1=REACTOR1_Y2 BUT REACTOR1_R1/=REACTOR1_R2:' 603 WRITE(*,*)
'REACTOR1_Y1,REACTOR1_Y2 =',
reactor1_y1(q),reactor1_y2(q)
604 WRITE(*,*)
'REACTOR1_R1,REACTOR1_R2 =',
reactor1_r1(q),reactor1_r2(q)
605 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 611 IF(reactor1_yr2(q) <= reactor1_y2(q))
THEN 613 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q
614 WRITE(*,*)
'MUST HAVE REACTOR1_YR2 > REACTOR1_Y2.' 615 WRITE(*,*)
'REACTOR1_YR2,REACTOR1_Y2 =', reactor1_yr2(q),reactor1_y2(q)
616 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 623 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q
624 WRITE(*,*)
'MUST HAVE REACTOR1_YR1 < REACTOR1_Y1.' 626 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 633 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q
634 WRITE(*,*)
'MUST HAVE 0.0 < REACTOR1_THETA1 <= 90 DEGREES.' 636 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 641 IF(reactor1_theta2(q) <=
zero.OR.reactor1_theta2(q) > 90.0d0)
THEN 643 WRITE(*,*)
'INPUT ERROR: REACTOR1:', q
644 WRITE(*,*)
'MUST HAVE 0.0 < REACTOR1_THETA2 <= 90 DEGREES.' 645 WRITE(*,*)
'REACTOR1_THETA2 =', reactor1_theta2(q)
646 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 652 reactor1_theta2(q) = reactor1_theta2(q)/180.0d0*
pi 657 WRITE(*,*)
'INPUT ERROR: QUADRIC:', q, &
659 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 667 WRITE(*,*)
'INPUT ERROR: QUADRIC:', q, &
668 ' HAS NO ASSIGNED BC ID.' 669 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 682 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF N_GROUP =',
n_group 683 WRITE(*,*)
'MAXIMUM ACCEPTABLE VALUE IS DIM_GROUP =',
dim_group 684 WRITE(*,*)
'CHANGE MAXIMUM VALUE IN QUADRIC_MOD.F IF NECESSARY.' 685 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 695 WRITE(*,*)
'INPUT ERROR: GROUP:', i,
' HAS INCORRECT SIZE:',
group_size(i)
696 WRITE(*,*)
'VALID GROUP SIZE RANGE IS:', 1,
' TO ',
n_quadric 697 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 705 WRITE(*,*)
'INPUT ERROR: GROUP_Q(', i,
',',j,
') HAS INCORRECT VALUE:',
group_q(i,j)
706 WRITE(*,*)
'VALID GROUP_Q RANGE IS:', 1,
' TO ',
n_quadric 707 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 715 IF(gr/=
'OR'.AND.gr/=
'AND'.AND.gr/=
'PIECEWISE')
THEN 717 WRITE(*,*)
'INPUT ERROR: GROUP:', i,
' HAS INCORRECT GROUP RELATION: ', gr
718 WRITE(*,*)
'VALID GROUP RELATIONS ARE ''OR'',''AND'', AND ''PIECEWISE''. ' 719 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 730 IF(gr/=
'OR'.AND.gr/=
'AND')
THEN 732 WRITE(*,*)
'INPUT ERROR: GROUP:', i,
' HAS INCORRECT RELATION WITH PREVIOUS: ', gr
733 WRITE(*,*)
'VALID GROUP RELATIONS ARE ''OR'', AND ''AND''. ' 734 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 746 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_SNAP IN X-DIRECTION =',
tol_snap(1)
747 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 0.5.' 748 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 757 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_SNAP IN Y-DIRECTION =',
tol_snap(2)
758 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 0.5.' 759 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 768 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_SNAP IN Z-DIRECTION =',
tol_snap(3)
769 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 0.5.' 770 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 778 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_DELH =',
tol_delh 779 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 1.0.' 780 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 787 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_SMALL_CELL =',
tol_small_cell 788 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 1.0.' 789 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 796 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF TOL_SMALL_AREA =',
tol_small_area 797 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 1.0.' 798 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 805 WRITE(*,*)
'INPUT ERROR: NEGATIVE VALUE OF ALPHA_MAX =',
alpha_max 806 WRITE(*,*)
'ACCEPTABLE VALUES ARE POSITIVE NUMBERS (E.G. 1.0).' 807 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 815 WRITE(*,*)
'INPUT ERROR: NEGATIVE VALUE OF TOL_F =',
tol_f 816 WRITE(*,*)
'ACCEPTABLE VALUES ARE SMALL POSITIVE NUMBERS (E.G. 1.0E-9).' 817 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 824 WRITE(*,*)
'INPUT ERROR: NEGATIVE VALUE OF TOL_POLY =',
tol_poly 825 WRITE(*,*)
'ACCEPTABLE VALUES ARE SMALL POSITIVE NUMBERS (E.G. 1.0E-9).' 826 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 833 WRITE(*,*)
'INPUT ERROR: NEGATIVE VALUE OF ITERMAX_INT =',
itermax_int 834 WRITE(*,*)
'ACCEPTABLE VALUES ARE LARGE POSITIVE INTEGERS (E.G. 10000).' 835 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 843 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.05 AND 5.0.' 844 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 852 IF(
mype ==
pe_io)
WRITE(*,*)
'WARNING: SAFE_MODE ACTIVATED FOR GAS PRESSURE, REVERTING TO PG_OPTION = 0' 857 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF PG_OPTION =',
pg_option 858 WRITE(*,*)
'ACCEPTABLE VALUES ARE 0,1,AND 2.' 859 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 866 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF CG_UR_FAC(2) =',
cg_ur_fac(2)
867 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 1.0.' 868 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 873 IF(bar_width<10.OR.bar_width>80)
THEN 875 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF BAR_WIDTH =', bar_width
876 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 10 AND 80.' 877 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 882 IF(bar_resolution<
one.OR.bar_resolution>100.0)
THEN 884 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF BAR_RESOLUTION =', bar_resolution
885 WRITE(*,*)
'ACCEPTABLE VALUES ARE BETWEEN 0.0 AND 100.0.' 886 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 893 WRITE(*,*)
'INPUT ERROR: INVALID VALUE OF F_DASHBOARD =',
f_dashboard 894 WRITE(*,*)
'ACCEPTABLE VALUES ARE INTEGERS >= 1.' 895 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 926 if(
mype==0) print*,
'From check_data_cartesian: Converted CG_MI to CG_NSW for BC#',bcv
935 WRITE(*,*)
' From check_data_cartesian: RE_INDEXING is turned on.' 936 WRITE(*,*)
' The preconditionner will be turned off for all equations' 937 WRITE(*,*)
' regardless of the mfix.dat setting.' 990 INTEGER :: IJK,IJKW,IJKS,IJKB,M,NN
991 INTEGER :: IJKWW,IJKSS,IJKBB
992 INTEGER :: BCV,BCV_U,BCV_V,BCV_W
994 DOUBLE PRECISION SUM, SUM_EP
1017 1710
FORMAT(
'Error 1110: BC :',i3,
'. When using CG_MI, the gas mass flow rate',/1x, &
1018 'must be specified, including when it is zero.',/1x, &
1019 ' Please correct the mfix.dat file.')
1021 1711
FORMAT(
'Error 1111: BC :',i3,
'. When using CG_MI, the solids mass flow rate',/1x, &
1022 'for M=',i4,
' must be specified, including when it is zero.',/1x, &
1023 ' Please correct the mfix.dat file.')
1031 print*,
'CG_MI at', ijk
1056 ijks = south_of(ijk)
1068 ijkb = bottom_of(ijk)
1183 ELSEIF (
mmax == 1)
THEN 1320 IF(fluid_at(ijkw))
THEN 1327 ijkww = west_of(ijkw)
1328 IF(fluid_at(ijkww))
THEN 1329 flag_e(ijkww) = 2011
1334 ijks = south_of(ijk)
1335 IF(fluid_at(ijks))
THEN 1342 ijkss = south_of(ijks)
1343 IF(fluid_at(ijkss))
THEN 1344 flag_n(ijkss) = 2011
1351 ijkb = bottom_of(ijk)
1352 IF(fluid_at(ijkb))
THEN 1359 ijkbb = bottom_of(ijkb)
1360 IF(fluid_at(ijkbb))
THEN 1361 flag_t(ijkbb) = 2011
1385 900
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,&
1386 ') not specified',/1x,
'One of the following must be specified:',/1x,&
1387 'BC_VOLFLOW_g, BC_MASSFLOW_g or BC_VELMAG_g',/1x,70(
'*')/)
1389 910
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i1,&
1390 ') not specified',/1x,
'One of the following must be specified:',/1x,&
1391 'BC_VOLFLOW_g, BC_MASSFLOW_g or BC_VELMAG_g',/1x,70(
'*')/)
1393 1000
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,&
1394 ') not specified',/1x,70(
'*')/)
1395 1001
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/&
1396 ' Message: Illegal BC_TYPE for BC # = ',i2,/
' BC_TYPE = ',
a,/&
1397 ' Valid BC_TYPE are: ')
1399 1003
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,&
1400 ') value is unphysical',/1x,70(
'*')/)
1401 1004
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i2,&
1402 ') not specified',/1x,70(
'*')/)
1403 1005
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i2,&
1404 ') value is unphysical',/1x,70(
'*')/)
1405 1010
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC_P_g( ',i2,&
1407 ' Pressure should be greater than zero for compressible flow',/1x,70(&
1409 1050
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC number:',i2,&
1410 ' - ',
a,
' should be ',
a,
' zero.',/1x,70(
'*')/)
1411 1060
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC_X_g(',i2,
',',i2&
1412 ,
') not specified',/1x,70(
'*')/)
1413 1065
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC number:',i2,&
1414 ' - Sum of gas mass fractions is NOT equal to one',/1x,70(
'*')/)
1415 1100
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i1,&
1416 ') not specified',/1x,70(
'*')/)
1417 1103
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i1,&
1418 ') value is unphysical',/1x,70(
'*')/)
1419 1104
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i2,&
1420 ',',i2,
') not specified',/1x,70(
'*')/)
1421 1105
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i2,&
1422 ',',i2,
') value is unphysical',/1x,70(
'*')/)
1423 1110
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC_X_s(',i2,
',',i2&
1424 ,
',',i2,
') not specified',/1x,70(
'*')/)
1425 1120
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC number:',i2,&
1426 ' - Sum of solids-',i1,
' mass fractions is NOT equal to one',/1x,70(&
1428 1125
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC number:',i2,&
1429 ' - Sum of volume fractions is NOT equal to one',/1x,70(
'*')/)
1430 1150
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: BC number:',i2,&
1431 ' - ',
a,i1,
' should be ',
a,
' zero.',/1x,70(
'*')/)
1432 1160
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/&
1433 ' Message: Boundary condition no', &
1434 i2,
' is a second outflow condition.',/1x,&
1435 ' Only one outflow is allowed. Consider using P_OUTFLOW.',/1x, 70(
'*')/)
1436 1200
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,&
1437 ') specified',
' for an undefined BC location',/1x,70(
'*')/)
1438 1300
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/
' Message: ',
a,
'(',i2,
',',i1,&
1439 ') specified',
' for an undefined BC location',/1x,70(
'*')/)
1440 1400
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/&
1441 ' Message: No initial or boundary condition specified',/&
1443 1410
FORMAT(i5,3x,i5,3x,i5)
1444 1420
FORMAT(/1x,70(
'*')/)
1446 1500
FORMAT(/1x,70(
'*')//
' From: CHECK_BC_FLAGS',/&
1447 ' Message: No initial or boundary condition specified',/&
1512 INTEGER :: Q,QM1,QP1
1513 DOUBLE PRECISION :: x1,x2,y1,y2,z1,z2,R1,R2
1514 DOUBLE PRECISION :: tan_half_angle
1523 WRITE(*,*)
' INFO FOR QUADRIC', q
1524 WRITE(*,*)
' Defining Cone for Cylinder to Cylinder junction' 1525 WRITE(*,*)
' Between Quadrics ',qm1,
' AND ', qp1
1534 aligned = (
t_y(qm1)==
t_y(qp1)).AND.(
t_z(qm1)==
t_z(qp1))
1535 IF(.NOT.aligned)
THEN 1537 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1538 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1547 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1548 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1557 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1558 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1563 tan_half_angle = (r2-r1)/(x2-x1)
1568 lambda_z(q) =
one/(tan_half_angle)**2
1574 t_x(q) = x1 - r1/tan_half_angle
1579 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1580 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1589 aligned = (
t_y(qm1)==
t_y(qp1)).AND.(
t_z(qm1)==
t_z(qp1))
1590 IF(.NOT.aligned)
THEN 1592 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1593 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1602 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1603 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1612 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1613 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1618 tan_half_angle = (r2-r1)/(x2-x1)
1623 lambda_z(q) = -
one/(tan_half_angle)**2
1629 t_x(q) = x1 - r1/tan_half_angle
1634 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1635 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1645 aligned = (
t_x(qm1)==
t_x(qp1)).AND.(
t_z(qm1)==
t_z(qp1))
1646 IF(.NOT.aligned)
THEN 1648 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1649 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1658 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1659 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1664 y1 = piece_ymax(qm1)
1665 y2 = piece_ymin(qp1)
1668 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1669 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1674 tan_half_angle = (r2-r1)/(y2-y1)
1679 lambda_z(q) =
one/(tan_half_angle)**2
1686 t_y(q) = y1 - r1/tan_half_angle
1690 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1691 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1699 aligned = (
t_x(qm1)==
t_x(qp1)).AND.(
t_z(qm1)==
t_z(qp1))
1700 IF(.NOT.aligned)
THEN 1702 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1703 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1712 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1713 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1718 y1 = piece_ymax(qm1)
1719 y2 = piece_ymin(qp1)
1722 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1723 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1728 tan_half_angle = (r2-r1)/(y2-y1)
1733 lambda_z(q) = -
one/(tan_half_angle)**2
1740 t_y(q) = y1 - r1/tan_half_angle
1744 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1745 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1755 aligned = (
t_x(qm1)==
t_x(qp1)).AND.(
t_y(qm1)==
t_y(qp1))
1756 IF(.NOT.aligned)
THEN 1758 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1759 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1768 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1769 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1774 z1 = piece_zmax(qm1)
1775 z2 = piece_zmin(qp1)
1778 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1779 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1784 tan_half_angle = (r2-r1)/(z2-z1)
1797 t_z(q) = z1 - r1/tan_half_angle
1800 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1801 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1809 aligned = (
t_x(qm1)==
t_x(qp1)).AND.(
t_y(qm1)==
t_y(qp1))
1810 IF(.NOT.aligned)
THEN 1812 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT ALIGNED' 1813 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1822 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' HAVE THE SAME RADIUS' 1823 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1828 z1 = piece_zmax(qm1)
1829 z2 = piece_zmin(qp1)
1832 WRITE(*,*)
' ERROR: CYLINDERS ',qm1,
' AND ', qp1,
' ARE NOT PIECED PROPERLY' 1833 WRITE(*,*)
'PLEASE CORRECT MFIX.DAT AND TRY AGAIN.' 1838 tan_half_angle = (r2-r1)/(z2-z1)
1851 t_z(q) = z1 - r1/tan_half_angle
1854 WRITE(*,*)
' QUADRIC:',q,
' WAS DEFINED AS ', trim(
quadric_form(q))
1855 WRITE(*,*)
' WITH AN HALF-ANGLE OF ',
half_angle(q),
'DEG.' 1861 WRITE(*,*)
' ERROR: C2C MUST BE DEFINED BETWEEN 2 CYLINDERS' 1862 WRITE(*,*)
' QUADRIC:',qm1,
' IS ', trim(
quadric_form(qm1))
1863 WRITE(*,*)
' QUADRIC:',qp1,
' IS ', trim(
quadric_form(qp1))
1925 INTEGER :: NN,NX,NY,NZ
1926 INTEGER :: I,I1,I2,J,J1,J2,K,K1,K2
1927 DOUBLE PRECISION :: L,CELL_RATIO
1929 LOGICAL,
DIMENSION(MAX_CP) :: INDEPENDENT_SEGMENT
1956 IF(
mype==0)
WRITE(*,*)
' INFO: DEFINING GRID SPACING IN X-DIRECTION... ' 1957 IF(
mype==0)
WRITE(*,*)
' INFO: NUMBER OF CONTROL POINTS IN X-DIRECTION = ',nx
1958 IF(
cpx(nx)/=xlength)
THEN 1959 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST CONTROL POINT MUST BE EQUAL TO XLENGTH.' 1960 IF(
mype==0)
WRITE(*,*)
' XLENGTH = ',xlength
1961 IF(
mype==0)
WRITE(*,*)
' LAST CONTROL POINT = ',
cpx(nx)
1970 independent_segment = .true.
1974 IF(
cpx(nn) <=
cpx(nn-1))
THEN 1975 IF(
mype==0)
WRITE(*,*)
' ERROR: CONTROL POINTS ALONG X MUST BE SORTED IN ASCENDING ORDER.' 1976 IF(
mype==0)
WRITE(*,*)
' CPX = ',
cpx(0:nx)
1980 IF(
ncx(nn) <= 1)
THEN 1981 IF(
mype==0)
WRITE(*,*)
' ERROR: NUMBER OF CELLS MUST BE LARGER THAN 1 IN X-SEGMENT :',nn
1982 IF(
mype==0)
WRITE(*,*)
' NCX = ',
ncx(nn)
1987 IF(
mype==0)
WRITE(*,*)
' ERROR: EXPANSION RATIO MUST BE POSITIVE IN X-SEGMENT :',nn
1988 IF(
mype==0)
WRITE(*,*)
' ERX = ',
erx(nn)
1997 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST AND LAST DX ARE DEFINED, WHICH IS NOT ALLOWED IN X-SEGMENT :',nn
2002 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DX DEFINED IN X-SEGMENT :',nn
2006 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DX IS NOT SMALLER THAN SEGMENT LENGTH IN X-SEGMENT :',nn
2008 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2012 erx(nn) = cell_ratio**(
ncx(nn)-1)
2013 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
erx(nn)
2015 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DX DEFINED IN X-SEGMENT :',nn
2019 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DX IS NOT SMALLER THAN SEGMENT LENGTH IN X-SEGMENT :',nn
2021 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2025 erx(nn) = cell_ratio**(
ncx(nn)-1)
2026 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
erx(nn)
2029 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DX CANNOT MATCH PREVIOUS DX FOR FIRST SEGMENT.' 2032 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DX WILL ATTEMPT TO MATCH PREVIOUS DX FOR SEGMENT :',nn
2033 independent_segment(nn) = .false.
2037 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DX CANNOT MATCH NEXT DX FOR LAST SEGMENT.' 2040 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DX WILL ATTEMPT TO MATCH NEXT DX FOR SEGMENT :',nn
2041 independent_segment(nn) = .false.
2057 i2 = i1 +
ncx(nn) - 1
2059 IF(independent_segment(nn))
THEN 2064 cell_ratio =
erx(nn)**(
one/dble(
ncx(nn)-1))
2065 dx(i1) = l * (
one - cell_ratio) / (
one - cell_ratio**
ncx(nn))
2068 dx(i) = dx(i-1) * cell_ratio
2072 dx(i1:i2) = l /
ncx(nn)
2089 i2 = i1 +
ncx(nn) - 1
2091 IF(.NOT.independent_segment(nn))
THEN 2099 dx(i) = dx(i-1) * cell_ratio
2105 dx(i) = dx(i+1) / cell_ratio
2118 IF(i1>0.AND.i1/=imax)
THEN 2119 IF(
mype==0)
WRITE(*,*)
' ERROR: IMAX MUST BE EQUAL TO THE SUM OF NCX.' 2120 IF(
mype==0)
WRITE(*,*)
' IMAX = ', imax
2121 IF(
mype==0)
WRITE(*,*)
' SUM OF NCX = ', i1
2148 IF(
mype==0)
WRITE(*,*)
' INFO: DEFINING GRID SPACING IN Y-DIRECTION... ' 2149 IF(
mype==0)
WRITE(*,*)
' INFO: NUMBER OF CONTROL POINTS IN Y-DIRECTION = ',ny
2150 IF(
cpy(ny)/=ylength)
THEN 2151 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST CONTROL POINT MUST BE EQUAL TO YLENGTH.' 2152 IF(
mype==0)
WRITE(*,*)
' YLENGTH = ',ylength
2153 IF(
mype==0)
WRITE(*,*)
' LAST CONTROL POINT = ',
cpy(ny)
2162 independent_segment = .true.
2166 IF(
cpy(nn) <=
cpy(nn-1))
THEN 2167 IF(
mype==0)
WRITE(*,*)
' ERROR: CONTROL POINTS ALONG Y MUST BE SORTED IN ASCENDING ORDER.' 2168 IF(
mype==0)
WRITE(*,*)
' CPY = ',
cpy(0:ny)
2172 IF(
ncy(nn) <= 1)
THEN 2173 IF(
mype==0)
WRITE(*,*)
' ERROR: NUMBER OF CELLS MUST BE LARGER THAN 1 IN Y-SEGMENT :',nn
2174 IF(
mype==0)
WRITE(*,*)
' NCY = ',
ncy(nn)
2179 IF(
mype==0)
WRITE(*,*)
' ERROR: EXPANSION RATIO MUST BE POSITIVE IN Y-SEGMENT :',nn
2180 IF(
mype==0)
WRITE(*,*)
' ERY = ',
ery(nn)
2189 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST AND LAST DY ARE DEFINED, WHICH IS NOT ALLOWED IN Y-SEGMENT :',nn
2194 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DY DEFINED IN Y-SEGMENT :',nn
2198 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DY IS NOT SMALLER THAN SEGMENT LENGTH IN Y-SEGMENT :',nn
2200 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2204 ery(nn) = cell_ratio**(
ncy(nn)-1)
2205 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
ery(nn)
2207 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DY DEFINED IN Y-SEGMENT :',nn
2211 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DY IS NOT SMALLER THAN SEGMENT LENGTH IN Y-SEGMENT :',nn
2213 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2217 ery(nn) = cell_ratio**(
ncy(nn)-1)
2218 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
ery(nn)
2221 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DY CANNOT MATCH PREVIOUS DY FOR FIRST SEGMENT.' 2224 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DY WILL ATTEMPT TO MATCH PREVIOUS DY FOR SEGMENT :',nn
2225 independent_segment(nn) = .false.
2229 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DY CANNOT MATCH NEXT DY FOR LAST SEGMENT.' 2232 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DY WILL ATTEMPT TO MATCH NEXT DY FOR SEGMENT :',nn
2233 independent_segment(nn) = .false.
2249 j2 = j1 +
ncy(nn) - 1
2251 IF(independent_segment(nn))
THEN 2256 cell_ratio =
ery(nn)**(
one/dble(
ncy(nn)-1))
2257 dy(j1) = l * (
one - cell_ratio) / (
one - cell_ratio**
ncy(nn))
2260 dy(j) = dy(j-1) * cell_ratio
2264 dy(j1:j2) = l /
ncy(nn)
2281 j2 = j1 +
ncy(nn) - 1
2283 IF(.NOT.independent_segment(nn))
THEN 2291 dy(j) = dy(j-1) * cell_ratio
2297 dy(j) = dy(j+1) / cell_ratio
2310 IF(j1>0.AND.j1/=jmax)
THEN 2311 IF(
mype==0)
WRITE(*,*)
' ERROR: JMAX MUST BE EQUAL TO THE SUM OF NCY.' 2312 IF(
mype==0)
WRITE(*,*)
' JMAX = ', jmax
2313 IF(
mype==0)
WRITE(*,*)
' SUM OF NCY = ', j1
2342 IF(
mype==0)
WRITE(*,*)
' INFO: DEFINING GRID SPACING IN Z-DIRECTION... ' 2343 IF(
mype==0)
WRITE(*,*)
' INFO: NUMBER OF CONTROL POINTS IN Z-DIRECTION = ',nz
2344 IF(
cpz(nz)/=zlength)
THEN 2345 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST CONTROL POINT MUST BE EQUAL TO ZLENGTH.' 2346 IF(
mype==0)
WRITE(*,*)
' ZLENGTH = ',zlength
2347 IF(
mype==0)
WRITE(*,*)
' LAST CONTROL POINT = ',
cpz(nz)
2356 independent_segment = .true.
2360 IF(
cpz(nn) <=
cpz(nn-1))
THEN 2361 IF(
mype==0)
WRITE(*,*)
' ERROR: CONTROL POINTS ALONG Z MUST BE SORTED IN ASCENDING ORDER.' 2362 IF(
mype==0)
WRITE(*,*)
' CPZ = ',
cpz(0:nz)
2366 IF(
ncz(nn) <= 1)
THEN 2367 IF(
mype==0)
WRITE(*,*)
' ERROR: NUMBER OF CELLS MUST BE LARGER THAN 1 IN Z-SEGMENT :',nn
2368 IF(
mype==0)
WRITE(*,*)
' NCZ = ',
ncz(nn)
2373 IF(
mype==0)
WRITE(*,*)
' ERROR: EXPANSION RATIO MUST BE POSITIVE IN Z-SEGMENT :',nn
2374 IF(
mype==0)
WRITE(*,*)
' ERZ = ',
erz(nn)
2383 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST AND LAST DZ ARE DEFINED, WHICH IS NOT ALLOWED IN Z-SEGMENT :',nn
2388 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DZ DEFINED IN Z-SEGMENT :',nn
2392 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DZ IS NOT SMALLER THAN SEGMENT LENGTH IN Z-SEGMENT :',nn
2394 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2398 erz(nn) = cell_ratio**(
ncz(nn)-1)
2399 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
erz(nn)
2401 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DZ DEFINED IN Z-SEGMENT :',nn
2405 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DZ IS NOT SMALLER THAN SEGMENT LENGTH IN Z-SEGMENT :',nn
2407 IF(
mype==0)
WRITE(*,*)
' SEGMENT LENGTH = ',l
2411 erz(nn) = cell_ratio**(
ncz(nn)-1)
2412 IF(
mype==0)
WRITE(*,*)
' CORRESPONDING EXPANSION RATIO = ',
erz(nn)
2415 IF(
mype==0)
WRITE(*,*)
' ERROR: FIRST DZ CANNOT MATCH PREVIOUS DZ FOR FIRST SEGMENT.' 2418 IF(
mype==0)
WRITE(*,*)
' INFO: FIRST DZ WILL ATTEMPT TO MATCH PREVIOUS DZ FOR SEGMENT :',nn
2419 independent_segment(nn) = .false.
2423 IF(
mype==0)
WRITE(*,*)
' ERROR: LAST DZ CANNOT MATCH NEXT DZ FOR LAST SEGMENT.' 2426 IF(
mype==0)
WRITE(*,*)
' INFO: LAST DZ WILL ATTEMPT TO MATCH NEXT DZ FOR SEGMENT :',nn
2427 independent_segment(nn) = .false.
2443 k2 = k1 +
ncz(nn) - 1
2445 IF(independent_segment(nn))
THEN 2450 cell_ratio =
erz(nn)**(
one/dble(
ncz(nn)-1))
2451 dz(k1) = l * (
one - cell_ratio) / (
one - cell_ratio**
ncz(nn))
2454 dz(k) = dz(k-1) * cell_ratio
2458 dz(k1:k2) = l /
ncz(nn)
2475 k2 = k1 +
ncz(nn) - 1
2477 IF(.NOT.independent_segment(nn))
THEN 2485 dz(k) = dz(k-1) * cell_ratio
2491 dz(k) = dz(k+1) / cell_ratio
2504 IF(k1>0.AND.k1/=kmax)
THEN 2505 IF(
mype==0)
WRITE(*,*)
' ERROR: KMAX MUST BE EQUAL TO THE SUM OF NCZ.' 2506 IF(
mype==0)
WRITE(*,*)
' KMAX = ', kmax
2507 IF(
mype==0)
WRITE(*,*)
' SUM OF NCZ = ', k1
2548 LOGICAL :: SOLUTION_FOUND
2550 DOUBLE PRECISION :: f1,f2,f3
2551 DOUBLE PRECISION :: ALPHA1,ALPHA2,ALPHA3,D_Target,L,DU
2552 DOUBLE PRECISION,
PARAMETER :: ALPHAMAX = 10.0d0
2554 CHARACTER (LEN=5) :: POS
2558 IF(du==d_target)
THEN 2560 solution_found = .true.
2564 IF(trim(pos)==
'FIRST')
THEN 2565 IF(d_target<du)
THEN 2569 alpha1 =
one/alphamax
2572 ELSEIF(trim(pos)==
'LAST')
THEN 2573 IF(d_target>du)
THEN 2577 alpha1 =
one/alphamax
2581 IF(
mype==0)
WRITE(*,*)
' ERROR, IN FUNCTION F: POS MUST BE FIRST OR LAST.' 2587 f1 =
f(pos,alpha1,d_target,l,nn)
2588 f2 =
f(pos,alpha2,d_target,l,nn)
2596 solution_found = .false.
2598 if(dabs(f1)<
tol_f)
then 2599 solution_found = .true.
2601 elseif(dabs(f2)<
tol_f)
then 2602 solution_found = .true.
2604 elseif(f1*f2 <
zero)
then 2609 alpha3 = alpha1 - f1*(alpha2-alpha1)/(f2-f1)
2611 f3 =
f(pos,alpha3,d_target,l,nn)
2624 solution_found = .true.
2626 WRITE(*,*)
'Unable to find a solution' 2627 WRITE(*,1000)
'between ALPHA1 = ', alpha1
2628 WRITE(*,1000)
' and ALPHA2 = ', alpha2
2629 WRITE(*,1000)
'Current value of ALPHA3 = ', alpha3
2630 WRITE(*,1000)
'Current value of abs(f) = ', dabs(f3)
2631 WRITE(*,1000)
'Tolerance = ',
tol_f 2632 WRITE(*,*)
'Maximum number of iterations = ',
itermax_int 2633 WRITE(*,*)
'Please increase the intersection tolerance, ' 2634 WRITE(*,*)
'or the maximum number of iterations, and try again.' 2635 WRITE(*,*)
'MFiX will exit now.' 2637 solution_found = .false.
2640 WRITE(*,*)
'Unable to find a solution' 2641 WRITE(*,*)
'MFiX will exit now.' 2643 solution_found = .false.
2646 1000
FORMAT(a,3(2
x,g12.5))
2652 DOUBLE PRECISION Function f(POS,ALPHAC,D_Target,L,N)
2658 DOUBLE PRECISION:: ALPHAC,D,D_Target,DU,L
2660 CHARACTER (LEN=5) :: POS
2664 IF(alphac==
one)
THEN 2667 IF(trim(pos)==
'FIRST')
THEN 2668 d = l * (
one - alphac) / (
one -alphac**n)
2669 ELSEIF(trim(pos)==
'LAST')
THEN 2670 d = l * (
one - alphac) / (
one -alphac**n) * alphac**(n-1)
2672 IF(
mype==0)
WRITE(*,*)
' ERROR, IN FUNCTION F: POS MUST BE FIRST OR LAST.' 2740 INTEGER :: LC,I,J,K,Q_ID,TOTAL_NUC,IDEAL_NCPP
2741 DOUBLE PRECISION :: X_COPY,Y_COPY,Z_COPY,F_COPY
2742 LOGICAL :: SHIFT,CLIP_FLAG,PRESENT
2743 DOUBLE PRECISION,
DIMENSION(0:DIM_I) :: DXT ,XCC
2744 DOUBLE PRECISION,
DIMENSION(0:DIM_J) :: DYT ,YCC
2745 DOUBLE PRECISION,
DIMENSION(0:DIM_K) :: DZT, ZCC
2747 INTEGER,
DIMENSION(0:DIM_I) :: NUC_I,GLOBAL_NUC_I
2748 INTEGER,
DIMENSION(0:DIM_J) :: NUC_J,GLOBAL_NUC_J
2749 INTEGER,
DIMENSION(0:DIM_K) :: NUC_K,GLOBAL_NUC_K
2751 INTEGER :: IPROC,PSUM
2753 INTEGER,
DIMENSION(0:numPEs-1) :: NCPP_OLD,NCPP,NCPP_WITH_GHOST
2755 INTEGER,
DIMENSION(0:NODESJ-1) :: JSIZE_OLD
2757 INTEGER :: JSIZE, JREMAIN
2758 INTEGER :: MAXVAL_NCPP_OLD,MINVAL_NCPP_OLD,MAXVAL_NCPP,MINVAL_NCPP
2759 INTEGER :: AVG_NCPP_OLD,AVG_NCPP
2760 DOUBLE PRECISION :: LIP_OLD,LIP,MAXSPEEDUP_OLD,P
2762 INTEGER :: I_OFFSET,J_OFFSET,K_OFFSET,IERR
2764 INTEGER,
DIMENSION(0:numPEs-1) :: disp,rcount
2766 LOGICAL :: PRINT_STATISTICS
2777 INQUIRE(file=
'gridmap.dat',exist=present)
2779 IF (
mype ==
pe_io)
WRITE(*,*)
'gridmap was assigned from grimap.dat. Skipping the adjustment.' 2794 allocate( ksize_all(0:
nodesk-1))
2818 dxt(imax3) = dx(imax-1)
2819 dxt(imax2) = dx(imax-1)
2820 DO lc = imax1, imin1, -1
2823 dxt(imin2) = dx(imin1)
2824 dxt(imin3) =dx(imin2)
2826 xcc(imin1) =
half*dxt(imin1)
2828 xcc(i) = xcc(i-1) +
half*(dxt(i-1) + dxt(i))
2834 dyt(jmax3) = dy(jmax-1)
2835 dyt(jmax2) = dy(jmax-1)
2836 DO lc = jmax1, jmin1, -1
2839 dyt(jmin2) = dy(jmin1)
2840 dyt(jmin3) =dy(jmin2)
2842 ycc(jmin1) =
half*dyt(jmin1)
2844 ycc(j) = ycc(j-1) +
half*(dyt(j-1) + dyt(j))
2851 dzt(kmax3) = dz(kmax-1)
2852 dzt(kmax2) = dz(kmax-1)
2853 DO lc = kmax1, kmin1, -1
2856 dzt(kmin2) = dz(kmin1)
2857 dzt(kmin3) =dz(kmin2)
2859 zcc(kmin1) =
half*dzt(kmin1)
2861 zcc(k) = zcc(k-1) +
half*(dzt(k-1) + dzt(k))
2873 WRITE(*,*)
'ERROR IN SUBROUTINE ADJUST_IJK_SIZE.' 2874 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 2876 WRITE(*,*)
'MFIX WILL EXIT NOW.' 2882 ksize_all(0:
nodesk-1) = kmax1-kmin1+1
2886 WRITE(*,1000)
'INFO FROM ADJUST_IJK_SIZE:' 2887 WRITE(*,1000)
'ATTEMPTING TO ADJUST DOMAIN SIZE IN I-DIRECTION ...' 2888 WRITE(*,1000)
'THIS IS BASED ON AN ESTIMATED (NOT EXACT) NUMBER OF USEFUL CELLS,' 2889 WRITE(*,1000)
'AND IT INCLUDES GHOST LAYERS.' 2907 CALL eval_f(
'QUADRIC',x_copy,y_copy,z_copy,q_id,f_copy,clip_flag)
2916 IF (f_copy <
tol_f )
THEN 2917 nuc_i(i) = nuc_i(i) + 1
2934 i_offset = i_offset + rcount(iproc)
2948 WRITE(*,*)
'ERROR IN SUBROUTINE ADJUST_IJK_SIZE.' 2949 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 2951 WRITE(*,*)
'MFIX WILL EXIT NOW.' 2957 ksize_all(0:
nodesk-1) = kmax1-kmin1+1
2976 WRITE(*,1000)
'INFO FROM ADJUST_IJK_SIZE:' 2977 WRITE(*,1000)
'ATTEMPTING TO ADJUST DOMAIN SIZE IN J-DIRECTION ...' 2978 WRITE(*,1000)
'THIS IS BASED ON AN ESTIMATED (NOT EXACT) NUMBER OF USEFUL CELLS,' 2979 WRITE(*,1000)
'AND IT INCLUDES GHOST LAYERS.' 2997 CALL eval_f(
'QUADRIC',x_copy,y_copy,z_copy,q_id,f_copy,clip_flag)
3006 IF (f_copy <
tol_f )
THEN 3007 nuc_j(j) = nuc_j(j) + 1
3024 j_offset = j_offset + rcount(iproc)
3036 WRITE(*,*)
'ERROR IN SUBROUTINE ADJUST_IJK_SIZE.' 3037 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 3039 WRITE(*,*)
'MFIX WILL EXIT NOW.' 3049 WRITE(*,1000)
'INFO FROM ADJUST_IJK_SIZE:' 3050 WRITE(*,1000)
'ATTEMPTING TO ADJUST DOMAIN SIZE IN K-DIRECTION ...' 3051 WRITE(*,1000)
'THIS IS BASED ON AN ESTIMATED (NOT EXACT) NUMBER OF USEFUL CELLS,' 3052 WRITE(*,1000)
'AND IT INCLUDES GHOST LAYERS.' 3069 CALL eval_f(
'QUADRIC',x_copy,y_copy,z_copy,q_id,f_copy,clip_flag)
3078 IF (f_copy <
tol_f )
THEN 3079 nuc_k(k) = nuc_k(k) + 1
3096 k_offset = k_offset + rcount(iproc)
3114 jsize = (jmax1-jmin1+1)/
nodesj 3115 jsize_old(0:
nodesj-1) = jsize
3117 jremain = (jmax1-jmin1+1) -
nodesj*jsize
3118 IF (jremain.GE.1)
THEN 3119 jsize_old( 0:(jremain-1) ) = jsize + 1
3135 total_nuc = sum(ncpp_with_ghost(0:
numpes-1))
3136 ideal_ncpp = total_nuc /
numpes 3138 WRITE (*, 1000)
'AFTER OPTIMIZATION:' 3139 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3140 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/PROC. = ',ideal_ncpp
3141 WRITE (*, 1000)
'ACTUALL CELL COUNT:' 3142 WRITE (*, 1000)
'=================================================' 3143 WRITE (*, 1000)
' PROCESSOR J-SIZE CELLS/PROC. DIFF. (%)' 3144 WRITE (*, 1000)
'=================================================' 3146 WRITE (*, 1020) iproc,
jsize_all(iproc),ncpp_with_ghost(iproc), &
3147 dble(ncpp_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3151 ncpp_old(iproc) = (imax3-imin3+1)*(
jsize_all(iproc)+4)
3152 IF(do_k) ncpp_old(iproc) = ncpp_old(iproc)*(kmax3-kmin3+1)
3162 WRITE (*, 1010)
'ERROR: J-SIZE TOO SMALL FOR PROCESSOR:',iproc
3163 WRITE (*, 1010)
'J-SIZE = ',
jsize_all(iproc)
3170 WRITE (*, 1000)
'ERROR IN ADJUST_IJK_SIZE: UNABLE TO ASSIGN JSIZE TO PROCESSORS.' 3171 WRITE (*, 1000)
'SUM OF JSIZE_ALL DOES NOT MATCH JMAX:' 3172 WRITE (*, 1010)
'SUM OF JSIZE_ALL = ',psum
3173 WRITE (*, 1010)
'JMAX1 = ',jmax
3181 print_statistics = .true.
3183 IF(print_statistics)
THEN 3201 lip_old = dble(maxval_ncpp_old-avg_ncpp_old)/dble(avg_ncpp_old)*100.0d0
3203 p = dble(maxval_ncpp_old)/dble(avg_ncpp_old)
3205 maxspeedup_old = dble(
numpes)*(
one-lip_old/100.0d0)
3210 maxval_ncpp = maxval(ncpp_with_ghost)
3211 minval_ncpp = minval(ncpp_with_ghost)
3214 lip = dble(maxval_ncpp-avg_ncpp)/dble(avg_ncpp)*100.0d0
3216 p = dble(maxval_ncpp)/dble(avg_ncpp)
3221 WRITE (*, 1000)
'=================================================' 3222 WRITE (*, 1000)
'ESTIMATED PARALLEL LOAD BALANCING STATISTICS' 3223 WRITE (*, 1000)
'COMPARISION BETWEEN UNIFORM SIZE (OLD)' 3224 WRITE (*, 1000)
'AND ADJUSTED SIZE (NEW)' 3225 WRITE (*, 1000)
'=================================================' 3226 WRITE (*, 1000)
' OLD NEW' 3227 WRITE (*, 1010)
'MAX CELL COUNT : ',maxval_ncpp_old,maxval_ncpp
3228 WRITE (*, 1010)
'AT PROCESSOR : ',maxloc(ncpp_old)-1,maxloc(ncpp_with_ghost)-1
3229 WRITE (*, 1010)
'MIN CELL COUNT : ',minval_ncpp_old,minval_ncpp
3230 WRITE (*, 1010)
'AT PROCESSOR : ',minloc(ncpp_old)-1,minloc(ncpp_with_ghost)-1
3231 WRITE (*, 1010)
'AVG CELL COUNT : ',avg_ncpp_old,avg_ncpp
3233 WRITE (*, 1030)
'LOAD IMBALANCE (%) : ',lip_old,lip
3239 WRITE (*, 1000)
'=================================================' 3241 WRITE (*, 1000)
'NOTE: ACTUAL LOAD BALANCING WILL BE COMPUTED AFTER PRE_PROCESSING.' 3254 CALL bcast(ksize_all)
3260 1010
FORMAT(1x,
a,i10,i10)
3261 1020
FORMAT(1x,i8,2(i12),f12.2)
3262 1030
FORMAT(1x,
a,2(f10.1))
3264 1050
FORMAT(1x,3(
a))
3340 WRITE(*,1000)
'TEMPORARILY SETTING:' 3341 WRITE(*,1010)
'NODESI = ',
nodesi 3342 WRITE(*,1010)
'NODESJ = ',
nodesj 3343 WRITE(*,1010)
'NODESK = ',
nodesk 3344 WRITE(*,1000)
'TO REPORT BEST DOMAIN SIZE FOR PARALLEL RUN' 3367 1010
FORMAT(1x,
a,i10)
3431 INTEGER :: I,J,K,TOTAL_NUC,IDEAL_NCPP
3433 INTEGER,
DIMENSION(0:DIM_I) :: NUC_I
3434 INTEGER,
DIMENSION(0:DIM_J) :: NUC_J
3435 INTEGER,
DIMENSION(0:DIM_K) :: NUC_K
3438 INTEGER :: ilistsize,jlistsize,klistsize
3439 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_NUC_I
3441 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_LIST_I
3442 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: GLOBAL_NUC_I
3444 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_NUC_J
3446 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_LIST_J
3447 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: GLOBAL_NUC_J
3449 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_NUC_K
3451 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ALL_LIST_K
3452 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: GLOBAL_NUC_K
3455 INTEGER :: IPROC,PSUM
3457 INTEGER,
DIMENSION(0:numPEs-1) :: NCPP_OLD,NCPP,NCPP_OLD_WITH_GHOST,NCPP_WITH_GHOST
3459 INTEGER,
DIMENSION(0:NODESI-1) :: ISIZE_OLD
3460 INTEGER,
DIMENSION(0:NODESJ-1) :: JSIZE_OLD
3461 INTEGER,
DIMENSION(0:NODESK-1) :: KSIZE_OLD
3463 INTEGER :: JSIZE, IREMAIN,ISIZE, JREMAIN,KSIZE, KREMAIN
3464 DOUBLE PRECISION :: LIP_OLD
3466 INTEGER :: I_OFFSET,J_OFFSET,K_OFFSET,IERR
3468 INTEGER,
DIMENSION(0:numPEs-1) :: disp,rcount
3470 INTEGER :: IPROC_OF_MAX_OLD,IPROC_OF_MIN_OLD
3482 IF(.not.
allocated(ksize_all))
allocate( ksize_all(0:
nodesk-1))
3486 ksize_all(0:
nodesk-1) = kmax1-kmin1+1
3498 nuc_i(i) = nuc_i(i) + 1
3515 i_offset = i_offset + rcount(iproc)
3521 ilistsize=sum(rcount)
3523 allocate( all_nuc_i(ilistsize))
3524 allocate( all_list_i(ilistsize))
3525 allocate( global_nuc_i(imin1:imax1))
3535 global_nuc_i(all_list_i(i)) = global_nuc_i(all_list_i(i)) + all_nuc_i(i)
3550 nuc_j(j) = nuc_j(j) + 1
3567 j_offset = j_offset + rcount(iproc)
3573 jlistsize=sum(rcount)
3575 allocate( all_nuc_j(jlistsize))
3576 allocate( all_list_j(jlistsize))
3577 allocate( global_nuc_j(jmin1:jmax1))
3587 global_nuc_j(all_list_j(j)) = global_nuc_j(all_list_j(j)) + all_nuc_j(j)
3602 nuc_k(k) = nuc_k(k) + 1
3619 k_offset = k_offset + rcount(iproc)
3625 klistsize=sum(rcount)
3627 allocate( all_nuc_k(klistsize))
3628 allocate( all_list_k(klistsize))
3629 allocate( global_nuc_k(kmin1:kmax1))
3639 global_nuc_k(all_list_k(k)) = global_nuc_k(all_list_k(k)) + all_nuc_k(k)
3655 isize = (imax1-imin1+1)/
nodesi 3656 isize_old(0:
nodesi-1) = isize
3658 iremain = (imax1-imin1+1) -
nodesi*isize
3659 IF (iremain.GE.1)
THEN 3660 isize_old( 0:(iremain-1) ) = isize + 1
3667 imax1,
isize_all,ncpp_old,ncpp_old_with_ghost, &
3668 lip_old,iproc_of_max_old,iproc_of_min_old)
3670 total_nuc = sum(ncpp_old_with_ghost(0:
nodesi-1))
3671 ideal_ncpp = total_nuc /
nodesi 3672 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 3673 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN I-DIRECTION ...' 3674 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3675 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/I-NODE = ',ideal_ncpp
3676 WRITE (*, 1000)
'BEFORE OPTIMIZATION:' 3677 WRITE (*, 1000)
'=================================================' 3678 WRITE (*, 1000)
' I-NODE I-SIZE CELLS/NODE DIFF. (%)' 3679 WRITE (*, 1000)
'=================================================' 3681 WRITE (*, 1020) iproc,
isize_all(iproc),ncpp_old_with_ghost(iproc), &
3682 dble(ncpp_old_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3684 WRITE (*, 1000)
'=================================================' 3689 total_nuc = sum(ncpp_with_ghost(0:
nodesi-1))
3690 ideal_ncpp = total_nuc /
nodesi 3691 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3692 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/I-NODE = ',ideal_ncpp
3693 WRITE (*, 1010)
'SINCE GHOST CELLS ARE INCLUDED, THE TOTALS' 3694 WRITE (*, 1010)
'BEFORE AND AFTER OPTIMIZATION MAY NOT MATCH.' 3695 WRITE (*, 1000)
'AFTER OPTIMIZATION:' 3696 WRITE (*, 1000)
'=================================================' 3697 WRITE (*, 1000)
' I-NODE I-SIZE CELLS/NODE DIFF. (%)' 3698 WRITE (*, 1000)
'=================================================' 3700 WRITE (*, 1020) iproc,
isize_all(iproc),ncpp_with_ghost(iproc), &
3701 dble(ncpp_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3703 WRITE (*, 1000)
'=================================================' 3710 WRITE (*, 1010)
'ERROR: I-SIZE TOO SMALL FOR I-NODE:',iproc
3711 WRITE (*, 1010)
'I-SIZE = ',
isize_all(iproc)
3717 WRITE (*, 1000)
'ERROR IN ADJUST_IJK_SIZE: UNABLE TO ASSIGN ISIZE TO PROCESSORS.' 3718 WRITE (*, 1000)
'SUM OF ISIZE_ALL DOES NOT MATCH IMAX:' 3719 WRITE (*, 1010)
'SUM OF ISIZE_ALL = ',psum
3720 WRITE (*, 1010)
'IMAX = ',imax
3730 jsize = (jmax1-jmin1+1)/
nodesj 3731 jsize_old(0:
nodesj-1) = jsize
3733 jremain = (jmax1-jmin1+1) -
nodesj*jsize
3734 IF (jremain.GE.1)
THEN 3735 jsize_old( 0:(jremain-1) ) = jsize + 1
3742 ncpp_old,ncpp_old_with_ghost,lip_old,iproc_of_max_old,iproc_of_min_old)
3744 total_nuc = sum(ncpp_old_with_ghost(0:
nodesj-1))
3745 ideal_ncpp = total_nuc /
nodesj 3746 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 3747 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN J-DIRECTION ...' 3748 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3749 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/J-NODE = ',ideal_ncpp
3750 WRITE (*, 1000)
'BEFORE OPTIMIZATION:' 3751 WRITE (*, 1000)
'=================================================' 3752 WRITE (*, 1000)
' J-NODE J-SIZE CELLS/NODE DIFF. (%)' 3753 WRITE (*, 1000)
'=================================================' 3755 WRITE (*, 1020) iproc,
jsize_all(iproc),ncpp_old_with_ghost(iproc), &
3756 dble(ncpp_old_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3758 WRITE (*, 1000)
'=================================================' 3763 total_nuc = sum(ncpp_with_ghost(0:
nodesj-1))
3764 ideal_ncpp = total_nuc /
nodesj 3765 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3766 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/J-NODE = ',ideal_ncpp
3767 WRITE (*, 1010)
'SINCE GHOST CELLS ARE INCLUDED, THE TOTALS' 3768 WRITE (*, 1010)
'BEFORE AND AFTER OPTIMIZATION MAY NOT MATCH.' 3769 WRITE (*, 1000)
'AFTER OPTIMIZATION:' 3770 WRITE (*, 1000)
'=================================================' 3771 WRITE (*, 1000)
' J-NODE J-SIZE CELLS/NODE DIFF. (%)' 3772 WRITE (*, 1000)
'=================================================' 3774 WRITE (*, 1020) iproc,
jsize_all(iproc),ncpp_with_ghost(iproc), &
3775 dble(ncpp_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3777 WRITE (*, 1000)
'=================================================' 3784 WRITE (*, 1010)
'ERROR: J-SIZE TOO SMALL FOR J-NODE:',iproc
3785 WRITE (*, 1010)
'J-SIZE = ',
jsize_all(iproc)
3791 WRITE (*, 1000)
'ERROR IN ADJUST_IJK_SIZE: UNABLE TO ASSIGN JSIZE TO PROCESSORS.' 3792 WRITE (*, 1000)
'SUM OF JSIZE_ALL DOES NOT MATCH JMAX:' 3793 WRITE (*, 1010)
'SUM OF JSIZE_ALL = ',psum
3794 WRITE (*, 1010)
'JMAX = ',jmax
3803 ksize = (kmax1-kmin1+1)/
nodesk 3804 ksize_old(0:
nodesk-1) = ksize
3806 kremain = (kmax1-kmin1+1) -
nodesk*ksize
3807 IF (kremain.GE.1)
THEN 3808 ksize_old( 0:(kremain-1) ) = ksize + 1
3811 ksize_all = ksize_old
3815 ncpp_old,ncpp_old_with_ghost,lip_old,iproc_of_max_old,iproc_of_min_old)
3817 total_nuc = sum(ncpp_old_with_ghost(0:
nodesk-1))
3818 ideal_ncpp = total_nuc /
nodesk 3819 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 3820 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN K-DIRECTION ...' 3821 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3822 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/K_NODE = ',ideal_ncpp
3823 WRITE (*, 1000)
'BEFORE OPTIMIZATION:' 3824 WRITE (*, 1000)
'=================================================' 3825 WRITE (*, 1000)
' K-NODE K-SIZE CELLS/NODE DIFF. (%)' 3826 WRITE (*, 1000)
'=================================================' 3828 WRITE (*, 1020) iproc,ksize_all(iproc),ncpp_old_with_ghost(iproc), &
3829 dble(ncpp_old_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3831 WRITE (*, 1000)
'=================================================' 3836 total_nuc = sum(ncpp_with_ghost(0:
nodesk-1))
3837 ideal_ncpp = total_nuc /
nodesk 3838 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
3839 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/K_NODE = ',ideal_ncpp
3840 WRITE (*, 1010)
'SINCE GHOST CELLS ARE INCLUDED, THE TOTALS' 3841 WRITE (*, 1010)
'BEFORE AND AFTER OPTIMIZATION MAY NOT MATCH.' 3842 WRITE (*, 1000)
'AFTER OPTIMIZATION:' 3843 WRITE (*, 1000)
'=================================================' 3844 WRITE (*, 1000)
' K-NODE K-SIZE CELLS/NODE DIFF. (%)' 3845 WRITE (*, 1000)
'=================================================' 3847 WRITE (*, 1020) iproc,ksize_all(iproc),ncpp_with_ghost(iproc), &
3848 dble(ncpp_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
3850 WRITE (*, 1000)
'=================================================' 3855 psum = psum + ksize_all(iproc)
3856 IF(ksize_all(iproc)<5)
THEN 3857 WRITE (*, 1010)
'ERROR: K-SIZE TOO SMALL FOR K-NODE:',iproc
3858 WRITE (*, 1010)
'K-SIZE = ',ksize_all(iproc)
3864 WRITE (*, 1000)
'ERROR IN ADJUST_IJK_SIZE: UNABLE TO ASSIGN KSIZE TO PROCESSORS.' 3865 WRITE (*, 1000)
'SUM OF KSIZE_ALL DOES NOT MATCH KMAX:' 3866 WRITE (*, 1010)
'SUM OF KSIZE_ALL = ',psum
3867 WRITE (*, 1010)
'KMAX = ',kmax
3875 OPEN(convert=
'BIG_ENDIAN',unit=777, file=
'suggested_gridmap.dat')
3884 WRITE(777,1060) iproc,ksize_all(iproc)
3888 WRITE (*, 1000)
'=================================================' 3889 WRITE (*, 1000)
'GRID PARTITION SAVED IN FILE: suggested_gridmap.dat' 3890 WRITE (*, 1000)
'TO USE THIS DISTRIBUTION, RENAME THE FILE AS: gridmap.dat' 3891 WRITE (*, 1000)
'AND RUN MFIX AGAIN.' 3893 WRITE (*, 1000)
'=================================================' 3912 1005
FORMAT(1x,i10,i10,i10,
a)
3913 1010
FORMAT(1x,
a,i10,i10)
3914 1020
FORMAT(1x,i8,2(i12),f12.2)
3915 1030
FORMAT(1x,
a,2(f10.1))
3917 1050
FORMAT(1x,3(
a))
3918 1060
FORMAT(1x,i10,i10)
3941 SUBROUTINE get_lip_with_ghost_layers(NODESL,NUC_L,LMIN1,LMAX1,L_SIZE,NCPP,NCPP_WITH_GHOST,LIP,IPROC_OF_MAX,IPROC_OF_MIN)
3979 INTEGER :: NODESL,L,LMIN1,LMAX1,TOTAL_NUC,TOTAL_NUC_WITH_GHOST,IPROC_OF_MAX,IPROC_OF_MIN
3981 INTEGER :: LCOUNT1,LCOUNT2,MINVAL_NCPP,MAXVAL_NCPP,IDEAL_NCPP
3982 INTEGER,
DIMENSION(LMIN1:LMAX1) :: NUC_L
3986 INTEGER,
DIMENSION(0:NODESL-1) :: NCPP,NCPP_WITH_GHOST,L_SIZE,L1,L2
3989 DOUBLE PRECISION :: LIP
3993 lcount1 = lmax1 - lmin1 + 1
3994 lcount2 = sum(l_size(0:nodesl-1))
3996 IF(lcount1/=lcount2)
THEN 3997 WRITE(*,*)
' ERROR: SUM OF CELLS DO NOT MATCH:',lcount1,lcount2
4002 l2(0) = l1(0) + l_size(0) - 1
4004 DO iproc = 1,nodesl-1
4005 l1(iproc) = l2(iproc-1) + 1
4006 l2(iproc) = l1(iproc) + l_size(iproc) - 1
4009 DO iproc = 0,nodesl-1
4010 ncpp(iproc) = sum(nuc_l(l1(iproc):l2(iproc)))
4018 total_nuc = total_nuc + nuc_l(l)
4021 ncpp_with_ghost(0) = ncpp(0) + 2*nuc_l(l1(0)) + nuc_l(l1(1)) + nuc_l(l1(1)+1)
4023 DO iproc = 1,nodesl-2
4024 ncpp_with_ghost(iproc) = ncpp(iproc) &
4025 + nuc_l(l2(iproc-1)) + nuc_l(l2(iproc-1)-1) &
4026 + nuc_l(l1(iproc+1)) + nuc_l(l1(iproc+1)+1)
4029 ncpp_with_ghost(nodesl-1) = ncpp(nodesl-1) + 2*nuc_l(l2(nodesl-1)) + nuc_l(l2(nodesl-2)) + nuc_l(l2(nodesl-2)-1)
4031 total_nuc_with_ghost = 0
4032 DO iproc = 0,nodesl-1
4034 total_nuc_with_ghost = total_nuc_with_ghost + ncpp_with_ghost(iproc)
4038 ideal_ncpp = total_nuc_with_ghost /
numpes 4040 maxval_ncpp = maxval(ncpp_with_ghost)
4041 minval_ncpp = minval(ncpp_with_ghost)
4043 lip = dble(maxval_ncpp-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
4047 iproc_of_max = maxloc(ncpp_with_ghost,1)-1
4048 iproc_of_min = minloc(ncpp_with_ghost,1)-1
4113 INTEGER :: NODESL,LMIN1,LMAX1,IPROC_OF_MAX,IPROC_OF_MIN
4115 INTEGER,
DIMENSION(LMIN1:LMAX1) :: NUC_L
4117 INTEGER :: NN,NOIMPROVEMENT
4119 INTEGER,
PARAMETER :: NAMAX=10000
4121 INTEGER,
DIMENSION(0:numPEs-1) :: NCPP,NCPP_WITH_GHOST,L_SIZE,BEST_L_SIZE,BEST_NCPP,BEST_NCPP_WITH_GHOST
4123 DOUBLE PRECISION :: LIP,BEST_LIP
4135 best_l_size = l_size
4151 print*,
'ATTEMPTING TO OPTIMIZE LOAD BALANCE...' 4157 l_size(iproc_of_max) = l_size(iproc_of_max) - 1
4158 l_size(iproc_of_min) = l_size(iproc_of_min) + 1
4166 IF(lip<best_lip)
THEN 4168 best_l_size = l_size
4170 best_ncpp_with_ghost = ncpp_with_ghost
4173 noimprovement = noimprovement + 1
4185 IF(noimprovement==10)
THEN 4186 WRITE (*, 1000)
'OPTIMIZED LOAD BALANCE REACHED.' 4193 l_size = best_l_size
4195 ncpp_with_ghost = best_ncpp_with_ghost
4207 1010
FORMAT(1x,
a,i10,i10)
4208 1020
FORMAT(1x,i8,2(i12),f12.2)
4272 INTEGER :: I,J,K,TOTAL_NUC,IDEAL_NCPP
4274 INTEGER,
DIMENSION(0:DIM_I) :: NUC_I,GLOBAL_NUC_I
4275 INTEGER,
DIMENSION(0:DIM_J) :: NUC_J,GLOBAL_NUC_J
4276 INTEGER,
DIMENSION(0:DIM_K) :: NUC_K,GLOBAL_NUC_K
4278 INTEGER :: IPROC,PSUM
4280 INTEGER,
DIMENSION(0:numPEs-1) :: NCPP_OLD,NCPP,NCPP_OLD_WITH_GHOST,NCPP_WITH_GHOST
4282 INTEGER,
DIMENSION(0:NODESJ-1) :: JSIZE_OLD
4284 INTEGER :: JSIZE, JREMAIN
4285 INTEGER :: MAXVAL_NCPP_OLD,MINVAL_NCPP_OLD,MAXVAL_NCPP,MINVAL_NCPP
4286 INTEGER :: AVG_NCPP_OLD,AVG_NCPP
4287 DOUBLE PRECISION :: LIP_OLD,LIP,MAXSPEEDUP_OLD,MAXSPEEDUP,P
4289 INTEGER :: I_OFFSET,J_OFFSET,K_OFFSET,IERR
4291 INTEGER,
DIMENSION(0:numPEs-1) :: disp,rcount
4293 INTEGER :: IPROC_OF_MAX_OLD,IPROC_OF_MIN_OLD
4307 IF(.not.
allocated(ksize_all))
allocate( ksize_all(0:
nodesk-1))
4319 WRITE(*,*)
'ERROR IN SUBROUTINE REPORT_BEST_IJK_SIZE.' 4320 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 4322 WRITE(*,*)
'MFIX WILL EXIT NOW.' 4328 ksize_all(0:
nodesk-1) = kmax1-kmin1+1
4332 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 4333 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN I-DIRECTION ...' 4344 nuc_i(i) = nuc_i(i) + 1
4361 i_offset = i_offset + rcount(iproc)
4375 WRITE(*,*)
'ERROR IN SUBROUTINE REPORT_BEST_IJK_SIZE.' 4376 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 4378 WRITE(*,*)
'MFIX WILL EXIT NOW.' 4384 ksize_all(0:
nodesk-1) = kmax1-kmin1+1
4388 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 4389 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN J-DIRECTION ...' 4400 nuc_j(j) = nuc_j(j) + 1
4413 global_nuc_j(j) = nuc_j(j)
4426 j_offset = j_offset + rcount(iproc)
4447 WRITE(*,*)
'ERROR IN SUBROUTINE REPORT_BEST_IJK_SIZE.' 4448 WRITE(*,*)
'ADJUSTMENT POSSIBLE ONLY FOR DOMAIN DECOMPOSITION In ONE DIRECTION.' 4450 WRITE(*,*)
'MFIX WILL EXIT NOW.' 4460 WRITE(*,1000)
'INFO FROM REPORT_BEST_IJK_SIZE:' 4461 WRITE(*,1000)
'ATTEMPTING TO REPORT BEST DOMAIN SIZE IN K-DIRECTION ...' 4472 nuc_k(k) = nuc_k(k) + 1
4489 k_offset = k_offset + rcount(iproc)
4514 jsize = (jmax1-jmin1+1)/
nodesj 4515 jsize_old(0:
nodesj-1) = jsize
4517 jremain = (jmax1-jmin1+1) -
nodesj*jsize
4518 IF (jremain.GE.1)
THEN 4519 jsize_old( 0:(jremain-1) ) = jsize + 1
4527 ncpp_old,ncpp_old_with_ghost,lip_old,iproc_of_max_old,iproc_of_min_old)
4542 total_nuc = sum(ncpp_with_ghost(0:
numpes-1))
4543 ideal_ncpp = total_nuc /
numpes 4545 WRITE (*, 1000)
'AFTER OPTIMIZATION:' 4546 WRITE (*, 1010)
'TOTAL NUMBER OF USEFUL CELLS = ',total_nuc
4547 WRITE (*, 1010)
'IDEAL NUMBER OF CELLS/PROC. = ',ideal_ncpp
4548 WRITE (*, 1000)
'ACTUALL CELL COUNT:' 4549 WRITE (*, 1000)
'=================================================' 4550 WRITE (*, 1000)
' PROCESSOR J-SIZE CELLS/PROC. DIFF. (%)' 4551 WRITE (*, 1000)
'=================================================' 4553 WRITE (*, 1020) iproc,
jsize_all(iproc),ncpp_with_ghost(iproc), &
4554 dble(ncpp_with_ghost(iproc)-ideal_ncpp)/dble(ideal_ncpp)*100.0d0
4570 WRITE (*, 1010)
'ERROR: J-SIZE TOO SMALL FOR PROCESSOR:',iproc
4571 WRITE (*, 1010)
'J-SIZE = ',
jsize_all(iproc)
4578 WRITE (*, 1000)
'ERROR IN ADJUST_IJK_SIZE: UNABLE TO ASSIGN JSIZE TO PROCESSORS.' 4579 WRITE (*, 1000)
'SUM OF JSIZE_ALL DOES NOT MATCH JMAX:' 4580 WRITE (*, 1010)
'SUM OF JSIZE_ALL = ',psum
4581 WRITE (*, 1010)
'JMAX1 = ',jmax
4586 OPEN(convert=
'BIG_ENDIAN',unit=777, file=
'suggested_gridmap.dat')
4587 WRITE (777, 1000)
'J-SIZE DISTRIBUTION' 4588 WRITE (777, 1010)
'NUMBER OF PROCESSORS = ',
numpes 4589 WRITE (777, 1000)
'=================================================' 4590 WRITE (777, 1000)
' PROCESSOR J-SIZE' 4591 WRITE (777, 1000)
'=================================================' 4597 WRITE (*, 1000)
'=================================================' 4598 WRITE (*, 1000)
'J-SIZE DISTRIBUTION SAVED IN FILE: suggested_gridmap.dat' 4599 WRITE (*, 1000)
'TO USE THIS DISTRIBUTION, RENAME THE FILE AS: gridmap.dat' 4600 WRITE (*, 1000)
'AND RUN MFIX AGAIN.' 4601 WRITE (*, 1000)
'=================================================' 4612 maxval_ncpp_old = maxval(ncpp_old_with_ghost)
4613 minval_ncpp_old = minval(ncpp_old_with_ghost)
4614 avg_ncpp_old = sum(ncpp_old_with_ghost)/
numpes 4617 lip_old = dble(maxval_ncpp_old-minval_ncpp_old)/dble(minval_ncpp_old)*100.0d0
4620 p = dble(minval_ncpp_old)/dble(maxval_ncpp_old)
4625 maxval_ncpp = maxval(ncpp_with_ghost)
4626 minval_ncpp = minval(ncpp_with_ghost)
4630 lip = dble(maxval_ncpp-minval_ncpp)/dble(minval_ncpp)*100.0d0
4633 p = dble(minval_ncpp)/dble(maxval_ncpp)
4638 WRITE (*, 1000)
'=================================================' 4639 WRITE (*, 1000)
'ESTIMATED PARALLEL LOAD BALANCING STATISTICS' 4640 WRITE (*, 1000)
'COMPARISION BETWEEN UNIFORM SIZE (OLD)' 4641 WRITE (*, 1000)
'AND SUGGESTED SIZE (NEW)' 4642 WRITE (*, 1000)
'=================================================' 4643 WRITE (*, 1000)
' OLD NEW' 4644 WRITE (*, 1010)
'MAX CELL COUNT : ',maxval_ncpp_old,maxval_ncpp
4645 WRITE (*, 1010)
'AT PROCESSOR : ',maxloc(ncpp_old_with_ghost)-1,maxloc(ncpp_with_ghost)-1
4646 WRITE (*, 1010)
'MIN CELL COUNT : ',minval_ncpp_old,minval_ncpp
4647 WRITE (*, 1010)
'AT PROCESSOR : ',minloc(ncpp_old_with_ghost)-1,minloc(ncpp_with_ghost)-1
4648 WRITE (*, 1010)
'AVG CELL COUNT : ',avg_ncpp_old,avg_ncpp
4650 WRITE (*, 1030)
'LOAD IMBALANCE (%) : ',lip_old,lip
4656 WRITE (*, 1000)
'=================================================' 4676 1010
FORMAT(1x,
a,i10,i10)
4677 1020
FORMAT(1x,i8,2(i12),f12.2)
4678 1030
FORMAT(1x,
a,2(f10.1))
4680 1050
FORMAT(1x,3(
a))
4681 1060
FORMAT(1x,i8,i12)
4741 INTEGER :: NODESL,L,LMIN1,LMAX1,TOTAL_NUC,TOTAL_NUC_WITH_GHOST,IPROC_OF_MAX,IPROC_OF_MIN
4743 INTEGER :: LCOUNT1,LCOUNT2,MINVAL_NCPP,MAXVAL_NCPP,IDEAL_NCPP
4744 INTEGER,
DIMENSION(LMIN1:LMAX1) :: NUC_L
4748 INTEGER,
DIMENSION(0:NODESL-1) :: NCPP,NCPP_WITH_GHOST,L_SIZE,L1,L2
4751 DOUBLE PRECISION :: LIP
4755 lcount1 = lmax1 - lmin1 + 1
4756 lcount2 = sum(l_size(0:nodesl-1))
4758 IF(lcount1/=lcount2)
THEN 4759 WRITE(*,*)
' ERROR: SUM OF CELLS DO NOT MATCH:',lcount1,lcount2
4764 l2(0) = l1(0) + l_size(0) - 1
4766 DO iproc = 1,nodesl-1
4767 l1(iproc) = l2(iproc-1) + 1
4768 l2(iproc) = l1(iproc) + l_size(iproc) - 1
4771 DO iproc = 0,nodesl-1
4772 ncpp(iproc) = sum(nuc_l(l1(iproc):l2(iproc)))
4780 total_nuc = total_nuc + nuc_l(l)
4783 ncpp_with_ghost(0) = ncpp(0) + 2*nuc_l(l1(0)) + nuc_l(l1(1)) + nuc_l(l1(1)+1)
4785 DO iproc = 1,nodesl-2
4786 ncpp_with_ghost(iproc) = ncpp(iproc) &
4787 + nuc_l(l2(iproc-1)) + nuc_l(l2(iproc-1)-1) &
4788 + nuc_l(l1(iproc+1)) + nuc_l(l1(iproc+1)+1)
4791 ncpp_with_ghost(nodesl-1) = ncpp(nodesl-1) + 2*nuc_l(l2(nodesl-1)) + nuc_l(l2(nodesl-2)) + nuc_l(l2(nodesl-2)-1)
4793 total_nuc_with_ghost = 0
4794 DO iproc = 0,nodesl-1
4796 total_nuc_with_ghost = total_nuc_with_ghost + ncpp_with_ghost(iproc)
4800 ideal_ncpp = total_nuc_with_ghost /
numpes 4802 maxval_ncpp = maxval(ncpp_with_ghost)
4803 minval_ncpp = minval(ncpp_with_ghost)
4806 lip = dble(maxval_ncpp-minval_ncpp)/dble(minval_ncpp)*100.0d0
4809 iproc_of_max = maxloc(ncpp_with_ghost,1)-1
4810 iproc_of_min = minloc(ncpp_with_ghost,1)-1
4875 INTEGER :: NODESL,LMIN1,LMAX1,IPROC_OF_MAX,IPROC_OF_MIN
4877 INTEGER,
DIMENSION(LMIN1:LMAX1) :: NUC_L
4879 INTEGER :: NN,NOIMPROVEMENT
4881 INTEGER,
PARAMETER :: NAMAX=10000
4883 INTEGER,
DIMENSION(0:numPEs-1) :: NCPP,NCPP_WITH_GHOST,L_SIZE,BEST_L_SIZE,BEST_NCPP,BEST_NCPP_WITH_GHOST
4886 DOUBLE PRECISION :: LIP,BEST_LIP
4898 best_l_size = l_size
4914 print*,
'ATTEMPTING TO OPTIMIZE LOAD BALANCE...' 4920 l_size(iproc_of_max) = l_size(iproc_of_max) - 1
4921 l_size(iproc_of_min) = l_size(iproc_of_min) + 1
4929 IF(lip<best_lip)
THEN 4931 best_l_size = l_size
4933 best_ncpp_with_ghost = ncpp_with_ghost
4936 noimprovement = noimprovement + 1
4948 IF(noimprovement==10)
THEN 4949 WRITE (*, 1000)
'OPTIMIZED LOAD BALANCE REACHED.' 4956 l_size = best_l_size
4958 ncpp_with_ghost = best_ncpp_with_ghost
4970 1010
FORMAT(1x,
a,i10,i10)
4971 1020
FORMAT(1x,i8,2(i12),f12.2)
double precision, dimension(max_cp) last_dy
double precision, dimension(max_cp) last_dz
double precision tol_small_area
double precision, dimension(dimension_bc) bc_volflow_g
subroutine report_best_processor_size
integer, dimension(max_cp) ncz
double precision, dimension(dimension_bc) bc_t_g
logical function compare(V1, V2)
double precision, dimension(dim_quadric) reactor1_y1
integer, dimension(dim_group) group_size
double precision, parameter one
double precision alpha_max
logical short_gridmap_init
subroutine get_lip_with_ghost_layers(NODESL, NUC_L, LMIN1, LMAX1, L_SIZE, NCPP, NCPP_WITH_GHOST, LIP, IPROC_OF_MAX, IPROC_OF_MIN)
double precision, dimension(dim_quadric) c2c_r2
double precision, dimension(dim_quadric) c2c_r1
double precision, dimension(dim_quadric) lambda_x
double precision fac_dim_max_cut_cell
double precision, dimension(dim_quadric) torus_r2
integer, dimension(max_cp) ncx
double precision, dimension(dim_quadric) radius
logical, dimension(0:dim_m) species_eq
double precision, dimension(dimension_bc, dim_m) bc_w_s
integer, dimension(10) cg_safe_mode
logical adjust_proc_domain_size
double precision, dimension(dimension_bc, dim_m, dim_n_s) bc_x_s
double precision, dimension(dim_quadric) clip_xmax
double precision, dimension(0:max_cp) cpz
double precision, dimension(max_cp) first_dz
subroutine check_data_cartesian
subroutine minimize_load_imbalance(NODESL, NUC_L, LMIN1, LMAX1, L_SIZE, NCPP, NCPP_WITH_GHOST)
subroutine allgather_1i(lbuf, gbuf, idebug)
integer, parameter dimension_bc
integer, dimension(dimension_bc) bc_type_enum
double precision, dimension(dim_quadric) t_x
double precision, parameter undefined
character(len=9), dimension(dim_group) relation_with_previous
double precision, dimension(dim_quadric) ucoil_y1
double precision, dimension(0:max_cp) cpy
double precision, dimension(:), allocatable a
double precision, dimension(dimension_bc) bc_v_g
double precision, dimension(dimension_bc, dim_m) bc_velmag_s
double precision, dimension(dim_quadric) ucoil_r2
double precision, dimension(dim_quadric) n_z
double precision, dimension(9) cg_ur_fac
double precision quadric_scale
integer, parameter dim_group
double precision, dimension(dim_quadric) reactor1_r1
subroutine init_err_msg(CALLER)
double precision, dimension(dim_quadric) c2c_y2
double precision init_time
double precision, dimension(max_cp) erz
double precision, dimension(dimension_bc, dim_m) bc_volflow_s
double precision, dimension(dim_quadric) torus_r1
integer, dimension(dim_quadric) bc_id_q
subroutine get_dxyz_from_control_points
integer, dimension(:), allocatable bc_u_id
double precision, dimension(0:max_cp) cpx
subroutine mfix_exit(myID, normal_termination)
double precision tol_small_cell
logical, dimension(:,:,:), allocatable dead_cell_at
double precision, dimension(dimension_bc, dim_m) bc_t_s
integer, dimension(:), allocatable bc_w_id
double precision, dimension(dim_quadric) ucoil_r1
double precision, dimension(dim_quadric) bend_r2
subroutine adjust_ijk_size
double precision, dimension(dimension_bc, dim_scalar) bc_scalar
double precision function f(POS, ALPHAC, D_Target, L, N)
double precision, dimension(dim_quadric) bend_r1
subroutine print_cg_header
double precision, dimension(dimension_bc) bc_p_g
double precision, dimension(dim_quadric) reactor1_theta1
double precision, dimension(3) tol_snap
double precision, dimension(dim_quadric) half_angle
double precision, dimension(dim_quadric) dquadric
integer, dimension(max_cp) ncy
double precision, parameter half
integer, parameter unit_log
double precision, dimension(max_cp) erx
double precision, dimension(dim_quadric) ucoil_y2
integer, dimension(:), allocatable jsize_all
double precision, dimension(max_cp) ery
double precision, parameter large_number
double precision, dimension(dimension_bc) bc_velmag_g
integer, dimension(:), allocatable bc_v_id
double precision, dimension(dim_quadric) lambda_y
subroutine define_quadrics
double precision, dimension(dimension_bc, dim_m) bc_v_s
double precision, dimension(dimension_bc) bc_massflow_g
subroutine find_cell_ratio(POS, D_Target, L, NN, ALPHA3)
integer, dimension(0:dim_m) nmax
double precision, dimension(dimension_bc, dim_m) bc_massflow_s
integer, dimension(:), allocatable isize_all
double precision, dimension(dimension_bc) bc_u_g
subroutine report_best_ijk_size0
character(len=12), dimension(dim_quadric) quadric_form
logical domain_size_adjusted
double precision, dimension(dim_quadric) n_y
integer, parameter undefined_i
double precision, dimension(max_cp) last_dx
double precision, dimension(dimension_bc, dim_m) bc_u_s
character(len=line_length), dimension(line_count) err_msg
character(len=9), dimension(dim_group) group_relation
double precision, dimension(dimension_bc) bc_e_turb_g
integer, dimension(:), allocatable bc_id
subroutine get_lip_with_ghost_layers0(NODESL, NUC_L, LMIN1, LMAX1, L_SIZE, NCPP, NCPP_WITH_GHOST, LIP, IPROC_OF_MAX, IPROC_OF_MIN)
double precision, dimension(dim_quadric) clip_xmin
double precision, dimension(max_cp) first_dx
double precision, dimension(dimension_bc, dim_m) bc_theta_m
double precision tol_delh
double precision, dimension(dimension_bc) bc_ep_g
subroutine minimize_load_imbalance0(NODESL, NUC_L, LMIN1, LMAX1, L_SIZE, NCPP, NCPP_WITH_GHOST)
double precision, dimension(dimension_bc) bc_k_turb_g
subroutine check_bc_flags
double precision, dimension(dim_m) ro_s0
integer, parameter dim_quadric
double precision, dimension(dim_quadric) reactor1_yr1
logical report_best_domain_size
double precision, dimension(dim_quadric) t_y
double precision, dimension(dim_quadric) piece_xmin
subroutine eval_f(METHOD, x1, x2, x3, Q, f, CLIP_FLAG)
double precision, parameter pi
double precision tol_poly
double precision, dimension(dim_quadric) bend_theta1
integer, parameter max_cp
double precision, dimension(dim_quadric) t_z
double precision, dimension(dimension_bc) bc_w_g
logical, dimension(dimension_bc) cg_mi_converted_to_ps
integer, dimension(:), allocatable ijksize3_all
subroutine build_cone_for_c2c(Q)
double precision, dimension(dim_quadric) n_x
double precision, dimension(dim_quadric) c2c_y1
integer, dimension(dim_group, dim_quadric) group_q
integer, dimension(:), allocatable ncpp_uniform
double precision, dimension(:), allocatable x
double precision, parameter zero
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
double precision, dimension(dimension_bc, dim_m) bc_rop_s
subroutine gatherv_1i(lbuf, sendcnt, gbuf, rcount, disp, mroot, idebug)
double precision, dimension(dim_quadric) piece_xmax
character(len=4), dimension(dim_eqs) leq_pc
double precision, dimension(max_cp) first_dy
subroutine report_best_ijk_size