18 SUBROUTINE get_del_h(IJK,TYPE_OF_CELL,X0,Y0,Z0,Del_H,Nx,Ny,Nz)
35 CHARACTER (LEN=*) :: TYPE_OF_CELL
36 DOUBLE PRECISION:: X0,Y0,Z0,XREF,YREF,ZREF
38 DOUBLE PRECISION :: Del_H,Diagonal
39 DOUBLE PRECISION :: Nx,Ny,Nz
41 SELECT CASE (type_of_cell)
45 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H:' 46 WRITE(*,*)
' SCALAR CELL',ijk,
' IS NOT A CUT CELL' 47 WRITE(*,*)
' MFiX will exit now.' 62 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H:' 63 WRITE(*,*)
' U-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 64 WRITE(*,*)
' MFiX will exit now.' 87 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H:' 88 WRITE(*,*)
' V-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 89 WRITE(*,*)
' MFiX will exit now.' 112 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H:' 113 WRITE(*,*)
' W-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 114 WRITE(*,*)
' MFiX will exit now.' 135 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H:' 136 WRITE(*,*)
'UNKNOWN TYPE OF CELL:',type_of_cell
137 WRITE(*,*)
'ACCEPTABLE TYPES ARE:' 139 WRITE(*,*)
'U_MOMENTUM' 140 WRITE(*,*)
'V_MOMENTUM' 141 WRITE(*,*)
'W_MOMENTUM' 146 del_h = nx * (x0 - xref) + ny * (y0 - yref) + nz * (z0 - zref)
157 diagonal = sqrt(
dx(i)**2 +
dy(j)**2 )
159 diagonal = sqrt(
dx(i)**2 +
dy(j)**2 +
dz(k)**2)
162 IF (del_h <=
tol_delh * diagonal)
THEN 176 SUBROUTINE get_del_h_des(IJK,TYPE_OF_CELL,X0,Y0,Z0,Del_H,Nx,Ny,Nz, allow_neg_dist)
193 CHARACTER (LEN=*) :: TYPE_OF_CELL
194 DOUBLE PRECISION:: X0,Y0,Z0,XREF,YREF,ZREF
196 DOUBLE PRECISION :: Del_H,Diagonal
197 DOUBLE PRECISION :: Nx,Ny,Nz
199 LOGICAL :: ALLOW_NEG_DIST
201 SELECT CASE (type_of_cell)
205 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H_DES:' 206 WRITE(*,*)
' SCALAR CELL',ijk,
' IS NOT A CUT CELL' 208 WRITE(*,*)
' MFiX will exit now.' 223 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H_DES:' 224 WRITE(*,*)
' U-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 225 WRITE(*,*)
' MFiX will exit now.' 248 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H_DES:' 249 WRITE(*,*)
' V-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 250 WRITE(*,*)
' MFiX will exit now.' 273 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H_DES:' 274 WRITE(*,*)
' W-MOMENTUM CELL',ijk,
' IS NOT A CUT CELL' 275 WRITE(*,*)
' MFiX will exit now.' 296 WRITE(*,*)
' EROR IN SUBROUTINE GET_DEL_H_DES:' 297 WRITE(*,*)
'UNKNOWN TYPE OF CELL:',type_of_cell
298 WRITE(*,*)
'ACCEPTABLE TYPES ARE:' 300 WRITE(*,*)
'U_MOMENTUM' 301 WRITE(*,*)
'V_MOMENTUM' 302 WRITE(*,*)
'W_MOMENTUM' 306 del_h = nx * (x0 - xref) + ny * (y0 - yref) + nz * (z0 - zref)
316 IF(.NOT.allow_neg_dist)
THEN 317 diagonal = sqrt(
dx(i)**2 +
dy(j)**2 +
dz(k)**2)
319 IF (del_h <=
tol_delh * diagonal)
THEN 345 SUBROUTINE store_cut_face_info(IJK,TYPE_OF_CELL,N_CUT_FACE_NODES,COORD_CUT_FACE_NODES,X_MEAN,Y_MEAN,Z_MEAN)
362 CHARACTER (LEN=*) :: TYPE_OF_CELL
364 INTEGER :: N_CUT_FACE_NODES
365 DOUBLE PRECISION,
DIMENSION(3,15) :: COORD_CUT_FACE_NODES
366 DOUBLE PRECISION :: X_MEAN,Y_MEAN,Z_MEAN
367 DOUBLE PRECISION,
DIMENSION(3) :: NN,V,N1,N2
368 DOUBLE PRECISION :: NORM,N1_dot_N2
369 DOUBLE PRECISION,
DIMENSION(3) :: VECTEMP,VECTEMP2
373 nn(1) = coord_cut_face_nodes(2,1) - coord_cut_face_nodes(2,2)
374 nn(2) = coord_cut_face_nodes(1,2) - coord_cut_face_nodes(1,1)
383 IF(n_cut_face_nodes < 3)
THEN 384 WRITE(*,*)
' ERROR IN SUBROUTINE STORE_CUT_FACE_INFO:' 385 WRITE(*,*)
' CUT FACE HAS LESS THAN 3 NODES.' 386 WRITE(*,*)
' MFIX WILL EXIT NOW.' 396 vectemp = coord_cut_face_nodes(:,2)-coord_cut_face_nodes(:,1)
397 vectemp2 = coord_cut_face_nodes(:,3)-coord_cut_face_nodes(:,1)
402 norm = sqrt(dot_product(nn(:),nn(:)))
405 v(1) = x_mean - coord_cut_face_nodes(1,1)
406 v(2) = y_mean - coord_cut_face_nodes(2,1)
407 v(3) = z_mean - coord_cut_face_nodes(3,1)
409 IF (dot_product(nn,v) <
zero) nn = - nn
411 IF(n_cut_face_nodes > 3)
THEN 415 vectemp = coord_cut_face_nodes(:,2)-coord_cut_face_nodes(:,1)
416 vectemp2 = coord_cut_face_nodes(:,4)-coord_cut_face_nodes(:,1)
420 norm = sqrt(dot_product(n2(:),n2(:)))
423 v(1) = x_mean - coord_cut_face_nodes(1,1)
424 v(2) = y_mean - coord_cut_face_nodes(2,1)
425 v(3) = z_mean - coord_cut_face_nodes(3,1)
427 IF (dot_product(n2,v) <
zero) n2 = - n2
431 n1_dot_n2 = dot_product(n1,n2)
434 IF(n1_dot_n2<0.99)
THEN 444 SELECT CASE (type_of_cell)
448 refp_s(ijk,:) = coord_cut_face_nodes(:,1)
455 refp_u(ijk,:) = coord_cut_face_nodes(:,1)
460 refp_v(ijk,:) = coord_cut_face_nodes(:,1)
465 refp_w(ijk,:) = coord_cut_face_nodes(:,1)
468 WRITE(*,*)
'SUBROUTINE: STORE_CUT_FACE_INFO' 469 WRITE(*,*)
'UNKNOWN TYPE OF CELL:',type_of_cell
470 WRITE(*,*)
'ACCEPTABLE TYPES ARE:' 472 WRITE(*,*)
'U_MOMENTUM' 473 WRITE(*,*)
'V_MOMENTUM' 474 WRITE(*,*)
'W_MOMENTUM' 513 CHARACTER (LEN=*) :: TYPE_OF_CELL
514 DOUBLE PRECISION:: X_COPY,Y_COPY,Z_COPY
516 INTEGER :: NODE,N_N1,N_N2,NN
517 DOUBLE PRECISION :: Del_H
518 DOUBLE PRECISION :: Nx,Ny,Nz
520 LOGICAL :: ALLOW_NEG_DIST = .true.
552 CALL get_del_h_des(ijk,type_of_cell,x_copy,y_copy,z_copy,del_h,nx,ny,nz, allow_neg_dist)
559 WRITE(*,*)
' Warning: Negative delh detected in scalar cell :',ijk
560 WRITE(*,*)
' Location (X,Y,Z) = ',x_copy,y_copy,z_copy
561 WRITE(*,*)
' Reverting unit normal vector.' 611 DOUBLE PRECISION:: X0,Y0,Z0,XREF,YREF,ZREF
614 DOUBLE PRECISION :: D_TO_CUT, D_TO_PE_REF
616 INTEGER :: N_CUT_CELLS
619 INTEGER :: iproc,IERR,IJK_OFFSET,nb,n1,n2
620 INTEGER :: GLOBAL_N_CUT_CELLS
621 INTEGER,
DIMENSION(0:numPEs-1) :: disp,rcount
622 LOGICAL,
DIMENSION(0:numPEs-1) :: ALREADY_VISITED
623 DOUBLE PRECISION,
DIMENSION(0:numPEs-1,3) :: PE_REFP,ALL_PE_REFP
624 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: LOCAL_REFP_S,GLOBAL_REFP_S
626 IF(
mype==
pe_io)
WRITE(*,*)
'COMPUTING WALL DISTANCE...' 632 n_cut_cells = n_cut_cells + 1
633 list_of_cut_cells(n_cut_cells) = ijk
639 ALLOCATE (local_refp_s(n_cut_cells,3))
648 n_cut_cells = n_cut_cells + 1
649 local_refp_s(n_cut_cells,1) =
refp_s(ijk,1)
650 local_refp_s(n_cut_cells,2) =
refp_s(ijk,2)
651 local_refp_s(n_cut_cells,3) =
refp_s(ijk,3)
659 IF(n_cut_cells>0)
THEN 660 pe_refp(
mype,1) = pe_refp(
mype,1) / n_cut_cells
661 pe_refp(
mype,2) = pe_refp(
mype,2) / n_cut_cells
662 pe_refp(
mype,3) = pe_refp(
mype,3) / n_cut_cells
688 ijk_offset = ijk_offset + rcount(iproc)
704 ALLOCATE (global_refp_s(global_n_cut_cells,3))
712 global_refp_s = local_refp_s
714 call gatherv_1d( local_refp_s(:,1), n_cut_cells, global_refp_s(:,1), rcount, disp,
pe_io, ierr )
715 call gatherv_1d( local_refp_s(:,2), n_cut_cells, global_refp_s(:,2), rcount, disp,
pe_io, ierr )
716 call gatherv_1d( local_refp_s(:,3), n_cut_cells, global_refp_s(:,3), rcount, disp,
pe_io, ierr )
718 call bcast(global_refp_s(:,1))
719 call bcast(global_refp_s(:,2))
720 call bcast(global_refp_s(:,3))
724 already_visited(:) = .false.
769 already_visited(
mype) = .true.
771 DO nn = 1,n_cut_cells
773 xref = local_refp_s(nn,1)
774 yref = local_refp_s(nn,2)
775 zref = local_refp_s(nn,3)
777 d_to_cut = sqrt((x0 - xref)**2 + (y0 - yref)**2 + (z0 - zref)**2)
790 already_visited(iproc) = .true.
792 n2 = n1 + rcount(iproc) - 1
796 xref = global_refp_s(nn,1)
797 yref = global_refp_s(nn,2)
798 zref = global_refp_s(nn,3)
800 d_to_cut = sqrt((x0 - xref)**2 + (y0 - yref)**2 + (z0 - zref)**2)
817 IF(already_visited(iproc)) cycle
819 xref = all_pe_refp(iproc,1)
820 yref = all_pe_refp(iproc,2)
821 zref = all_pe_refp(iproc,3)
823 d_to_pe_ref = sqrt((x0 - xref)**2 + (y0 - yref)**2 + (z0 - zref)**2)
825 IF((
dwall(ijk) < d_to_pe_ref).AND. &
830 n2 = n1 + rcount(iproc) - 1
834 xref = global_refp_s(nn,1)
835 yref = global_refp_s(nn,2)
836 zref = global_refp_s(nn,3)
838 d_to_cut = sqrt((x0 - xref)**2 + (y0 - yref)**2 + (z0 - zref)**2)
856 DEALLOCATE (local_refp_s)
857 DEALLOCATE (global_refp_s)
subroutine allgather_1d(lbuf, gbuf, idebug)
double precision, dimension(:,:), allocatable normal_u
integer, dimension(:), allocatable i_of
logical, dimension(:), allocatable wall_u_at
subroutine test_del_h(IJK, TYPE_OF_CELL)
logical, dimension(:), allocatable cut_u_cell_at
double precision, dimension(:,:), allocatable debug_cg
subroutine gatherv_1d(lbuf, sendcnt, gbuf, rcount, disp, mroot, idebug)
double precision, dimension(0:15) z_node
double precision, dimension(0:15) y_node
logical, dimension(:), allocatable wall_v_at
double precision, dimension(0:dim_j) dy
subroutine allgather_1i(lbuf, gbuf, idebug)
double precision, dimension(:,:), allocatable normal_s
double precision, parameter undefined
double precision, dimension(0:dim_k) dz
double precision, dimension(:,:), allocatable refp_v
integer, dimension(:), allocatable k_of
double precision function, dimension(3) cross_product(A, B)
logical dwall_brute_force
integer, dimension(:), allocatable j_of
logical, dimension(:), allocatable wall_w_at
subroutine get_cell_node_coordinates(IJK, TYPE_OF_CELL)
logical, dimension(:), allocatable cut_w_cell_at
double precision, dimension(0:dim_i) dx
double precision, dimension(:,:), allocatable refp_s
integer, dimension(:), allocatable number_of_nodes
double precision, dimension(:,:), allocatable refp_u
double precision, dimension(:,:), allocatable refp_w
logical, dimension(:), allocatable cut_v_cell_at
logical, dimension(:), allocatable interior_cell_at
double precision, dimension(:,:), allocatable normal_w
logical, dimension(:), allocatable cut_cell_at
subroutine store_cut_face_info(IJK, TYPE_OF_CELL, N_CUT_FACE_NODES, COORD_CUT_FACE_NODES, X_MEAN, Y_MEAN, Z_MEAN)
integer, dimension(:), pointer sendproc2
subroutine write_progress_bar(I, I_MAX, JUSTIFICATION)
double precision tol_delh
subroutine get_del_h_des(IJK, TYPE_OF_CELL, X0, Y0, Z0, Del_H, Nx, Ny, Nz, allow_neg_dist)
subroutine get_distance_to_wall
double precision, dimension(:), allocatable dwall
subroutine get_del_h(IJK, TYPE_OF_CELL, X0, Y0, Z0, Del_H, Nx, Ny, Nz)
logical, dimension(:), allocatable blocked_cell_at
double precision, dimension(:,:), allocatable normal_v
integer, dimension(0:15) ijk_of_node
double precision, parameter zero
double precision, dimension(0:15) x_node
integer, dimension(:,:), allocatable connectivity