gravity_pointmass.f90
Go to the documentation of this file.
1 !#############################################################################
2 !# #
3 !# fosite - 3D hydrodynamical simulation program #
4 !# module: gravity_pointmass.f90 #
5 !# #
6 !# Copyright (C) 2007-2019 #
7 !# Tobias Illenseer <tillense@astrophysik.uni-kiel.de> #
8 !# Björn Sperling <sperling@astrophysik.uni-kiel.de> #
9 !# Jannes Klee <jklee@astrophysik.uni-kiel.de> #
10 !# #
11 !# This program is free software; you can redistribute it and/or modify #
12 !# it under the terms of the GNU General Public License as published by #
13 !# the Free Software Foundation; either version 2 of the License, or (at #
14 !# your option) any later version. #
15 !# #
16 !# This program is distributed in the hope that it will be useful, but #
17 !# WITHOUT ANY WARRANTY; without even the implied warranty of #
18 !# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or #
19 !# NON INFRINGEMENT. See the GNU General Public License for more #
20 !# details. #
21 !# #
22 !# You should have received a copy of the GNU General Public License #
23 !# along with this program; if not, write to the Free Software #
24 !# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #
25 !# #
26 !#############################################################################
38 !----------------------------------------------------------------------------!
47 !----------------------------------------------------------------------------!
51  USE fluxes_base_mod
53  USE mesh_base_mod
55  USE marray_base_mod
57  USE common_dict
58 #ifdef PARALLEL
59 #ifdef HAVE_MPI_MOD
60  USE mpi
61 #endif
62 #endif
63  IMPLICIT NONE
64 #ifdef PARALLEL
65 #ifdef HAVE_MPIF_H
66  include 'mpif.h'
67 #endif
68 #endif
69  !--------------------------------------------------------------------------!
70  PRIVATE
71  CHARACTER(LEN=16), PARAMETER :: potential_name(2) = (/ &
72  "Newton ", &
73  "Paczynski-Wiita " /)
74  INTEGER, PARAMETER :: newton = 1
75  INTEGER, PARAMETER :: wiita = 2
76 
77  TYPE, EXTENDS(gravity_base) :: gravity_pointmass
78  CLASS(logging_base), ALLOCATABLE :: potential
79  INTEGER :: outbound
80  REAL, POINTER :: mass
81  REAL, POINTER :: accrate
82  REAL, POINTER :: massloss
83  REAL :: mdot
84  REAL :: acclimit
85  REAL :: switchon
86  REAL, DIMENSION(:,:), POINTER :: pos
87  REAL, DIMENSION(:), POINTER :: r0
88  REAL, DIMENSION(:,:,:), POINTER :: r_prim
89  REAL, DIMENSION(:,:,:,:), POINTER :: fr_prim
90  REAL, DIMENSION(:,:,:,:), POINTER :: posvec_prim
91  REAL, DIMENSION(:,:,:,:), POINTER :: posvec_prim_tmp
92  REAL, DIMENSION(:,:,:,:,:), POINTER :: fposvec_prim
93  REAL, DIMENSION(:,:,:,:), POINTER :: pot_prim
94  REAL, DIMENSION(:,:,:), POINTER :: omega
95  REAL, DIMENSION(:,:,:,:), POINTER :: omega2
96  CONTAINS
97  PROCEDURE :: initgravity_pointmass
98  PROCEDURE :: calcpotential
99  PROCEDURE :: updategravity_single
100  PROCEDURE :: infogravity
102  PROCEDURE :: finalize
103  END TYPE
104 
105  !--------------------------------------------------------------------------!
106  PUBLIC :: &
107  ! types
109  ! constants
110  newton, wiita, &
111  ! elemental functions
113  !--------------------------------------------------------------------------!
114 
115 CONTAINS
116 
132  SUBROUTINE initgravity_pointmass(this,Mesh,Physics,config,IO)
136  IMPLICIT NONE
137  !------------------------------------------------------------------------!
138  CLASS(gravity_pointmass), INTENT(INOUT) :: this
139  CLASS(mesh_base), INTENT(IN) :: Mesh
140  CLASS(physics_base), INTENT(IN) :: Physics
141  TYPE(Dict_TYP), POINTER :: config,IO
142  !------------------------------------------------------------------------!
143  INTEGER :: potential_number, valwrite, gtype
144  INTEGER :: err,i,j,k,l
145  REAL :: r_schwarzschild=0.0,eps
146  !------------------------------------------------------------------------!
147  CALL this%InitGravity(mesh,physics,"central point mass",config,io)
148  !\todo last dimensions are absolutely not clear if right.. What are the standing for?
149  ALLOCATE(this%potential, &
150  this%pot(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,4), &
151  this%omega(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX), &
152  this%omega2(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,1), &
153  this%r_prim(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX),&
154  this%fr_prim(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,3), &
155  this%posvec_prim(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,3),&
156  this%posvec_prim_tmp(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,3),&
157  this%fposvec_prim(mesh%IGMIN:mesh%IGMAX,mesh%JGMIN:mesh%JGMAX,mesh%KGMIN:mesh%KGMAX,3,3),& ! last two entries (EAST,NORTH,TOP)x(dim1,dim2,dim3)
158  this%mass, this%accrate, this%massloss, this%pos(1,3), &
159  stat = err)
160  IF (err.NE.0) CALL this%Error("InitGravity_pointmass", "Unable allocate memory!")
161 
162  ! type of the potential
163  CALL getattr(config, "potential", potential_number, newton)
164  CALL this%potential%InitLogging(potential_number,potential_name(potential_number))
165 
166  ! set (initial) mass
167  CALL getattr(config, "mass", this%mass, 1.0)
168  CALL setattr(io, "mass", ref(this%mass))
169 
170  ! cartesian position of the point mass
171  CALL getattr(config, "x", this%pos(1,1), 0.0)
172  CALL getattr(config, "y", this%pos(1,2), 0.0)
173  CALL getattr(config, "z", this%pos(1,3), 0.0)
174 
175  ! Softening (e.g. for planets inside the computational domain)
176  CALL getattr(config, "softening", eps, 0.0)
177 
178  ! soft switch on
179  CALL getattr(config, "switchon", this%switchon, -1.0)
180 
181  ! accretion limit (e.g. eddington limit) divided by central mass
182  ! the units are therefore (e.g. SI): kg/s / central_mass = 1 / s
183  ! -1.0 == off
184  CALL getattr(config, "acclimit", this%acclimit, -1.0)
185 
186  CALL setattr(io, "accrate", ref(this%accrate))
187  IF (this%acclimit.GT.0.0) &
188  CALL setattr(io, "massloss", ref(this%massloss))
189 
190  SELECT CASE(potential_number)
191  CASE(newton)
192  r_schwarzschild = 0.0
193  CASE(wiita)
194  ! Schwarzschild radius
195  r_schwarzschild = 2.*physics%constants%GN * this%mass / physics%constants%C**2
196  CASE DEFAULT
197  CALL this%Error("InitGravity_pointmass", "potential must be either NEWTON or WIITA")
198  END SELECT
199 
200  ! output cartesian positions of the point mass
201  CALL getattr(config, "output/position", valwrite, 0)
202  IF (valwrite .EQ. 1) &
203  CALL setattr(io, "position", this%pos)
204 
205  ! reset mass flux and massloss and register for output
206  this%mdot = 0.0
207  this%massloss = 0.0
208  this%accrate = 0.0
209 
210  ! define position vector from the central object to all cell bary centers
211  ! and the corresponding distances
212  ! TODO Here should be a different evaluation for either 2D or 3D simulation
213  IF (abs(this%pos(1,1)).LE.tiny(this%pos(1,1)).AND.abs(this%pos(1,2)).LE.tiny(this%pos(1,2))) THEN
214  ! no shift: point mass is located at the origin of the mesh
215  ! set position vector and inverse radius using appropriate mesh arrays
216  this%posvec_prim(:,:,:,:) = mesh%posvec%bcenter(:,:,:,:)
217  this%r_prim(:,:,:) = mesh%radius%bcenter(:,:,:)
218  this%fr_prim(:,:,:,1) = mesh%radius%faces(:,:,:,east)
219  this%fr_prim(:,:,:,2) = mesh%radius%faces(:,:,:,north)
220  this%fr_prim(:,:,:,3) = mesh%radius%faces(:,:,:,top)
221  ELSE
222  ! shifted point mass position:
223  ! compute curvilinear components of shift vector
224  ! PLEASE NOTE: We need the shifted curvilinear components at the bary_centers and
225  ! faces in EASTERN and NORTHERN direction. This is the case because we want to
226  ! calculate the potential at these face positions further below.
227  this%posvec_prim_tmp(:,:,:,1) = this%pos(1,1)
228  this%posvec_prim_tmp(:,:,:,2) = this%pos(1,2)
229  this%posvec_prim_tmp(:,:,:,3) = this%pos(1,3)
230 
231  CALL mesh%Geometry%Convert2Curvilinear(mesh%curv%faces(:,:,:,east,:),this%posvec_prim_tmp(:,:,:,:),this%fposvec_prim(:,:,:,1,:))
232  CALL mesh%Geometry%Convert2Curvilinear(mesh%curv%faces(:,:,:,north,:),this%posvec_prim_tmp(:,:,:,:),this%fposvec_prim(:,:,:,2,:))
233  CALL mesh%Geometry%Convert2Curvilinear(mesh%curv%faces(:,:,:,top,:),this%posvec_prim_tmp(:,:,:,:),this%fposvec_prim(:,:,:,3,:))
234 
235  CALL mesh%Geometry%Convert2Curvilinear(mesh%bcenter,this%posvec_prim_tmp,this%posvec_prim)
236 
237  ! subtract the result from the position vector:
238  ! this gives you the curvilinear components of all vectors pointing
239  ! from the point mass to the bary center of any cell on the mesh
240  this%posvec_prim(:,:,:,:) = mesh%posvec%bcenter(:,:,:,:) - this%posvec_prim(:,:,:,:)
241  this%fposvec_prim(:,:,:,1,:) = mesh%posvec%faces(:,:,:,east,:) - this%fposvec_prim(:,:,:,1,:) ! EAST
242  this%fposvec_prim(:,:,:,2,:) = mesh%posvec%faces(:,:,:,north,:) - this%fposvec_prim(:,:,:,2,:) ! NORTH
243  this%fposvec_prim(:,:,:,3,:) = mesh%posvec%faces(:,:,:,top,:) - this%fposvec_prim(:,:,:,3,:) ! TOP
244 
245  this%r_prim(:,:,:) = sqrt(this%posvec_prim(:,:,:,1)**2+this%posvec_prim(:,:,:,2)**2+this%posvec_prim(:,:,:,3)**2)
246  this%fr_prim(:,:,:,1) = sqrt(this%fposvec_prim(:,:,:,1,1)**2+this%fposvec_prim(:,:,:,1,2)**2+this%fposvec_prim(:,:,:,1,3)**2) ! shifted EAST-faces
247  this%fr_prim(:,:,:,2) = sqrt(this%fposvec_prim(:,:,:,2,1)**2+this%fposvec_prim(:,:,:,2,2)**2+this%fposvec_prim(:,:,:,2,3)**2) ! shifted NORTH-faces
248  this%fr_prim(:,:,:,3) = sqrt(this%fposvec_prim(:,:,:,3,1)**2+this%fposvec_prim(:,:,:,3,2)**2+this%fposvec_prim(:,:,:,3,3)**2) ! shifted TOP-faces
249  END IF
250 
251  ! initialize gravitational acceleration and Keplerian angular velocity
252  ! loop over ghost cells to ensure that all values are well defined
253  ! and remain finite; this is of particular importance for the calculation
254  ! of the disk scale height (see below)
255 !NEC$ COLLAPSE
256  DO k=mesh%KGMIN,mesh%KGMAX
257  DO j=mesh%JGMIN,mesh%JGMAX
258 !NEC$ IVDEP
259  DO i=mesh%IGMIN,mesh%IGMAX
260  ! compute local Keplerian angular velocity
261  ! Since omega usually becomes infinite in the limit r -> r_prim (or a, if a > 0 )
262  ! (unless softening is enabled, i. e. eps > 0) we avoid devision by zero by first
263  ! limiting the inverse of omega to some very small value.
264  this%omega2(i,j,k,1) = 1./ max(10*tiny(eps), &
265  (( this%r_prim(i,j,k) * (this%r_prim(i,j,k)-r_schwarzschild)**2) + eps**3) / (physics%Constants%GN*this%mass) )
266  this%omega(i,j,k) = sqrt(this%omega2(i,j,k,1))
267  ! curvilinear components of the gravitational acceleration
268 !NEC$ UNROLL(3)
269  DO l=1,physics%VDIM
270  this%accel%data4d(i,j,k,l) = -this%omega2(i,j,k,1) * this%posvec_prim(i,j,k,l)
271  END DO
272  END DO
273  END DO
274  END DO
275 
276  !! \todo implement computation for pseudo-Newton Paczynski-Wiita potential
277  CALL this%CalcPotential(mesh,physics,this%mass,this%r_prim,this%fr_prim,this%pot)
278 
279 
280  CALL this%SetOutput(mesh,physics,config,io)
281 
282  ! enable mass accretion by setting "outbound" to one of the four boundaries
283  ! of the computational domain (depends on mesh geometry)
284  SELECT TYPE(geo=>mesh%geometry)
285  CLASS IS(geometry_cylindrical)
286  CALL getattr(config, "outbound", this%outbound, west)
287  CLASS IS(geometry_spherical)
288  CALL getattr(config, "outbound", this%outbound, west)
289  CLASS DEFAULT
290  CALL getattr(config, "outbound", this%outbound, 0)
291  CALL this%WARNING("GravitySources_pointmass","geometry does not support accretion")
292  END SELECT
293  CALL this%InfoGravity()
294  END SUBROUTINE initgravity_pointmass
295 
296  SUBROUTINE calcpotential(this,Mesh,Physics,mass,dist,dist_faces,pot)
297  IMPLICIT NONE
298  !------------------------------------------------------------------------!
299  CLASS(gravity_pointmass) :: this
300  CLASS(mesh_base), INTENT(IN) :: Mesh
301  CLASS(physics_base), INTENT(IN) :: Physics
302  REAL :: mass
303  REAL, DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX), &
304  INTENT(IN) :: dist
305  REAL, DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX,3), &
306  INTENT(IN) :: dist_faces
307  REAL, DIMENSION(Mesh%IGMIN:Mesh%IGMAX,Mesh%JGMIN:Mesh%JGMAX,Mesh%KGMIN:Mesh%KGMAX,4), &
308  INTENT(OUT) :: pot
309  !------------------------------------------------------------------------!
310 
311  !! \todo implement computation for pseudo-Newton Paczynski-Wiita potential
312  pot(:,:,:,1) = - physics%constants%GN * mass / dist(:,:,:)
313  pot(:,:,:,2) = - physics%constants%GN * mass / dist_faces(:,:,:,1) ! direction EAST !Mesh%radius%faces(:,:,:,EAST)
314  pot(:,:,:,3) = - physics%constants%GN * mass / dist_faces(:,:,:,2) ! direction NORTH !Mesh%radius%faces(:,:,:,NORTH)
315  pot(:,:,:,4) = - physics%constants%GN * mass / dist_faces(:,:,:,3) ! direction TOP !Mesh%radius%faces(:,:,:,TOP)
316  END SUBROUTINE
317 
318  SUBROUTINE infogravity(this)
319  IMPLICIT NONE
320  !------------------------------------------------------------------------!
321  CLASS(gravity_pointmass), INTENT(IN) :: this
322  !------------------------------------------------------------------------!
323  CHARACTER(LEN=32) :: param_str
324  !------------------------------------------------------------------------!
325  WRITE (param_str,'(ES8.2)') this%mass
326  CALL this%Info(" potential: " // &
327  trim(this%potential%GetName()))
328  CALL this%Info(" initial mass: " // trim(param_str))
329  IF (this%outbound.GT.0) THEN
330  param_str = "enabled"
331  ELSE
332  param_str = "disabled"
333  END IF
334  CALL this%Info(" accretion: " // trim(param_str))
335  IF (this%outbound.GT.0.AND.this%acclimit.GT.0.0) THEN
336  WRITE (param_str,'(ES8.2)') this%acclimit
337  CALL this%Info(" accretion limit: " // trim(param_str))
338  END IF
339  IF (this%switchon.GT.0.0) THEN
340  WRITE (param_str,'(ES8.2)') this%switchon
341  CALL this%Info(" switchon time: " // trim(param_str))
342  END IF
343  END SUBROUTINE infogravity
344 
345 
351  SUBROUTINE updategravity_single(this,Mesh,Physics,Fluxes,pvar,time,dt)
352  IMPLICIT NONE
353  !------------------------------------------------------------------------!
354  CLASS(gravity_pointmass), INTENT(INOUT) :: this
355  CLASS(mesh_base), INTENT(IN) :: Mesh
356  CLASS(physics_base), INTENT(IN) :: Physics
357  CLASS(fluxes_base), INTENT(IN) :: Fluxes
358  CLASS(marray_compound), INTENT(INOUT) :: pvar
359  REAL, INTENT(IN) :: time,dt
360  !------------------------------------------------------------------------!
361  INTEGER :: l
362  REAL, DIMENSION(Physics%VNUM) :: bflux
363  REAL :: scaling,oldmass,massfac,sqrmassfac,dmass,dmasslim
364  !------------------------------------------------------------------------!
365  ! update accel and omega only in case of accretion
366  IF (this%outbound.NE.0) THEN
367  ! get boundary flux
368 #ifdef PARALLEL
369  bflux(:) = fluxes%GetBoundaryFlux(mesh,physics,this%outbound,mpi_comm_world)
370 #else
371  bflux(:) = fluxes%GetBoundaryFlux(mesh,physics,this%outbound)
372 #endif
373  ! store old mass
374  oldmass = this%mass
375  ! compute the mass flux difference
376  ! REMARK #1: bflux is the accumulated flux across the boundary
377  ! REMARK #2: mdot is NOT the accretion rate, but the
378  ! mass flux from the previous evalution (see below)
379  dmass = (bflux(physics%DENSITY) - this%mdot)
380  IF(this%acclimit.GE.0.) THEN
381  dmasslim = min(dmass,this%acclimit*dt*this%mass)
382  this%massloss = this%massloss + dmass - dmasslim
383  dmass = dmasslim
384  END IF
385  ! compute new mass and current true, i. e. possibly limited, accretion rate
386  this%mass = this%mass + dmass
387  IF (dt.GT.0.0) this%accrate = dmass/dt
388  ! scale gravitational acceleration and Keplerian angular velocity
389  ! with newmass/oldmass to account for accretion
390  massfac = this%mass/oldmass
391  sqrmassfac = sqrt(massfac)
392  this%accel%data4d(:,:,:,:) = this%accel%data4d(:,:,:,:) * massfac
393  this%pot(:,:,:,:) = this%pot(:,:,:,:) * massfac
394  this%omega(:,:,:) = this%omega(:,:,:) * sqrmassfac
395  this%mdot = bflux(physics%DENSITY)
396  END IF
397 
398  ! modify acceleration during switchon phase
399  IF (time.GE.0.0.AND.time.LE.this%switchon) THEN
400  ! compute new scaling
401  scaling = sin(0.5*pi*time/this%switchon)**2
402  ! compute acceleration and scale it;
403  ! during the switchon phase accretion is disabled
404 !NEC$ UNROLL(3)
405  DO l=1,physics%VDIM
406  this%accel%data4d(:,:,:,l) = -scaling * this%omega2(:,:,:,1) * this%posvec_prim(:,:,:,l)
407  END DO
408  END IF
409 
410  END SUBROUTINE updategravity_single
411 
412 
416  PURE SUBROUTINE calcdiskheight_single(this,Mesh,Physics,pvar,bccsound,h_ext,height)
417  IMPLICIT NONE
418  !------------------------------------------------------------------------!
419  CLASS(gravity_pointmass), INTENT(INOUT) :: this
420  CLASS(mesh_base), INTENT(IN) :: mesh
421  CLASS(physics_base), INTENT(IN) :: physics
422  CLASS(marray_compound), INTENT(INOUT) :: pvar
423  TYPE(marray_base), INTENT(INOUT) :: bccsound,h_ext,height
424  !------------------------------------------------------------------------!
425  ! compute disk height
426  h_ext%data3d(:,:,:) = getdiskheight(bccsound%data3d(:,:,:),this%omega(:,:,:))
427  END SUBROUTINE calcdiskheight_single
428 
429  SUBROUTINE finalize(this)
430  IMPLICIT NONE
431  !------------------------------------------------------------------------!
432  CLASS(gravity_pointmass), INTENT(INOUT) :: this
433  !------------------------------------------------------------------------!
434  CHARACTER(LEN=128) :: buffer
435  !------------------------------------------------------------------------!
436  IF (this%GetRank().EQ.0) THEN
437  CALL this%Info("-------------------------------------------------------------------")
438  WRITE(buffer, "(A,(ES11.3))") " central mass: ", this%mass
439  CALL this%Info(buffer)
440  IF (this%acclimit.GT.0.0) THEN
441  WRITE(buffer, "(A,(ES11.3))") " mass loss: ", this%massloss
442  CALL this%Info(buffer)
443  END IF
444  END IF
445 
446  DEALLOCATE(this%pot,this%omega,this%omega2,this%r_prim,this%fr_prim, &
447  this%posvec_prim,this%posvec_prim_tmp,this%fposvec_prim,this%mass, &
448  this%accrate,this%massloss,this%pos)
449 
450  DEALLOCATE(this%potential)
451 
452  CALL this%Finalize_base()
453  END SUBROUTINE finalize
454 
464  ELEMENTAL FUNCTION getdiskheight(cs,omega) RESULT(height)
465  IMPLICIT NONE
466  !------------------------------------------------------------------------!
467  REAL, INTENT(IN) :: cs,omega
468  REAL :: height
469  !------------------------------------------------------------------------!
470  height = cs / omega
471  END FUNCTION getdiskheight
472 
473 END MODULE gravity_pointmass_mod
subroutine finalize(this)
Destructor of common class.
character(len=16), dimension(2), parameter potential_name
subroutine infogravity(this)
integer, parameter, public newton
pure real function, dimension(size(ephir%data2d, dim=1)) omega(ephir, velocity)
type(logging_base), save this
derived class for compound of mesh arrays
base class for mesh arrays
Definition: marray_base.f90:36
Basic fosite module.
common data structure
pure subroutine calcdiskheight_single(this, Mesh, Physics, pvar, bccsound, h_ext, height)
computes pressure scale height of a geometrically thin Keplerian disk
subroutine updategravity_single(this, Mesh, Physics, Fluxes, pvar, time, dt)
updates the gravitational acceleration of the pointmass module
defines properties of a 3D logcylindrical mesh
defines properties of a 3D cylindrical mesh
defines properties of a 3D spherical mesh
source terms module for gravitational acceleration due to a point mass at the center of the coordinat...
generic gravity terms module providing functionaly common to all gravity terms
basic mesh array class
Definition: marray_base.f90:64
subroutine calcpotential(this, Mesh, Physics, mass, dist, dist_faces, pot)
named integer constants for flavour of state vectors
Basic physics module.
Dictionary for generic data types.
Definition: common_dict.f90:61
subroutine initgravity_pointmass(this, Mesh, Physics, config, IO)
constructor for point mass module
elemental real function, public getdiskheight(cs, omega)
return pressure scale height of a geometrically thin Keplerian disk
integer, parameter, public wiita
base module for numerical flux functions
Definition: fluxes_base.f90:39