Skip to content
Snippets Groups Projects
define_bc_rot_sub_init.f90 5.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              ||===\\                                                         | 
    !              ||    \\                                                        |
    !              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
    !              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
    !              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
    !              ||===//     \\==//    \\==\\  \\==\\  ||                        |
    !                                                                              |
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              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
    
        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
    
    !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
    
    !------------------------------------------------------------------------------|