!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              ||===\\                                                         | 
!              ||    \\                                                        |
!              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
!              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
!              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
!              ||===//     \\==//    \\==\\  \\==\\  ||                        |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              DEFINE_BC_SEGMENTED_S_LINE   Feb. 2009                          |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|

subroutine define_bc_rot_sub_init(params,osolve,vo,bcdef,nest)

!------------------------------------------------------------------------------|
!((((((((((((((((  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,phi,distmain,distrot
double precision :: distzonerad,distzoney,distzone,distedge
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
    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

!------------------------------------------------------------------------------|
