Neko 1.99.6
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
drag_torque.f90
Go to the documentation of this file.
1! Copyright (c) 2008-2020, UCHICAGO ARGONNE, LLC.
2! Copyright (c) 2025, The Neko Authors
3!
4! The UChicago Argonne, LLC as Operator of Argonne National
5! Laboratory holds copyright in the Software. The copyright holder
6! reserves all rights except those expressly granted to licensees,
7! and U.S. Government license rights.
8!
9! Redistribution and use in source and binary forms, with or without
10! modification, are permitted provided that the following conditions
11! are met:
12!
13! 1. Redistributions of source code must retain the above copyright
14! notice, this list of conditions and the disclaimer below.
15!
16! 2. Redistributions in binary form must reproduce the above copyright
17! notice, this list of conditions and the disclaimer (as noted below)
18! in the documentation and/or other materials provided with the
19! distribution.
20!
21! 3. Neither the name of ANL nor the names of its contributors
22! may be used to endorse or promote products derived from this software
23! without specific prior written permission.
24!
25! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
29! UCHICAGO ARGONNE, LLC, THE U.S. DEPARTMENT OF
30! ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
32! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37!
38! Additional BSD Notice
39! ---------------------
40! 1. This notice is required to be provided under our contract with
41! the U.S. Department of Energy (DOE). This work was produced at
42! Argonne National Laboratory under Contract
43! No. DE-AC02-06CH11357 with the DOE.
44!
45! 2. Neither the United States Government nor UCHICAGO ARGONNE,
46! LLC nor any of their employees, makes any warranty,
47! express or implied, or assumes any liability or responsibility for the
48! accuracy, completeness, or usefulness of any information, apparatus,
49! product, or process disclosed, or represents that its use would not
50! infringe privately-owned rights.
51!
52! 3. Also, reference herein to any specific commercial products, process,
53! or services by trade name, trademark, manufacturer or otherwise does
54! not necessarily constitute or imply its endorsement, recommendation,
55! or favoring by the United States Government or UCHICAGO ARGONNE LLC.
56! The views and opinions of authors expressed
57! herein do not necessarily state or reflect those of the United States
58! Government or UCHICAGO ARGONNE, LLC, and shall
59! not be used for advertising or product endorsement purposes.
60!
61
63 use field, only : field_t
64 use coefs, only : coef_t
65 use vector, only : vector_t
66 use facet_zone, only : facet_zone_t
67 use math, only : rzero, col3, vdot3, col2
68 use space, only : space_t
69 use num_types, only : rp
71 use iso_c_binding, only : c_ptr
73 use device, only : host_to_device
77 use mpi_f08, only : mpi_allreduce, mpi_in_place, mpi_sum
78 implicit none
79 private
85
86contains
96 subroutine drag_torque_zone(dgtq, tstep, zone, center, s11, s22, s33, s12, &
97 s13, s23, p, coef, visc)
98 integer, intent(in) :: tstep
99 type(facet_zone_t) :: zone
100 type(coef_t), intent(inout) :: coef
101 real(kind=rp), intent(inout) :: s11(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
102 coef%msh%nelv)
103 real(kind=rp), intent(inout) :: s22(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
104 coef%msh%nelv)
105 real(kind=rp), intent(inout) :: s33(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
106 coef%msh%nelv)
107 real(kind=rp), intent(inout) :: s12(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
108 coef%msh%nelv)
109 real(kind=rp), intent(inout) :: s13(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
110 coef%msh%nelv)
111 real(kind=rp), intent(inout) :: s23(coef%Xh%lx, coef%Xh%ly, coef%Xh%lz, &
112 coef%msh%nelv)
113 type(field_t), intent(inout) :: p
114 real(kind=rp), intent(in) :: visc, center(3)
115 real(kind=rp) :: dgtq(3,4)
116 real(kind=rp) :: dragpx = 0.0_rp ! pressure
117 real(kind=rp) :: dragpy = 0.0_rp
118 real(kind=rp) :: dragpz = 0.0_rp
119 real(kind=rp) :: dragvx = 0.0_rp ! viscous
120 real(kind=rp) :: dragvy = 0.0_rp
121 real(kind=rp) :: dragvz = 0.0_rp
122 real(kind=rp) :: torqpx = 0.0_rp ! pressure
123 real(kind=rp) :: torqpy = 0.0_rp
124 real(kind=rp) :: torqpz = 0.0_rp
125 real(kind=rp) :: torqvx = 0.0_rp ! viscous
126 real(kind=rp) :: torqvy = 0.0_rp
127 real(kind=rp) :: torqvz = 0.0_rp
128 real(kind=rp) :: dragx, dragy, dragz
129 integer :: ie, ifc, mem, ierr
130 dragx = 0.0
131 dragy = 0.0
132 dragz = 0.0
133
134!
135! Fill up viscous array w/ default
136!
137 dragpx = 0.0
138 dragpy = 0.0
139 dragpz = 0.0
140 dragvx = 0.0
141 dragvy = 0.0
142 dragvz = 0.0
143 do mem = 1, zone%size
144 ie = zone%facet_el(mem)%x(2)
145 ifc = zone%facet_el(mem)%x(1)
146 call drag_torque_facet(dgtq, coef%dof%x, coef%dof%y, coef%dof%z, &
147 center, s11, s22, s33, s12, s13, s23, p%x, visc, ifc, ie, coef, &
148 coef%Xh)
149
150 dragpx = dragpx + dgtq(1,1) ! pressure
151 dragpy = dragpy + dgtq(2,1)
152 dragpz = dragpz + dgtq(3,1)
153
154 dragvx = dragvx + dgtq(1,2) ! viscous
155 dragvy = dragvy + dgtq(2,2)
156 dragvz = dragvz + dgtq(3,2)
157
158 torqpx = torqpx + dgtq(1,3) ! pressure
159 torqpy = torqpy + dgtq(2,3)
160 torqpz = torqpz + dgtq(3,3)
161
162 torqvx = torqvx + dgtq(1,4) ! viscous
163 torqvy = torqvy + dgtq(2,4)
164 torqvz = torqvz + dgtq(3,4)
165 end do
166!
167! Sum contributions from all processors
168!
169 call mpi_allreduce(mpi_in_place, dragpx, 1, &
170 mpi_real_precision, mpi_sum, neko_comm, ierr)
171 call mpi_allreduce(mpi_in_place, dragpy, 1, &
172 mpi_real_precision, mpi_sum, neko_comm, ierr)
173 call mpi_allreduce(mpi_in_place, dragpz, 1, &
174 mpi_real_precision, mpi_sum, neko_comm, ierr)
175 call mpi_allreduce(mpi_in_place, dragvx, 1, &
176 mpi_real_precision, mpi_sum, neko_comm, ierr)
177 call mpi_allreduce(mpi_in_place, dragvy, 1, &
178 mpi_real_precision, mpi_sum, neko_comm, ierr)
179 call mpi_allreduce(mpi_in_place, dragvz, 1, &
180 mpi_real_precision, mpi_sum, neko_comm, ierr)
181 !Torque
182 call mpi_allreduce(mpi_in_place, torqpx, 1, &
183 mpi_real_precision, mpi_sum, neko_comm, ierr)
184 call mpi_allreduce(mpi_in_place, torqpy, 1, &
185 mpi_real_precision, mpi_sum, neko_comm, ierr)
186 call mpi_allreduce(mpi_in_place, torqpz, 1, &
187 mpi_real_precision, mpi_sum, neko_comm, ierr)
188 call mpi_allreduce(mpi_in_place, torqvx, 1, &
189 mpi_real_precision, mpi_sum, neko_comm, ierr)
190 call mpi_allreduce(mpi_in_place, torqvy, 1, &
191 mpi_real_precision, mpi_sum, neko_comm, ierr)
192 call mpi_allreduce(mpi_in_place, torqvz, 1, &
193 mpi_real_precision, mpi_sum, neko_comm, ierr)
194
195 dgtq(1,1) = dragpx ! pressure
196 dgtq(2,1) = dragpy
197 dgtq(3,1) = dragpz
198
199 dgtq(1,2) = dragvx ! viscous
200 dgtq(2,2) = dragvy
201 dgtq(3,2) = dragvz
202
203 dgtq(1,3) = torqpx ! pressure
204 dgtq(2,3) = torqpy
205 dgtq(3,3) = torqpz
206
207 dgtq(1,4) = torqvx ! viscous
208 dgtq(2,4) = torqvy
209 dgtq(3,4) = torqvz
210
211 end subroutine drag_torque_zone
212
224 subroutine drag_torque_facet(dgtq, xm0, ym0, zm0, center, s11, s22, s33, &
225 s12, s13, s23, pm1, visc, f, e, coef, Xh)
226 type(coef_t), intent(in) :: coef
227 type(space_t), intent(in) :: xh
228 real(kind=rp), intent(out) :: dgtq(3,4)
229 real(kind=rp), intent(in) :: center(3)
230 real(kind=rp), intent(in) :: xm0(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
231 real(kind=rp), intent(in) :: ym0(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
232 real(kind=rp), intent(in) :: zm0(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
233 real(kind=rp), intent(in) :: s11(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
234 real(kind=rp), intent(in) :: s22(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
235 real(kind=rp), intent(in) :: s33(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
236 real(kind=rp), intent(in) :: s12(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
237 real(kind=rp), intent(in) :: s13(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
238 real(kind=rp), intent(in) :: s23(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
239 real(kind=rp), intent(in) :: pm1(xh%lx, xh%ly, xh%lz, coef%msh%nelv)
240 real(kind=rp), intent(in) :: visc
241 integer, intent(in) :: f, e
242 integer :: pf, i, j1, j2
243 real(kind=rp) :: n1, n2, n3, a, v, dgtq_i(3,4)
244 integer :: skpdat(6,6), nx, ny, nz
245 integer :: js1
246 integer :: jf1
247 integer :: jskip1
248 integer :: js2
249 integer :: jf2
250 integer :: jskip2
251 real(kind=rp) :: s11_, s12_, s22_, s13_, s23_, s33_
252
253
254 nx = xh%lx
255 ny = xh%ly
256 nz = xh%lz
257 skpdat(1,1) = 1
258 skpdat(2,1) = nx*(ny-1) + 1
259 skpdat(3,1) = nx
260 skpdat(4,1) = 1
261 skpdat(5,1) = ny*(nz-1) + 1
262 skpdat(6,1) = ny
263
264 skpdat(1,2) = 1 + (nx-1)
265 skpdat(2,2) = nx*(ny-1)+1 + (nx-1)
266 skpdat(3,2) = nx
267 skpdat(4,2) = 1
268 skpdat(5,2) = ny*(nz-1)+1
269 skpdat(6,2) = ny
270
271 skpdat(1,3) = 1
272 skpdat(2,3) = nx
273 skpdat(3,3) = 1
274 skpdat(4,3) = 1
275 skpdat(5,3) = ny*(nz-1)+1
276 skpdat(6,3) = ny
277
278 skpdat(1,4) = 1 + nx*(ny-1)
279 skpdat(2,4) = nx + nx*(ny-1)
280 skpdat(3,4) = 1
281 skpdat(4,4) = 1
282 skpdat(5,4) = ny*(nz-1)+1
283 skpdat(6,4) = ny
284
285 skpdat(1,5) = 1
286 skpdat(2,5) = nx
287 skpdat(3,5) = 1
288 skpdat(4,5) = 1
289 skpdat(5,5) = ny
290 skpdat(6,5) = 1
291
292 skpdat(1,6) = 1 + nx*ny*(nz-1)
293 skpdat(2,6) = nx + nx*ny*(nz-1)
294 skpdat(3,6) = 1
295 skpdat(4,6) = 1
296 skpdat(5,6) = ny
297 skpdat(6,6) = 1
298 pf = f
299 js1 = skpdat(1, pf)
300 jf1 = skpdat(2, pf)
301 jskip1 = skpdat(3, pf)
302 js2 = skpdat(4, pf)
303 jf2 = skpdat(5, pf)
304 jskip2 = skpdat(6, pf)
305 call rzero(dgtq,12)
306 i = 0
307 a = 0
308 do j2 = js2, jf2, jskip2
309 do j1 = js1, jf1, jskip1
310 i = i + 1
311 n1 = coef%nx(i,1,f,e) * coef%area(i,1,f,e)
312 n2 = coef%ny(i,1,f,e) * coef%area(i,1,f,e)
313 n3 = coef%nz(i,1,f,e) * coef%area(i,1,f,e)
314 a = a + coef%area(i,1,f,e)
315 v = visc
316 s11_ = s11(j1, j2, 1, e)
317 s12_ = s12(j1, j2, 1, e)
318 s22_ = s22(j1, j2, 1, e)
319 s13_ = s13(j1, j2, 1, e)
320 s23_ = s23(j1, j2, 1, e)
321 s33_ = s33(j1, j2, 1, e)
322 call drag_torque_pt(dgtq_i, xm0(j1, j2, 1, e), ym0(j1, j2, 1, e), &
323 zm0(j1, j2, 1, e), center, s11_, s22_, s33_, s12_, s13_, s23_, &
324 pm1(j1, j2, 1, e), n1, n2, n3, v)
325 dgtq = dgtq + dgtq_i
326 end do
327 end do
328 end subroutine drag_torque_facet
329
342 subroutine drag_torque_pt(dgtq, x, y, z, center, s11, s22, s33, s12, s13, &
343 s23, p, n1, n2, n3, v)
344 real(kind=rp), intent(inout) :: dgtq(3, 4)
345 real(kind=rp), intent(in) :: x
346 real(kind=rp), intent(in) :: y
347 real(kind=rp), intent(in) :: z
348 real(kind=rp), intent(in) :: p
349 real(kind=rp), intent(in) :: v
350 real(kind=rp), intent(in) :: n1, n2, n3, center(3)
351 real(kind=rp), intent(in) :: s11, s12, s22, s13, s23, s33
352 real(kind=rp) :: s21, s31, s32, r1, r2, r3
353
354 call rzero(dgtq, 12)
355 s21 = s12
356 s32 = s23
357 s31 = s13
358 !pressure drag
359 dgtq(1,1) = p*n1
360 dgtq(2,1) = p*n2
361 dgtq(3,1) = p*n3
362 ! viscous drag
363 dgtq(1,2) = -2*v*(s11*n1 + s12*n2 + s13*n3)
364 dgtq(2,2) = -2*v*(s21*n1 + s22*n2 + s23*n3)
365 dgtq(3,2) = -2*v*(s31*n1 + s32*n2 + s33*n3)
366 r1 = x - center(1)
367 r2 = y - center(2)
368 r3 = z - center(3)
369 !pressure torque
370 dgtq(1,3) = r2*dgtq(3,1) - r3*dgtq(2,1)
371 dgtq(2,3) = r3*dgtq(1,1) - r1*dgtq(3,1)
372 dgtq(3,3) = r1*dgtq(2,1) - r2*dgtq(1,1)
373 !viscous torque
374 dgtq(1,4) = r2*dgtq(3,2) - r3*dgtq(2,2)
375 dgtq(2,4) = r3*dgtq(1,2) - r1*dgtq(3,2)
376 dgtq(3,4) = r1*dgtq(2,2) - r2*dgtq(1,2)
377 end subroutine drag_torque_pt
378
388 subroutine calc_force_array(force1, force2, force3, force4, force5, force6,&
389 s11, s22, s33, s12, s13, s23,&
390 p, n1, n2, n3, mu, n_pts)
391 integer :: n_pts
392 real(kind=rp), intent(inout), dimension(n_pts) :: force1, force2, force3
393 real(kind=rp), intent(inout), dimension(n_pts) :: force4, force5, force6
394 real(kind=rp), intent(in) :: p(n_pts)
395 real(kind=rp), intent(in) :: mu(n_pts)
396 real(kind=rp), intent(in) :: n1(n_pts), n2(n_pts), n3(n_pts)
397 real(kind=rp), intent(in), dimension(n_pts) :: s11, s12, s22, s13, s23, s33
398 real(kind=rp) :: v2(n_pts)
399 call rzero(force4, n_pts)
400 call rzero(force5, n_pts)
401 call rzero(force6, n_pts)
402 !pressure force
403 call col3(force1, p, n1, n_pts)
404 call col3(force2, p, n2, n_pts)
405 call col3(force3, p, n3, n_pts)
406 ! viscous force
407 v2 = -2.0_rp*mu
408 call vdot3(force4, s11, s12, s13, n1, n2, n3, n_pts)
409 call vdot3(force5, s12, s22, s23, n1, n2, n3, n_pts)
410 call vdot3(force6, s13, s23, s33, n1, n2, n3, n_pts)
411 call col2(force4, v2, n_pts)
412 call col2(force5, v2, n_pts)
413 call col2(force6, v2, n_pts)
414 end subroutine calc_force_array
415
425 subroutine device_calc_force_array(force1, force2, force3,&
426 force4, force5, force6,&
427 s11, s22, s33, s12, s13, s23,&
428 p, n1, n2, n3, mu, n_pts)
429 integer :: n_pts
430 type(c_ptr) :: force1, force2, force3
431 type(c_ptr) :: force4, force5, force6
432 type(c_ptr) :: p, n1, n2, n3
433 type(c_ptr) :: s11, s12, s22, s13, s23, s33
434 type(c_ptr) :: mu
435 if (neko_bcknd_device .eq. 1) then
436 call device_rzero(force4, n_pts)
437 call device_rzero(force5, n_pts)
438 call device_rzero(force6, n_pts)
439 !pressure force
440 call device_col3(force1, p, n1, n_pts)
441 call device_col3(force2, p, n2, n_pts)
442 call device_col3(force3, p, n3, n_pts)
443
444 call device_vdot3(force4, s11, s12, s13, n1, n2, n3, n_pts)
445 call device_vdot3(force5, s12, s22, s23, n1, n2, n3, n_pts)
446 call device_vdot3(force6, s13, s23, s33, n1, n2, n3, n_pts)
447 call device_cmult(force4, -2.0_rp, n_pts)
448 call device_cmult(force5, -2.0_rp, n_pts)
449 call device_cmult(force6, -2.0_rp, n_pts)
450 call device_col2(force4, mu, n_pts)
451 call device_col2(force5, mu, n_pts)
452 call device_col2(force6, mu, n_pts)
453 else
454 call neko_error('error in drag_torque, no device bcklnd configured')
455 end if
456 end subroutine device_calc_force_array
457
458
468 subroutine setup_normals(coef, mask, facets, n1, n2, n3, n_pts)
469 type(coef_t) :: coef
470 integer :: n_pts
471 type(vector_t), intent(inout) :: n1, n2, n3
472 integer :: mask(0:n_pts), facets(0:n_pts), fid, idx(4)
473 real(kind=rp) :: normal(3), area
474 integer :: i
475
476 do i = 1, n_pts
477 fid = facets(i)
478 if ( (fid .lt. 1) .or. (fid .gt. 6)) then
479 call neko_error('setup_normals: invalid facet id. ' // &
480 'Finalize the bc with only_facets = .true.')
481 end if
482 idx = nonlinear_index(mask(i), coef%Xh%lx, coef%Xh%lx, coef%Xh%lx)
483 normal = coef%get_normal(idx(1), idx(2), idx(3), idx(4), fid)
484 area = coef%get_area(idx(1), idx(2), idx(3), idx(4), fid)
485 n1%x(i) = normal(1)*area
486 n2%x(i) = normal(2)*area
487 n3%x(i) = normal(3)*area
488 end do
489
490 if (neko_bcknd_device .eq. 1) then
491 call n1%copy_from(host_to_device, .false.)
492 call n2%copy_from(host_to_device, .false.)
493 call n3%copy_from(host_to_device, .true.)
494 end if
495 end subroutine setup_normals
496
497end module drag_torque
__inline__ __device__ void nonlinear_index(const int idx, const int lx, int *index)
Definition bc_utils.h:44
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_datatype), public mpi_real_precision
MPI type for working precision of REAL types.
Definition comm.F90:54
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:46
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_cmult(a_d, c, n, strm)
Multiplication by constant c .
subroutine, public device_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, n, strm)
Compute a dot product (3-d version) assuming vector components etc.
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
subroutine, public device_col3(a_d, b_d, c_d, n, strm)
Vector multiplication with 3 vectors .
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:48
subroutine, public drag_torque_zone(dgtq, tstep, zone, center, s11, s22, s33, s12, s13, s23, p, coef, visc)
Some functions to calculate the lift/drag and torque Calculation can be done on a zone,...
subroutine, public setup_normals(coef, mask, facets, n1, n2, n3, n_pts)
Computes the normals for a given set of boundary points accessed by the mask.
subroutine, public drag_torque_facet(dgtq, xm0, ym0, zm0, center, s11, s22, s33, s12, s13, s23, pm1, visc, f, e, coef, xh)
Calculate drag and torque over a facet.
subroutine, public calc_force_array(force1, force2, force3, force4, force5, force6, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, mu, n_pts)
Calculate drag and torque from array of points.
subroutine, public device_calc_force_array(force1, force2, force3, force4, force5, force6, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, mu, n_pts)
Calculate drag and torque from array of points.
subroutine, public drag_torque_pt(dgtq, x, y, z, center, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, v)
Calculate drag and torque from one point.
Defines a zone as a subset of facets in a mesh.
Defines a field.
Definition field.f90:34
Object for handling masks in Neko.
Definition mask.f90:34
Definition math.f90:60
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:1046
subroutine, public col3(a, b, c, n)
Vector multiplication with 3 vectors .
Definition math.f90:1061
subroutine, public vdot3(dot, u1, u2, u3, v1, v2, v3, n)
Compute a dot product (3-d version) assuming vector components etc.
Definition math.f90:852
subroutine, public rzero(a, n)
Zero a real vector.
Definition math.f90:235
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a function space.
Definition space.f90:34
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:63
The function space for the SEM solution fields.
Definition space.f90:64