Skip to content
Snippets Groups Projects
define_surface.f90 11.2 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 threads
    use definitions
    
    implicit none
    
    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 err,ierr,iproc,nproc,iface,ioc,i,j,k,is,noctree,nnode,nleaves,nface,nt
    integer icon,inn,inl,nlsf,ncl,nf,inr,kx,ky,kz,kt
    logical inf,wlif
    character*7 ic
    double precision s,p,t,x,y,z,u,v,w,xlsf,e2d,don,con,activation_time
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    
    INCLUDE 'mpif.h'
    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)
                call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
                allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
                allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
                allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
                allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
                allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
                allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%r),'dp',+1)
                allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%s),'dp',+1)
                allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
                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)
                call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
                allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
                allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
                allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
                allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
                allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
                allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%r),'dp',+1)
                allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%s),'dp',+1)
                allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
                call heap (threadinfo,'surface(is)%icon','define_surface',size(surface(is)%icon),'int',+1)
    
                call create_surf(surface(is),is,params%debug)
             endif
          current_time=0.d0
       end do
    else
       open (9,file=trim(params%restartfile),status='old',form='unformatted')
       read (9) noctree, &
                  nnode,   &
                  nleaves, &
                  nface,   &
                  nlsf,    &
                  ncl,     &
                  current_time 
       read (9) (x,              &
                   y,              &
                   z,              & 
                   u,              &
                   v,              &
                   w,              &
                   (xlsf,j=1,nlsf),&
                   t,              &
                   p,              &
                   s,              &
                   kx,             &
                   ky,             &
                   kz,             &
                   kt,             &
                   i=1,nnode)
       read (9) ((icon,k=1,8),con,e2d,wlif,i=1,nleaves)
       read (9) (ioc,k=1,noctree)                    
       read (9) ((iface,k=1,9),i=1,nface)
       read (9) (inn, &
                   inl, &
                   nf,  &
                   inr, &
                   inf, &
                   i=1,nnode)
       read (9) (nf,i=1,nface)
       ! read surface information
       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)
          call heap (threadinfo,'surface(is)%x','define_surface',size(surface(is)%x),'dp',+1)
          allocate (surface(is)%y(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%y','define_surface',size(surface(is)%y),'dp',+1)
          allocate (surface(is)%z(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%z','define_surface',size(surface(is)%z),'dp',+1)
          allocate (surface(is)%xn(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%xn','define_surface',size(surface(is)%xn),'dp',+1)
          allocate (surface(is)%yn(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%yn','define_surface',size(surface(is)%yn),'dp',+1)
          allocate (surface(is)%zn(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%zn','define_surface',size(surface(is)%zn),'dp',+1)
          allocate (surface(is)%r(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%r','define_surface',size(surface(is)%x),'dp',+1)
          allocate (surface(is)%s(surface(is)%nsurface),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%s','define_surface',size(surface(is)%x),'dp',+1)
          allocate (surface(is)%icon(3,surface(is)%nt),stat=threadinfo%err)
          call heap (threadinfo,'surface(is)%icon','define_surface',size(surface(is)%icon),'int',+1)
    
    
          read (9) (surface(is)%r(i),  &
                      surface(is)%s(i),  &
                      surface(is)%x(i),  &
                      surface(is)%y(i),  &
                      surface(is)%z(i),  &
                      surface(is)%xn(i), &
                      surface(is)%yn(i), &
                      surface(is)%zn(i), &
                      u,v,w,             & 
                      i=1,surface(is)%nsurface)
          read (9) ((surface(is)%icon(k,i),k=1,3),i=1,surface(is)%nt)
    
       end do
       close (9)
    end if
    
    return
    end
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|