From fd6da22a36a85e62fce43892701594f1cdf77b4e Mon Sep 17 00:00:00 2001 From: Dave Whipp <dwhipp@dal.ca> Date: Mon, 21 Dec 2009 15:39:38 +0000 Subject: [PATCH] Added storage of zisodisp array --- src/isostasy.f90 | 186 ++++++++++++++++++++++++----------------------- 1 file changed, 95 insertions(+), 91 deletions(-) diff --git a/src/isostasy.f90 b/src/isostasy.f90 index 267f82bd..31c69c75 100644 --- a/src/isostasy.f90 +++ b/src/isostasy.f90 @@ -1,4 +1,4 @@ -subroutine isostasy (params,weightel,ov,surface,mat) +subroutine isostasy (params,weightel,ov,surface,mat,zisodisp) ! first go at imposing isostasy ! this routine assumes that the original surface are flat @@ -15,6 +15,7 @@ type(octreev) ov double precision weightel(ov%nleaves) type(sheet) surface(params%ns) type(material) mat(0:params%nmat) +double precision zisodisp(2**params%levelmax_oct+1,2**params%levelmax_oct+1) double precision xc,yc,zc,eps integer i,j,ii,jj,kk,ie,dlev,is,iproc,nproc,ierr,ic @@ -107,7 +108,7 @@ xk=-mat(surface(params%ns)%material)%density*params%density_difference*9.81d0 d=1.d11/12.d0/(1.d0-0.25d0**2)*params%elastic_plate_thickness**3 dh=hx/(nflex-1) -if (iproc.eq.0) print*,'hx,dh,xk,d',hx,dh,xk,d +!if (iproc.eq.0) print*,'hx,dh,xk,d',hx,dh,xk,d ii=nflex/2-nb/2-1 jj=ii @@ -118,7 +119,7 @@ flex=0.d0 enddo enddo -if (iproc.eq.0) print*,'poids',minval(flex),maxval(flex) +!if (iproc.eq.0) print*,'poids',minval(flex),maxval(flex) do j=1,nflex call dsinft (flex(1,j),nflex) @@ -165,7 +166,7 @@ pihx=pi/hx call dsinft (flex(1,j),nflex) enddo -if (iproc.eq.0) print*,'def in m',minval(flex),maxval(flex) +!if (iproc.eq.0) print*,'def in m',minval(flex),maxval(flex) ii=nflex/2-nb/2-1 jj=ii @@ -177,7 +178,7 @@ jj=ii deallocate (flex,work) -if (iproc.eq.0) print*,'dimensionless def ',minval(weight),maxval(weight) +!if (iproc.eq.0) print*,'dimensionless def ',minval(weight),maxval(weight) endif @@ -206,59 +207,62 @@ if ((ii-1)*(ii-nb-1).gt.0 .or. (jj-1)*(jj-nb-1).gt.0) stop 'error in isostasy' diso(i)=work(ii,jj) enddo -goto 3333 +!goto 3333 ! old version : to be neglected new is much faster -diso=0.d0 -np=0 - do ie=1,ov%nleaves - xc=0.d0;yc=0.d0;zc=0.d0 - do i=1,8 - xc=xc+ov%x(ov%icon(i,ie)) - yc=yc+ov%y(ov%icon(i,ie)) - zc=zc+ov%z(ov%icon(i,ie)) - enddo - xc=xc/8.d0 - yc=yc/8.d0 - zc=zc/8.d0 - call octree_find_leaf (ov%octree,ov%noctree,xc,yc,zc,leaf,level,loc,x0,y0,z0,dxyz) -! call octree_find_leaf (ov%octree,ov%noctree,xc,yc,eps,leafb,levelb,locb,x0b,y0b,z0b,dxyzb) -! disoel=(w(leafb)-weightref)/(mat(surface(params%ns)%material)%density) - w=0.d0 - dlev=params%levelmax_oct-level - call find_integer_coordinates (x0+dd,y0+dd,z0+dd,ii,jj,kk,params%levelmax_oct) - ii=min(ii,2**(params%levelmax_oct)-2**dlev) - jj=min(jj,2**(params%levelmax_oct)-2**dlev) - do i=1,2**dlev - do j=1,2**dlev - w=w+weight(ii+i,jj+j) - enddo - enddo - disoel=w/(2**dlev*2.d0**dlev) -! disoel=(w-weightref)/(mat(surface(params%ns)%material)%density) - do i=1,8 - ic=ov%icon(i,ie) - np(ic)=np(ic)+1 - diso(ic)=diso(ic)+disoel - enddo - enddo - - do i=1,ov%nnode - if (np(i).ne.0) then - diso(i)=diso(i)/np(i) - else - diso(i)=0 - print*,'error np',i,ov%x(i),ov%y(i),ov%z(i) - endif - enddo - -3333 continue +!diso=0.d0 +!np=0 +! do ie=1,ov%nleaves +! xc=0.d0;yc=0.d0;zc=0.d0 +! do i=1,8 +! xc=xc+ov%x(ov%icon(i,ie)) +! yc=yc+ov%y(ov%icon(i,ie)) +! zc=zc+ov%z(ov%icon(i,ie)) +! enddo +! xc=xc/8.d0 +! yc=yc/8.d0 +! zc=zc/8.d0 +! call octree_find_leaf (ov%octree,ov%noctree,xc,yc,zc,leaf,level,loc,x0,y0,z0,dxyz) +!! call octree_find_leaf (ov%octree,ov%noctree,xc,yc,eps,leafb,levelb,locb,x0b,y0b,z0b,dxyzb) +!! disoel=(w(leafb)-weightref)/(mat(surface(params%ns)%material)%density) +! w=0.d0 +! dlev=params%levelmax_oct-level +! call find_integer_coordinates (x0+dd,y0+dd,z0+dd,ii,jj,kk,params%levelmax_oct) +! ii=min(ii,2**(params%levelmax_oct)-2**dlev) +! jj=min(jj,2**(params%levelmax_oct)-2**dlev) +! do i=1,2**dlev +! do j=1,2**dlev +! w=w+weight(ii+i,jj+j) +! enddo +! enddo +! disoel=w/(2**dlev*2.d0**dlev) +!! disoel=(w-weightref)/(mat(surface(params%ns)%material)%density) +! do i=1,8 +! ic=ov%icon(i,ie) +! np(ic)=np(ic)+1 +! diso(ic)=diso(ic)+disoel +! enddo +! enddo +! +! do i=1,ov%nnode +! if (np(i).ne.0) then +! diso(i)=diso(i)/np(i) +! else +! diso(i)=0 +! print*,'error np',i,ov%x(i),ov%y(i),ov%z(i) +! endif +! enddo +! +!3333 continue if (params%debug>=1.and.iproc.eq.0) then write(*,'(a,f10.7,1x,f10.7)') shift//'Isostatic velocity range = ',minval(diso)/params%dt,maxval(diso)/params%dt endif +! Store the total displacement of the basal node plane +if (params%isobc) zisodisp=zisodisp-work + ! transforms the displacements into velocities and add this contribution to the velocity ! solution of the Stokes equation before interpolation onto the surfaces and their advection @@ -267,47 +271,47 @@ np=0 ov%wnode(i)=ov%wnode(i)-diso(i)/params%dt enddo -goto 1111 - -! display results into a vtk file for debugging - -iunit=30 -open(unit=iunit,file='isostasy.vtk') -write(iunit,'(a)')'# vtk DataFile Version 3.0' -write(iunit,'(a)')'velocities' -write(iunit,'(a)')'ASCII' -write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID' -write(iunit,'(a7,i10,a6)')'POINTS ',ov%nnode,' float' - -do i=1,ov%nnode -write(iunit,'(3f16.11)')ov%x(i),ov%y(i),ov%z(i) -enddo - -write(iunit,'(A6, 2I10)') 'CELLS ',ov%nleaves,(1+8)*ov%nleaves -do ie=1,ov%nleaves -write(iunit,'(9I10)')8,ov%icon(1:8,ie)-1 -enddo - -write(iunit,'(A11, I10)') 'CELL_TYPES ',ov%nleaves -do ie=1,ov%nleaves - write(iunit,'(I2)')11 ! octree (8 nodes) -end do - -write(iunit,'(a11,i10)')'POINT_DATA ',ov%nnode - -write(iunit,'(a)')'VECTORS iso float' -do i=1,ov%nnode - write(iunit,'(3e11.4)')0.,0.,-diso(i)/params%dt -enddo - -write(iunit,'(a)')'VECTORS velo float' -do i=1,ov%nnode - write(iunit,'(3e11.4)')0.,0.,ov%wnode(i) -enddo - -close (iunit) - -1111 continue +!goto 1111 +! +!! display results into a vtk file for debugging +! +!iunit=30 +!open(unit=iunit,file='isostasy.vtk') +!write(iunit,'(a)')'# vtk DataFile Version 3.0' +!write(iunit,'(a)')'velocities' +!write(iunit,'(a)')'ASCII' +!write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID' +!write(iunit,'(a7,i10,a6)')'POINTS ',ov%nnode,' float' +! +!do i=1,ov%nnode +!write(iunit,'(3f16.11)')ov%x(i),ov%y(i),ov%z(i) +!enddo +! +!write(iunit,'(A6, 2I10)') 'CELLS ',ov%nleaves,(1+8)*ov%nleaves +!do ie=1,ov%nleaves +!write(iunit,'(9I10)')8,ov%icon(1:8,ie)-1 +!enddo +! +!write(iunit,'(A11, I10)') 'CELL_TYPES ',ov%nleaves +!do ie=1,ov%nleaves +! write(iunit,'(I2)')11 ! octree (8 nodes) +!end do +! +!write(iunit,'(a11,i10)')'POINT_DATA ',ov%nnode +! +!write(iunit,'(a)')'VECTORS iso float' +!do i=1,ov%nnode +! write(iunit,'(3e11.4)')0.,0.,-diso(i)/params%dt +!enddo +! +!write(iunit,'(a)')'VECTORS velo float' +!do i=1,ov%nnode +! write(iunit,'(3e11.4)')0.,0.,ov%wnode(i) +!enddo +! +!close (iunit) +! +!1111 continue deallocate (np) deallocate (diso) -- GitLab