Skip to content

Commit 98620a7

Browse files
Add linear drag and use impulse on wall for kelvin wave setup
1 parent 81f5081 commit 98620a7

4 files changed

Lines changed: 31 additions & 27 deletions

File tree

examples/linear_shallow_water2d_kelvinwaves.f90

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ program linear_shallow_water2d_kelvinwaves
3333
character(SELF_INTEGRATOR_LENGTH),parameter :: integrator = 'rk3' ! Which integrator method
3434
integer,parameter :: controlDegree = 7 ! Degree of control polynomial
3535
integer,parameter :: targetDegree = 16 ! Degree of target polynomial
36-
real(prec),parameter :: dt = 0.001_prec ! Time-step size
37-
real(prec),parameter :: endtime = 1.0_prec !30.0_prec ! (s);
38-
real(prec),parameter :: f0 = -10.0_prec ! reference coriolis parameter (1/s)
36+
real(prec),parameter :: dt = 0.0025_prec ! Time-step size
37+
real(prec),parameter :: endtime = 30.0_prec ! (s);
38+
real(prec),parameter :: f0 = 10.0_prec ! reference coriolis parameter (1/s)
39+
real(prec),parameter :: Cd = 0.5_prec ! Linear drag coefficient (1/s)
3940
real(prec),parameter :: iointerval = 0.05 ! Write files 20 times per characteristic time scale
4041
real(prec) :: r
4142
real(prec) :: e0,ef ! Initial and final entropy
@@ -71,25 +72,26 @@ program linear_shallow_water2d_kelvinwaves
7172
! Set the resting surface height and gravity
7273
modelobj%H = H
7374
modelobj%g = g
75+
modelobj%Cd = Cd
7476

7577
! ! Set the initial conditions
76-
!call modelobj%solution%SetEquation(3,'f = 0.001*exp( -( x^2 + y^2 )/0.02 ) ')
77-
!call modelobj%solution%SetInteriorFromEquation(geometry,0.0_prec)
78+
call modelobj%solution%SetEquation(3,'f = 0.001*exp( -( (x-1.0)^2 + y^2 )/0.02 ) ')
79+
call modelobj%solution%SetInteriorFromEquation(geometry,0.0_prec)
7880

79-
do iel = 1,modelobj%mesh%nElem
80-
do j = 1,modelobj%solution%N+1
81-
do i = 1,modelobj%solution%N+1
82-
call random_number(r)
83-
! modelobj%solution%interior(i,j,iel,3) = modelobj%solution%interior(i,j,iel,3) + 0.0001_prec*(r-0.5)
84-
modelobj%solution%interior(i,j,iel,3) = 0.0001_prec*(r-0.5)
81+
! do iel = 1,modelobj%mesh%nElem
82+
! do j = 1,modelobj%solution%N+1
83+
! do i = 1,modelobj%solution%N+1
84+
! call random_number(r)
85+
! modelobj%solution%interior(i,j,iel,3) = modelobj%solution%interior(i,j,iel,3)*(1.0_prec+1.0_prec*(r-0.5))
86+
! ! modelobj%solution%interior(i,j,iel,3) = 0.0001_prec*(r-0.5)
8587

86-
enddo
87-
enddo
88-
enddo
89-
call modelobj%solution%UpdateDevice()
88+
! enddo
89+
! enddo
90+
! enddo
91+
! call modelobj%solution%UpdateDevice()
9092

9193
call modelobj%SetCoriolis(f0)
92-
call modelobj%DiagnoseGeostrophicVelocity()
94+
! call modelobj%DiagnoseGeostrophicVelocity()
9395

9496
call modelobj%WriteModel()
9597
call modelobj%IncrementIOCounter()
@@ -108,9 +110,8 @@ program linear_shallow_water2d_kelvinwaves
108110

109111
ef = modelobj%entropy
110112

111-
print*,e0,ef
112-
if(abs(ef-e0) > epsilon(e0)) then
113-
print*,"Warning: Final entropy greater than initial entropy! ",e0,ef
113+
if(ef > e0) then
114+
print*,"Warning: Final entropy greater than initial entropy! ",ef,e0
114115
endif
115116

116117
! Clean up

src/SELF_LinearShallowWater2D_t.f90

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ module self_LinearShallowWater2D_t
3434
type,extends(dgmodel2d) :: LinearShallowWater2D_t
3535
real(prec) :: H = 0.0_prec ! uniform resting depth
3636
real(prec) :: g = 0.0_prec ! acceleration due to gravity
37+
real(prec) :: Cd = 0.0_prec ! Linear drag coefficient (1/s)
3738
type(MappedScalar2D) :: fCori ! The coriolis parameter
3839

3940
contains
@@ -246,8 +247,8 @@ subroutine sourcemethod_LinearShallowWater2D_t(this)
246247

247248
s = this%solution%interior(i,j,iel,1:this%nvar)
248249

249-
this%source%interior(i,j,iel,1) = this%fCori%interior(i,j,iel,1)*s(2) ! du/dt = f*v
250-
this%source%interior(i,j,iel,2) = -this%fCori%interior(i,j,iel,1)*s(1) ! dv/dt = -f*u
250+
this%source%interior(i,j,iel,1) = this%fCori%interior(i,j,iel,1)*s(2)-this%Cd*s(1) ! du/dt = f*v - Cd*u
251+
this%source%interior(i,j,iel,2) = -this%fCori%interior(i,j,iel,1)*s(1)-this%Cd*s(2) ! dv/dt = -f*u - Cd*v
251252

252253
enddo
253254

src/gpu/SELF_LinearShallowWater2D.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,25 +144,25 @@ extern "C"
144144
}
145145
}
146146

147-
__global__ void sourcemethod_LinearShallowWater2D_gpukernel(real *solution, real *source, real *fCori, int ndof){
147+
__global__ void sourcemethod_LinearShallowWater2D_gpukernel(real *solution, real *source, real *fCori, real Cd, int ndof){
148148
uint32_t idof = threadIdx.x + blockIdx.x*blockDim.x;
149149

150150
if( idof < ndof ){
151151
real u = solution[idof];
152152
real v = solution[idof + ndof];
153153

154-
source[idof] = fCori[idof]*v; // du/dt = fv
155-
source[idof+ndof] = -fCori[idof]*u; // dv/dt = -fu
154+
source[idof] = fCori[idof]*v - Cd*u; // du/dt = fv - Cd*u
155+
source[idof+ndof] = -fCori[idof]*u - Cd*v; // dv/dt = -fu - Cd*v
156156

157157
}
158158

159159
}
160160
extern "C"
161161
{
162-
void sourcemethod_LinearShallowWater2D_gpu(real *solution, real *source, real *fCori, int N, int nel, int nvar){
162+
void sourcemethod_LinearShallowWater2D_gpu(real *solution, real *source, real *fCori, real Cd, int N, int nel, int nvar){
163163
int ndof = (N+1)*(N+1)*nel;
164164
int threads_per_block = 256;
165165
int nblocks_x = ndof/threads_per_block +1;
166-
sourcemethod_LinearShallowWater2D_gpukernel<<<dim3(nblocks_x,1,1), dim3(threads_per_block,1,1), 0, 0>>>(solution,source,fCori,ndof);
166+
sourcemethod_LinearShallowWater2D_gpukernel<<<dim3(nblocks_x,1,1), dim3(threads_per_block,1,1), 0, 0>>>(solution,source,fCori,Cd,ndof);
167167
}
168168
}

src/gpu/SELF_LinearShallowWater2D.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@ subroutine fluxmethod_LinearShallowWater2D_gpu(solution,flux,g,H,N,nel,nvar) &
7171
endinterface
7272

7373
interface
74-
subroutine sourcemethod_LinearShallowWater2D_gpu(solution,source,fCori,N,nel,nvar) &
74+
subroutine sourcemethod_LinearShallowWater2D_gpu(solution,source,fCori,Cd,N,nel,nvar) &
7575
bind(c,name="sourcemethod_LinearShallowWater2D_gpu")
7676
use iso_c_binding
7777
use SELF_Constants
7878
type(c_ptr),value :: solution,source,fCori
79+
real(c_prec),value :: Cd
7980
integer(c_int),value :: N,nel,nvar
8081
endsubroutine sourcemethod_LinearShallowWater2D_gpu
8182
endinterface
@@ -165,6 +166,7 @@ subroutine sourcemethod_LinearShallowWater2D(this)
165166
call sourcemethod_LinearShallowWater2D_gpu(this%solution%interior_gpu, &
166167
this%source%interior_gpu, &
167168
this%fCori%interior_gpu, &
169+
this%Cd, &
168170
this%solution%interp%N, &
169171
this%solution%nelem, &
170172
this%solution%nvar)

0 commit comments

Comments
 (0)