48 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: rinv, lambda
49 REAL,
DIMENSION(:,:,:,:),
ALLOCATABLE :: data
50 LOGICAL :: first_call = .true.
71 TYPE(
dict_typ),
POINTER,
INTENT(IN) :: config
72 INTEGER,
INTENT(IN) :: dir
78 IF (.NOT.physics%supports_farfield) &
79 CALL this%Error(
"InitBoundary_farfield", &
80 "boundary condition not supported for this type of physics")
84 SELECT CASE(this%direction%GetType())
86 ALLOCATE(this%Rinv(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,physics%VNUM), &
87 this%lambda(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,physics%VNUM), &
88 this%data(mesh%GINUM,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,physics%VNUM), &
91 ALLOCATE(this%Rinv(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,physics%VNUM), &
92 this%lambda(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,physics%VNUM), &
93 this%data(mesh%IMIN:mesh%IMAX,mesh%GJNUM,mesh%KMIN:mesh%KMAX,physics%VNUM), &
96 ALLOCATE(this%Rinv(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,physics%VNUM), &
97 this%lambda(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,physics%VNUM), &
98 this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,mesh%GKNUM,physics%VNUM), &
102 CALL this%Error(
"InitBoundary_farfield",
"Unable to allocate memory.")
106 this%first_call = .true.
108 this%Rinv(:,:,:) = 0.0
109 this%lambda(:,:,:) = 0.0
110 this%data(:,:,:,:) = 0.0
121 REAL,
INTENT(IN) :: time
126 SELECT CASE(this%direction%GetType())
129 IF (this%first_call)
THEN
134 pvar%data4d(mesh%IMIN-i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
135 = this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
137 CALL physics%CalculatePrim2RiemannX(mesh,mesh%IMIN-i,&
138 pvar,this%lambda,this%Rinv)
140 this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
141 = this%Rinv(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
144 this%first_call = .false.
149 CALL physics%CalculatePrim2RiemannX(mesh,mesh%IMIN-i+1,&
150 pvar,this%lambda,this%Rinv)
152 WHERE (this%lambda(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:).GE.0.0)
153 this%Rinv(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
154 = this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
157 CALL physics%CalculateRiemann2PrimX(mesh,mesh%IMIN-i,this%Rinv,pvar)
161 IF (this%first_call)
THEN
166 pvar%data4d(mesh%IMAX+i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
167 = this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
169 CALL physics%CalculatePrim2RiemannX(mesh,mesh%IMAX+i,&
170 pvar,this%lambda,this%Rinv)
172 this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
173 = this%Rinv(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
176 this%first_call = .false.
181 CALL physics%CalculatePrim2RiemannX(mesh,mesh%IMAX+i-1,&
182 pvar,this%lambda,this%Rinv)
184 WHERE (this%lambda(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:).LE.0.0)
185 this%Rinv(mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:) &
186 = this%data(i,mesh%JMIN:mesh%JMAX,mesh%KMIN:mesh%KMAX,:)
189 CALL physics%CalculateRiemann2PrimX(mesh,mesh%IMAX+i,this%Rinv,pvar)
193 IF (this%first_call)
THEN
198 pvar%data4d(mesh%IMIN:mesh%IMAX,mesh%JMIN-j,mesh%KMIN:mesh%KMAX,:) &
199 = this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:)
201 CALL physics%CalculatePrim2RiemannY(mesh,mesh%JMIN-j,&
202 pvar,this%lambda,this%Rinv)
204 this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:) &
205 = this%Rinv(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:)
208 this%first_call = .false.
213 CALL physics%CalculatePrim2RiemannY(mesh,mesh%JMIN-j+1,&
214 pvar,this%lambda,this%Rinv)
216 WHERE (this%lambda(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:).GE.0.0)
217 this%Rinv(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:) &
218 = this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:)
221 CALL physics%CalculateRiemann2PrimY(mesh,mesh%JMIN-j,this%Rinv,pvar)
225 IF (this%first_call)
THEN
230 pvar%data4d(mesh%IMIN:mesh%IMAX,mesh%JMAX+j,mesh%KMIN:mesh%KMAX,:) &
231 = this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:)
233 CALL physics%CalculatePrim2RiemannY(mesh,mesh%JMAX+j,&
234 pvar,this%lambda,this%Rinv)
236 this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:) &
237 = this%Rinv(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:)
240 this%first_call = .false.
245 CALL physics%CalculatePrim2RiemannY(mesh,mesh%JMAX+j-1,&
246 pvar,this%lambda,this%Rinv)
248 WHERE (this%lambda(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:).LE.0.0)
249 this%Rinv(mesh%IMIN:mesh%IMAX,mesh%KMIN:mesh%KMAX,:) &
250 = this%data(mesh%IMIN:mesh%IMAX,j,mesh%KMIN:mesh%KMAX,:)
253 CALL physics%CalculateRiemann2PrimY(mesh,mesh%JMAX+j,this%Rinv,pvar)
257 IF (this%first_call)
THEN
262 pvar%data4d(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,mesh%KMIN-k,:) &
263 = this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:)
266 CALL physics%CalculatePrim2RiemannZ(mesh,mesh%KMIN-k,&
267 pvar,this%lambda,this%Rinv)
270 this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:) &
271 = this%Rinv(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:)
274 this%first_call = .false.
279 CALL physics%CalculatePrim2RiemannZ(mesh,mesh%KMIN-k+1,&
280 pvar,this%lambda,this%Rinv)
282 WHERE (this%lambda(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:).GE.0.0)
283 this%Rinv(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:) &
284 = this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:)
287 CALL physics%CalculateRiemann2PrimZ(mesh,mesh%KMIN-k,this%Rinv,pvar)
291 IF (this%first_call)
THEN
296 pvar%data4d(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,mesh%KMAX+k,:) &
297 = this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:)
299 CALL physics%CalculatePrim2RiemannZ(mesh,mesh%KMAX+k,&
300 pvar,this%lambda,this%Rinv)
302 this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:) &
303 = this%Rinv(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:)
306 this%first_call = .false.
311 CALL physics%CalculatePrim2RiemannZ(mesh,mesh%KMAX+k-1,&
312 pvar,this%lambda,this%Rinv)
314 WHERE (this%lambda(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:).LE.0.0)
315 this%Rinv(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,:) &
316 = this%data(mesh%IMIN:mesh%IMAX,mesh%JMIN:mesh%JMAX,k,:)
319 CALL physics%CalculateRiemann2PrimZ(mesh,mesh%KMAX+k,this%Rinv,pvar)
330 DEALLOCATE(this%Rinv,this%lambda,this%data)
331 CALL this%Finalize_base()
integer, parameter farfield
uses far-field data and Riemann invariants
Boundary module for far field conditions.
subroutine finalize(this)
Destructor for farfield boundary conditions.
subroutine setboundarydata(this, Mesh, Physics, time, pvar)
Applies the farfield boundary condition.
character(len=32), parameter boundcond_name
subroutine initboundary_farfield(this, Mesh, Physics, dir, config)
Constructor for farfield boundary conditions.
Dictionary for generic data types.
derived class for compound of mesh arrays
integer, parameter east
named constant for eastern boundary
integer, parameter bottom
named constant for bottom boundary
integer, parameter south
named constant for southern boundary
integer, parameter top
named constant for top boundary
integer, parameter north
named constant for northern boundary
integer, parameter west
named constant for western boundary