173
173
subroutine assemble_scaled_pressure_mass_matrix(state,scaled_pressure_mass_matrix)
175
! This routine assembles the scaled_pressure_mass_matrix. It is scaled
176
! by the inverse of viscosity.
175
! This routine assembles the scaled_pressure_mass_matrix at the
176
! quadrature points. It is scaled by the inverse of viscosity.
178
178
type(state_type), intent(in) :: state
180
179
! Scaled pressure mass matrix - already allocated in Momentum_Eq:
181
180
type(csr_matrix), intent(inout) :: scaled_pressure_mass_matrix
183
181
! Pressure field:
184
182
type(scalar_field), pointer :: pressure
185
183
! Viscosity tensor:
186
184
type(tensor_field), pointer :: viscosity
187
185
! Viscosity component:
188
186
type(scalar_field) :: viscosity_component
189
! Inverse of Viscosity component
190
type(scalar_field) :: inverse_viscosity_component
192
188
type(vector_field), pointer :: positions
190
! Relevant declerations for mass matrix calculation:
192
real, dimension(:), allocatable :: detwei
193
type(element_type), pointer :: p_shape
194
real, dimension(:,:), allocatable :: mass_matrix
195
real, dimension(:), allocatable :: mu_gi
194
197
ewrite(1,*) 'Entering assemble_scaled_pressure_mass_matrix'
205
208
! Extract first component of viscosity tensor from full tensor:
206
209
viscosity_component = extract_scalar_field(viscosity,1,1)
208
! Allocate memory for inverse viscosity component scalar field:
209
call allocate(inverse_viscosity_component, viscosity_component%mesh, name="inverse_viscosity_component")
212
call invert(viscosity_component,inverse_viscosity_component)
214
! Compute pressure mass matrix, scaled by inverse viscosity - note that the
215
! inverse viscosity is supplied as density here:
216
call compute_mass(positions,pressure%mesh,scaled_pressure_mass_matrix,density=inverse_viscosity_component)
211
! Initialise and assemble scaled pressure mass matrix:
212
allocate(detwei(ele_ngi(pressure, 1)), &
213
mass_matrix(ele_loc(pressure, 1), ele_loc(pressure, 1)), &
214
mu_gi(ele_ngi(viscosity_component, 1)))
216
call zero(scaled_pressure_mass_matrix)
217
do ele = 1, ele_count(pressure)
218
p_shape => ele_shape(pressure, ele)
219
mu_gi = ele_val_at_quad(viscosity_component, ele)
220
call transform_to_physical(positions, ele, detwei=detwei)
221
mass_matrix = shape_shape(p_shape, p_shape, detwei/mu_gi)
222
call addto(scaled_pressure_mass_matrix, ele_nodes(pressure, ele),&
223
ele_nodes(pressure, ele), mass_matrix)
218
226
ewrite_minmax(scaled_pressure_mass_matrix)
220
! Deallocate inverse viscosity component scalar field:
221
call deallocate(inverse_viscosity_component)
228
deallocate(detwei, mass_matrix, mu_gi)
223
230
end subroutine assemble_scaled_pressure_mass_matrix