Page 1 of 2
How can I get the derivatives of velocity field?
Posted: Wed Oct 09, 2019 8:56 am
by Mohammad
Hi,
I want to calculate the derivatives of velocity field and store them.
For example, I want this expression in every iteration:

(∂u/∂y + ∂v/∂x)
How can I get this expression from the code?
Thanks
Re: How can I get the derivatives of velocity field?
Posted: Wed Oct 09, 2019 2:59 pm
by joubanba
Hello,
You can get a gradient of a field(scalar, vector or tensor) by using the following
Code_Saturne functions:
cs_field_gradient_scalar()/cs_field_gradient_vector()/cs_field_gradient_tensor() in
C language
or call field_gradient_scalar()
in fortran 90.
The following link of
Code_Saturne documentation web site shows how to get the gradient of the temperature field:
https://www.code-saturne.org/cms/sites/ ... nce_p.html
Best regards,
Jamal
Re: How can I get the derivatives of velocity field?
Posted: Wed Oct 09, 2019 5:41 pm
by Mohammad
Thank you Jamal!
Now, the problem is how to get each component of calculated gradient to sum the mentioned expression?

(∂u/∂y + ∂v/∂x)
Re: How can I get the derivatives of velocity field?
Posted: Thu Oct 10, 2019 9:35 am
by joubanba
Hello,
I can't see your attached images.
Jamal
Re: How can I get the derivatives of velocity field?
Posted: Fri Oct 11, 2019 7:01 am
by Mohammad
If you can't see, I want (∂u/∂y + ∂v/∂x)
It's one of strain rate matrix components.
Re: How can I get the derivatives of velocity field?
Posted: Fri Oct 11, 2019 8:08 am
by C.FLAG.
Hello,
If you take a look at the link provided, you will see some source code such as :
Code: Select all
call field_gradient_scalar (ivarfl(ivar), 0, imrgra, inc, iccocg, grad)
! - Compute reconstructed value in boundary cells
do ifac = 1, nfabor
iel = ifabor(ifac)
treco(ifac) = cvar_scal(iel) &
+ diipb(1,ifac)*grad(1,iel) &
+ diipb(2,ifac)*grad(2,iel) &
+ diipb(3,ifac)*grad(3,iel)
enddo
In this case, the gradient of a scalar is a vector. Grad(1,iel) is the gradient in direction X inside cell iel. Grad(2,iel) for direction Y. Grad(3,iel) for direction Z.
EDIT: for the gradient of the velocity field, take a look here :
https://github.com/code-saturne/code_sa ... til.c#L744
Regards,
Cédric
Re: How can I get the derivatives of velocity field?
Posted: Fri Oct 18, 2019 5:09 pm
by Mohammad
Thank you!
I used those codes to sum the three components of gradient of velocity field at each point.
So I wrote the following C code in
cs_user_postprocess.c file.
But it does not give me any output at all!
My CS version is 5.0.9.
Code: Select all
void
cs_user_postprocess_values(const char *mesh_name,
int mesh_id,
int cat_id,
cs_probe_set_t *probes,
cs_lnum_t n_cells,
cs_lnum_t n_i_faces,
cs_lnum_t n_b_faces,
cs_lnum_t n_vertices,
const cs_lnum_t cell_list[],
const cs_lnum_t i_face_list[],
const cs_lnum_t b_face_list[],
const cs_lnum_t vertex_list[],
const cs_time_step_t *ts)
{
/* cs_lnumt is local mesh id*/
cs_real_t *s_cell;
cs_real_33_t *gradv; //
BFT_MALLOC(s_cell, n_cells, cs_real_t);
BFT_MALLOC(gradv, n_cells, cs_real_33_t);
cs_field_gradient_vector(CS_F_(u),
false, //use_previous_t,
CS_GRADIENT_ITER, //gradient type
CS_HALO_STANDARD, //HALO type
1, //inc
gradv);
for (cs_lnum_t i = 0; i < n_cells; i++) {
cs_lnum_t iel = cell_list[i];
s_cell[i] = (gradv[iel][0][0] + gradv[iel][1][1] + gradv[iel][2][2]);
}
cs_post_write_var(mesh_id,
CS_POST_WRITER_ALL_ASSOCIATED, /* writer id filter */
"ugrad", /* var_name */
1, /* var_dim */
true, /* interlace, */
false, /* use_parent */
CS_POST_TYPE_cs_real_t, /* var_type */
s_cell, /* cel_vals */
NULL, /* i_face_vals */
NULL, /* b_face_vals */
ts);
BFT_FREE(s_cell);
}
I also included the following headers:
Code: Select all
#include "cs_defs.h"
#include "cs_field.h"
#include "cs_gradient.h"
#include "cs_halo.h"
#include "cs_field_operator.h"
The other question is :
gradv[iel][0][2] means du/dz or dw/dx?
Re: How can I get the derivatives of velocity field?
Posted: Fri Oct 18, 2019 10:57 pm
by Yvan Fournier
Hello,
Do you have other outputs active ? What system are you running on ? (i.e. some users have had issues with user functions not being called on Ubuntu systems). Your code looks OK, so I do not see any obvious mistake (but there can always be a subtle one).
Could you use a "printf" or bft_printf" statement (or even better, a debugger) to check if the function is called (as it should be) ?
As for the second question, I am not sure. I think it is du/dz judging by a quick look at a usage pattern in the sources, but I recommend checking the sources more carefully, or checking on a case where you are sure nothing interesting happens in the x or z direction (i.e. the matching component is 0).
Best regards,
Yvan
Re: How can I get the derivatives of velocity field?
Posted: Fri Oct 18, 2019 11:07 pm
by Mohammad
Hello,
Thanks for your helps,
I'm using Ubuntu 18.04.
It seems that the problem solved by using
cs_field_gradient_scalar instead of
cs_field_gradient_vector!
But I have a new problem:
When the calculation ends, the CS says:
Code: Select all
****************************
Saving calculation results
****************************
Error in calculation stage.
After checking listing and error files there is an error there which says:
Code: Select all
IGSEGV signal (forbidden memory area access) intercepted!
Call stack:
1: 0x7f1e920b9818 <+0x312818> (libsaturne.so.5)
2: 0x7f1e8f5dbecf <GOMP_parallel+0x3f> (libgomp.so.1)
3: 0x7f1e920c68c8 <+0x31f8c8> (libsaturne.so.5)
4: 0x7f1e920caac4 <cs_gradient_scalar+0x334> (libsaturne.so.5)
5: 0x7f1e91eb8757 <cs_field_gradient_scalar+0x127> (libsaturne.so.5)
6: 0x5582d41cc6bc <cs_user_postprocess_values+0x8c> (cs_solver)
7: 0x7f1e91ee7c82 <cs_post_time_step_output+0xaa2> (libsaturne.so.5)
8: 0x7f1e91ee8801 <cs_post_write_vars+0x11> (libsaturne.so.5)
9: 0x7f1e91e40921 <caltri_+0x208c> (libsaturne.so.5)
10: 0x7f1e91e1d58d <cs_run+0x57d> (libsaturne.so.5)
11: 0x7f1e91e1cee5 <main+0x125> (libsaturne.so.5)
12: 0x7f1e90f68b97 <__libc_start_main+0xe7> (libc.so.6)
13: 0x5582d41cc2ba <_start+0x2a> (cs_solver)
End of stack
The outputs are generated perfectly and I can access the results using paraview ,but what about this error?!
How can the results be generated while this error is occurred?
Thank you!
Re: How can I get the derivatives of velocity field?
Posted: Sun Oct 20, 2019 2:55 am
by Yvan Fournier
Hello,
If you are running in parallel, you need to allocate using n_cells_with_ghosts and not n_cells..
If this is not the cause of the crash, running under a debugger or under Valgrind would help.
Regards,
Yvan