Skip to content
Snippets Groups Projects
define_surface.f90 12.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              ||===\\                                                         | 
    !              ||    \\                                                        |
    !              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
    !              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
    !              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
    !              ||===//     \\==//    \\==\\  \\==\\  ||                        |
    !                                                                              |
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              DEFINE_SURFACE    Nov. 2006                                     |
    !                                                                              |
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    
    subroutine define_surface (params,surface,threadinfo,total,step,inc,current_time)
    
    !------------------------------------------------------------------------------|
    !(((((((((((((((( Purpose of the routine  ))))))))))))))))))))))))))))))))))))))
    !------------------------------------------------------------------------------|
    ! if irestart=0, this routine allocates and creates the ns surfaces present 
    ! in the system. Otherwise, it reads form a user supplied file name the 
    ! surfaces as they were at the end of a previous run. In this case, since the 
    ! run output files contain all the octree+lsf+cloud+surface informations, 
    ! the routine first reads dummy parameters until it gets to the real 
    ! interesting surface information .
    
    !------------------------------------------------------------------------------|
    !((((((((((((((((  declaration of the subroutine arguments  ))))))))))))))))))))
    !------------------------------------------------------------------------------|
    
    use definitions
    
    type(parameters) params
    type(sheet),dimension(params%ns)::surface
    type(thread) threadinfo
    double precision total, step, inc, current_time
    
    !------------------------------------------------------------------------------|
    !(((((((((((((((( declaration of the subroutine internal variables )))))))))))))
    !------------------------------------------------------------------------------|
         
    
    integer ierr,iproc,nproc,is,noctree,nnode,nleaves,nface
    
    integer vermajor,verminor,verstat,verrev
    
    logical isostasyout,isobcout,nestout,compactionout
    
    character*7 ic
    
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    
    call mpi_comm_size (mpi_comm_world,nproc,ierr)
    call mpi_comm_rank (mpi_comm_world,iproc,ierr)
    
    if (params%irestart.eq.0) then
       do is=1,params%ns
          call int_to_char(ic,2,is)
          if (iproc.eq.0) call show_time(total,step,inc,1,'surface '//ic(1:2)//'$')
             if (surface(is)%activation_time.ge.0.d0) then
                ! if activation_time ge 0 than the surface is simply made as a copy of the top (1st) surface
                if (is.eq.0) call stop_run ('First surface must be active at all times (activation_time<0)$')
                surface(is)%nsurface=surface(1)%nsurface
                surface(is)%levelt=surface(1)%levelt
                surface(is)%nt=surface(1)%nt
                surface(is)%itype=surface(1)%itype
                surface(is)%surface_type=surface(1)%surface_type
                surface(is)%rand=surface(1)%rand
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%x(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%r),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%s),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%icon','define_surface',size(surface(is)%icon),'int',+1)
    
                surface(is)%x=surface(1)%x
                surface(is)%y=surface(1)%y
                surface(is)%z=surface(1)%z
                surface(is)%xn=surface(1)%xn
                surface(is)%yn=surface(1)%yn
                surface(is)%zn=surface(1)%zn
                surface(is)%r=surface(1)%r
                surface(is)%s=surface(1)%s
                surface(is)%icon=surface(1)%icon(:,1:surface(is)%nt)
             else
                ! otherwise create_surface is invoked
    !            surface(is)%nsurface=(2**surface(is)%levelt+1)*(2**surface(is)%levelt+1)
                surface(is)%nsurface=(2**surface(is)%levelt+2)*(2**surface(is)%levelt+2)   !opla
    !            surface(is)%nt=(2**surface(is)%levelt)*(2**surface(is)%levelt)*2
                surface(is)%nt=(2**surface(is)%levelt +1)*(2**surface(is)%levelt +1)*2      ! opla
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%x(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%r),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%s),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
                allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
    
                if (params%debug.gt.1) call heap (threadinfo,'surface(is)%icon','define_surface',size(surface(is)%icon),'int',+1)
    
                call create_surf(surface(is),is,params%debug)
    
                surface(is)%z=surface(is)%z/params%vex
                surface(is)%zn=surface(is)%zn/params%vex
    
             endif
          current_time=0.d0
       end do
    else
       open (9,file=trim(params%restartfile),status='old',form='unformatted')
    
       ! Read version number
       read (9) vermajor,verminor,verstat,verrev
       if (iproc==0) then
         if (vermajor/=params%vermajor .or. verminor/=params%verminor) then
           write(*,'(a,i1,a,i1,a,i1,a,i1)') 'DOUAR-WSMP v',params%vermajor,'.',params%verminor,' cannot be restarted using output from v',vermajor,'.',verminor
           write(*,'(a)') 'because the output formats are not compatible. To restart with this output'
           write(*,'(a,i1,a,i1,a)') 'please use DOUAR-WSMP v',params%vermajor,'.',params%verminor,'.'
           stop
         endif
       endif
    
    
       ! Read optional output flags
       read (9) isostasyout,isobcout,nestout,compactionout
    
    
       read (9) noctree,nnode,nleaves,nface,nlsf,ncl,current_time
    
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
    
       if (isostasyout) read (9)
       if (compactionout) read (9)
    
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
    
       if (compactionout) read (9)
    
       read (9)
       read (9)
    
       read (9)
       read (9)
       read (9)
       read (9)
       read (9)
    
       read (9)
    
    
       ! read surface information
    
    Dave Whipp's avatar
    Dave Whipp committed
       do is=1,nlsf
    
          read (9) surface(is)%nsurface,activation_time,surface(is)%nt
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%x(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%x),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%x),'dp',+1)
    
    Douglas Guptill's avatar
    Douglas Guptill committed
          allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
    
          if (params%debug.gt.1) call heap (threadinfo,'surface(is)%icon','define_surface',size(surface(is)%icon),'int',+1)
    
          read (9) surface(is)%r
          read (9) surface(is)%s
          read (9) surface(is)%x
          read (9) surface(is)%y
          read (9) surface(is)%z
          read (9) surface(is)%xn
          read (9) surface(is)%yn
          read (9) surface(is)%zn
          read (9)
          read (9)
          read (9)
          read (9) surface(is)%icon
    
    ! correct surface for vertical exageration
    
          surface(is)%z=surface(is)%z/params%vex
          surface(is)%zn=surface(is)%zn/params%vex
    
    
       end do
       close (9)
    end if
    
    return
    end
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|