Merge lp:~s-parkinson11/fluidity/SU_SUPG_stress_form_fix into lp:fluidity

Proposed by Samuel Parkinson
Status: Merged
Merged at revision: 4034
Proposed branch: lp:~s-parkinson11/fluidity/SU_SUPG_stress_form_fix
Merge into: lp:fluidity
Diff against target: 136 lines (+58/-18)
2 files modified
assemble/Momentum_CG.F90 (+39/-17)
femtools/Diagnostic_Fields.F90 (+19/-1)
To merge this branch: bzr merge lp:~s-parkinson11/fluidity/SU_SUPG_stress_form_fix
Reviewer Review Type Date Requested Status
Stephan Kramer Approve
Review via email: mp+120169@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Stephan Kramer (s-kramer) wrote :

Looks good to me. The only issue that one could raise is that this only deals with isotropic viscosity in full/partial stress form - but in my entirely uninformed opinion we don't deal with anisotropic full stress form very well in general. So afaic this is good to go when tests have gone green. Oh, one nitpicky thing: I much prefer ==, >=, <, etc. over .eq., .geq. and .lt.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'assemble/Momentum_CG.F90'
2--- assemble/Momentum_CG.F90 2012-05-23 14:01:16 +0000
3+++ assemble/Momentum_CG.F90 2012-08-17 13:45:11 +0000
4@@ -1184,7 +1184,7 @@
5 real, dimension(u%dim, ele_loc(u, ele)) :: oldu_val
6 type(element_type), pointer :: u_shape, p_shape
7 real, dimension(ele_ngi(u, ele)) :: detwei, detwei_old, detwei_new
8- real, dimension(u%dim, u%dim, ele_ngi(u,ele)) :: J_mat
9+ real, dimension(u%dim, u%dim, ele_ngi(u,ele)) :: J_mat, diff_q
10 real, dimension(ele_loc(u, ele), ele_ngi(u, ele), u%dim) :: du_t
11 real, dimension(ele_loc(u, ele), ele_ngi(u, ele), u%dim) :: dug_t
12 real, dimension(ele_loc(p, ele), ele_ngi(p, ele), u%dim) :: dp_t
13@@ -1197,7 +1197,7 @@
14 real, dimension(u%dim, ele_loc(u, ele)) :: big_m_diag_addto, rhs_addto
15 real, dimension(u%dim, u%dim, ele_loc(u, ele), ele_loc(u, ele)) :: big_m_tensor_addto
16 logical, dimension(u%dim, u%dim) :: block_mask ! control whether the off diagonal entries are used
17- integer :: dim
18+ integer :: dim, i, j
19 type(element_type) :: test_function
20
21 if(move_mesh) then
22@@ -1272,11 +1272,22 @@
23 relu_gi = relu_gi - ele_val_at_quad(ug, ele)
24 end if
25 if(have_viscosity) then
26- call supg_test_function(supg_shape, u_shape, du_t, relu_gi, j_mat, diff_q = ele_val_at_quad(viscosity, ele), &
27- & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
28+ diff_q = ele_val_at_quad(viscosity, ele)
29+
30+ ! for full and partial stress form we need to set the off diagonal terms of the viscosity tensor to zero
31+ ! to be able to invert it when calculating nu_bar
32+ do i=1,size(diff_q,1)
33+ do j=1,size(diff_q,2)
34+ if(i.eq.j) cycle
35+ diff_q(i,j,:) = 0.0
36+ end do
37+ end do
38+
39+ call supg_test_function(supg_shape, u_shape, du_t, relu_gi, j_mat, diff_q = ele_val_at_quad(viscosity, ele), &
40+ & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
41 else
42- call supg_test_function(supg_shape, u_shape, du_t, relu_gi, j_mat, &
43- & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
44+ call supg_test_function(supg_shape, u_shape, du_t, relu_gi, j_mat, &
45+ & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
46 end if
47 test_function = supg_shape
48 case default
49@@ -1531,11 +1542,11 @@
50 real, dimension(ele_loc(u, ele), ele_ngi(u, ele), u%dim), intent(in) :: dug_t
51 real, dimension(:, :, :), intent(in) :: dnvfrac_t
52 real, dimension(ele_ngi(u, ele)), intent(in) :: detwei
53- real, dimension(u%dim, u%dim, ele_ngi(u,ele)) :: J_mat
54+ real, dimension(u%dim, u%dim, ele_ngi(u,ele)) :: J_mat, diff_q
55 real, dimension(u%dim, u%dim, ele_loc(u, ele), ele_loc(u, ele)), intent(inout) :: big_m_tensor_addto
56 real, dimension(u%dim, ele_loc(u, ele)), intent(inout) :: rhs_addto
57
58- integer :: dim, i
59+ integer :: dim, i, j
60 real, dimension(ele_ngi(u, ele)) :: density_gi, div_relu_gi
61 real, dimension(ele_ngi(u, ele)) :: nvfrac_gi, relu_dot_grad_nvfrac_gi
62 real, dimension(u%dim, ele_ngi(u, ele)) :: grad_nvfrac_gi
63@@ -1603,15 +1614,26 @@
64
65 select case(stabilisation_scheme)
66 case(STABILISATION_STREAMLINE_UPWIND)
67- if(have_viscosity) then
68- advection_mat = advection_mat + &
69- & element_upwind_stabilisation(u_shape, du_t, relu_gi, J_mat, detwei, &
70- & diff_q = ele_val_at_quad(viscosity, ele), nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
71- else
72- advection_mat = advection_mat + &
73- & element_upwind_stabilisation(u_shape, du_t, relu_gi, J_mat, detwei, &
74- & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
75- end if
76+ if(have_viscosity) then
77+ diff_q = ele_val_at_quad(viscosity, ele)
78+
79+ ! for full and partial stress form we need to set the off diagonal terms of the viscosity tensor to zero
80+ ! to be able to invert it when calculating nu_bar
81+ do i=1,size(diff_q,1)
82+ do j=1,size(diff_q,2)
83+ if(i.eq.j) cycle
84+ diff_q(i,j,:) = 0.0
85+ end do
86+ end do
87+
88+ advection_mat = advection_mat + &
89+ & element_upwind_stabilisation(u_shape, du_t, relu_gi, J_mat, detwei, &
90+ & diff_q, nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
91+ else
92+ advection_mat = advection_mat + &
93+ & element_upwind_stabilisation(u_shape, du_t, relu_gi, J_mat, detwei, &
94+ & nu_bar_scheme = nu_bar_scheme, nu_bar_scale = nu_bar_scale)
95+ end if
96 end select
97
98 do dim = 1, u%dim
99
100=== modified file 'femtools/Diagnostic_Fields.F90'
101--- femtools/Diagnostic_Fields.F90 2012-02-18 15:45:48 +0000
102+++ femtools/Diagnostic_Fields.F90 2012-08-17 13:45:11 +0000
103@@ -477,7 +477,7 @@
104 type(scalar_field), intent(inout) :: grn
105
106 type(vector_field), pointer :: U, X
107- integer :: ele, gi, stat
108+ integer :: ele, gi, stat, a, b
109 ! Transformed quadrature weights.
110 real, dimension(ele_ngi(GRN, 1)) :: detwei
111 ! Inverse of the local coordinate change matrix.
112@@ -525,6 +525,24 @@
113 ! The matmul is as given by dham
114 GRN_q=ele_val_at_quad(U, ele)
115 vis_q=ele_val_at_quad(viscosity, ele)
116+
117+ ! for full and partial stress form we need to set the off diagonal terms of the viscosity tensor to zero
118+ ! to be able to invert it
119+ if (have_option(trim(U%option_path)//&
120+ &"/prognostic/spatial_discretisation/continuous_galerkin"//&
121+ &"/stress_terms/stress_form") .or. &
122+ have_option(trim(U%option_path)//&
123+ &"/prognostic/spatial_discretisation/continuous_galerkin"//&
124+ &"/stress_terms/partial_stress_form")) then
125+
126+ do a=1,size(vis_q,1)
127+ do b=1,size(vis_q,2)
128+ if(a.eq.b) cycle
129+ vis_q(a,b,:) = 0.0
130+ end do
131+ end do
132+ end if
133+
134 do gi=1, size(detwei)
135 GRN_q(:,gi)=matmul(GRN_q(:,gi), J(:,:,gi))
136 GRN_q(:,gi)=matmul(inverse(vis_q(:,:,gi)), GRN_q(:,gi))