MPI-AMRVAC 3.2
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_usr_methods.t
Go to the documentation of this file.
1!> Module with all the methods that users can customize in AMRVAC
2!>
3!> Each procedure pointer can be initialized in a user's mod_usr.t
5
6 implicit none
7 public
8
9 !> Initialize the user's settings (after initializing amrvac)
10 procedure(p_no_args), pointer :: usr_set_parameters => null()
11 !> Initialize earch grid block data
12 procedure(init_one_grid), pointer :: usr_init_one_grid => null()
13
14 ! Boundary condition related
15 procedure(special_bc), pointer :: usr_special_bc => null()
16 procedure(special_prepare_bc), pointer :: usr_prepare_boundary => null()
17 procedure(special_mg_bc), pointer :: usr_special_mg_bc => null()
18
19 procedure(internal_bc), pointer :: usr_internal_bc => null()
20
21 ! Output related
22 procedure(p_no_args), pointer :: usr_print_log => null()
23 procedure(p_no_args), pointer :: usr_write_analysis => null()
24 procedure(transform_w), pointer :: usr_transform_w => null()
25 procedure(aux_output), pointer :: usr_aux_output => null()
26 procedure(add_aux_names), pointer :: usr_add_aux_names => null()
27 procedure(sub_modify_io), pointer :: usr_modify_output => null()
28 procedure(special_convert), pointer :: usr_special_convert => null()
29
30 ! Called at the beginning of every time step (after determining dt)
31 procedure(process_grid), pointer :: usr_process_grid => null()
32 procedure(process_global), pointer :: usr_process_global => null()
33
34 ! Called every time step just after advance (with w^(n+1), it^n, global_time^n)
35 procedure(process_adv_grid), pointer :: usr_process_adv_grid => null()
36 procedure(process_adv_global), pointer :: usr_process_adv_global => null()
37
38 ! Called after initial condition before the start of the simulation
39 procedure(p_no_args), pointer :: usr_improve_initial_condition => null()
40
41 ! Called before the start of the simulation
42 procedure(p_no_args), pointer :: usr_before_main_loop => null()
43
44 ! Source terms
45 procedure(source), pointer :: usr_source => null()
46 procedure(source), pointer :: usr_source_after => null()
47 procedure(get_dt), pointer :: usr_get_dt => null()
48 procedure(phys_gravity), pointer :: usr_gravity => null()
49 procedure(sub_get_heating), pointer :: usr_get_heating => null()
50
51 ! Usr defined dust drag force
52 procedure(phys_dust_get_dt), pointer :: usr_dust_get_dt => null()
53 procedure(phys_dust_get_3d_dragforce), pointer :: usr_get_3d_dragforce => null()
54
55 ! Usr defined space varying viscosity
56 procedure(set_viscosity), pointer :: usr_set_viscosity => null()
57
58 ! Usr defined thermal pressure for hydro & energy=.False.
59 procedure(hd_pthermal), pointer :: usr_set_pthermal => null()
60
61 ! Refinement related procedures
62 procedure(refine_grid), pointer :: usr_refine_grid => null()
63 procedure(var_for_errest), pointer :: usr_var_for_errest => null()
64 procedure(a_refine_threshold), pointer :: usr_refine_threshold => null()
65 procedure(flag_grid), pointer :: usr_flag_grid => null()
66
67 ! Set time-independent magnetic field for B0 splitting
68 procedure(set_b0), pointer :: usr_set_b0 => null()
69 ! Set time-independent variables for equilibrium splitting, except for B0
70 procedure(set_equi_vars), pointer :: usr_set_equi_vars => null()
71 ! Set time-independent current density for B0 splitting
72 procedure(set_j0), pointer :: usr_set_j0 => null()
73 procedure(special_resistivity), pointer :: usr_special_resistivity => null()
74
75 ! Particle module related
76 procedure(update_payload), pointer :: usr_update_payload => null()
77 procedure(create_particles), pointer :: usr_create_particles => null()
78 procedure(check_particle), pointer :: usr_check_particle => null()
79 procedure(particle_fields), pointer :: usr_particle_fields => null()
80 procedure(particle_analytic), pointer :: usr_particle_analytic => null()
81 procedure(particle_position), pointer :: usr_particle_position => null()
82
83 ! Radiation quantity related
84 procedure(special_opacity), pointer :: usr_special_opacity => null()
85 procedure(special_fluxlimiter), pointer :: usr_special_fluxlimiter => null()
86 procedure(special_diffcoef), pointer :: usr_special_diffcoef => null()
87
88 ! Called after the mesh has been adjuste
89 procedure(after_refine), pointer :: usr_after_refine => null()
90
91 ! initialize vector potential on cell edges for magnetic field
92 procedure(init_vector_potential), pointer :: usr_init_vector_potential => null()
93
94 ! allow user to change inductive electric field, especially for boundary driven applications
95 procedure(set_electric_field), pointer :: usr_set_electric_field => null()
96
97 ! allow user to specify variables at physical boundaries
98 procedure(set_wlr), pointer :: usr_set_wlr => null()
99
100 ! allow user to specify the expansion function for the surface of a cross sectional
101 ! area of a 1D prominence, along with the analytical derivative of that function and its
102 ! primitive shape evaluated in the boundaries \int_(x_i-dx_i/2)^(x_i+dx_i/2) A(s) ds
103 procedure(set_surface), pointer :: usr_set_surface => null()
104
105 ! for tracing field. allow user to specify variables and field
106 procedure(set_field_w), pointer :: usr_set_field_w => null()
107 procedure(set_field), pointer :: usr_set_field => null()
108
109 ! allow user to specify R factor in ideal gas law with partial ionization
110 procedure(rfactor), pointer :: usr_rfactor => null()
111
112 ! allow user to specify adiabatic index and gamma dependent on space
113 procedure(set_adiab), pointer :: usr_set_adiab => null()
114 procedure(set_adiab), pointer :: usr_set_gamma => null()
115
116 abstract interface
117
118 subroutine p_no_args()
119 end subroutine p_no_args
120
121 !> Initialize one grid
122 subroutine init_one_grid(ixI^L,ixO^L,w,x)
124 integer, intent(in) :: ixI^L, ixO^L
125 double precision, intent(in) :: x(ixI^S,1:ndim)
126 double precision, intent(inout) :: w(ixI^S,1:nw)
127 end subroutine init_one_grid
128
129 !> special boundary types, users must assign conservative
130 !> variables in boundaries
131 subroutine special_bc(qdt,qt,ixI^L,ixO^L,iB,w,x)
133 !> Shape of input arrays
134 integer, intent(in) :: ixI^L
135 !> Region where boundary values have to be set
136 integer, intent(in) :: ixO^L
137 !> Integer indicating direction of boundary
138 integer, intent(in) :: iB
139 double precision, intent(in) :: qdt,qt, x(ixI^S,1:ndim)
140 double precision, intent(inout) :: w(ixI^S,1:nw)
141 end subroutine special_bc
142
143 subroutine special_prepare_bc(qt,qdt)
145 double precision, intent(in) :: qt, qdt
146 end subroutine special_prepare_bc
147
148 !> Special boundary type for radiation hydrodynamics module, only used to
149 !> set the boundary conditions for the radiation energy.
150 subroutine special_mg_bc(iB)
152 integer, intent(in) :: iB
153 end subroutine special_mg_bc
154
155 !> internal boundary, user defined
156 !> This subroutine can be used to artificially overwrite ALL conservative
157 !> variables in a user-selected region of the mesh, and thereby act as
158 !> an internal boundary region. It is called just before external (ghost cell)
159 !> boundary regions will be set by the BC selection. Here, you could e.g.
160 !> want to introduce an extra variable (nwextra, to be distinguished from nwaux)
161 !> which can be used to identify the internal boundary region location.
162 !> Its effect should always be local as it acts on the mesh.
163 subroutine internal_bc(level,qt,qdt,ixI^L,ixO^L,w,x)
165 integer, intent(in) :: ixI^L,ixO^L,level
166 double precision, intent(in) :: qt, qdt
167 double precision, intent(inout) :: w(ixI^S,1:nw)
168 double precision, intent(in) :: x(ixI^S,1:ndim)
169 end subroutine internal_bc
170
171 !> this subroutine is ONLY to be used for computing auxiliary variables
172 !> which happen to be non-local (like div v), and are in no way used for
173 !> flux computations. As auxiliaries, they are also not advanced
174 subroutine process_grid(igrid,level,ixI^L,ixO^L,qt,w,x)
176 integer, intent(in) :: igrid,level,ixI^L,ixO^L
177 double precision, intent(in) :: qt,x(ixI^S,1:ndim)
178 double precision, intent(inout) :: w(ixI^S,1:nw)
179 end subroutine process_grid
180
181 !> If defined, this routine is called before writing output, and it can
182 !> set/modify the variables in the w array.
183 subroutine sub_modify_io(ixI^L,ixO^L,qt,w,x)
185 integer, intent(in) :: ixI^L,ixO^L
186 double precision, intent(in) :: qt,x(ixI^S,1:ndim)
187 double precision, intent(inout) :: w(ixI^S,1:nw)
188 end subroutine sub_modify_io
189
190 !> This subroutine is called at the beginning of each time step
191 !> by each processor. No communication is specified, so the user
192 !> has to implement MPI routines if information has to be shared
193 subroutine process_global(iit,qt)
195 integer, intent(in) :: iit
196 double precision, intent(in) :: qt
197 end subroutine process_global
198
199 !> for processing after the advance (PIC-MHD, e.g.)
200 subroutine process_adv_grid(igrid,level,ixI^L,ixO^L,qt,w,x)
202 integer, intent(in) :: igrid,level,ixI^L,ixO^L
203 double precision, intent(in) :: qt,x(ixI^S,1:ndim)
204 double precision, intent(inout) :: w(ixI^S,1:nw)
205 end subroutine process_adv_grid
206
207 !> for processing after the advance (PIC-MHD, e.g.)
208 subroutine process_adv_global(iit,qt)
210 integer, intent(in) :: iit
211 double precision, intent(in) :: qt
212 end subroutine process_adv_global
213
214 !> this subroutine can be used in convert, to add auxiliary variables to the
215 !> converted output file, for further analysis using tecplot, paraview, ....
216 !> these auxiliary values need to be stored in the nw+1:nw+nwauxio slots
217 !
218 !> the array normconv can be filled in the (nw+1:nw+nwauxio) range with
219 !> corresponding normalization values (default value 1)
220 subroutine aux_output(ixI^L,ixO^L,w,x,normconv)
222 integer, intent(in) :: ixI^L,ixO^L
223 double precision, intent(in) :: x(ixI^S,1:ndim)
224 double precision :: w(ixI^S,nw+nwauxio)
225 double precision :: normconv(0:nw+nwauxio)
226 end subroutine aux_output
227
228 !> Add names for the auxiliary variables
229 subroutine add_aux_names(varnames)
231 character(len=*) :: varnames
232 end subroutine add_aux_names
233
234 !> Calculate w(iw)=w(iw)+qdt*SOURCE[wCT,qtC,x] within ixO for all indices
235 !> iw=iwmin...iwmax. wCT is at time qCT
236 subroutine source(qdt,ixI^L,ixO^L,iw^LIM,qtC,wCT,qt,w,x)
238 integer, intent(in) :: ixI^L, ixO^L, iw^LIM
239 double precision, intent(in) :: qdt, qtC, qt
240 double precision, intent(in) :: wCT(ixI^S,1:nw), x(ixI^S,1:ndim)
241 double precision, intent(inout) :: w(ixI^S,1:nw)
242 end subroutine source
243
244 !> Limit "dt" further if necessary, e.g. due to the special source terms.
245 !> The getdt_courant (CFL condition) and the getdt subroutine in the AMRVACPHYS
246 !> module have already been called.
247 subroutine get_dt(w,ixI^L,ixO^L,dtnew,dx^D,x)
249 integer, intent(in) :: ixI^L, ixO^L
250 double precision, intent(in) :: dx^D, x(ixI^S,1:ndim)
251 double precision, intent(in) :: w(ixI^S,1:nw)
252 double precision, intent(inout) :: dtnew
253 end subroutine get_dt
254
255 !> Calculate gravitational acceleration in each dimension
256 subroutine phys_gravity(ixI^L,ixO^L,wCT,x,gravity_field)
258 integer, intent(in) :: ixI^L, ixO^L
259 double precision, intent(in) :: x(ixI^S,1:ndim)
260 double precision, intent(in) :: wCT(ixI^S,1:nw)
261 double precision, intent(out) :: gravity_field(ixI^S,ndim)
262 end subroutine phys_gravity
263
264 !> Calculate the 3d drag force of gas onto dust
265 subroutine phys_dust_get_3d_dragforce(ixI^L, ixO^L, w, x, fdrag, ptherm, vgas,dust_n_species)
267 integer, intent(in) :: ixI^L, ixO^L, dust_n_species
268 double precision, intent(in) :: x(ixI^S, 1:ndim)
269 double precision, intent(in) :: w(ixI^S, 1:nw)
270 double precision, intent(out) :: &
271 fdrag(ixI^S, 1:ndir, 1:dust_n_species)
272 double precision, intent(in) :: ptherm(ixI^S), vgas(ixI^S, ndir)
273 end subroutine phys_dust_get_3d_dragforce
274
275 !> Calculate the time step associated with the usr drag force
276 subroutine phys_dust_get_dt(w, ixI^L, ixO^L, dtdust, dx^D, x, dust_n_species)
278 integer, intent(in) :: ixI^L, ixO^L, dust_n_species
279 double precision, intent(in) :: dx^D, x(ixI^S,1:ndim)
280 double precision, intent(in) :: w(ixI^S,1:nw)
281 double precision, intent(inout) :: dtdust(1:dust_n_species)
282 end subroutine phys_dust_get_dt
283
284 !>Calculation anormal viscosity depending on space
285 subroutine set_viscosity(ixI^L,ixO^L,x,wp,mu)
287 integer, intent(in) :: ixI^L, ixO^L
288 double precision, intent(in) :: x(ixI^S,1:ndim)
289 double precision, intent(in) :: wp(ixI^S,1:nw) ! primitive w
290 double precision, intent(out) :: mu(ixI^S)
291 end subroutine set_viscosity
292
293 !>Calculation anormal pressure for hd & energy=.False.
294 subroutine hd_pthermal(w,x,ixI^L,ixO^L,pth)
296 integer, intent(in) :: ixI^L, ixO^L
297 double precision, intent(in) :: x(ixI^S,1:ndim)
298 double precision, intent(in) :: w(ixI^S,1:nw)
299 double precision, intent(out) :: pth(ixI^S)
300 end subroutine hd_pthermal
301
302 !>Calculation R factor for ideal gas law with partial ionization
303 subroutine rfactor(w,x,ixI^L,ixO^L,pth)
305 integer, intent(in) :: ixI^L, ixO^L
306 double precision, intent(in) :: x(ixI^S,1:ndim)
307 double precision, intent(in) :: w(ixI^S,1:nw)
308 double precision, intent(out) :: pth(ixI^S)
309 end subroutine rfactor
310
311 !>set adiabatic index
312 subroutine set_adiab(w,x,ixI^L,ixO^L,adiab)
314 integer, intent(in) :: ixI^L, ixO^L
315 double precision, intent(in) :: x(ixI^S,1:ndim)
316 double precision, intent(in) :: w(ixI^S,1:nw)
317 double precision, intent(out) :: adiab(ixI^S)
318 end subroutine set_adiab
319
320 !> Set the "eta" array for resistive MHD based on w or the
321 !> "current" variable which has components between idirmin and 3.
322 subroutine special_resistivity(w,ixI^L,ixO^L,idirmin,x,current,eta)
324 integer, intent(in) :: ixI^L, ixO^L, idirmin
325 double precision, intent(in) :: w(ixI^S,nw), x(ixI^S,1:ndim)
326 double precision, intent(in) :: current(ixI^S,7-2*ndir:3)
327 double precision, intent(out) :: eta(ixI^S)
328 end subroutine special_resistivity
329
330
331 !> Set user defined opacity for use in diffusion coeff, heating and cooling, and radiation force
332 subroutine special_opacity(ixI^L,ixO^L,w,x,kappa)
334 integer, intent(in) :: ixI^L, ixO^L
335 double precision, intent(in) :: w(ixI^S,1:nw), x(ixI^S,1:ndim)
336 double precision, intent(out):: kappa(ixI^S)
337 end subroutine special_opacity
338
339 !> Set user defined FLD flux limiter, lambda
340 subroutine special_fluxlimiter(ixI^L,ixO^L,w,x,fld_lambda,fld_R)
342 integer, intent(in) :: ixI^L, ixO^L
343 double precision, intent(in) :: w(ixI^S,1:nw), x(ixI^S,1:ndim)
344 double precision, intent(out):: fld_lambda(ixI^S),fld_R(ixI^S)
345 end subroutine special_fluxlimiter
346
347 !> Set user defined FLD diffusion coefficient
348 subroutine special_diffcoef(w, wprim, x, ixI^L, ixO^L)
350 integer, intent(in) :: ixI^L, ixO^L
351 double precision, intent(inout) :: w(ixI^S, 1:nw)
352 double precision, intent(in) :: wprim(ixI^S, 1:nw)
353 double precision, intent(in) :: x(ixI^S, 1:ndim)
354 end subroutine special_diffcoef
355
356 !> Enforce additional refinement or coarsening
357 !> One can use the coordinate info in x and/or time qt=t_n and w(t_n) values w.
358 !> you must set consistent values for integers refine/coarsen:
359 !> refine = -1 enforce to not refine
360 !> refine = 0 doesn't enforce anything
361 !> refine = 1 enforce refinement
362 !> coarsen = -1 enforce to not coarsen
363 !> coarsen = 0 doesn't enforce anything
364 !> coarsen = 1 enforce coarsen
365 !> e.g. refine for negative first coordinate x < 0 as
366 !> if (any(x(ix^S,1) < zero)) refine=1
367 subroutine refine_grid(igrid,level,ixI^L,ixO^L,qt,w,x,refine,coarsen)
369 integer, intent(in) :: igrid, level, ixI^L, ixO^L
370 double precision, intent(in) :: qt, w(ixI^S,1:nw), x(ixI^S,1:ndim)
371 integer, intent(inout) :: refine, coarsen
372 end subroutine refine_grid
373
374 !> this is the place to compute a local auxiliary variable to be used
375 !> as refinement criterion for the Lohner error estimator only
376 !> -->it is then requiring and iflag>nw
377 !> note that ixO=ixI=ixG, hence the term local (gradients need special attention!)
378 subroutine var_for_errest(ixI^L,ixO^L,iflag,w,x,var)
380 integer, intent(in) :: ixI^L,ixO^L,iflag
381 double precision, intent(in) :: w(ixI^S,1:nw), x(ixI^S,1:ndim)
382 double precision, intent(out) :: var(ixI^S)
383 end subroutine var_for_errest
384
385 !> Here one can add a steady (time-independent) potential background field
386 subroutine set_b0(ixI^L,ixO^L,x,wB0)
388 integer, intent(in) :: ixI^L,ixO^L
389 double precision, intent(in) :: x(ixI^S,1:ndim)
390 double precision, intent(inout) :: wB0(ixI^S,1:ndir)
391 end subroutine set_b0
392
393 !> Here one can add a time-independent background current density
394 subroutine set_j0(ixI^L,ixO^L,x,wJ0)
396 integer, intent(in) :: ixI^L,ixO^L
397 double precision, intent(in) :: x(ixI^S,1:ndim)
398 double precision, intent(inout) :: wJ0(ixI^S,7-2*ndir:ndir)
399 end subroutine set_j0
400
401 !> Here one can add a steady (time-independent) equi vars
402 subroutine set_equi_vars(ixI^L,ixO^L,x,w0)
404 integer, intent(in) :: ixI^L,ixO^L
405 double precision, intent(in) :: x(ixI^S,1:ndim)
406 double precision, intent(inout) :: w0(ixI^S,1:number_equi_vars)
407 end subroutine set_equi_vars
408
409 !> adjust w when restart from dat file with different w variables
410 subroutine transform_w(ixI^L,ixO^L,nw_in,w_in,x,w_out)
412 integer, intent(in) :: ixI^L, ixO^L, nw_in
413 double precision, intent(in) :: w_in(ixI^S,1:nw_in)
414 double precision, intent(in) :: x(ixI^S, 1:ndim)
415 double precision, intent(out) :: w_out(ixI^S,1:nw)
416 end subroutine transform_w
417
418 !> use different threshold in special regions for AMR to
419 !> reduce/increase resolution there where nothing/something interesting happens.
420 subroutine a_refine_threshold(wlocal,xlocal,threshold,qt,level)
422 double precision, intent(in) :: wlocal(1:nw),xlocal(1:ndim),qt
423 double precision, intent(inout) :: threshold
424 integer, intent(in) :: level
425 end subroutine a_refine_threshold
426
427 !> Allow user to use their own data-postprocessing procedures
428 subroutine special_convert(qunitconvert)
430 integer, intent(in) :: qunitconvert
431 character(len=20) :: userconvert_type
432 end subroutine special_convert
433
434 !> flag=-1 : Treat all cells active, omit deactivation (onentry, default)
435 !> flag=0 : Treat as normal domain
436 !> flag=1 : Treat as passive, but reduce by safety belt
437 !> flag=2 : Always treat as passive
438 subroutine flag_grid(qt,ixI^L,ixO^L,w,x,flag)
440 integer, intent(in) :: ixI^L, ixO^L
441 integer, intent(inout) :: flag
442 double precision, intent(in) :: qt
443 double precision, intent(inout) :: w(ixI^S,1:nw)
444 double precision, intent(in) :: x(ixI^S,1:ndim)
445 end subroutine flag_grid
446
447 !> Update payload of particles
448 subroutine update_payload(igrid,x,u,q,m,mypayload,mynpayload,particle_time)
450 integer, intent(in) :: igrid,mynpayload
451 double precision, intent(in) :: x(1:ndir),u(1:ndir),q,m,particle_time
452 double precision, intent(out) :: mypayload(mynpayload)
453 end subroutine update_payload
454
455 !> Create particles
456 subroutine create_particles(n_particles, x, v, q, m, follow)
457 integer, intent(in) :: n_particles
458 double precision, intent(out) :: x(3, n_particles)
459 double precision, intent(out) :: v(3, n_particles)
460 double precision, intent(out) :: q(n_particles)
461 double precision, intent(out) :: m(n_particles)
462 logical, intent(out) :: follow(n_particles)
463 end subroutine create_particles
464
465 !> Check arbitrary particle conditions or modifications
466 subroutine check_particle(igrid,x,v,q,m,follow,check)
468 integer, intent(in) :: igrid
469 double precision, intent(inout) :: x(1:ndir)
470 double precision, intent(inout) :: v(1:ndir),q,m
471 logical, intent(inout) :: follow
472 logical, intent(out) :: check
473 end subroutine check_particle
474
475 !> Associate fields to particle
476 subroutine particle_fields(w, x, E, B)
478 double precision, intent(in) :: w(ixG^T,1:nw)
479 double precision, intent(in) :: x(ixG^T,1:ndim)
480 double precision, intent(out) :: E(ixG^T, ndir)
481 double precision, intent(out) :: B(ixG^T, ndir)
482 end subroutine particle_fields
483
484 subroutine particle_analytic(ix, x, tloc, vec)
486 integer, intent(in) :: ix(ndir) !< Indices in gridvars
487 double precision, intent(in) :: x(ndir)
488 double precision, intent(in) :: tloc
489 double precision, intent(out) :: vec(ndir)
490 end subroutine particle_analytic
491
492 !> User-defined particle movement
493 subroutine particle_position(x, n, tloc, tlocnew)
495 integer, intent(in) :: n
496 double precision, intent(inout) :: x(3)
497 double precision, intent(in) :: tloc, tlocnew
498 end subroutine particle_position
499
500 subroutine after_refine(n_coarsen, n_refine)
501 integer, intent(in) :: n_coarsen
502 integer, intent(in) :: n_refine
503 end subroutine after_refine
504
505 !> initialize vector potential on cell edges for magnetic field
506 subroutine init_vector_potential(ixI^L, ixC^L, xC, A, idir)
508
509 integer, intent(in) :: ixI^L, ixC^L, idir
510 double precision, intent(in) :: xC(ixI^S,1:ndim)
511 double precision, intent(out) :: A(ixI^S)
512
513 end subroutine init_vector_potential
514
515 ! allow user to change inductive electric field, especially for boundary driven applications
516 subroutine set_electric_field(ixI^L,ixO^L,qt,qdt,fE,s)
518 integer, intent(in) :: ixI^L, ixO^L
519 double precision, intent(in) :: qt, qdt
520 type(state) :: s
521 double precision, intent(inout) :: fE(ixI^S,sdim:3)
522
523 !integer :: ixC^L,ixA^L
524 ! For example, to set inductive electric field at bottom boundary in a 3D box for induction equation
525 ! v and b are from observational data for data-driven application
526
527 !associate(w=>s%w,ws=>s%ws)
528
529 !if(s%is_physical_boundary(5)) then
530 ! ixCmin^D=ixOmin^D-1;
531 ! ixCmax^D=ixOmax^D;
532 ! ixAmin^D=ixCmin^D;
533 ! ixAmax^D=ixCmax^D+1;
534 ! fE(nghostcells^%3ixA^S,1)=-ws(nghostcells^%3ixA^S,3)*w(nghostcells^%3ixA^S,mom(2))
535 ! fE(nghostcells^%3ixA^S,2)= ws(nghostcells^%3ixA^S,3)*w(nghostcells^%3ixA^S,mom(1))
536 ! ixAmin^D=ixCmin^D+kr(2,^D);
537 ! ixAmax^D=ixCmax^D+kr(2,^D);
538 ! fE(nghostcells^%3ixC^S,1)=0.5d0*(fE(nghostcells^%3ixC^S,1)+fE(nghostcells^%3ixA^S,1))*&
539 ! qdt*s%dsC(nghostcells^%3ixC^S,1)
540 ! ixAmin^D=ixCmin^D+kr(1,^D);
541 ! ixAmax^D=ixCmax^D+kr(1,^D);
542 ! fE(nghostcells^%3ixC^S,2)=0.5d0*(fE(nghostcells^%3ixC^S,2)+fE(nghostcells^%3ixA^S,2))*&
543 ! qdt*s%dsC(nghostcells^%3ixC^S,2)
544 !end if
545
546 !end associate
547
548 end subroutine set_electric_field
549
550 !> allow user to specify 'variables' left and right state at physical boundaries to control flux through the boundary surface
551 subroutine set_wlr(ixI^L,ixO^L,qt,wLC,wRC,wLp,wRp,s,idir)
553 integer, intent(in) :: ixI^L, ixO^L, idir
554 double precision, intent(in) :: qt
555 double precision, intent(inout) :: wLC(ixI^S,1:nw), wRC(ixI^S,1:nw)
556 double precision, intent(inout) :: wLp(ixI^S,1:nw), wRp(ixI^S,1:nw)
557 type(state) :: s
558
559 !if(s%is_physical_boundary(3).and.idir==2) then
560 ! wLp(ixOmin2^%2ixO^S,mom(1))=1.d0
561 ! wRp(ixOmin2^%2ixO^S,mom(1))=wRp(ixOmin2^%2ixO^S,mom(1))
562 ! wLC(ixOmin2^%2ixO^S,mom(1))=wLp(ixOmin2^%2ixO^S,mom(1))*wLp(ixOmin2^%2ixO^S,rho_)
563 ! wRC(ixOmin2^%2ixO^S,mom(1))=wRp(ixOmin2^%2ixO^S,mom(1))*wRp(ixOmin2^%2ixO^S,rho_)
564 !end if
565 end subroutine set_wlr
566
567 subroutine set_surface(ixI^L,x,delx,exp_factor,del_exp_factor,exp_factor_primitive)
569 integer, intent(in) :: ixI^L
570 double precision, intent(in) :: delx(ixI^S,1:ndim), x(ixI^S,1:ndim)
571 double precision, intent(out) :: exp_factor(ixI^S), del_exp_factor(ixI^S)
572 double precision, intent(out) :: exp_factor_primitive(ixI^S)
573
574 end subroutine set_surface
575
576 subroutine set_field_w(igrid,ip,xf,wP,wL,numP,nwP,nwL,dL,forward,ftype,tcondi)
578 !use mod_point_searching
579
580 integer, intent(in) :: igrid,ip,numP,nwP,nwL
581 double precision, intent(in) :: xf(numP,ndim)
582 double precision, intent(inout) :: wP(numP,nwP),wL(1+nwL)
583 double precision, intent(in) :: dL
584 logical, intent(in) :: forward
585 character(len=std_len), intent(in) :: ftype,tcondi
586
587 !double precision :: xpp(1:ndim),wpp(1:nw)
588
589 !! nwP=2,nwL=0. get rho/T at line
590 !if (tcondi=='user') then
591 ! xpp(1:ndim)=xf(ip,1:ndim)
592 ! call get_point_w_ingrid(igrid,xpp,wpp,'primitive')
593 ! wP(ip,1)=wpp(rho_)
594 ! wP(ip,2)=wpp(p_)/wpp(rho_)
595 !endif
596
597 end subroutine set_field_w
598
599 subroutine set_field(xfn,igrid,field,ftype)
601
602 integer,intent(in) :: igrid
603 double precision, intent(in) :: xfn(ndim)
604 double precision, intent(inout) :: field(ndim)
605 character(len=std_len), intent(in) :: ftype
606
607 !if (ftype='xdir') then
608 ! field(:)=zero
609 ! field(1)=1.d0
610 !endif
611
612 end subroutine set_field
613
614 !> Calculate volumetric heating rate for TRAC broadening
615 subroutine sub_get_heating(Qgrid,ixI^L,ixO^L,w,x)
617 integer, intent(in) :: ixI^L, ixO^L
618 double precision, intent(in) :: x(ixI^S,1:ndim), w(ixI^S,1:nw)
619 double precision, intent(out):: Qgrid(ixI^S)
620 end subroutine sub_get_heating
621
622 end interface
623
624end module mod_usr_methods
use different threshold in special regions for AMR to reduce/increase resolution there where nothing/...
Add names for the auxiliary variables.
this subroutine can be used in convert, to add auxiliary variables to the converted output file,...
Check arbitrary particle conditions or modifications.
flag=-1 : Treat all cells active, omit deactivation (onentry, default) flag=0 : Treat as normal domai...
Limit "dt" further if necessary, e.g. due to the special source terms. The getdt_courant (CFL conditi...
Calculation anormal pressure for hd & energy=.False.
initialize vector potential on cell edges for magnetic field
internal boundary, user defined This subroutine can be used to artificially overwrite ALL conservativ...
Associate fields to particle.
User-defined particle movement.
Calculate the 3d drag force of gas onto dust.
Calculate the time step associated with the usr drag force.
Calculate gravitational acceleration in each dimension.
for processing after the advance (PIC-MHD, e.g.)
for processing after the advance (PIC-MHD, e.g.)
This subroutine is called at the beginning of each time step by each processor. No communication is s...
this subroutine is ONLY to be used for computing auxiliary variables which happen to be non-local (li...
Enforce additional refinement or coarsening One can use the coordinate info in x and/or time qt=t_n a...
Calculation R factor for ideal gas law with partial ionization.
Here one can add a steady (time-independent) potential background field.
Here one can add a steady (time-independent) equi vars.
Here one can add a time-independent background current density.
Calculation anormal viscosity depending on space.
allow user to specify 'variables' left and right state at physical boundaries to control flux through...
Calculate w(iw)=w(iw)+qdt*SOURCE[wCT,qtC,x] within ixO for all indices iw=iwmin......
special boundary types, users must assign conservative variables in boundaries
Allow user to use their own data-postprocessing procedures.
Set user defined FLD diffusion coefficient.
Set user defined FLD flux limiter, lambda.
Special boundary type for radiation hydrodynamics module, only used to set the boundary conditions fo...
Set user defined opacity for use in diffusion coeff, heating and cooling, and radiation force.
Set the "eta" array for resistive MHD based on w or the "current" variable which has components betwe...
Calculate volumetric heating rate for TRAC broadening.
If defined, this routine is called before writing output, and it can set/modify the variables in the ...
adjust w when restart from dat file with different w variables
Update payload of particles.
this is the place to compute a local auxiliary variable to be used as refinement criterion for the Lo...
This module contains definitions of global parameters and variables and some generic functions/subrou...
Module with all the methods that users can customize in AMRVAC.
procedure(rfactor), pointer usr_rfactor
procedure(source), pointer usr_source_after
procedure(source), pointer usr_source
procedure(special_resistivity), pointer usr_special_resistivity
procedure(set_adiab), pointer usr_set_adiab
procedure(special_opacity), pointer usr_special_opacity
procedure(set_adiab), pointer usr_set_gamma
procedure(process_grid), pointer usr_process_grid
procedure(sub_get_heating), pointer usr_get_heating
procedure(particle_position), pointer usr_particle_position
procedure(special_prepare_bc), pointer usr_prepare_boundary
procedure(check_particle), pointer usr_check_particle
procedure(p_no_args), pointer usr_improve_initial_condition
procedure(a_refine_threshold), pointer usr_refine_threshold
procedure(set_surface), pointer usr_set_surface
procedure(phys_dust_get_dt), pointer usr_dust_get_dt
procedure(phys_gravity), pointer usr_gravity
procedure(aux_output), pointer usr_aux_output
procedure(p_no_args), pointer usr_print_log
procedure(phys_dust_get_3d_dragforce), pointer usr_get_3d_dragforce
procedure(special_diffcoef), pointer usr_special_diffcoef
procedure(process_adv_grid), pointer usr_process_adv_grid
procedure(particle_analytic), pointer usr_particle_analytic
procedure(set_viscosity), pointer usr_set_viscosity
procedure(special_convert), pointer usr_special_convert
procedure(create_particles), pointer usr_create_particles
procedure(init_one_grid), pointer usr_init_one_grid
Initialize earch grid block data.
procedure(update_payload), pointer usr_update_payload
procedure(p_no_args), pointer usr_write_analysis
procedure(sub_modify_io), pointer usr_modify_output
procedure(p_no_args), pointer usr_before_main_loop
procedure(special_fluxlimiter), pointer usr_special_fluxlimiter
procedure(set_field_w), pointer usr_set_field_w
procedure(flag_grid), pointer usr_flag_grid
procedure(process_global), pointer usr_process_global
procedure(special_bc), pointer usr_special_bc
procedure(process_adv_global), pointer usr_process_adv_global
procedure(internal_bc), pointer usr_internal_bc
procedure(set_equi_vars), pointer usr_set_equi_vars
procedure(special_mg_bc), pointer usr_special_mg_bc
procedure(set_j0), pointer usr_set_j0
procedure(particle_fields), pointer usr_particle_fields
procedure(refine_grid), pointer usr_refine_grid
procedure(hd_pthermal), pointer usr_set_pthermal
procedure(init_vector_potential), pointer usr_init_vector_potential
procedure(p_no_args), pointer usr_set_parameters
Initialize the user's settings (after initializing amrvac)
procedure(var_for_errest), pointer usr_var_for_errest
procedure(set_b0), pointer usr_set_b0
procedure(set_electric_field), pointer usr_set_electric_field
procedure(set_wlr), pointer usr_set_wlr
procedure(transform_w), pointer usr_transform_w
procedure(after_refine), pointer usr_after_refine
procedure(get_dt), pointer usr_get_dt
procedure(set_field), pointer usr_set_field
procedure(add_aux_names), pointer usr_add_aux_names