Newer
Older
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
! |
! ||===\\ |
! || \\ |
! || || //==\\ || || //==|| ||/==\\ |
! || || || || || || || || || || |
! || // || || || || || || || |
! ||===// \\==// \\==\\ \\==\\ || |
! |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
! |
! DEFINE_BC_SEGMENTED_S_LINE Feb. 2009 |
! |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
subroutine define_bc_rot_sub_init(params,osolve,vo,bcdef)
!------------------------------------------------------------------------------|
!(((((((((((((((( Purpose of the routine )))))))))))))))))))))))))))))))))))))
!------------------------------------------------------------------------------|
! This routine assigns the velocity boundary conditions for the rotational |
! subduction geometry |
!------------------------------------------------------------------------------|
!(((((((((((((((( declaration of the subroutine arguments ))))))))))))))))))))
!------------------------------------------------------------------------------|
use definitions
!use mpi
implicit none
include 'mpif.h'
type (parameters) params
type (octreesolve) osolve
type (void) vo
type (bc_definition) bcdef
type (nest_info) nest
!------------------------------------------------------------------------------|
!(((((((((((((((( declaration of the subroutine internal variables )))))))))))))
!------------------------------------------------------------------------------|
integer i,iproc,nproc,ierr,tempcase
double precision :: eps,pi,y0,h,rx,wy,vin
double precision :: rmain,zmain,omega,theta,distmain,distrot
double precision :: nl_heat,hr,depth,ztemp,shellwidth
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
call mpi_comm_size (mpi_comm_world,nproc,ierr)
call mpi_comm_rank (mpi_comm_world,iproc,ierr)
!basic constants
eps=1.d-10
pi=atan(1.d0)*4.d0
!set fixed to 0 everywhere
osolve%kfix=0
osolve%kfixt=0
!parameters from input file
y0=bcdef%bc_parameters(1)
h=bcdef%bc_parameters(2)
rx=bcdef%bc_parameters(3)
wy=bcdef%bc_parameters(4)
vin=bcdef%bc_parameters(5)
shellwidth = bcdef%bc_parameters(6)
tempcase=idint(bcdef%bc_parameters(7))
nl_heat=bcdef%bc_parameters(8)/params%tempscale
hr=bcdef%bc_parameters(9)
ztemp = params%ztemp*params%vex
!Derived parameters from input values
rmain=(h**2+rx**2)/(2.d0*h)
zmain=h-rmain
omega=vin/rmain
!rotating element is sphere
do i=1,osolve%nnode
!distance from center of sphere
distmain=sqrt(osolve%x(i)**2+((osolve%y(i)-y0)*rx/(0.5d0*wy))**2 + &
(osolve%z(i)*params%vex-zmain)**2)
!distance from axis of rotation
distrot=sqrt(osolve%x(i)**2+(osolve%z(i)*params%vex-zmain)**2)
!setting velocity in indenter
if (distmain<rmain) then
theta=asin(osolve%x(i)/distrot)
osolve%kfix((i-1)*3+1)=1
osolve%u(i)=distrot*omega*cos(theta)
osolve%kfix((i-1)*3+2)=1
osolve%v(i)=0.d0
osolve%kfix((i-1)*3+3)=1
osolve%w(i)=-osolve%x(i)*omega
elseif (distmain > rmain+shellwidth) then
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
osolve%kfix((i-1)*3+1)=1
osolve%u(i)=0.d0
osolve%kfix((i-1)*3+2)=1
osolve%v(i)=0.d0
osolve%kfix((i-1)*3+3)=1
osolve%w(i)=0.d0
end if
!y=0 face free slip
if (osolve%y(i)<eps) then
!no flux through face
osolve%kfix((i-1)*3+2)=1 ; osolve%v(i)=0.d0
end if
!y=1 face free slip
if (osolve%y(i)>(1.d0-eps)) then
!no flux through face
osolve%kfix((i-1)*3+2)=1 ; osolve%v(i)=0.d0
end if
!x=0 face
if (osolve%x(i)<eps) then
!set temperature
osolve%kfixt(i) = 1
depth = ztemp - osolve%z(i)*params%vex
select case (tempcase)
case (1)
!"typical isotherm taken from R.Bendicks simulation
!nl_heat is scaled nonlinear heat component hr^2*S_o/k_T
osolve%temp(i) = (depth/ztemp) + &
nl_heat*((1.d0-exp(-depth/hr))-(1.d0-exp(-ztemp/hr))*depth/ztemp)
case default
osolve%temp(i) = depth/ztemp
end select
end if
!z=0 face
if (osolve%z(i) < eps) then
if (distmain > rmain+shellwidth) then
osolve%kfixt(i) = 1
osolve%temp(i) = 1.d0
end if
end if
!x=1 face with influx vback
!if (osolve%x(i)>1.d0-eps) then
!end if
!z=1 face
if (osolve%z(i) > 1.d0-eps) then
osolve%kfix((i-1)*3+1)=1 ; osolve%u(i)=0.d0 !x-direction
osolve%kfix((i-1)*3+2)=1 ; osolve%v(i)=0.d0 !y-direction
osolve%kfix((i-1)*3+3)=1 ; osolve%w(i)=0.d0 !z-direction
osolve%kfixt(i)=1 ; osolve%temp(i)=0.d0
end if
if (.not.vo%influid(i)) then
osolve%kfixt(i)=1
osolve%temp(i)=0.d0
endif
end do
end
!------------------------------------------------------------------------------|