SPINS derivatives

From Fluids Wiki
Jump to navigation Jump to search

A case file has been created for efficiently computing derivatives and secondary variables from a completed SPINS run. This case file uses the internal operations of SPINS and are therefore spectrally accurate, parallel and quick. The case file is called derivatives.cpp in cases/derivatives and can calculate:

  • 1st and 2nd derivatives of any field
  • Each component of vorticity
  • Enstrophy
  • Dissipation
  • Vortex stretching
  • Enstrophy stretching production
  • Baroclinic vorticity
  • Q and R

Running derivatives.x

Compile the case file and transfer the executable and configuration file into your case directory. Since you will likely have a configuration file for your initial case you should rename the derivatives configuration file as spins.conf_deriv. Keeping the configuration file for the original case is good practice as you will want to reference it a lot.

After setting the parameters and specifying which derivatives and secondary variables to calculate in the configuration file you will run the derivatives case file. Since the configuration file for this is not called spins.conf you will need to adjust your execution command. The command you want is:

mpirun -np N ./derivatives.x --config=spins.conf_deriv

Derivative fields (once computed) will contain an underscore followed by a letter indicating which dimension the field was differentiated with respect to. For example u_y corresponds to the y-derivative of the u field, and u_yy corresponds to the second y-derivative of the u field. This is in contrast to vorty which is the y component of the vorticity field (the other two being vortx and vortz).

Specifying fields and indices/outputs

The deriv_files option in the configuration file will specify which fields will be differentiated. You can specify multiple fields by placing a space between each field name. For example, if you'd like the derivatives of u, v, w, and rho then set the deriv_files line to

deriv_files = u v w rho

Make sure there is only a single space. If multiple spaces exist then empty files will be created. If you are not calculating derivatives (just the vorticity, enstrophy, or dissipation) then the inputs on this line will be ignored.

Specify which secondary variables are computed with the do_... options:

do_vor_x = false
do_vor_y = true
do_vor_z = false
do_barvor = false
do_enstrophy = false
do_dissipation = false
do_vort_stretch = false
do_enst_stretch = false
do_Q = false
do_R = false
do_Q_and_R = false

do_vor_y = true will calculate the y-component of vorticity. The enstrophy and dissipation options are similar. True for compute the derivative, and false if not.

You will specify which outputs to compute by using the start_sequence, final_sequence, and step_sequence options. These options are like creating a vector in Matlab with colon notation. The start_sequence sets the first output number to compute, the step_sequence sets the increment between output numbers, and the final_sequence is the last output number to compute. If you want to compute the 3,5, and 7th outputs then set:

start_sequence = 3
final_sequence = 7
step_sequence =  2

If you only want a single output computed (say, the 7th) then set:

start_sequence = 7
final_sequence = 7

step_sequence will be ignored.

2D/3D

If your simulation is three-dimensional (or contains the span-wise velocity v) then you must specify that the v-velocity is present within the working directory. This is the very last option in the configuration file.

If the simulation is 3D then set v_exist = true.

If the simulation is 2D then you'll likely want to set v_exist = false. However, if the simulation is 2-1/2 dimensions (has periodic flow in y with only a single grid point, probably due to rotation) then you'll need to include the v-velocity for the vorticity, enstrophy, and dissipation calculations.

Second derivatives

Second derivatives can be computed immediately with first derivatives, but require them to also be computed. Essentially it's a serial process in that the first derivative will be calculated, written to disk, then read from disk, and the second derivative calculated. It's not ideal, but it's simpler code.

To calculate the second x-derivative of rho set:

deriv_files = rho rho_x
deriv_x = true

The order of the deriv_files is key. The first derivative will be calculated first since rho is listed first, then the second derivative will be calculated. You can do this for multiple fields, such as

deriv_files = rho rho_x u u_x
deriv_x = true

You can also compute all secondary derivatives with:

deriv_files = rho rho_x rho_y rho_z
deriv_x = true
deriv_y = true
deriv_z = true

Though you'll get 12 files since each cross-derivative will be computed. You should then delete unneeded cross-derivative files afterwards to clear-up some storage.

Higher derivatives are essentially not available. In practice, higher derivatives of tracer fields are available, but the resultant field will contain multiple underscores which could become confusing. Higher derivatives of velocity fields will only be correct in only a small subset of boundary conditions. Try higher derivatives at your peril.

Bottom shear stress

Setting do_stress = true in spins.conf enables the computation of bottom and top shear stress, while setting deriv_files = u and v tells the program to compute the streamwise stress and spanwise stress, respectively. Currently, the program works only for a flat top or bottom boundary without topography. Instead of writing the data onto the disk at each output step, the program saves them in the form of 3D arrays stress_bot_x, stress_bot_y, stress_top_x, and stress_top_y, whose third dimension is determined by the total number of output steps.