Newer
Older
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
! |
! ||===\\ |
! || \\ |
! || || //==\\ || || //==|| ||/==\\ |
! || || || || || || || || || || |
! || // || || || || || || || |
! ||===// \\==// \\==\\ \\==\\ || |
! |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
! |
! 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 ))))))))))))))))))))
!------------------------------------------------------------------------------|
Dave Whipp
committed
!use mpi
Dave Whipp
committed
use threads
include 'mpif.h'
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
Dave Whipp
committed
integer nlsf,ncl
integer vermajor,verminor,verstat,verrev
Dave Whipp
committed
logical isostasyout,isobcout,nestout,compactionout
Dave Whipp
committed
double precision activation_time
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
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
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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
Dave Whipp
committed
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
Dave Whipp
committed
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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)
Dave Whipp
committed
read (9) surface(is)%nsurface,activation_time,surface(is)%nt
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)
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)
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)
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)
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)
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)
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)
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)
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)
Dave Whipp
committed
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
Dave Whipp
committed
! correct surface for vertical exageration
surface(is)%z=surface(is)%z/params%vex
surface(is)%zn=surface(is)%zn/params%vex